#include <defines.h>#include <moving.h>#include <properties.h>
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) |
| 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 }

| 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 }

| protected void NotifyMove | ( | object | dest, | |
| object | oldenv, | |||
| int | method | |||
| ) |
| 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 }

| 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 }

1.6.3