/** * The property handling system. This handles all the stuff to do with * properties. * @author Pinkfish */ mapping map_prop; mapping timed_properties; void create() { /* don't init the mapping to save memory */ } /* create() */ /** * Adds a property onto the object. Allows you to add a property * onto the current object. You can also set a time for the property * to last. * @param var the name of the property * @param val the value to give the property * @param tim the time before the property should time out * @return 1 if it succeeded, 0 if it failed. */ varargs int add_property( string var, mixed val, int tim ) { if( !stringp(var) || !val ) return 0; if( !map_prop ) map_prop = ([ ]); map_prop[var] = val; if( tim > 0 ) { if( !timed_properties ) timed_properties = ([ ]); timed_properties[var] = tim + time(); } if( var == "silenced" ) log_file("/secure/log/SILENCED", "%s silenced on %s\n", TO->query_name(), ctime(time()) ); return 1; } /* add_property() */ /** * Removes a property off the object. This removes the named property * from the object. * @param var the name of the property * @return always returns 1 */ int remove_property( string var ) { if( map_prop ) map_delete( map_prop, var ); if( timed_properties ) map_delete( timed_properties, var ); if( var == "silenced" ) log_file("/secure/log/SILENCED", "%s unsilenced on %s\n", TO->query_name(), ctime(time()) ); return 1; } /* remove_property() */ /** * Returns the value of the property. This will return the current value * of the named property. * @param str the property to find * @return the value of the property */ mixed query_property( string str ) { if( !map_prop ) return 0; if( timed_properties && timed_properties[str] && timed_properties[str] < time() ) { map_delete( timed_properties, str ); map_delete( map_prop, str ); return map_prop[str]; } return map_prop[str]; } /* query_property() */ /** * Is this property value timed? * @return 1 if it is, 0 if not * @param str the property to check */ int query_is_timed_property( string str ) { if( timed_properties && timed_properties[str] ) { if( timed_properties[str] < time() ) { map_delete( timed_properties, str ); map_delete( map_prop, str ); return 0; } return 1; } return 0; } /* query_is_timed_property() */ /** * If this is a timed property it returns the amount of time left. * @param str the property name * @return the amount of time left */ int query_property_time_left( string str ) { if( timed_properties && timed_properties[str] ) { if( timed_properties[str] < time() ) { map_delete( timed_properties, str ); map_delete( map_prop, str ); return 0; } return timed_properties[str] - time(); } return 0; } /* query_property_time_left() */ /** * returns a mapping with all the properties in it. * @return a mapping of all the properties */ mapping query_properties() { return map_prop || ([ ]); } /* query_properties() */ /** * Returns a mapping of all the timed properties. * @return a mapping of all the timed properties */ mapping query_timed_properties() { return timed_properties || ([ ]); } /* query_timed_properties() */ /** * Adds a mapping of properties in, instead of just one. * @param map the mapping of properties */ void add_properties( mapping map ) { if( !map_prop ) map_prop = map; else map_prop += map; } /* add_properties() */ /** * Updates the timeouts and stuff before saving the player object. */ protected void save_player_properties() { if( timed_properties ) { foreach( string key in keys(timed_properties) ) if( timed_properties[ key ] < time() ) { map_delete( timed_properties, key ); map_delete( map_prop, key ); } else timed_properties[ key ] -= time(); } } /* save_player_properties() */ /** * Fixes the times back up again after it has been loaded. */ protected void reload_player_properties() { if( timed_properties ) foreach( string key in keys(timed_properties) ) timed_properties[ key ] += time(); } /* reload_player_properties() */ /** @ignore yes */ mixed stats() { int time; mixed *res, value; string key; mapping props; if( !props = (mapping)TO->query_properties() ) return ({ }); res = ({ }); foreach( key, value in props ) { time = 0; if( timed_properties && timed_properties[ key ] && timed_properties[ key ] < time() ) { map_delete( timed_properties, key ); map_delete( map_prop, key ); continue; } if( timed_properties && timed_properties[ key ] ) time = timed_properties[ key ] - time(); if( !stringp( key ) || key[0..3] == "news" || key[0] == '.' ) continue; if( pointerp( value ) ) { res += ({ ({ "(" + key + ( time ? ":" + time : "") + ")", array_to_string( value ) }) }); continue; } if( mappingp( value ) ) { res += ({ ({ "(" + key + ( time ? ":" + time : "") + ")", mapping_to_string( value ) }) }); continue; } res += ({ ({ "("+ key + ( time ? ":" + time : "" ) +")", value }) }); } return res; } /* stats() */