moving.c-Dateireferenz

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

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES

Funktionen

protected int PreventMove (object dest, object oldenv, int method)
protected void NotifyMove (object dest, object oldenv, int method)
varargs int move (mixed dest, int method)
varargs int remove (int silent)
public string NotifyDestruct (object caller)

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 16 der Datei moving.c.


Dokumentation der Funktionen

varargs int move ( mixed  dest,
int  method 
)

Definiert in Zeile 73 der Datei moving.c.

Benutzt IS_PARA, ME, ME_DONT_WANT_TO_BE_MOVED, ME_WAS_DESTRUCTED, move_object(), MOVE_OK, NotifyMove(), P_NO_PLAYERS, P_PARA, P_SENSITIVE, P_TESTPLAYER, PreventMove(), Query(), QueryProp() und VALID_MOVE_ERROR.

00074 {
00075   object oldenv;
00076   int tmp;
00077   string fn,vc;
00078   mixed sens;
00079 
00080   if (!objectp(dest) && !stringp(dest))
00081       raise_error(sprintf("Wrong argument 1 to move(). 'dest' must be a "
00082                     "string or object! Argument was: %.100O\n",
00083                     dest));
00084 
00085   // Jetzige Umgebung merken
00086   oldenv = environment();
00087 
00088   // Bewegung in Para-Welt-Raeume?
00089   // tmp ist die Ziel-Parallelweltnummer
00090   if (!environment()||!living(environment())||
00091       !intp(tmp =(int)environment()->Query(P_PARA)))
00092     tmp=0;
00093     
00094   // Wenn das Objekt von einem in der Parawelt befindlichen Spieler
00095   // oder NPC bewegt wird, sollte es auch wieder in der Parawelt landen.
00096   // Um Rechenzeit zu sparen, wird angenommen, dass bei Bewegungen in
00097   // das Inv oder Env des Spielers 'dest' als Objekt uebergeben wird,
00098   // wohingegen bei Bewegungen in Nachbarraeume (die eigentlich nur
00099   // interessant sind) 'dest' als Filename angegeben wird.
00100   if (tmp&&!objectp(dest)&&!environment(dest)) {
00101       // Falls der Zielraum nicht schon explizit in der Parallelwelt ist,
00102       // neuen Zielraum suchen. Aber nur, wenn das Ziel kein Clone ist. Sonst
00103       // buggt, wenn man versucht, nach raum#42^para zu bewegen.
00104       if (!IS_PARA(dest) && strrstr(dest,"#")==-1) {
00105         fn=dest+"^"+tmp;
00106 
00107         // Der Parawelt-Raum wird nur zum Ziel, wenn er a) existiert
00108         // und b) auch von Spielern betreten werden darf. Letzteres
00109         // Kriterium kann nur mit im Objekt gesetzter Property
00110         // P_TESTPLAYER umgangen werden.
00111           if ( (find_object(fn) || ((file_size(fn+".c")>0||
00112                   (file_size(vc=implode(explode(fn,"/")[0..<2],"/")+
00113                   "/virtual_compiler.c")>0 &&
00114                                   !catch(tmp=(int)call_other(vc,"QueryValidObject",fn);
00115                                     publish) && tmp>0)) &&
00116                   !catch(load_object( fn );publish))) &&
00117               (!fn->QueryProp(P_NO_PLAYERS) || QueryProp(P_TESTPLAYER)) )
00118            dest = fn;
00119       }
00120   }
00121     
00122   // dest auf Objekt normieren.
00123   if (stringp(dest))
00124       dest = load_object(dest);
00125     
00126   // testen, ob das Objekt bewegt werden will
00127   if (tmp=PreventMove(dest, oldenv, method)) {
00128       // auf gueltigen Fehler pruefen, wer weiss, was Magier da evtl.
00129       // versehentliche zurueckgeben.
00130       if (VALID_MOVE_ERROR(tmp))
00131                 return(tmp);
00132       else
00133                 return(ME_DONT_WANT_TO_BE_MOVED);
00134   }
00135 
00136   // Sensitive Objekte muessen entfernt werden
00137   sens = QueryProp(P_SENSITIVE);
00138   
00139   if (sens&&environment())
00140     environment()->RemoveSensitiveObject( this_object() );
00141 
00142   // Bewegen
00143   move_object(ME, dest);
00144 
00145   //falls (sich) das objekt im init() zerstoert (wurde). (Die u. stehenden
00146   //Funktionsaufrufe werden dann vom Driver eh groesstenteils ignoriert.)
00147   if (!objectp(this_object())) return(ME_WAS_DESTRUCTED);
00148 
00149   // Objekt informieren. ;-)
00150   NotifyMove(environment(), oldenv, method);
00151 
00152   // Alte Umgebung informieren
00153   if (oldenv) oldenv->NotifyLeave(this_object());
00154 
00155   // Wenn das Objekt eine Umgebung hat, selbige informieren
00156   if (environment()) {
00157     if (sens)
00158       environment()->InsertSensitiveObject(this_object(),sens);
00159     environment()->NotifyInsert(this_object());
00160   }
00161   //wurde das Objekt vielleicht noch zerstoert?
00162   if (!objectp(ME)) return(ME_WAS_DESTRUCTED);
00163   
00164   //scheint wohl alles ok zu sein.
00165   return MOVE_OK;
00166 }

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

