2 * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 /// \addtogroup world The World
28 #include "Policies/Singleton.h"
29 #include "SharedDefines.h"
30 #include "ace/Atomic_Op.h"
48 enum ServerMessageType
50 SERVER_MSG_SHUTDOWN_TIME
= 1,
51 SERVER_MSG_RESTART_TIME
= 2,
52 SERVER_MSG_STRING
= 3,
53 SERVER_MSG_SHUTDOWN_CANCELLED
= 4,
54 SERVER_MSG_RESTART_CANCELLED
= 5
59 SHUTDOWN_MASK_RESTART
= 1,
60 SHUTDOWN_MASK_IDLE
= 2,
65 SHUTDOWN_EXIT_CODE
= 0,
67 RESTART_EXIT_CODE
= 2,
70 /// Timers for different object refresh rates
83 /// Configuration elements
86 CONFIG_COMPRESSION
= 0,
89 CONFIG_INTERVAL_GRIDCLEAN
,
90 CONFIG_INTERVAL_MAPUPDATE
,
91 CONFIG_INTERVAL_CHANGEWEATHER
,
93 CONFIG_SOCKET_SELECTTIME
,
94 CONFIG_GROUP_XP_DISTANCE
,
99 CONFIG_ALLOW_TWO_SIDE_ACCOUNTS
,
100 CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT
,
101 CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL
,
102 CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
,
103 CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
,
104 CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION
,
105 CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL
,
106 CONFIG_ALLOW_TWO_SIDE_WHO_LIST
,
107 CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND
,
108 CONFIG_STRICT_PLAYER_NAMES
,
109 CONFIG_STRICT_CHARTER_NAMES
,
110 CONFIG_STRICT_PET_NAMES
,
111 CONFIG_MIN_PLAYER_NAME
,
112 CONFIG_MIN_CHARTER_NAME
,
114 CONFIG_CHARACTERS_CREATING_DISABLED
,
115 CONFIG_CHARACTERS_PER_ACCOUNT
,
116 CONFIG_CHARACTERS_PER_REALM
,
117 CONFIG_HEROIC_CHARACTERS_PER_REALM
,
118 CONFIG_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING
,
119 CONFIG_SKIP_CINEMATICS
,
120 CONFIG_MAX_PLAYER_LEVEL
,
121 CONFIG_START_PLAYER_LEVEL
,
122 CONFIG_START_HEROIC_PLAYER_LEVEL
,
123 CONFIG_START_PLAYER_MONEY
,
124 CONFIG_MAX_HONOR_POINTS
,
125 CONFIG_START_HONOR_POINTS
,
126 CONFIG_MAX_ARENA_POINTS
,
127 CONFIG_START_ARENA_POINTS
,
128 CONFIG_INSTANCE_IGNORE_LEVEL
,
129 CONFIG_INSTANCE_IGNORE_RAID
,
130 CONFIG_INSTANCE_RESET_TIME_HOUR
,
131 CONFIG_INSTANCE_UNLOAD_DELAY
,
133 CONFIG_MAX_PRIMARY_TRADE_SKILL
,
134 CONFIG_MIN_PETITION_SIGNS
,
135 CONFIG_GM_LOGIN_STATE
,
136 CONFIG_GM_VISIBLE_STATE
,
137 CONFIG_GM_ACCEPT_TICKETS
,
139 CONFIG_GM_WISPERING_TO
,
140 CONFIG_GM_LEVEL_IN_GM_LIST
,
141 CONFIG_GM_LEVEL_IN_WHO_LIST
,
143 CONFIG_START_GM_LEVEL
,
144 CONFIG_GM_LOWER_SECURITY
,
145 CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS
,
146 CONFIG_GROUP_VISIBILITY
,
147 CONFIG_MAIL_DELIVERY_DELAY
,
148 CONFIG_UPTIME_UPDATE
,
149 CONFIG_SKILL_CHANCE_ORANGE
,
150 CONFIG_SKILL_CHANCE_YELLOW
,
151 CONFIG_SKILL_CHANCE_GREEN
,
152 CONFIG_SKILL_CHANCE_GREY
,
153 CONFIG_SKILL_CHANCE_MINING_STEPS
,
154 CONFIG_SKILL_CHANCE_SKINNING_STEPS
,
155 CONFIG_SKILL_PROSPECTING
,
156 CONFIG_SKILL_GAIN_CRAFTING
,
157 CONFIG_SKILL_GAIN_DEFENSE
,
158 CONFIG_SKILL_GAIN_GATHERING
,
159 CONFIG_SKILL_GAIN_WEAPON
,
160 CONFIG_MAX_OVERSPEED_PINGS
,
161 CONFIG_SAVE_RESPAWN_TIME_IMMEDIATLY
,
162 CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL
,
165 CONFIG_CHATFLOOD_MESSAGE_COUNT
,
166 CONFIG_CHATFLOOD_MESSAGE_DELAY
,
167 CONFIG_CHATFLOOD_MUTE_TIME
,
168 CONFIG_EVENT_ANNOUNCE
,
169 CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS
,
170 CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS
,
171 CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY
,
172 CONFIG_CREATURE_FAMILY_FLEE_DELAY
,
173 CONFIG_WORLD_BOSS_LEVEL_DIFF
,
174 CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
,
175 CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
,
176 CONFIG_DETECT_POS_COLLISION
,
177 CONFIG_RESTRICTED_LFG_CHANNEL
,
178 CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL
,
179 CONFIG_TALENTS_INSPECTING
,
180 CONFIG_CHAT_FAKE_MESSAGE_PREVENTING
,
181 CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY
,
182 CONFIG_CHAT_STRICT_LINK_CHECKING_KICK
,
183 CONFIG_CORPSE_DECAY_NORMAL
,
184 CONFIG_CORPSE_DECAY_RARE
,
185 CONFIG_CORPSE_DECAY_ELITE
,
186 CONFIG_CORPSE_DECAY_RAREELITE
,
187 CONFIG_CORPSE_DECAY_WORLDBOSS
,
188 CONFIG_ADDON_CHANNEL
,
189 CONFIG_DEATH_SICKNESS_LEVEL
,
190 CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
,
191 CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
,
192 CONFIG_DEATH_BONES_WORLD
,
193 CONFIG_DEATH_BONES_BG_OR_ARENA
,
194 CONFIG_THREAT_RADIUS
,
195 CONFIG_INSTANT_LOGOUT
,
196 CONFIG_ALL_TAXI_PATHS
,
197 CONFIG_DECLINED_NAMES_USED
,
198 CONFIG_LISTEN_RANGE_SAY
,
199 CONFIG_LISTEN_RANGE_TEXTEMOTE
,
200 CONFIG_LISTEN_RANGE_YELL
,
201 CONFIG_SKILL_MILLING
,
202 CONFIG_BATTLEGROUND_CAST_DESERTER
,
203 CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE
,
204 CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY
,
205 CONFIG_BATTLEGROUND_INVITATION_TYPE
,
206 CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER
,
207 CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH
,
208 CONFIG_ARENA_MAX_RATING_DIFFERENCE
,
209 CONFIG_ARENA_RATING_DISCARD_TIMER
,
210 CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS
,
211 CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS
,
212 CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE
,
213 CONFIG_ARENA_SEASON_ID
,
214 CONFIG_ARENA_SEASON_IN_PROGRESS
,
215 CONFIG_OFFHAND_CHECK_AT_TALENTS_RESET
,
216 CONFIG_CLIENTCACHE_VERSION
,
217 CONFIG_GUILD_EVENT_LOG_COUNT
,
218 CONFIG_GUILD_BANK_EVENT_LOG_COUNT
,
219 CONFIG_TIMERBAR_FATIGUE_GMLEVEL
,
220 CONFIG_TIMERBAR_FATIGUE_MAX
,
221 CONFIG_TIMERBAR_BREATH_GMLEVEL
,
222 CONFIG_TIMERBAR_BREATH_MAX
,
223 CONFIG_TIMERBAR_FIRE_GMLEVEL
,
224 CONFIG_TIMERBAR_FIRE_MAX
,
233 RATE_POWER_RAGE_INCOME
,
234 RATE_POWER_RAGE_LOSS
,
235 RATE_POWER_RUNICPOWER_INCOME
,
236 RATE_POWER_RUNICPOWER_LOSS
,
238 RATE_SKILL_DISCOVERY
,
240 RATE_DROP_ITEM_NORMAL
,
241 RATE_DROP_ITEM_UNCOMMON
,
244 RATE_DROP_ITEM_LEGENDARY
,
245 RATE_DROP_ITEM_ARTIFACT
,
246 RATE_DROP_ITEM_REFERENCED
,
251 RATE_REPUTATION_GAIN
,
252 RATE_REPUTATION_LOWLEVEL_KILL
,
253 RATE_REPUTATION_LOWLEVEL_QUEST
,
254 RATE_CREATURE_NORMAL_HP
,
255 RATE_CREATURE_ELITE_ELITE_HP
,
256 RATE_CREATURE_ELITE_RAREELITE_HP
,
257 RATE_CREATURE_ELITE_WORLDBOSS_HP
,
258 RATE_CREATURE_ELITE_RARE_HP
,
259 RATE_CREATURE_NORMAL_DAMAGE
,
260 RATE_CREATURE_ELITE_ELITE_DAMAGE
,
261 RATE_CREATURE_ELITE_RAREELITE_DAMAGE
,
262 RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE
,
263 RATE_CREATURE_ELITE_RARE_DAMAGE
,
264 RATE_CREATURE_NORMAL_SPELLDAMAGE
,
265 RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE
,
266 RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE
,
267 RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE
,
268 RATE_CREATURE_ELITE_RARE_SPELLDAMAGE
,
271 RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
,
272 RATE_REST_OFFLINE_IN_WILDERNESS
,
275 RATE_AUCTION_DEPOSIT
,
281 RATE_CORPSE_DECAY_LOOTED
,
282 RATE_INSTANCE_RESET_TIME
,
283 RATE_TARGET_POS_RECALCULATION_RANGE
,
284 RATE_DURABILITY_LOSS_DAMAGE
,
285 RATE_DURABILITY_LOSS_PARRY
,
286 RATE_DURABILITY_LOSS_ABSORB
,
287 RATE_DURABILITY_LOSS_BLOCK
,
294 REALM_TYPE_NORMAL
= 0,
296 REALM_TYPE_NORMAL2
= 4,
298 REALM_TYPE_RPPVP
= 8,
299 REALM_TYPE_FFA_PVP
= 16 // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries
300 // replaced by REALM_PVP in realm list
305 REALM_ZONE_UNKNOWN
= 0, // any language
306 REALM_ZONE_DEVELOPMENT
= 1, // any language
307 REALM_ZONE_UNITED_STATES
= 2, // extended-Latin
308 REALM_ZONE_OCEANIC
= 3, // extended-Latin
309 REALM_ZONE_LATIN_AMERICA
= 4, // extended-Latin
310 REALM_ZONE_TOURNAMENT_5
= 5, // basic-Latin at create, any at login
311 REALM_ZONE_KOREA
= 6, // East-Asian
312 REALM_ZONE_TOURNAMENT_7
= 7, // basic-Latin at create, any at login
313 REALM_ZONE_ENGLISH
= 8, // extended-Latin
314 REALM_ZONE_GERMAN
= 9, // extended-Latin
315 REALM_ZONE_FRENCH
= 10, // extended-Latin
316 REALM_ZONE_SPANISH
= 11, // extended-Latin
317 REALM_ZONE_RUSSIAN
= 12, // Cyrillic
318 REALM_ZONE_TOURNAMENT_13
= 13, // basic-Latin at create, any at login
319 REALM_ZONE_TAIWAN
= 14, // East-Asian
320 REALM_ZONE_TOURNAMENT_15
= 15, // basic-Latin at create, any at login
321 REALM_ZONE_CHINA
= 16, // East-Asian
322 REALM_ZONE_CN1
= 17, // basic-Latin at create, any at login
323 REALM_ZONE_CN2
= 18, // basic-Latin at create, any at login
324 REALM_ZONE_CN3
= 19, // basic-Latin at create, any at login
325 REALM_ZONE_CN4
= 20, // basic-Latin at create, any at login
326 REALM_ZONE_CN5
= 21, // basic-Latin at create, any at login
327 REALM_ZONE_CN6
= 22, // basic-Latin at create, any at login
328 REALM_ZONE_CN7
= 23, // basic-Latin at create, any at login
329 REALM_ZONE_CN8
= 24, // basic-Latin at create, any at login
330 REALM_ZONE_TOURNAMENT_25
= 25, // basic-Latin at create, any at login
331 REALM_ZONE_TEST_SERVER
= 26, // any language
332 REALM_ZONE_TOURNAMENT_27
= 27, // basic-Latin at create, any at login
333 REALM_ZONE_QA_SERVER
= 28, // any language
334 REALM_ZONE_CN9
= 29 // basic-Latin at create, any at login
337 // DB scripting commands
338 #define SCRIPT_COMMAND_TALK 0 // source = unit, target=any, datalong ( 0=say, 1=whisper, 2=yell, 3=emote text)
339 #define SCRIPT_COMMAND_EMOTE 1 // source = unit, datalong = anim_id
340 #define SCRIPT_COMMAND_FIELD_SET 2 // source = any, datalong = field_id, datalog2 = value
341 #define SCRIPT_COMMAND_MOVE_TO 3 // source = Creature, datalog2 = time, x/y/z
342 #define SCRIPT_COMMAND_FLAG_SET 4 // source = any, datalong = field_id, datalog2 = bitmask
343 #define SCRIPT_COMMAND_FLAG_REMOVE 5 // source = any, datalong = field_id, datalog2 = bitmask
344 #define SCRIPT_COMMAND_TELEPORT_TO 6 // source or target with Player, datalong = map_id, x/y/z
345 #define SCRIPT_COMMAND_QUEST_EXPLORED 7 // one from source or target must be Player, another GO/Creature, datalong=quest_id, datalong2=distance or 0
346 #define SCRIPT_COMMAND_KILL_CREDIT 8 // source or target with Player, datalong = creature entry, datalong2 = bool (0=personal credit, 1=group credit)
347 #define SCRIPT_COMMAND_RESPAWN_GAMEOBJECT 9 // source = any (summoner), datalong=db_guid, datalong2=despawn_delay
348 #define SCRIPT_COMMAND_TEMP_SUMMON_CREATURE 10 // source = any (summoner), datalong=creature entry, datalong2=despawn_delay
349 #define SCRIPT_COMMAND_OPEN_DOOR 11 // source = unit, datalong=db_guid, datalong2=reset_delay
350 #define SCRIPT_COMMAND_CLOSE_DOOR 12 // source = unit, datalong=db_guid, datalong2=reset_delay
351 #define SCRIPT_COMMAND_ACTIVATE_OBJECT 13 // source = unit, target=GO
352 #define SCRIPT_COMMAND_REMOVE_AURA 14 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id
353 #define SCRIPT_COMMAND_CAST_SPELL 15 // source/target cast spell at target/source (script->datalong2: 0: s->t 1: s->s 2: t->t 3: t->s
354 #define SCRIPT_COMMAND_PLAY_SOUND 16 // source = any object, target=any/player, datalong (sound_id), datalong2 (bitmask: 0/1=anyone/target, 0/2=with distance dependent, so 1|2 = 3 is target with distance dependent)
356 /// Storage class for commands issued for delayed execution
357 struct CliCommandHolder
359 typedef void Print(const char*);
364 CliCommandHolder(const char *command
, Print
* zprint
)
367 size_t len
= strlen(command
)+1;
368 m_command
= new char[len
];
369 memcpy(m_command
, command
, len
);
372 ~CliCommandHolder() { delete[] m_command
; }
379 static volatile uint32 m_worldLoopCounter
;
384 WorldSession
* FindSession(uint32 id
) const;
385 void AddSession(WorldSession
*s
);
386 bool RemoveSession(uint32 id
);
387 /// Get the number of current active sessions
388 void UpdateMaxSessionCounters();
389 uint32
GetActiveAndQueuedSessionCount() const { return m_sessions
.size(); }
390 uint32
GetActiveSessionCount() const { return m_sessions
.size() - m_QueuedPlayer
.size(); }
391 uint32
GetQueuedSessionCount() const { return m_QueuedPlayer
.size(); }
392 /// Get the maximum number of parallel sessions on the server since last reboot
393 uint32
GetMaxQueuedSessionCount() const { return m_maxQueuedSessionCount
; }
394 uint32
GetMaxActiveSessionCount() const { return m_maxActiveSessionCount
; }
395 Player
* FindPlayerInZone(uint32 zone
);
397 Weather
* FindWeather(uint32 id
) const;
398 Weather
* AddWeather(uint32 zone_id
);
399 void RemoveWeather(uint32 zone_id
);
401 /// Get the active session server limit (or security level limitations)
402 uint32
GetPlayerAmountLimit() const { return m_playerLimit
>= 0 ? m_playerLimit
: 0; }
403 AccountTypes
GetPlayerSecurityLimit() const { return m_playerLimit
<= 0 ? AccountTypes(-m_playerLimit
) : SEC_PLAYER
; }
405 /// Set the active session server limit (or security level limitation)
406 void SetPlayerLimit(int32 limit
, bool needUpdate
= false);
409 typedef std::list
<WorldSession
*> Queue
;
410 void AddQueuedPlayer(WorldSession
*);
411 bool RemoveQueuedPlayer(WorldSession
* session
);
412 int32
GetQueuePos(WorldSession
*);
413 uint32
GetQueueSize() const { return m_QueuedPlayer
.size(); }
415 /// \todo Actions on m_allowMovement still to be implemented
416 /// Is movement allowed?
417 bool getAllowMovement() const { return m_allowMovement
; }
418 /// Allow/Disallow object movements
419 void SetAllowMovement(bool allow
) { m_allowMovement
= allow
; }
421 /// Set a new Message of the Day
422 void SetMotd(const std::string
& motd
) { m_motd
= motd
; }
423 /// Get the current Message of the Day
424 const char* GetMotd() const { return m_motd
.c_str(); }
426 LocaleConstant
GetDefaultDbcLocale() const { return m_defaultDbcLocale
; }
428 /// Get the path where data (dbc, maps) are stored on disk
429 std::string
GetDataPath() const { return m_dataPath
; }
431 /// When server started?
432 time_t const& GetStartTime() const { return m_startTime
; }
434 time_t const& GetGameTime() const { return m_gameTime
; }
436 uint32
GetUptime() const { return uint32(m_gameTime
- m_startTime
); }
438 /// Get the maximum skill level a player can reach
439 uint16
GetConfigMaxSkillValue() const
441 uint32 lvl
= getConfig(CONFIG_MAX_PLAYER_LEVEL
);
442 return lvl
> 60 ? 300 + ((lvl
- 60) * 75) / 10 : lvl
*5;
445 void SetInitialWorldSettings();
446 void LoadConfigSettings(bool reload
= false);
448 void SendWorldText(int32 string_id
, ...);
449 void SendGlobalText(const char* text
, WorldSession
*self
);
450 void SendGlobalMessage(WorldPacket
*packet
, WorldSession
*self
= 0, uint32 team
= 0);
451 void SendZoneMessage(uint32 zone
, WorldPacket
*packet
, WorldSession
*self
= 0, uint32 team
= 0);
452 void SendZoneText(uint32 zone
, const char *text
, WorldSession
*self
= 0, uint32 team
= 0);
453 void SendServerMessage(ServerMessageType type
, const char *text
= "", Player
* player
= NULL
);
455 /// Are we in the middle of a shutdown?
456 bool IsShutdowning() const { return m_ShutdownTimer
> 0; }
457 void ShutdownServ(uint32 time
, uint32 options
, uint8 exitcode
);
458 void ShutdownCancel();
459 void ShutdownMsg(bool show
= false, Player
* player
= NULL
);
460 static uint8
GetExitCode() { return m_ExitCode
; }
461 static void StopNow(uint8 exitcode
) { m_stopEvent
= true; m_ExitCode
= exitcode
; }
462 static bool IsStopped() { return m_stopEvent
; }
464 void Update(uint32 diff
);
466 void UpdateSessions( uint32 diff
);
467 /// Set a server rate (see #Rates)
468 void setRate(Rates rate
,float value
) { rate_values
[rate
]=value
; }
469 /// Get a server rate (see #Rates)
470 float getRate(Rates rate
) const { return rate_values
[rate
]; }
472 /// Set a server configuration element (see #WorldConfigs)
473 void setConfig(uint32 index
,uint32 value
)
475 if(index
<CONFIG_VALUE_COUNT
)
476 m_configs
[index
]=value
;
479 /// Get a server configuration element (see #WorldConfigs)
480 uint32
getConfig(uint32 index
) const
482 if(index
<CONFIG_VALUE_COUNT
)
483 return m_configs
[index
];
488 /// Are we on a "Player versus Player" server?
489 bool IsPvPRealm() { return (getConfig(CONFIG_GAME_TYPE
) == REALM_TYPE_PVP
|| getConfig(CONFIG_GAME_TYPE
) == REALM_TYPE_RPPVP
|| getConfig(CONFIG_GAME_TYPE
) == REALM_TYPE_FFA_PVP
); }
490 bool IsFFAPvPRealm() { return getConfig(CONFIG_GAME_TYPE
) == REALM_TYPE_FFA_PVP
; }
493 void KickAllLess(AccountTypes sec
);
494 BanReturn
BanAccount(BanMode mode
, std::string nameOrIP
, std::string duration
, std::string reason
, std::string author
);
495 bool RemoveBanAccount(BanMode mode
, std::string nameOrIP
);
497 uint32
IncreaseScheduledScriptsCount() { return (uint32
)++m_scheduledScripts
; }
498 uint32
DecreaseScheduledScriptCount() { return (uint32
)--m_scheduledScripts
; }
499 uint32
DecreaseScheduledScriptCount(size_t count
) { return (uint32
)(m_scheduledScripts
-= count
); }
500 bool IsScriptScheduled() const { return m_scheduledScripts
> 0; }
502 // for max speed access
503 static float GetMaxVisibleDistanceOnContinents() { return m_MaxVisibleDistanceOnContinents
; }
504 static float GetMaxVisibleDistanceInInstances() { return m_MaxVisibleDistanceInInctances
; }
505 static float GetMaxVisibleDistanceInBGArenas() { return m_MaxVisibleDistanceInBGArenas
; }
506 static float GetMaxVisibleDistanceForObject() { return m_MaxVisibleDistanceForObject
; }
508 static float GetMaxVisibleDistanceInFlight() { return m_MaxVisibleDistanceInFlight
; }
509 static float GetVisibleUnitGreyDistance() { return m_VisibleUnitGreyDistance
; }
510 static float GetVisibleObjectGreyDistance() { return m_VisibleObjectGreyDistance
; }
512 void ProcessCliCommands();
513 void QueueCliCommand( CliCommandHolder::Print
* zprintf
, char const* input
) { cliCmdQueue
.add(new CliCommandHolder(input
, zprintf
)); }
515 void UpdateResultQueue();
516 void InitResultQueue();
518 void UpdateRealmCharCount(uint32 accid
);
520 LocaleConstant
GetAvailableDbcLocale(LocaleConstant locale
) const { if(m_availableDbcLocaleMask
& (1 << locale
)) return locale
; else return m_defaultDbcLocale
; }
522 //used World DB version
523 void LoadDBVersion();
524 char const* GetDBVersion() { return m_DBVersion
.c_str(); }
525 char const* GetCreatureEventAIVersion() { return m_CreatureEventAIVersion
.c_str(); }
527 //used Script version
528 void SetScriptsVersion(char const* version
) { m_ScriptsVersion
= version
? version
: "unknown scripting library"; }
529 char const* GetScriptsVersion() { return m_ScriptsVersion
.c_str(); }
532 void _UpdateGameTime();
533 // callback for UpdateRealmCharacters
534 void _UpdateRealmCharCount(QueryResult
*resultCharCount
, uint32 accountId
);
536 void InitDailyQuestResetTime();
537 void ResetDailyQuests();
539 static volatile bool m_stopEvent
;
540 static uint8 m_ExitCode
;
541 uint32 m_ShutdownTimer
;
542 uint32 m_ShutdownMask
;
544 //atomic op counter for active scripts amount
545 ACE_Atomic_Op
<ACE_Thread_Mutex
, long> m_scheduledScripts
;
549 IntervalTimer m_timers
[WUPDATE_COUNT
];
551 uint32 mail_timer_expires
;
553 typedef UNORDERED_MAP
<uint32
, Weather
*> WeatherMap
;
554 WeatherMap m_weathers
;
555 typedef UNORDERED_MAP
<uint32
, WorldSession
*> SessionMap
;
556 SessionMap m_sessions
;
557 uint32 m_maxActiveSessionCount
;
558 uint32 m_maxQueuedSessionCount
;
560 float rate_values
[MAX_RATES
];
561 uint32 m_configs
[CONFIG_VALUE_COUNT
];
563 LocaleConstant m_defaultDbcLocale
; // from config for one from loaded DBC locales
564 uint32 m_availableDbcLocaleMask
; // by loaded DBC
565 void DetectDBCLang();
566 bool m_allowMovement
;
568 std::string m_dataPath
;
570 // for max speed access
571 static float m_MaxVisibleDistanceOnContinents
;
572 static float m_MaxVisibleDistanceInInctances
;
573 static float m_MaxVisibleDistanceInBGArenas
;
574 static float m_MaxVisibleDistanceForObject
;
576 static float m_MaxVisibleDistanceInFlight
;
577 static float m_VisibleUnitGreyDistance
;
578 static float m_VisibleObjectGreyDistance
;
580 // CLI command holder to be thread safe
581 ACE_Based::LockedQueue
<CliCommandHolder
*,ACE_Thread_Mutex
> cliCmdQueue
;
582 SqlResultQueue
*m_resultQueue
;
584 // next daily quests reset time
585 time_t m_NextDailyQuestReset
;
588 Queue m_QueuedPlayer
;
590 //sessions that are added async
591 void AddSession_(WorldSession
* s
);
592 ACE_Based::LockedQueue
<WorldSession
*, ACE_Thread_Mutex
> addSessQueue
;
595 std::string m_DBVersion
;
596 std::string m_CreatureEventAIVersion
;
597 std::string m_ScriptsVersion
;
600 extern uint32 realmID
;
602 #define sWorld MaNGOS::Singleton<World>::Instance()