shadowmaster.c-Dateireferenz

Objekt, welches eine Liste mit aktiven Shadows hat. Mehr ...

#include <defines.h>
#include <wizlevels.h>
Include-Abhängigkeitsdiagramm für shadowmaster.c:

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.

Ausführliche Beschreibung

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.

Autor:
Zesstra
Datum:
07.08.2009
Version:
$Id$

Definiert in Datei shadowmaster.c.


Makro-Dokumentation

#define DEBUG ( x   ) 
Wert:
if (find_player("zesstra"))\
            tell_object(find_player("zesstra"),\
                                      "SMDBG: "+x+"\n")

Definiert in Zeile 32 der Datei shadowmaster.c.

#define HOME ( x   )     (__PATH__(0)+x)

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.


Dokumentation der Funktionen

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.

Rückgabe:
string - Liste von Schatten und Opfern

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.

Parameter:
[in] object - ein beschattetes Objekt.
Rückgabe:
object - Den Schatten oder 0.
Siehe auch:
FindShadowsObject(), QueryObject(), QueryInfo()

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

public object FindShadowedObject ( object  schatten  ) 

Findet zu einem Schatten das beschattete Objekt.

Parameter:
[in] object - ein beschattendes Objekt.
Rückgabe:
object - Das beschattete Objekt oder 0.
Siehe auch:
FindShadow(), QueryObject(), QueryInfo()

Definiert in Zeile 94 der Datei shadowmaster.c.

Benutzt shadows.

Wird benutzt von QueryObject().

00094                                                   {
00095   return shadows[schatten];
00096 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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).

Parameter:
[in] object - ein Objekt.
Rückgabe:
string - String mit Infos ueber ob.
Siehe auch:
FindShadow(), FindShadowedObject(), QueryObject()

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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.

Parameter:
[in] object - ein Objekt.
Rückgabe:
object* - ({a, b, c, d}) oder 0.
Siehe auch:
FindShadow(), FindShadowedObject, QueryInfo()

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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.

Siehe auch:
UnregisterShadow()

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.

Siehe auch:
RegisterShadow(), UnregisterOpfer()

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 }


Variablen-Dokumentation

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().

Erzeugt am Thu Jun 3 14:41:49 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3