Pol  Revision:3cfda13
uvars.cpp
Go to the documentation of this file.
1 
16 #include "uvars.h"
17 
18 #include <string.h>
19 
20 #include "../../bscript/bobject.h"
21 #include "../../clib/boostutils.h"
22 #include "../../clib/clib_MD5.h"
23 #include "../../clib/logfacility.h"
24 #include "../../plib/systemstate.h"
25 #include "../accounts/account.h"
26 #include "../accounts/accounts.h"
27 #include "../checkpnt.h"
28 #include "../console.h"
29 #include "../guardrgn.h"
30 #include "../guilds.h"
31 #include "../item/equipmnt.h"
32 #include "../item/itemdesc.h"
33 #include "../item/weapon.h"
34 #include "../listenpt.h"
35 #include "../loadunld.h"
36 #include "../miscrgn.h"
37 #include "../mobile/attribute.h"
38 #include "../multi/boat.h"
39 #include "../musicrgn.h"
40 #include "../npctmpl.h"
41 #include "../objecthash.h"
42 #include "../party.h"
43 #include "../polcfg.h"
44 #include "../polsem.h"
45 #include "../realms/realm.h"
46 #include "../resource.h"
47 #include "../scrstore.h"
48 #include "../spells.h"
49 #include "../startloc.h"
50 #include "../storage.h"
51 #include "../syshook.h"
52 #include "../syshookscript.h"
53 #include "../uoskills.h"
54 #include "../uworld.h"
55 #include "../vital.h"
56 #include "multidefs.h"
57 #include "network.h"
58 #include "object_storage.h"
59 #include "script_internals.h"
60 #include "ucfg.h"
61 
62 #ifdef _MSC_VER
63 #pragma warning( \
64  disable : 4505 ) // '...': unreferenced local function has been removed (because of region.h)
65 #endif
66 
67 namespace Pol
68 {
69 namespace Core
70 {
71 // See comment in boost_utils::flyweight_initializers
73 
75 
76 
78  : cmdlevels(),
79  npc_templates(),
80  npc_template_elems(),
81  // Using force allocate because this is inited before reading global CProp setting
82  global_properties( new Core::PropertyList( CPropProfiler::Type::GLOBAL, true ) ),
83  accounts(),
84  startlocations(),
85  wrestling_weapon( nullptr ),
86  justicedef( nullptr ),
87  nocastdef( nullptr ),
88  lightdef( nullptr ),
89  weatherdef( nullptr ),
90  musicdef( nullptr ),
91  menus(),
92  storage(),
93  parties(),
94  guilds(),
95  nextguildid( 1 ),
96  main_realm( nullptr ),
97  Realms(),
98  shadowrealms_by_id(),
99  baserealm_count( 0 ),
100  shadowrealm_count( 0 ),
101 
102  update_rpm_task( new PeriodicTask( update_rpm, 60, "RPM" ) ),
103  regen_stats_task( new PeriodicTask( regen_stats, 5, "Regen" ) ),
104  regen_resources_task( new PeriodicTask( regen_resources, 10, 60 * 10, "RsrcRegen" ) ),
105  reload_accounts_task( new PeriodicTask( Accounts::reload_account_data, 30, "LOADACCT" ) ),
106  write_account_task( new PeriodicTask( Accounts::write_account_data_task, 60, "WRITEACCT" ) ),
107  update_sysload_task( new PeriodicTask( update_sysload, 1, "SYSLOAD" ) ),
108  reload_pol_cfg_task( new PeriodicTask( PolConfig::reload_pol_cfg, 30, "LOADPOLCFG" ) ),
109 
110  attributes(),
111  numAttributes( 0 ),
112  attributes_byname(),
113  pAttrStrength( nullptr ),
114  pAttrIntelligence( nullptr ),
115  pAttrDexterity( nullptr ),
116  pAttrParry( nullptr ),
117  pAttrTactics( nullptr ),
118 
119  // Magery is repeated at array entry 3, because as of right now, NO spellbook
120  // on OSI uses the 301+ spellrange that we can find. 5/30/06 - MuadDib
121  // We use Mysticism at array entry 3 because Mysticism spellids are 678 -> 693 and this slot
122  // is free.
123  spell_scroll_objtype_limits( {{// TODO: Comment those objtypes :D
124  {{0x1F2D, 0x1F6C}},
125  {{0x2260, 0x226F}},
126  {{0x2270, 0x227C}},
127  {{0x2D9E, 0x2DAD}},
128  {{0x238D, 0x2392}},
129  {{0x23A1, 0x23A8}},
130  {{0x2D51, 0x2D60}},
131  {{0x574B, 0x5750}}}} ),
132  spells(),
133  spellcircles(),
134  export_scripts(),
135  system_hooks(),
136  tipfilenames(),
137  armorzones(),
139  vitals(),
140  numVitals( 0 ),
141  pVitalLife( nullptr ),
142  pVitalStamina( nullptr ),
143  pVitalMana( nullptr ),
144  vitals_byname(),
145  desctable(),
148  objtype_byname(),
149  // The temp_itemdesc is used when something is created by graphic.
150  // another option is to create such ItemDesc objects on demand as needed, and keep them
151  // around.
154  resourcedefs(),
155 
157  boatshapes(),
158 
161  landtiles(),
162  landtiles_loaded( false ),
163  listen_points(),
164  wwwroot_pkg( nullptr ),
165  mime_types(),
166  task_queue(),
168  target_cursors(),
169  textcmds(),
170  paramtextcmds(),
171  uo_skills(),
173 {
174  memset( &mount_action_xlate, 0, sizeof( mount_action_xlate ) );
175 }
177 {
178  // FIXME: since deconstruction of externs has a more or less random order
179  // everything should be cleared before.
180  // or make sure that the globals get deconstructed before eg the flyweight string container
181 }
182 
184 
186 {
187  INFO_PRINT << "Initiating POL Cleanup....\n";
188 
190  deinit_ipc_vars();
191 
192  if ( Plib::systemstate.config.log_script_cycles )
194 
195  checkpoint( "cleaning up vars" );
196  cleanup_vars();
197  checkpoint( "cleaning up scripts" );
198  cleanup_scripts();
199 
200  // scripts remove their listening points when they exit..
201  // so there should be no listening points to clean up.
202  checkpoint( "cleaning listen points" );
204 
205 
206  // unload_other_objects
209 
210  // unload_itemdesc_scripts
211  for ( auto& elem : desctable )
212  {
213  elem.second->unload_scripts();
214  }
215 
217 
219 
220  unload_npc_templates(); // quick and nasty fix until npcdesc usage is rewritten Turley
221  // 2012-08-27: moved before objecthash due to npc-method_script cleanup
222 
226 
229 
230  checkpoint( "unloading data" );
231  unload_data();
232  guilds.clear();
233 
235 
236  checkpoint( "misc cleanup" );
237 
238  global_properties->clear();
239  menus.clear();
240 
241  textcmds.clear();
242  paramtextcmds.clear();
243  Global_Ignore_CProps.clear();
244  mime_types.clear();
245  console_commands.clear();
246  animation_translates.clear();
247 
248  tipfilenames.clear();
249 
251 
252  checkpoint( "end of xmain2" );
253 
254 #ifdef __linux__
255  unlink( ( Plib::systemstate.config.pidfile_path + "pol.pid" ).c_str() );
256 #endif
257 }
258 
259 
261 {
262  // dave added 9/27/03: accounts and player characters have a mutual reference that prevents them
263  // getting cleaned up
264  // properly. So clear the references now.
265  for ( auto& account : accounts )
266  {
267  for ( int i = 0; i < Plib::systemstate.config.character_slots; i++ )
268  account->clear_character( i );
269  }
270 
271  for ( auto& realm : Realms )
272  {
273  unsigned wgridx = realm->grid_width();
274  unsigned wgridy = realm->grid_height();
275 
276  for ( unsigned wx = 0; wx < wgridx; ++wx )
277  {
278  for ( unsigned wy = 0; wy < wgridy; ++wy )
279  {
280  for ( auto& item : realm->zone[wx][wy].items )
281  {
282  item->destroy();
283  }
284  realm->zone[wx][wy].items.clear();
285  }
286  }
287 
288  for ( unsigned wx = 0; wx < wgridx; ++wx )
289  {
290  for ( unsigned wy = 0; wy < wgridy; ++wy )
291  {
292  for ( auto& chr : realm->zone[wx][wy].characters )
293  {
294  chr->acct.clear(); // dave added 9/27/03, see above comment re: mutual references
295  chr->destroy();
296  }
297  realm->zone[wx][wy].characters.clear();
298  for ( auto& chr : realm->zone[wx][wy].npcs )
299  {
300  chr->acct.clear(); // dave added 9/27/03, see above comment re: mutual references
301  chr->destroy();
302  }
303  realm->zone[wx][wy].npcs.clear();
304  }
305  }
306 
307  for ( unsigned wx = 0; wx < wgridx; ++wx )
308  {
309  for ( unsigned wy = 0; wy < wgridy; ++wy )
310  {
311  for ( auto& multi : realm->zone[wx][wy].multis )
312  {
313  multi->destroy();
314  }
315  realm->zone[wx][wy].multis.clear();
316  }
317  }
318  }
319 
320  // dave renamed this 9/27/03, so we only have to traverse the objhash once, to clear out account
321  // references and delete.
322  // and Nando placed it outside the Realms' loop in 2009-01-18.
324 
325  accounts.clear();
327 
328  storage.clear();
329 
330  // RegionGroup cleanup _before_ Realm cleanup
331  delete justicedef;
332  delete lightdef;
333  delete nocastdef;
334  delete weatherdef;
335  delete musicdef;
336  clean_resources();
337 
338  Clib::delete_all( Realms );
339  shadowrealms_by_id.clear();
340  main_realm = nullptr;
341 
342  // delete_all(vitals);
343  clean_vitals();
345 
347  cmdlevels.clear();
348  clean_spells();
349  clean_skills();
350 }
351 
352 // Note, when the program exits, each executor in these queues
353 // will be deleted by cleanup_scripts()
354 // Therefore, any object that owns an executor must be destroyed
355 // before cleanup_scripts() is called.
356 
358 {
360 }
361 
363 {
364  for ( auto& lp_pair : listen_points )
365  {
366  ListenPoint* lp = lp_pair.second;
367  delete lp;
368  lp_pair.second = NULL;
369  }
370  listen_points.clear();
371 }
372 
374 {
375  if ( wrestling_weapon != NULL )
376  {
378  wrestling_weapon = NULL;
379  }
380 }
381 
383 {
384  for ( auto it = intrinsic_equipments.begin(); it != intrinsic_equipments.end(); ++it )
385  {
386  if ( it->second != NULL )
387  {
388  it->second->destroy();
389  it->second = NULL;
390  }
391  }
392  intrinsic_equipments.clear();
393 }
394 
395 // quick and nasty fix until npcdesc usage is rewritten
397 {
398  for ( auto& templates : npc_templates )
399  {
400  if ( templates.second != NULL )
401  delete templates.second;
402  templates.second = NULL;
403  }
404  npc_templates.clear();
405 
406  npc_template_elems.clear();
407 }
408 
409 
411 {
412  Memory usage;
413  memset( &usage, 0, sizeof( usage ) );
414 
415  usage.misc = sizeof( GameState );
416  for ( const auto& ele : cmdlevels )
417  usage.misc += ele.estimateSize();
418 
419  for ( const auto& ele : npc_templates )
420  {
421  usage.misc += ele.first.capacity() + sizeof( NpcTemplate* ) + ( sizeof( void* ) * 3 + 1 ) / 2;
422  if ( ele.second != nullptr )
423  usage.misc += ele.second->estimateSize();
424  }
425 
426  for ( const auto& ele : npc_template_elems )
427  {
428  usage.misc +=
429  ele.first.capacity() + ele.second.estimateSize() + ( sizeof( void* ) * 3 + 1 ) / 2;
430  }
431 
432  usage.misc += sizeof( std::unique_ptr<Core::PropertyList> ) + global_properties->estimatedSize();
433 
434 
435  usage.account_count = accounts.size();
436  usage.account_size += 3 * sizeof( AccountRef* ) + accounts.capacity() * sizeof( AccountRef );
437  for ( const auto& acc : accounts )
438  {
439  if ( acc.get() != nullptr )
440  usage.account_size += acc->estimatedSize();
441  }
442 
443  for ( const auto& loc : startlocations )
444  {
445  if ( loc != nullptr )
446  usage.misc += loc->estimateSize();
447  }
448 
449  if ( justicedef != nullptr )
450  usage.misc += justicedef->estimateSize();
451  if ( nocastdef != nullptr )
452  usage.misc += nocastdef->estimateSize();
453  if ( lightdef != nullptr )
454  usage.misc += lightdef->estimateSize();
455  if ( weatherdef != nullptr )
456  usage.misc += weatherdef->estimateSize();
457  if ( musicdef != nullptr )
458  usage.misc += musicdef->estimateSize();
459 
460  for ( const auto& menu : menus )
461  usage.misc += menu.estimateSize();
462 
463  usage.misc += storage.estimateSize();
464 
465  for ( const auto& party : parties )
466  if ( party.get() != nullptr )
467  usage.misc += party->estimateSize();
468 
469  for ( const auto& guild : guilds )
470  if ( guild.second.get() != nullptr )
471  usage.misc +=
472  sizeof( unsigned int ) + guild.second->estimateSize() + ( sizeof( void* ) * 3 + 1 ) / 2;
473 
474  for ( const auto& realm : Realms )
475  {
476  if ( realm != nullptr )
477  usage.realm_size += realm->sizeEstimate();
478  }
479  usage.realm_size +=
480  ( sizeof( int ) + sizeof( Realms::Realm* ) + ( sizeof( void* ) * 3 + 1 ) / 2 ) *
481  gamestate.shadowrealms_by_id.size();
482 
483  for ( const auto& attr : attributes )
484  {
485  if ( attr != nullptr )
486  usage.misc += attr->estimateSize();
487  }
488 
489  for ( const auto& attr : attributes_byname )
490  {
491  usage.misc +=
492  attr.first.capacity() + sizeof( Mobile::Attribute* ) + ( sizeof( void* ) * 3 + 1 ) / 2;
493  }
494 
495  usage.misc += 3 * sizeof( USpell** ) + spells.capacity() * sizeof( USpell* );
496  for ( const auto& spell : spells )
497  {
498  if ( spell != nullptr )
499  usage.misc += spell->estimateSize();
500  }
501  usage.misc += 3 * sizeof( SpellCircle** ) +
502  spellcircles.capacity() * ( sizeof( SpellCircle* ) + sizeof( SpellCircle ) );
503 
504  usage.misc += 3 * sizeof( ExportScript** ) + export_scripts.capacity() * sizeof( ExportScript* );
505  for ( const auto& script : export_scripts )
506  {
507  if ( script != nullptr )
508  usage.misc += script->estimateSize();
509  }
510 
511  for ( const auto& name : tipfilenames )
512  {
513  usage.misc += name.capacity();
514  }
515 
516  for ( const auto& zone : armorzones )
517  {
518  usage.misc += zone.name.capacity() + sizeof( double ) + 3 * sizeof( unsigned short* ) +
519  zone.layers.capacity() * sizeof( unsigned short );
520  }
521 
522  usage.misc += 3 * sizeof( Vital** ) + vitals.capacity() * sizeof( Vital* );
523  for ( const auto& vital : vitals )
524  {
525  if ( vital != nullptr )
526  usage.misc += vital->estimateSize();
527  }
528  for ( const auto& vital : vitals_byname )
529  usage.misc += vital.first.capacity() + sizeof( Vital* ) + ( sizeof( void* ) * 3 + 1 ) / 2;
530 
531 
532  usage.misc += ( sizeof( u32 ) + sizeof( Items::ItemDesc* ) + ( sizeof( void* ) * 3 + 1 ) / 2 ) *
533  desctable.size();
534  for ( const auto& elem : desctable )
535  {
536  if ( elem.second != nullptr )
537  usage.misc += elem.second->estimatedSize();
538  }
539  for ( const auto& elem : dynamic_item_descriptors )
540  {
541  if ( elem != nullptr )
542  usage.misc += elem->estimatedSize();
543  }
544  usage.misc +=
545  ( sizeof( unsigned int ) + sizeof( unsigned int ) + ( sizeof( void* ) * 3 + 1 ) / 2 ) *
547 
548  for ( const auto& elem : objtype_byname )
549  usage.misc += elem.first.capacity() + sizeof( u32 ) + ( sizeof( void* ) * 3 + 1 ) / 2;
550 
551  for ( const auto& elem : resourcedefs )
552  {
553  usage.misc += elem.first.capacity() + sizeof( ResourceDef* ) + ( sizeof( void* ) * 3 + 1 ) / 2;
554  if ( elem.second != nullptr )
555  usage.misc += elem.second->estimateSize();
556  }
557  for ( const auto& elem : intrinsic_equipments )
558  {
559  usage.misc += elem.first.first.capacity() + sizeof( u8 ) + sizeof( Items::Equipment* ) +
560  ( sizeof( void* ) * 3 + 1 ) / 2;
561  }
562  for ( const auto& elem : boatshapes )
563  {
564  usage.misc += sizeof( u16 ) + sizeof( Multi::BoatShape* ) + ( sizeof( void* ) * 3 + 1 ) / 2;
565  if ( elem.second != nullptr )
566  usage.misc += elem.second->estimateSize();
567  }
568 
569  for ( const auto& elem : animation_translates )
570  {
571  usage.misc +=
572  elem.first.capacity() + elem.second.estimateSize() + ( sizeof( void* ) * 3 + 1 ) / 2;
573  }
574 
575  for ( const auto& elem : console_commands )
576  {
577  usage.misc += elem.estimateSize();
578  }
579  usage.misc += ( sizeof( UOExecutor* ) + sizeof( ListenPoint* ) + sizeof( ListenPoint ) +
580  ( sizeof( void* ) * 3 + 1 ) / 2 ) *
581  listen_points.size();
582  for ( const auto& elem : mime_types )
583  {
584  usage.misc += elem.first.capacity() + elem.second.capacity() + ( sizeof( void* ) * 3 + 1 ) / 2;
585  }
586 
587  usage.misc += task_queue.size() * ( sizeof( ScheduledTask* ) + sizeof( ScheduledTask ) );
588 
589  for ( const auto& elem : Global_Ignore_CProps )
590  usage.misc += elem.capacity() + 3 * sizeof( void* );
591 
592  for ( const auto& elem : textcmds )
593  {
594  usage.misc += elem.first.capacity() + sizeof( elem.second ) + ( sizeof( void* ) * 3 + 1 ) / 2;
595  }
596  for ( const auto& elem : paramtextcmds )
597  {
598  usage.misc += elem.first.capacity() + sizeof( elem.second ) + ( sizeof( void* ) * 3 + 1 ) / 2;
599  }
600 
601  for ( const auto& elem : uo_skills )
602  {
603  usage.misc += elem.estimateSize();
604  }
605  return usage;
606 }
607 }
608 }
virtual size_t estimateSize() const POL_OVERRIDE
Definition: miscrgn.cpp:107
unsigned char u8
Definition: rawtypes.h:25
NpcTemplates npc_templates
Definition: uvars.h:139
AccountsVector accounts
Definition: uvars.h:144
PropSet Global_Ignore_CProps
Definition: uvars.h:232
TaskQueue task_queue
Definition: uvars.h:230
std::map< std::string, std::string > mime_types
Definition: uvars.h:228
void delete_all(T &coll)
Definition: stlutil.h:24
std::vector< Items::ItemDesc * > dynamic_item_descriptors
Definition: uvars.h:206
IntrinsicEquipments intrinsic_equipments
Definition: uvars.h:213
SystemState systemstate
Definition: systemstate.cpp:12
Core::PolConfig config
Definition: systemstate.h:43
void unload_npc_templates()
Definition: uvars.cpp:396
Cursors target_cursors
Definition: uvars.h:234
void log_all_script_cycle_counts(bool clear_counters)
Definition: scrstore.cpp:157
threadhelp::TaskThreadPool task_thread_pool
Definition: uvars.h:248
const Vital * pVitalLife
Definition: uvars.h:199
void clear_listen_points()
Definition: uvars.cpp:362
void unload_data()
Definition: loadunld.cpp:273
void clean_skills()
Definition: uoskills.cpp:92
SystemHooks system_hooks
Definition: uvars.h:190
void clean_spells()
Definition: spells.cpp:502
MusicDef * musicdef
Definition: uvars.h:152
std::vector< UOSkill > uo_skills
Definition: uvars.h:239
void unload_intrinsic_templates()
Definition: uvars.cpp:382
ResourceDefs resourcedefs
Definition: uvars.h:211
void regen_stats()
Definition: tasks.cpp:43
TextCmds textcmds
Definition: uvars.h:236
AttributesByName attributes_byname
Definition: uvars.h:178
std::unique_ptr< Core::PropertyList > global_properties
Definition: uvars.h:142
CmdLevels cmdlevels
Definition: uvars.h:137
void update_sysload()
Definition: tasks.cpp:320
void display_leftover_objects()
Definition: pol.cpp:976
void clean_boatshapes()
Definition: boat.cpp:264
Memory estimateSize() const
Definition: uvars.cpp:410
VitalsByName vitals_byname
Definition: uvars.h:202
UACTION mount_action_xlate[ACTION__HIGHEST+1]
Definition: uvars.h:217
LightDef * lightdef
Definition: uvars.h:150
void clean_vitals()
Definition: vital.cpp:71
ListenPoints listen_points
Definition: uvars.h:225
std::unique_ptr< Items::ItemDesc > temp_itemdesc
Definition: uvars.h:209
static void ReleaseSharedInstance()
Definition: bobject.h:483
std::unique_ptr< Items::ItemDesc > empty_itemdesc
Definition: uvars.h:208
unsigned short u16
Definition: rawtypes.h:26
unsigned int u32
Definition: rawtypes.h:27
virtual size_t estimateSize() const
Definition: region.cpp:200
std::vector< Menu > menus
Definition: uvars.h:154
std::map< std::string, MobileTranslate > animation_translates
Definition: uvars.h:218
std::vector< ConsoleCommand > console_commands
Definition: uvars.h:220
virtual void destroy()
Definition: uobject.cpp:122
void reload_account_data(void)
Definition: accounts.cpp:202
void checkpoint(const char *msg, unsigned short minlvl)
Definition: checkpnt.cpp:17
std::vector< std::string > tipfilenames
Definition: uvars.h:192
Plib::Package * wwwroot_pkg
Definition: uvars.h:227
Definition: refptr.h:64
std::vector< Realms::Realm * > Realms
Definition: uvars.h:163
NpcTemplatesElems npc_template_elems
Definition: uvars.h:140
NetworkManager networkManager
Definition: network.cpp:28
boost_utils::flyweight_initializers fw_inits
Definition: uvars.cpp:72
ConfigurationBuffer configurationbuffer
Definition: ucfg.cpp:13
void clean_attributes()
Definition: attribute.cpp:118
bool landtiles_loaded
Definition: uvars.h:223
JusticeDef * justicedef
Definition: uvars.h:148
Parties parties
Definition: uvars.h:158
void cleanup_scripts()
Definition: uvars.cpp:357
ParamTextCmds paramtextcmds
Definition: uvars.h:237
std::array< LandTile, LANDTILE_COUNT > landtiles
Definition: uvars.h:222
std::vector< Mobile::Attribute * > attributes
Definition: uvars.h:176
void unload_intrinsic_weapons()
Definition: uvars.cpp:373
void write_account_data_task(void)
Definition: accounts.cpp:240
void ClearCharacterAccountReferences()
Definition: objecthash.cpp:220
NoCastDef * nocastdef
Definition: uvars.h:149
const Vital * pVitalStamina
Definition: uvars.h:200
GameState gamestate
Definition: uvars.cpp:74
const Vital * pVitalMana
Definition: uvars.h:201
std::vector< USpell * > spells
Definition: uvars.h:186
unsigned numVitals
Definition: uvars.h:198
ScriptScheduler scriptScheduler
void MD5_Cleanup()
Definition: clib_MD5.cpp:112
ref_ptr< Accounts::Account > AccountRef
Definition: reftypes.h:45
ArmorZones armorzones
Definition: uvars.h:194
void deinit_ipc_vars()
Definition: polsem.cpp:186
ObjtypeByNameMap objtype_byname
Definition: uvars.h:207
OldObjtypeConversions old_objtype_conversions
Definition: uvars.h:205
ObjectStorageManager objStorageManager
std::string name
Definition: osmod.cpp:943
std::vector< ExportScript * > export_scripts
Definition: uvars.h:189
void clean_resources()
Definition: resource.cpp:488
std::map< u32, Items::ItemDesc * > desctable
Definition: uvars.h:204
WeatherDef * weatherdef
Definition: uvars.h:151
double armor_zone_chance_sum
Definition: uvars.h:195
StartingLocations startlocations
Definition: uvars.h:145
BoatShapes boatshapes
Definition: uvars.h:215
void update_rpm(void)
Definition: tasks.cpp:156
Items::UWeapon * wrestling_weapon
Definition: uvars.h:146
#define INFO_PRINT
Definition: logfacility.h:223
unsigned short character_slots
Definition: polcfg.h:65
void regen_resources()
Definition: resource.cpp:238
std::map< int, Realms::Realm * > shadowrealms_by_id
Definition: uvars.h:164
size_t estimateSize() const
Definition: storage.cpp:287
std::vector< SpellCircle * > spellcircles
Definition: uvars.h:187
Realms::Realm * main_realm
Definition: uvars.h:162
Storage storage
Definition: uvars.h:156
Definition: berror.cpp:12
MultiDefBuffer multidef_buffer
Definition: multidefs.cpp:19
std::vector< Vital * > vitals
Definition: uvars.h:197