MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | //-------------------------------------------------------------------------------- |
| 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 | |
| 12 | inherit "/std/room"; |
| 13 | |
| 14 | #include <properties.h> |
| 15 | #include <language.h> |
| 16 | #include "schrankladen.h" |
| 17 | |
| 18 | mapping schraenke; |
| 19 | string *cnts; |
| 20 | int update_laeuft; |
| 21 | int reset_laeuft; |
| 22 | |
| 23 | protected 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 | |
| 53 | public int clean_up(int ref) {return 0;} // verhindert Ausswappen des Raumes |
| 54 | |
| 55 | public varargs string GetExits( object viewer ) |
| 56 | { |
| 57 | return ""; |
| 58 | } |
| 59 | |
| 60 | string 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 |
| 70 | void 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 | |
| 86 | void 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 | |
| 99 | string 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 | |
| 109 | int 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 | |
| 144 | void 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 | |
| 190 | int 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 | |
| 205 | void 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 !!! |
| 225 | void AddCnt(mixed cnt, mixed ver, mixed seher, mixed standort) |
| 226 | { |
| 227 | log_file("swift/schraenker/verloren.log", to_string(cnt)+"\n"); |
| 228 | } |
| 229 | void EditCnt(mixed cnt, mixed ver, mixed seher, mixed standort) |
| 230 | { |
| 231 | log_file("swift/schraenker/verloren.log", to_string(cnt)+"\n"); |
| 232 | } |
| 233 | */ |