Objekt, welches eine Liste mit aktiven Shadows hat. Mehr ...
#include <defines.h>#include <wizlevels.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | HOME(x) (__PATH__(0)+x) |
| #define | DEBUG(x) |
| #define | MEMORY "/secure/memory" |
| #define | SHADOW_OK 1 |
| #define | SHADOW_ACCESS_DENIED -1 |
| #define | SHADOW_EXISTS -2 |
| #define | SHADOW_UNKNOWN -3 |
Funktionen | |
| protected void | create () |
| public void | DumpShadows () |
| Liefert einen String mit allen Schatten und beschatteten Objekten zurueck. | |
| public object | FindShadow (object opfer) |
| Findet zu einem beschatteten Objekt den zugehoerigen Schatten. | |
| public object | FindShadowedObject (object schatten) |
| Findet zu einem Schatten das beschattete Objekt. | |
| public object * | QueryObject (object ob) |
| Gibt Schatten und Beschatteten zurueck, falls ob eines von beiden ist. | |
| public string | QueryInfo (object ob) |
| Gibt einen String mit Infos ueber ob zurueck. | |
| public int | RegisterShadow (object schatten) |
| Registriert einen Schatten und sein Opfer. | |
| public int | UnregisterShadow (object caller) |
| Traegt einen Schatten wieder aus. | |
| public int | ResetAll () |
| public void | reset () |
| Raeumt die Daten ueber die Schatten auf. | |
Variablen | |
| private mapping | shadows = ([]) |
| shadows ist ein mapping, welches alle Schatten und ihre Opfer enthaelt. | |
Objekt, welches eine Liste mit aktiven Shadows hat.
Die simul_efun shadow() meldet das beschattende Objekt hier an. Nuetzlich, damit man als Magier endlich mal rauskriegen kann, welche Shadows es eigentlich gibt.
Definiert in Datei shadowmaster.c.
| #define DEBUG | ( | x | ) |
if (find_player("zesstra"))\ tell_object(find_player("zesstra"),\ "SMDBG: "+x+"\n")
Definiert in Zeile 32 der Datei shadowmaster.c.
Definiert in Zeile 22 der Datei shadowmaster.c.
| #define MEMORY "/secure/memory" |
Definiert in Zeile 37 der Datei shadowmaster.c.
| #define SHADOW_ACCESS_DENIED -1 |
Definiert in Zeile 40 der Datei shadowmaster.c.
| #define SHADOW_EXISTS -2 |
Definiert in Zeile 41 der Datei shadowmaster.c.
| #define SHADOW_OK 1 |
Definiert in Zeile 39 der Datei shadowmaster.c.
| #define SHADOW_UNKNOWN -3 |
Definiert in Zeile 42 der Datei shadowmaster.c.
| protected void create | ( | ) |
Definiert in Zeile 44 der Datei shadowmaster.c.
Benutzt DEBUG, MEMORY und shadows.
00044 { 00045 mixed tmp; 00046 seteuid(getuid()); 00047 if (mappingp(tmp=MEMORY->Load("Schatten"))) { 00048 shadows = tmp; 00049 DEBUG("Daten aus MEMORY geladen.\n"); 00050 } 00051 else { 00052 DEBUG("Keine Daten in MEMORY vorhanden - reinitialisiere.\n"); 00053 if (MEMORY->Save("Schatten", shadows) != 1) 00054 raise_error("Konnte Daten nicht im Memory ablegen.\n"); 00055 } 00056 }
| public void DumpShadows | ( | ) |
Liefert einen String mit allen Schatten und beschatteten Objekten zurueck.
Definiert in Zeile 61 der Datei shadowmaster.c.
Benutzt ELDER_SECURITY und shadows.
00061 { 00062 if (extern_call() && !ELDER_SECURITY ) return 0; 00063 00064 string res = ""; 00065 foreach(object schatten, object opfer: shadows) 00066 if (schatten && opfer) 00067 res += sprintf("%O -> %O\n",schatten,opfer); 00068 00069 printf("Folgende Shadows sind bekannt: \n\n%s\n", res); 00070 }
| public object FindShadow | ( | object | opfer | ) |
Findet zu einem beschatteten Objekt den zugehoerigen Schatten.
| [in] | object | - ein beschattetes Objekt. |
Definiert in Zeile 77 der Datei shadowmaster.c.
Benutzt shadows.
Wird benutzt von QueryObject().
00077 { 00078 if (!objectp(opfer)) 00079 return 0; 00080 00081 foreach(object schatten, object victim: shadows) { 00082 if (opfer == victim) 00083 // Schatten gefunden. 00084 return schatten; 00085 } 00086 return 0; 00087 }

| public object FindShadowedObject | ( | object | schatten | ) |
Findet zu einem Schatten das beschattete Objekt.
| [in] | object | - ein beschattendes Objekt. |
Definiert in Zeile 94 der Datei shadowmaster.c.
Benutzt shadows.
Wird benutzt von QueryObject().
00094 { 00095 return shadows[schatten]; 00096 }

| public string QueryInfo | ( | object | ob | ) |
Gibt einen String mit Infos ueber ob zurueck.
Ist ob ein beschattetes Objekt oder ein Schatten, wird ein beschreibender String zurueckgeliefert (schatten -> beschattetes Objekt). Hierbei wird ggf. die gesamte Beschattungshierarchie angegeben (a -> b -> c -> d).
| [in] | object | - ein Objekt. |
Definiert in Zeile 152 der Datei shadowmaster.c.
Benutzt CountUp() und QueryObject().
00152 { 00153 object *shs = QueryObject(ob); 00154 if (!shs) return 0; 00155 00156 return CountUp(map(shs, #'object_name), " -> ", " -> "); 00157 }

| public object* QueryObject | ( | object | ob | ) |
Gibt Schatten und Beschatteten zurueck, falls ob eines von beiden ist.
Ist ob ein Schatten oder ein beschattetes Objekt, wird ein Array aus Objekten geliefert. Hierbei werden ggf. alle Objekte in der Beschattungshierarchie geliefert, von der ob Bestandteil ist.
| [in] | object | - ein Objekt. |
Definiert in Zeile 106 der Datei shadowmaster.c.
Benutzt FindShadow(), FindShadowedObject(), QueryObject() und shadows.
00106 { 00107 00108 if (!objectp(ob)) return 0; 00109 00110 object *res = ({ob}); 00111 object sh = FindShadow(ob); 00112 00113 while(sh) { 00114 // es gibt einen Schatten, also Kette nach oben verfolgen. 00115 res = ({sh}) + res; 00116 sh = FindShadow(sh); 00117 } 00118 00119 object vic = FindShadowedObject(ob); 00120 while(vic) { 00121 // es gibt ein beschattetes Objekt, Kette nach unten verfolgen. 00122 res = res + ({vic}); 00123 vic = FindShadowedObject(vic); 00124 } 00125 00126 if (sizeof(res) < 2) { 00127 // Offenbar wird ob weder beschattet noch beschattet selber. 00128 // Moeglicherweise wurde jedoch durch wilde Zerstoerung die Hierarchie 00129 // getrennt. Falls ob nen Schatten ist, laesst sich das reparieren. Falls 00130 // ob beschattet wird, hilft eigentlich nur ein reset(). Den moechte ich 00131 // hier aber nicht machen, weils u.U. teuer sein koennte. 00132 if (query_shadowing(ob)) { 00133 shadows[ob] = query_shadowing(ob); 00134 // nochmal. 00135 return QueryObject(ob); 00136 } 00137 // scheinbar nicht. 00138 return 0; 00139 } 00140 00141 return res; 00142 }

| public int RegisterShadow | ( | object | schatten | ) |
Registriert einen Schatten und sein Opfer.
Registriert den Schatten und sein Opfer. Sollte ausschliesslich durch die simul_efun oder spare_simul_fun gerufen werden.
Definiert in Zeile 164 der Datei shadowmaster.c.
00164 { 00165 object opfer; 00166 00167 //DEBUG(sprintf("[%O] %O\n", schatten, caller_stack())); 00168 00169 // Irgendein Sicherheitscheck ist eigentlich nicht noetig hier, da das Opfer 00170 // ohnehin per efun ermittelt wird und kein Eintrag erfolgt, wenn kein 00171 // beschattetes Objekt zu finden ist. 00172 00173 // das von schatten beschattete Objekt ermitteln 00174 if (objectp(opfer=query_shadowing(schatten))) { 00175 if (shadows[schatten] == opfer) 00176 return SHADOW_EXISTS; 00177 00178 // Neueintrag oder ggf. auch Aendern. 00179 shadows[schatten] = opfer; 00180 //DEBUG(DumpShadows()); 00181 return SHADOW_OK; 00182 } 00183 return SHADOW_ACCESS_DENIED; 00184 }
| public void reset | ( | void | ) |
Raeumt die Daten ueber die Schatten auf.
Zerstoeren sich beschattete Objekte, werden die Schatten nicht ausgetragen, daher wird das von zeit zu zeit hier gemacht.
Definiert in Zeile 250 der Datei shadowmaster.c.
00250 { 00251 foreach(object schatten, object opfer: shadows) { 00252 if (!objectp(opfer)) { 00253 // war schatten evtl. in einer Hierarchie und beschattet jetzt was 00254 // anderes? 00255 if (query_shadowing(schatten)) 00256 shadows[schatten] = query_shadowing(schatten); 00257 else 00258 efun::m_delete(shadows, schatten); 00259 } 00260 } 00261 }
| public int ResetAll | ( | ) |
Definiert in Zeile 233 der Datei shadowmaster.c.
00233 { 00234 if (!ARCH_SECURITY) return SHADOW_ACCESS_DENIED; 00235 00236 DEBUG("ResetAll() called.\n"); 00237 00238 shadows = ([]); 00239 00240 if (MEMORY->Save("Schatten", shadows) != 1) 00241 raise_error("Konnte Daten nicht im Memory ablegen.\n"); 00242 00243 return SHADOW_OK; 00244 }
| public int UnregisterShadow | ( | object | caller | ) |
Traegt einen Schatten wieder aus.
Der Schatten wird wieder ausgetragen. Sollte ausschliesslich durch die simul_efun oder spare_simul_fun gerufen werden. Werden Schatten oder beschattete Objekte zerstoert ohne vorher die Schattierung zu beenden, fuehrt dies zu Inkonsistenzen und zerbrochenen Beschattungshierarchien.
Definiert in Zeile 194 der Datei shadowmaster.c.
00194 { 00195 object schatten, opfer; 00196 00197 // Ein Sicherheitscheck fuer den Aufruf ist eigentlich nicht noetig, da ein 00198 // Eintrag nur entfernt wird, wenn die Beschattung nachweislich beendet 00199 // wurde. 00200 00201 //DEBUG(sprintf("[%O] %O\n", caller, caller_stack())); 00202 if (!objectp(caller)) return SHADOW_UNKNOWN; 00203 00204 // Schatten und beschatteten aus den lokalen Daten ermitteln. 00205 if (member(shadows, caller)) { 00206 schatten = caller; 00207 opfer = shadows[schatten]; 00208 } 00209 else if (objectp(schatten = FindShadow(caller))) { 00210 opfer = caller; 00211 } 00212 // wenn nicht bekannt, ist jetzt eh Ende. 00213 if (!schatten) return SHADOW_UNKNOWN; 00214 00215 //DEBUG(sprintf("%O -> %O (%O, %O)\n", 00216 // schatten, opfer, caller, query_shadowing(schatten))); 00217 00218 // Schattierung wirklich beendet? Wenn nicht -> Ende 00219 if (opfer && query_shadowing(schatten) == opfer) 00220 return SHADOW_ACCESS_DENIED; 00221 00222 // war schatten in einer Beschattungshierarchie? 00223 object up = FindShadow(schatten); 00224 if (up && query_shadowing(up) == opfer) { 00225 shadows[up] = opfer; // Kette neu verlinken 00226 } 00227 00228 // jetzt kann geloescht werden. 00229 efun::m_delete(shadows,schatten); 00230 return SHADOW_OK; 00231 }
| private mapping shadows = ([]) |
shadows ist ein mapping, welches alle Schatten und ihre Opfer enthaelt.
Struktur: Schatten als Schluessel (object) und Beschatteter (object) als Wert.
Definiert in Zeile 29 der Datei shadowmaster.c.
Wird benutzt von create(), DumpShadows(), FindShadow(), FindShadowedObject() und QueryObject().
1.6.3