
gehe zum Quellcode dieser Datei
Funktionen | |
| private void | recursive_remove (object ob, int immediate_destruct) |
| protected mixed | prepare_destruct (object ob) |
| string | NotifyDestruct (object caller) |
Variablen | |
| private nosave string * | deny_destruct_list |
| string NotifyDestruct | ( | object | caller | ) |
Definiert in Zeile 108 der Datei destruct.c.
00108 { 00109 // Nicht jeder Magier muss den Master entsorgen koennen. 00110 if ((caller != this_object() && 00111 funcall(symbol_function('secure_level)) < ARCH_LVL) 00112 || funcall(symbol_function('process_call)) ) { 00113 return "Du darfst den Mudlib-Master nicht zerstoeren!\n"; 00114 } 00115 return 0; 00116 }
| protected mixed prepare_destruct | ( | object | ob | ) |
Definiert in Zeile 52 der Datei destruct.c.
Benutzt deny_destruct_list, env(), IS_ARCH, item und ROOTID.
00053 { 00054 object old_env,env,item; 00055 mixed res; 00056 00057 // zuerst das notify_destruct() rufen und ggf. abbrechen, falls ob 00058 // privilegiert ist. 00059 catch(res = (mixed)ob->NotifyDestruct(previous_object()); publish); 00060 if (res && 00061 (getuid(ob) == ROOTID || 00062 (IS_ARCH(ob)) || 00063 member(deny_destruct_list, object_name(ob)) >= 0)) { 00064 if (stringp(res) && strlen(res)) 00065 return res; 00066 else 00067 return sprintf("%O verweigert die Zerstoerung mittels destruct(). " 00068 "Fehlende Rechte von %O?\n",ob, previous_object()); 00069 } 00070 00071 //TODO: Mit Reboot entfernen. 00072 #if __BOOT_TIME__ < 1234212788 00073 // Lichtsystem mit der aenderung versorgen. :-/ 00074 foreach(env : all_environment(ob) || ({})) { 00075 // Ja. Man ruft die _set_xxx()-Funktionen eigentlich nicht direkt auf. 00076 // Aber das Lichtsystem ist schon *so* rechenintensiv und gerade der 00077 // P_LAST_CONTENT_CHANGE-Cache wird *so* oft benoetigt, dass es mir 00078 // da um jedes bisschen Rechenzeit geht. 00079 // Der Zweck heiligt ja bekanntlich die Mittel. ;-) 00080 // 00081 // Tiamak 00082 env->_set_last_content_change(); 00083 } 00084 #endif 00085 env = environment(ob); 00086 00087 // Objekt hat kein Env: Alles zerstoeren, Spieler ins Void 00088 if (!env) { 00089 filter(all_inventory(ob), #'recursive_remove, 1); 00090 } 00091 else { 00092 // Ansonsten alles ins Environment 00093 foreach(item : all_inventory(ob)) 00094 { 00095 old_env=environment(item); 00096 // M_MOVE_ALL, falls item nen Unitobjekt ist. Sonst clonen die u.U. noch 00097 // wieder nen neues Objekt im alten Env. 00098 if(catch(item->move(env, M_NOCHECK|M_MOVE_ALL);publish)) 00099 recursive_remove(item, 1); 00100 else if (item && environment(item) == old_env) 00101 recursive_remove(item, 1); 00102 } 00103 } 00104 00105 return 0; // Erfolg 00106 }

| private void recursive_remove | ( | object | ob, | |
| int | immediate_destruct | |||
| ) |
Definiert in Zeile 14 der Datei destruct.c.
Benutzt destruct(), M_NOCHECK und M_TPORT.
00014 { 00015 00016 if (query_once_interactive(ob)) { 00017 // Spieler werden ins Void bewegt. 00018 int res; 00019 tell_object(ob, "Ploetzlich loest sich deine Welt in ihre " + 00020 "Bestandteile auf. Zum Glueck wirst\nDu irgendwo " + 00021 "hin geschleudert ...\n"); 00022 // wenn Bewegung buggt oder nicht funktioniert und ob noch existiert, 00023 // rekursiv zerstoeren. 00024 object oldenv=environment(ob); 00025 if ( (catch(res=(int)ob->move("/room/void",M_TPORT|M_NOCHECK,0,"faellt"); 00026 publish) || (ob && environment(ob) == oldenv) ) 00027 && ob) { 00028 // Spieler speichern, dann erst Inventar entleeren, dann remove() und 00029 // und destruct() anwenden. 00030 catch(ob->save_me(1); publish); 00031 filter(all_inventory(ob), #'recursive_remove, immediate_destruct); 00032 if (!immediate_destruct) 00033 catch(ob->remove(0);publish); 00034 if (ob) 00035 destruct(ob); 00036 } 00037 } 00038 else { 00039 // kein Spieler. Rekursiv entfernen. Hierbei _zuerst_ rekursiv das 00040 // Inventar entfernen und dann ob selber, damit nicht erst das Inventar in 00041 // das Environment bewegt wird (soll ja eh zerstoert werden). 00042 filter(all_inventory(ob), #'recursive_remove, immediate_destruct); 00043 // ggf. zuerst remove versuchen 00044 if (!immediate_destruct) 00045 catch(ob->remove(1);publish); 00046 if (ob) 00047 destruct(ob); 00048 } 00049 }

| private nosave string* deny_destruct_list |
({
"/obj/shut", "/room/void", "/room/netztot", "/room/jail" })
Definiert in Zeile 10 der Datei destruct.c.
Wird benutzt von prepare_destruct().
1.6.3