#include "/sys/thing/properties.h"#include "/secure/wizlevels.h"
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
Funktionen | |
| protected void | InitializeProperties () |
| protected void | create () |
| protected void | create_super () |
| nomask private int | allowed () |
| public varargs mixed | Set (string name, mixed Value, int Type, int extern) |
| public varargs mixed | Query (string name, int Type) |
| public mixed | SetProp (string name, mixed Value) |
| public mixed | QueryProp (string name) |
| public void | SetProperties (mapping props) |
| public mapping | QueryProperties () |
| public mixed * | __query_properties () |
| public void | _set_save_data (mixed data) |
| public mixed | _get_save_data () |
Variablen | |
| private nosave mapping * | prop = ({ ([]), ([]), ([]), ([]) }) |
| private mapping | properties |
| private nosave int | closure_call |
| #define NEED_PROTOTYPES |
Definiert in Zeile 21 der Datei properties.c.
| public mixed* __query_properties | ( | ) |
Definiert in Zeile 311 der Datei properties.c.
Benutzt prop.
| public mixed _get_save_data | ( | ) |
| public void _set_save_data | ( | mixed | data | ) |
| nomask private int allowed | ( | ) |
Definiert in Zeile 58 der Datei properties.c.
| protected void create | ( | ) |
Definiert in Zeile 47 der Datei properties.c.
Benutzt set_next_reset().
00047 { 00048 // Blueprints in /std benoetigenkeinen Reset .... 00049 if (object_name()=="/std/thing/properties") 00050 set_next_reset(-1); 00051 }

| protected void create_super | ( | ) |
Definiert in Zeile 53 der Datei properties.c.
Benutzt set_next_reset().
00053 { 00054 set_next_reset(-1); 00055 }

| protected void InitializeProperties | ( | ) |
Definiert in Zeile 41 der Datei properties.c.
Benutzt prop.
00041 { 00042 prop = ({ ([]), ([]), ([]), ([]) }); 00043 return; 00044 }
| public varargs mixed Query | ( | string | name, | |
| int | Type | |||
| ) |
| public mixed QueryProp | ( | string | name | ) |
Definiert in Zeile 197 der Datei properties.c.
Benutzt closure_call, F_QUERY_METHOD, F_VALUE, flag, prop und result().
00198 { 00199 closure func; 00200 mixed result; 00201 00202 // nur fuer heute 00203 if (!objectp(this_object())) 00204 return; 00205 00206 // Query-Methode vorhanden? 00207 if ( func = prop[F_QUERY_METHOD][name] ) 00208 { 00209 int flag; 00210 00211 // Wert als Query-Method? Gleich zurueckgeben ... 00212 if (!closurep(func)) return func; 00213 00214 // An dieser Stelle muss func eine Closure sein. Da Set() ungebundene 00215 // Lambdas bindet, kann es auch nur eine gebundene Closure sein und das 00216 // Objekt existiert auch noch (sonst waere func == 0). 00217 00218 // closure_call setzen, falls noch nicht gesetzt 00219 if ((flag=closure_call<time())) 00220 closure_call = time()+59; 00221 00222 // Dann Mal die Closure aufrufen. Bei Fehler selbige loeschen 00223 if (catch(result=funcall(func);publish)) 00224 { 00225 prop[F_QUERY_METHOD]-=([name]); 00226 } 00227 // Wenn closure_call gesetzt wurde, wieder loeschen 00228 if (flag) closure_call = 0; 00229 00230 // Und zurueckgeben 00231 return result; 00232 } 00233 00234 // _query_*-Methode vorhanden? falls ja, aufrufen. 00235 // TODO: Closurecache und nur rufen, wenn es _query_* auch gibt? 00236 if (call_resolved(&result,this_object(),"_query_"+name)) 00237 return result; 00238 00239 // Hilft alles nichts. Es ist eine 'normale' Property ... 00240 return prop[F_VALUE][name]; 00241 }

| public mapping QueryProperties | ( | ) |
Definiert in Zeile 289 der Datei properties.c.
00290 { 00291 mapping props; 00292 int i, j; 00293 string *names; 00294 00295 props = m_allocate( 0, 4 ); 00296 00297 if (pointerp(prop)) 00298 { 00299 i=4; 00300 while(i--) 00301 { 00302 names = m_indices(prop[i]); 00303 j=sizeof(names); 00304 while(j--) props[names[j], i] = prop[i][names[j]]; 00305 } 00306 } 00307 return props; 00308 }
| public varargs mixed Set | ( | string | name, | |
| mixed | Value, | |||
| int | Type, | |||
| int | extern | |||
| ) |
Definiert in Zeile 70 der Datei properties.c.
Benutzt allowed, closure_call, F_MODE, F_MODE_AD, F_MODE_AS, F_QUERY_METHOD, F_SET_METHOD, NOSETMETHOD, prop, PROTECTED, query_closure_object() und SECURED.
00071 { 00072 00073 if (!objectp(this_object())) 00074 return 0; 00075 00076 // Properties, die SECURED oder PROTECTED sind, duerfen nur vom Objekt 00077 // selber, EM+ oder ROOT veraendert werden 00078 if ((prop[F_MODE][name]&(PROTECTED|SECURED))&& 00079 (closure_call||extern||extern_call()) && 00080 previous_object() != this_object() && !allowed()) 00081 return -1; 00082 00083 // Das SECURED-Flag darf bei Properties nicht mehr geloescht werden 00084 if ((prop[F_MODE][name]&SECURED)&& 00085 (Type==F_MODE||Type==F_MODE_AD)&&(Value & SECURED)) 00086 return -2; 00087 00088 // Setzen duerfen das SECURED-Flag nur das Objekt selber, EM+ oder ROOT 00089 if ((Type==F_MODE||Type==F_MODE_AS)&&(Value&SECURED)&& 00090 (closure_call ||extern || extern_call()) && 00091 previous_object() != this_object() && !allowed() ) 00092 return -3; 00093 00094 switch(Type) 00095 { 00096 // Je nach Modus Flags veraendern 00097 case F_MODE_AS: prop[F_MODE][name]|= Value; 00098 return prop[F_MODE][name]; 00099 case F_MODE_AD: prop[F_MODE][name]&= ~Value; 00100 if (!prop[F_MODE][name]) prop[F_MODE]-=([name]); 00101 return prop[F_MODE][name]; 00102 case F_MODE: prop[F_MODE][name]^= Value; 00103 if (!prop[F_MODE][name]) prop[F_MODE]-=([name]); 00104 return prop[F_MODE][name]; 00105 case F_SET_METHOD: 00106 // -1 als Setz-Methode: Nosetmethod setzen 00107 if (Value == -1) 00108 { 00109 prop[F_SET_METHOD]-=([name]); 00110 prop[F_MODE][name] |= NOSETMETHOD; 00111 return 0; 00112 } 00113 // Kein break! 00114 case F_QUERY_METHOD: 00115 // Ungebundene Lambda_Closure? Binden! 00116 if (closurep(Value)&&!query_closure_object(Value)) 00117 { 00118 if (extern_call() && 00119 (getuid(previous_object()) != getuid()|| 00120 geteuid(previous_object()) != geteuid())) 00121 return prop[Type][name]; 00122 00123 Value = bind_lambda( Value,this_object()); 00124 } 00125 // Kein break! 00126 default: 00127 if (!Value) prop[Type]-=([name]); 00128 else prop[Type][name] = Value; 00129 } 00130 00131 // Gesamtwert zurueckgeben 00132 return prop[Type][name]; 00133 }

| public mixed SetProp | ( | string | name, | |
| mixed | Value | |||
| ) |
Definiert in Zeile 144 der Datei properties.c.
Benutzt closure_call, F_MODE, F_SET_METHOD, F_VALUE, flag, NOSETMETHOD, prop, result() und Set().
Wird benutzt von _cd2(), _channel(), _check_wear_restrictions(), _clone_items(), _echo(), _examine(), _flush_cache(), _look(), _msg_beep(), _msg_prepend(), _oropax(), _query_questpoints(), _query_total_light(), _sense_exa(), _set_autoloadobj(), _set_disable_attack(), _set_extern_attributes_modifier(), _set_extern_health_modifier(), _set_frog(), _set_max_hp(), _set_max_sp(), _set_resistance(), _set_vulnerability(), _set_weight(), _setcmsg(), _setdmsg(), _toggle_brief(), _traenke(), add_player(), AddAmount(), AddArmour(), AddDefender(), AddExp(), AddItem(), AddLiquid(), AddPursuer(), AddRoomMessage(), AddSkill(), AddSpell(), AddWeapon(), AssocMember(), Attack(), binde_seil(), blaettere(), catch_up_hbs(), ChannelAdmin(), ChannelParser(), check_and_update_timed_key(), CiceroneCmd(), consume(), create(), create_default_npc(), Damage(), DeAssocMember(), defuel_drink(), defuel_food(), DelayPreparedSpells(), desc_check(), do_damage(), do_decay(), DoUnwear(), DoUnwield(), DoWear(), DoWield(), drink_alcohol(), drink_soft(), drink_this(), DryPlant(), eat_food(), eat_this(), empty(), FinalSetup(), FreeHands(), fuelle(), geschmack(), getmode(), getstatus(), getstring(), gettext(), heal_self(), heart_beat(), Identify(), init(), InitSkills(), InsertSensitiveObjectToList(), IsEqual(), lies(), LiquidContDescr(), liste(), loese_seil(), long(), MakeDrink(), mnpc_create(), move(), name(), NewbieChangeMsg(), NewbieStatusMsg(), NotifyMove(), oeffne(), Pacify(), PourLiquid(), QueryDamage(), QueryDefend(), QueryPreferedEnemy(), quit(), reduce_hit_points(), reduce_spell_points(), RegisterChannels(), reise(), remove(), RemoveDefender(), RemoveExit(), RemoveItem(), RemovePursuer(), RemoveSensitiveObjectFromList(), reset(), restore_spell_points(), schliesse(), set_email(), set_homepage(), set_icq(), set_messenger(), SetAttackChats(), SetChats(), SetEvalFactor(), setup(), team_aufnahmewunsch(), tie(), ungewaehlt(), unterschreibe(), UnwearArmour(), UnwearClothing(), UseHands(), walk_random(), WearArmour() und WearClothing().
00145 { 00146 closure func; 00147 mixed result; 00148 00149 // nur fuer heute 00150 if (!objectp(this_object())) 00151 return 0; 00152 00153 // NOSETMETHOD: Darf nicht gesetzt werden 00154 if (prop[F_MODE][name] & NOSETMETHOD ) return -1; 00155 00156 // Set-Method abfragen, so vorhanden 00157 if (func=prop[F_SET_METHOD][name]) 00158 { 00159 int flag; 00160 00161 // Wert als Set-Method? gleich zurueckgeben 00162 if (!closurep(func)) return func; 00163 00164 // An dieser Stelle muss func eine Closure sein. Da Set() ungebundene 00165 // Lambdas bindet, kann es auch nur eine gebundene Closure sein und das 00166 // Objekt existiert auch noch (sonst waere func == 0). 00167 00168 // closure_call setzen, falls noch nicht gesetzt 00169 if ((flag=closure_call<time())) 00170 closure_call = time()+59; 00171 00172 // Dann mal die Closure aufrufen. Bei Fehler selbige loeschen 00173 if (catch(result=funcall(func, Value, name);publish)) 00174 { 00175 prop[F_SET_METHOD]-=([name]); 00176 } 00177 00178 // Wenn closure_call gesetzt wurde, wieder loeschen 00179 if (flag) closure_call = 0; 00180 00181 // Und zurueckgeben 00182 return result; 00183 } 00184 00185 // _set_*-Methode vorhanden? falls ja, aufrufen.i 00186 // TODO: Closurecache einfuehren und Funktionaufruf nur noch machen, wenn es 00187 // die _set_* auch gibt? 00188 if (call_resolved(&result,this_object(),"_set_"+name,Value )) 00189 return result; 00190 00191 // Letzte Moeglichkeit: Muss eine 'normale' Property sein 00192 return Set( name, Value, F_VALUE, extern_call() ); 00193 }

| public void SetProperties | ( | mapping | props | ) |
Definiert in Zeile 245 der Datei properties.c.
Benutzt allowed, closure_call, F_MODE, i, prop, PROTECTED und SECURED.
00246 { 00247 string *names; 00248 int i, j, same_object; 00249 00250 // Kein Mapping? Schlecht ... 00251 if(!mappingp(props)) return; 00252 00253 // Setzen wir selber? 00254 same_object = (!closure_call && 00255 (!extern_call()||previous_object()==this_object()|| 00256 allowed())); 00257 names = m_indices(props); 00258 00259 // Das SECURED-Flag darf nur durch das Objekt selber gesetzt werden: 00260 // Alle SECURED-Flags aus props loeschen 00261 if (!same_object) 00262 { 00263 j=sizeof(names); 00264 while(j--) props[names[j], F_MODE] &= ~SECURED; 00265 } 00266 00267 j=sizeof(names); 00268 while(j--) 00269 { 00270 // Properties, die schon SECURED oder PROTECTED sind, duerfen 00271 // nur vom Objekt selber manipuliert werden 00272 if (same_object||!(prop[F_MODE][names[j]] & (PROTECTED|SECURED)) ) 00273 { 00274 i=4; 00275 while(i--) 00276 { 00277 if(props[names[j],i]) 00278 prop[i][names[j]] = props[names[j], i]; 00279 else 00280 prop[i]-=([names[j]]); 00281 } 00282 } 00283 } 00284 return; 00285 }
| private nosave int closure_call |
Definiert in Zeile 34 der Datei properties.c.
Wird benutzt von QueryProp(), Set(), SetProp() und SetProperties().
| private nosave mapping* prop = ({ ([]), ([]), ([]), ([]) }) |
Definiert in Zeile 28 der Datei properties.c.
Wird benutzt von __query_properties(), _query_name(), InitializeProperties(), Query(), QueryProp(), QueryProperties(), Set(), SetProp() und SetProperties().
| private mapping properties |
Definiert in Zeile 31 der Datei properties.c.
1.6.3