blob: c602ddce21a0e198d3b975ba9ff5ac8aafa62d9b [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001//--------------------------------------------------------------------------------
2// Name des Objects: Schrankmaster
3// Letzte Aenderung: 19.03.2001
4// Magier: wurzel
5//--------------------------------------------------------------------------------
6/* Changelog:
7 * 21.06.2007, Zesstra
8 call_out ohne Verzoegerung beim Updaten durch eines mit 2s Verzoegerung ersetzt.
9*/
10#pragma strong_types,rtt_checks
11
12inherit "/std/room";
13
14#include <properties.h>
15#include <language.h>
16#include "schrankladen.h"
17
18mapping schraenke;
19string *cnts;
20int update_laeuft;
21int reset_laeuft;
22
23protected void create()
24{
25 ::create();
26 SP(P_INT_SHORT, "Irgendwo und Nirgends");
27 SP(P_INT_LONG,
28 "Dies ist der Master-Raum fuer den SCHRAENKER.\n"
29 +"Hier merkt sich August die Anzahl der verkauften Container.\n"
30 +"Davon sind momentan @@ANZAHL@@ registrierte im Umlauf!\n"
31 +"Folgende Befehle sind verfuegbar:\n"
32 +" schrankliste.........Listet registrierte, im Spiel befindliche Container.\n"
33 +" schrankupdate........Fuehrt ein Update aller registrierten Container durch.\n");
34
35 SP(P_LIGHT, 1);
36 SP(P_INDOORS, 1);
37 if( SCHRANKMASTER2->QueryProp("schraenke") ) // Der Sicherungsraum hat Daten?
38 schraenke=SCHRANKMASTER2->QueryProp("schraenke"); // Daten holen...
39 else
40 schraenke=([]);
41 SetProp("schraenke", schraenke );
42
43 update_laeuft=0;
44
45 // unnoetig, SCHRANKMASTER2 ist jetzt schon geladen, s.o.
46 //load_object(SCHRANKMASTER2);
47 set_next_reset(3600); // Reset 1 x pro Std.
48
49 AddCmd(({"schrankliste"}), "Schrankliste");
50 AddCmd(({"schrankupdate"}), "SchrankUpdate");
51}
52
53public int clean_up(int ref) {return 0;} // verhindert Ausswappen des Raumes
54
55public varargs string GetExits( object viewer )
56{
57 return "";
58}
59
60string ANZAHL()
61{
62 return to_string( sizeof(schraenke) );
63}
64
65
66// cnt = Object des Containers
67// ver = Version des Containers (VERSION_STD+VERSION_OBJ von std.cont. + objekt...)
68// seher=Der Besitzer/Kaeufer
69// standort=Raum in dem der Container steht
70void RegisterCnt(mixed cnt, mixed ver, mixed seher, mixed standort)
71{
72 if (objectp(standort)) standort=object_name(standort);
73 if( !objectp(cnt) || !stringp(ver) || !stringp(seher) || !stringp(standort) )
74 {
75 log_file("swift/schraenker/bugs.log", "schrankmaster (RegisterCnt) *"
76 +to_string(cnt)+"*"+to_string(ver)+"*"+to_string(seher)+"*"
77 +to_string(standort)+"*\n");
78 return;
79 }
80 m_delete(schraenke,object_name(cnt));
81 schraenke+=([object_name(cnt): ver; seher; to_string(standort)]);
82 SetProp("schraenke", schraenke );
83 SCHRANKMASTER2->SetProp("schraenke", schraenke );
84}
85
86void RemoveCnt(mixed cnt, mixed seher)
87{
88 if( !objectp(cnt) || !stringp(seher) )
89 {
90 log_file("swift/schraenker/bugs.log", "schrankmaster (RemoveCnt) *"
91 +to_string(cnt)+"*"+to_string(seher)+"*\n");
92 return;
93 }
94 schraenke-=([object_name(cnt)]);
95 SetProp("schraenke", schraenke );
96 SCHRANKMASTER2->SetProp("schraenke", schraenke );
97}
98
99string fn(string was)
100{
101 string str,*strs;
102 strs=old_explode( was, "/" );
103 str=strs[sizeof(strs)-1];
104 strs=old_explode( str, "#" );
105 str=strs[0];
106 return str;
107}
108
109int Schrankliste()
110{
111 int i;
112 string str, *strs;
113 object cnt;
114 if(update_laeuft && !reset_laeuft) // Nicht waehrend eines Updates der Schraenke!
115 {
116 write("Update wird durchgefuehrt. Bitte bis zum Ende warten!\n");
117 return 1;
118 }
119 str="----------------------------------------------------------------------\n";
120 strs=m_indices(schraenke);
121 for(i=0;i<sizeof(strs);i++)
122 {
123 if( cnt=find_object(strs[i]) )
124 {
125 str+=(fn(object_name(cnt))+"....................")[0..20]+" ";
126 str+=schraenke[strs[i], 0]+" ";
127 str+=(schraenke[strs[i], 1]+"....................")[0..20]+" ";
128 str+=fn(schraenke[strs[i], 2])+"\n";
129 }
130 else
131 {
132 str+="Nicht auffindbaren Container aus Liste geloescht!\n";
133 schraenke-=([strs[i]]);
134 SetProp("schraenke", schraenke );
135 SCHRANKMASTER2->SetProp("schraenke", schraenke );
136 }
137 }
138 str+="----------------------------------------------------------------------\n";
139 if( TP && present(TP) ) //wurzel 19.03.01
140 TP->More(str);
141 return 1;
142}
143
144void Update_naechster_Schrank()
145{
146 int i;
147 object cnt, cnt_neu, *inv;
148 if( sizeof(cnts) ) // Es gibt noch Schraenke zum abarbeiten...
149 {
150 cnt=find_object(cnts[0]); // Schrank auswaehlen + Objekt suchen
151 if(cnt)
152 {
153 // Autoloadertruhe ist etwas spezieller zu updaten... Daher alternativer
154 // Mechanismus: UpdateMe() im Moebelstueck aufrufen. Wenn die Funktion
155 // etwas != 0 liefert, wird angenommen, dass diese Funktion das Update
156 // gemacht hat oder sich in Kuerze darum kuemmert. Sonst wird das alte
157 // Update gemacht.
158 // Das neue Moebelobjekt ist dafuer verantwortlich, sich beim
159 // Schrankmaster zu (de-)registrieren!
160 object oldenv=environment(cnt);
161 if (cnt->UpdateMe())
162 {
163 tell_room(TO, "...Update "+CAP(fn(cnts[0]))
164 +" in " + object_name(oldenv) + "\n" );
165 }
166 else
167 {
168 tell_room(TO, CAP(fn(cnts[0]))
169 +" in " + object_name(oldenv)
170 + " hat kein UpdateMe()!\n" );
171 }
172 }
173 else
174 {
175 tell_room(TO, "Nicht auffindbaren Container aus Liste geloescht!\n");
176 schraenke-=([cnts[0]]);
177 }
178 cnts-=({cnts[0]}); // Schrank aus Liste nehmen
179 call_out("Update_naechster_Schrank", 2); // Nur 1 Schrank-Update pro heart_beat!
180 }
181 else // Alle Schraenke abgearbeitet:
182 {
183 tell_room(TO, "*** Update abgeschlossen.\n");
184 SetProp("schraenke", schraenke );
185 SCHRANKMASTER2->SetProp("schraenke", schraenke );
186 update_laeuft=0;
187 }
188}
189
190int SchrankUpdate()
191{
192 if(update_laeuft) // Nicht waehrend eines Updates der Schraenke!
193 {
194 write("Update wird durchgefuehrt. Bitte bis zum Ende warten!\n");
195 return 1;
196 }
197 update_laeuft=1; // Ab sofort laeuft Update!
198 cnts=m_indices(schraenke);
199 tell_room(TO, "*** Update wird gestartet...\n");
200 Update_naechster_Schrank();
201 return 1;
202}
203
204
205void reset()
206{
207 reset_laeuft=1;
208 set_next_reset(3600); // Reset 1 x pro Std.
209 ::reset();
210 // Wirft Schraenke aus der Liste, die aus welchem Grund auch immer nicht mehr existieren
211 Schrankliste();
212 if( !(schraenke==QueryProp("schraenke")==SCHRANKMASTER2->QueryProp("schraenke")) )
213 log_file("swift/schraenker/reset.log", "schrankmaster (reset) "
214 +sizeof(schraenke)+" "
215 +sizeof(QueryProp("schraenke"))+" "
216 +sizeof(SCHRANKMASTER2->QueryProp("schraenke"))+"\n");
217 if( present("Interactive") )
218 tell_room(TO, "*** RESET ***\n");
219 reset_laeuft=0;
220}
221
222/*
223// Veraltete Funktionen, um Fehler abzufangen. Kann nach dem naechsten Reboot
224// geloescht werden !!!
225void AddCnt(mixed cnt, mixed ver, mixed seher, mixed standort)
226{
227 log_file("swift/schraenker/verloren.log", to_string(cnt)+"\n");
228}
229void EditCnt(mixed cnt, mixed ver, mixed seher, mixed standort)
230{
231 log_file("swift/schraenker/verloren.log", to_string(cnt)+"\n");
232}
233*/