public string NotifyDestruct ( object  caller  ) 

Definiert in Zeile 181 der Datei moving.c.

Benutzt env().

00181                                             {
00182 #if __BOOT_TIME__ > 1234212788
00183   // Lichtsystem mit der aenderung versorgen. :-/
00184   foreach(object env : all_environment() || ({})) {
00185       // Ja. Man ruft die _set_xxx()-Funktionen eigentlich nicht direkt auf.
00186       // Aber das Lichtsystem ist schon *so* rechenintensiv und gerade der
00187       // P_LAST_CONTENT_CHANGE-Cache wird *so* oft benoetigt, dass es mir
00188       // da um jedes bisschen Rechenzeit geht.
00189       // Der Zweck heiligt ja bekanntlich die Mittel. ;-)
00190       //
00191       // Tiamak
00192       env->_set_last_content_change();
00193   }
00194 #endif
00195   return 0;
00196 }

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

protected void NotifyMove ( object  dest,
object  oldenv,
int  method 
)

Definiert in Zeile 70 der Datei moving.c.

00070                                                                   {
00071 }

protected int PreventMove ( object  dest,
object  oldenv,
int  method 
)

Definiert in Zeile 24 der Datei moving.c.

Benutzt M_GET, M_GIVE, M_NOCHECK, M_PUT, ME_CANT_BE_DROPPED, ME_CANT_BE_INSERTED, ME_CANT_BE_TAKEN, ME_CANT_LEAVE_ENV, ME_TOO_HEAVY, ME_TOO_HEAVY_FOR_ENV, P_NODROP, P_NOGET, P_TOTAL_WEIGHT, P_WEIGHT, QueryProp() und TOO_MANY_OBJECTS.

00024                                                                   {
00025   int tmp;
00026   
00027   // M_NOCHECK? -> Bewegung eh erlaubt (und Rueckgabewert wuerde ignoriert)
00028   if ((method&M_NOCHECK)) {
00029     // Bei M_NOCHECK zwar Prevent* aufrufen, aber das Resultat ignorieren
00030     if (oldenv) oldenv->PreventLeave(this_object(),dest);
00031     dest->PreventInsert(this_object());
00032 
00033     return 0; // das wars, rest ist egal.
00034   }
00035 
00036   // P_NODROP verhindert weggeben
00037   if ((method & (M_PUT|M_GIVE)) && QueryProp(P_NODROP))
00038       return ME_CANT_BE_DROPPED;
00039 
00040   // P_NOGET verhindert nehmen
00041   if ((method & M_GET) && QueryProp(P_NOGET))
00042       return ME_CANT_BE_TAKEN;
00043 
00044   // Gewicht ermitteln
00045   if ( !(tmp = (int)QueryProp(P_TOTAL_WEIGHT)) )
00046       tmp = (int)QueryProp(P_WEIGHT);
00047         
00048   // Ist das Objekt nicht zu schwer?
00049   if ( (tmp = (int)dest->MayAddWeight(tmp)) < 0) {
00050       if ( tmp == -2 ) return ME_TOO_HEAVY_FOR_ENV;
00051       return ME_TOO_HEAVY;
00052   }
00053 
00054   // Ist das Zielobjekt schon voll?
00055   if ( !dest->MayAddObject(this_object()) )
00056       return TOO_MANY_OBJECTS;
00057 
00058   // Darf hinausbewegt werden?
00059   if ( oldenv && oldenv->PreventLeave(this_object(), dest) )
00060       return ME_CANT_LEAVE_ENV;
00061 
00062   // Darf hineinbewegt werden?
00063   if ( dest->PreventInsert(this_object()) )
00064       return ME_CANT_BE_INSERTED;
00065 
00066   return(0);
00067 }

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

varargs int remove ( int  silent  ) 

Definiert in Zeile 169 der Datei moving.c.

Benutzt destruct(), P_SENSITIVE und QueryProp().

00170 { 
00171     if (environment() ) {
00172                 if(QueryProp(P_SENSITIVE))
00173                                 environment()->RemoveSensitiveObject(this_object());
00174                 environment()->NotifyRemove(this_object());
00175     }
00176     if (objectp(this_object()))
00177                 destruct(this_object());
00178     return 1;
00179 }

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

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