[8449] Deprecate healing/damage item mods and merge internal data in to spell power.
[getmangos.git] / src / game / World.h
blobf8d5b908a4c1edf123378429f93a0228a1acbf36
1 /*
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
20 /// @{
21 /// \file
23 #ifndef __WORLD_H
24 #define __WORLD_H
26 #include "Common.h"
27 #include "Timer.h"
28 #include "Policies/Singleton.h"
29 #include "SharedDefines.h"
30 #include "ace/Atomic_Op.h"
32 #include <map>
33 #include <set>
34 #include <list>
36 class Object;
37 class WorldPacket;
38 class WorldSession;
39 class Player;
40 class Weather;
41 struct ScriptAction;
42 struct ScriptInfo;
43 class SqlResultQueue;
44 class QueryResult;
45 class WorldSocket;
47 // ServerMessages.dbc
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
57 enum ShutdownMask
59 SHUTDOWN_MASK_RESTART = 1,
60 SHUTDOWN_MASK_IDLE = 2,
63 enum ShutdownExitCode
65 SHUTDOWN_EXIT_CODE = 0,
66 ERROR_EXIT_CODE = 1,
67 RESTART_EXIT_CODE = 2,
70 /// Timers for different object refresh rates
71 enum WorldTimers
73 WUPDATE_OBJECTS = 0,
74 WUPDATE_SESSIONS = 1,
75 WUPDATE_AUCTIONS = 2,
76 WUPDATE_WEATHERS = 3,
77 WUPDATE_UPTIME = 4,
78 WUPDATE_CORPSES = 5,
79 WUPDATE_EVENTS = 6,
80 WUPDATE_COUNT = 7
83 /// Configuration elements
84 enum WorldConfigs
86 CONFIG_COMPRESSION = 0,
87 CONFIG_GRID_UNLOAD,
88 CONFIG_INTERVAL_SAVE,
89 CONFIG_INTERVAL_GRIDCLEAN,
90 CONFIG_INTERVAL_MAPUPDATE,
91 CONFIG_INTERVAL_CHANGEWEATHER,
92 CONFIG_PORT_WORLD,
93 CONFIG_SOCKET_SELECTTIME,
94 CONFIG_GROUP_XP_DISTANCE,
95 CONFIG_SIGHT_MONSTER,
96 CONFIG_SIGHT_GUARDER,
97 CONFIG_GAME_TYPE,
98 CONFIG_REALM_ZONE,
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,
113 CONFIG_MIN_PET_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,
132 CONFIG_CAST_UNSTUCK,
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,
138 CONFIG_GM_CHAT,
139 CONFIG_GM_WISPERING_TO,
140 CONFIG_GM_LEVEL_IN_GM_LIST,
141 CONFIG_GM_LEVEL_IN_WHO_LIST,
142 CONFIG_GM_LOG_TRADE,
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,
163 CONFIG_WEATHER,
164 CONFIG_EXPANSION,
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_DISABLE_BREATHING,
197 CONFIG_ALL_TAXI_PATHS,
198 CONFIG_DECLINED_NAMES_USED,
199 CONFIG_LISTEN_RANGE_SAY,
200 CONFIG_LISTEN_RANGE_TEXTEMOTE,
201 CONFIG_LISTEN_RANGE_YELL,
202 CONFIG_SKILL_MILLING,
203 CONFIG_BATTLEGROUND_CAST_DESERTER,
204 CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE,
205 CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY,
206 CONFIG_BATTLEGROUND_INVITATION_TYPE,
207 CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
208 CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH,
209 CONFIG_ARENA_MAX_RATING_DIFFERENCE,
210 CONFIG_ARENA_RATING_DISCARD_TIMER,
211 CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
212 CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
213 CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE,
214 CONFIG_ARENA_SEASON_ID,
215 CONFIG_ARENA_SEASON_IN_PROGRESS,
216 CONFIG_OFFHAND_CHECK_AT_TALENTS_RESET,
217 CONFIG_CLIENTCACHE_VERSION,
218 CONFIG_GUILD_EVENT_LOG_COUNT,
219 CONFIG_GUILD_BANK_EVENT_LOG_COUNT,
220 CONFIG_VALUE_COUNT
223 /// Server rates
224 enum Rates
226 RATE_HEALTH=0,
227 RATE_POWER_MANA,
228 RATE_POWER_RAGE_INCOME,
229 RATE_POWER_RAGE_LOSS,
230 RATE_POWER_RUNICPOWER_INCOME,
231 RATE_POWER_RUNICPOWER_LOSS,
232 RATE_POWER_FOCUS,
233 RATE_SKILL_DISCOVERY,
234 RATE_DROP_ITEM_POOR,
235 RATE_DROP_ITEM_NORMAL,
236 RATE_DROP_ITEM_UNCOMMON,
237 RATE_DROP_ITEM_RARE,
238 RATE_DROP_ITEM_EPIC,
239 RATE_DROP_ITEM_LEGENDARY,
240 RATE_DROP_ITEM_ARTIFACT,
241 RATE_DROP_ITEM_REFERENCED,
242 RATE_DROP_MONEY,
243 RATE_XP_KILL,
244 RATE_XP_QUEST,
245 RATE_XP_EXPLORE,
246 RATE_REPUTATION_GAIN,
247 RATE_REPUTATION_LOWLEVEL_KILL,
248 RATE_REPUTATION_LOWLEVEL_QUEST,
249 RATE_CREATURE_NORMAL_HP,
250 RATE_CREATURE_ELITE_ELITE_HP,
251 RATE_CREATURE_ELITE_RAREELITE_HP,
252 RATE_CREATURE_ELITE_WORLDBOSS_HP,
253 RATE_CREATURE_ELITE_RARE_HP,
254 RATE_CREATURE_NORMAL_DAMAGE,
255 RATE_CREATURE_ELITE_ELITE_DAMAGE,
256 RATE_CREATURE_ELITE_RAREELITE_DAMAGE,
257 RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE,
258 RATE_CREATURE_ELITE_RARE_DAMAGE,
259 RATE_CREATURE_NORMAL_SPELLDAMAGE,
260 RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE,
261 RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE,
262 RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE,
263 RATE_CREATURE_ELITE_RARE_SPELLDAMAGE,
264 RATE_CREATURE_AGGRO,
265 RATE_REST_INGAME,
266 RATE_REST_OFFLINE_IN_TAVERN_OR_CITY,
267 RATE_REST_OFFLINE_IN_WILDERNESS,
268 RATE_DAMAGE_FALL,
269 RATE_AUCTION_TIME,
270 RATE_AUCTION_DEPOSIT,
271 RATE_AUCTION_CUT,
272 RATE_HONOR,
273 RATE_MINING_AMOUNT,
274 RATE_MINING_NEXT,
275 RATE_TALENT,
276 RATE_CORPSE_DECAY_LOOTED,
277 RATE_INSTANCE_RESET_TIME,
278 RATE_TARGET_POS_RECALCULATION_RANGE,
279 RATE_DURABILITY_LOSS_DAMAGE,
280 RATE_DURABILITY_LOSS_PARRY,
281 RATE_DURABILITY_LOSS_ABSORB,
282 RATE_DURABILITY_LOSS_BLOCK,
283 MAX_RATES
286 /// Type of server
287 enum RealmType
289 REALM_TYPE_NORMAL = 0,
290 REALM_TYPE_PVP = 1,
291 REALM_TYPE_NORMAL2 = 4,
292 REALM_TYPE_RP = 6,
293 REALM_TYPE_RPPVP = 8,
294 REALM_TYPE_FFA_PVP = 16 // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries
295 // replaced by REALM_PVP in realm list
298 enum RealmZone
300 REALM_ZONE_UNKNOWN = 0, // any language
301 REALM_ZONE_DEVELOPMENT = 1, // any language
302 REALM_ZONE_UNITED_STATES = 2, // extended-Latin
303 REALM_ZONE_OCEANIC = 3, // extended-Latin
304 REALM_ZONE_LATIN_AMERICA = 4, // extended-Latin
305 REALM_ZONE_TOURNAMENT_5 = 5, // basic-Latin at create, any at login
306 REALM_ZONE_KOREA = 6, // East-Asian
307 REALM_ZONE_TOURNAMENT_7 = 7, // basic-Latin at create, any at login
308 REALM_ZONE_ENGLISH = 8, // extended-Latin
309 REALM_ZONE_GERMAN = 9, // extended-Latin
310 REALM_ZONE_FRENCH = 10, // extended-Latin
311 REALM_ZONE_SPANISH = 11, // extended-Latin
312 REALM_ZONE_RUSSIAN = 12, // Cyrillic
313 REALM_ZONE_TOURNAMENT_13 = 13, // basic-Latin at create, any at login
314 REALM_ZONE_TAIWAN = 14, // East-Asian
315 REALM_ZONE_TOURNAMENT_15 = 15, // basic-Latin at create, any at login
316 REALM_ZONE_CHINA = 16, // East-Asian
317 REALM_ZONE_CN1 = 17, // basic-Latin at create, any at login
318 REALM_ZONE_CN2 = 18, // basic-Latin at create, any at login
319 REALM_ZONE_CN3 = 19, // basic-Latin at create, any at login
320 REALM_ZONE_CN4 = 20, // basic-Latin at create, any at login
321 REALM_ZONE_CN5 = 21, // basic-Latin at create, any at login
322 REALM_ZONE_CN6 = 22, // basic-Latin at create, any at login
323 REALM_ZONE_CN7 = 23, // basic-Latin at create, any at login
324 REALM_ZONE_CN8 = 24, // basic-Latin at create, any at login
325 REALM_ZONE_TOURNAMENT_25 = 25, // basic-Latin at create, any at login
326 REALM_ZONE_TEST_SERVER = 26, // any language
327 REALM_ZONE_TOURNAMENT_27 = 27, // basic-Latin at create, any at login
328 REALM_ZONE_QA_SERVER = 28, // any language
329 REALM_ZONE_CN9 = 29 // basic-Latin at create, any at login
332 // DB scripting commands
333 #define SCRIPT_COMMAND_TALK 0 // source = unit, target=any, datalong ( 0=say, 1=whisper, 2=yell, 3=emote text)
334 #define SCRIPT_COMMAND_EMOTE 1 // source = unit, datalong = anim_id
335 #define SCRIPT_COMMAND_FIELD_SET 2 // source = any, datalong = field_id, datalog2 = value
336 #define SCRIPT_COMMAND_MOVE_TO 3 // source = Creature, datalog2 = time, x/y/z
337 #define SCRIPT_COMMAND_FLAG_SET 4 // source = any, datalong = field_id, datalog2 = bitmask
338 #define SCRIPT_COMMAND_FLAG_REMOVE 5 // source = any, datalong = field_id, datalog2 = bitmask
339 #define SCRIPT_COMMAND_TELEPORT_TO 6 // source or target with Player, datalong = map_id, x/y/z
340 #define SCRIPT_COMMAND_QUEST_EXPLORED 7 // one from source or target must be Player, another GO/Creature, datalong=quest_id, datalong2=distance or 0
341 #define SCRIPT_COMMAND_RESPAWN_GAMEOBJECT 9 // source = any (summoner), datalong=db_guid, datalong2=despawn_delay
342 #define SCRIPT_COMMAND_TEMP_SUMMON_CREATURE 10 // source = any (summoner), datalong=creature entry, datalong2=despawn_delay
343 #define SCRIPT_COMMAND_OPEN_DOOR 11 // source = unit, datalong=db_guid, datalong2=reset_delay
344 #define SCRIPT_COMMAND_CLOSE_DOOR 12 // source = unit, datalong=db_guid, datalong2=reset_delay
345 #define SCRIPT_COMMAND_ACTIVATE_OBJECT 13 // source = unit, target=GO
346 #define SCRIPT_COMMAND_REMOVE_AURA 14 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id
347 #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
348 #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)
350 /// Storage class for commands issued for delayed execution
351 struct CliCommandHolder
353 typedef void Print(const char*);
355 char *m_command;
356 Print* m_print;
358 CliCommandHolder(const char *command, Print* zprint)
359 : m_print(zprint)
361 size_t len = strlen(command)+1;
362 m_command = new char[len];
363 memcpy(m_command, command, len);
366 ~CliCommandHolder() { delete[] m_command; }
369 /// The World
370 class World
372 public:
373 static volatile uint32 m_worldLoopCounter;
375 World();
376 ~World();
378 WorldSession* FindSession(uint32 id) const;
379 void AddSession(WorldSession *s);
380 bool RemoveSession(uint32 id);
381 /// Get the number of current active sessions
382 void UpdateMaxSessionCounters();
383 uint32 GetActiveAndQueuedSessionCount() const { return m_sessions.size(); }
384 uint32 GetActiveSessionCount() const { return m_sessions.size() - m_QueuedPlayer.size(); }
385 uint32 GetQueuedSessionCount() const { return m_QueuedPlayer.size(); }
386 /// Get the maximum number of parallel sessions on the server since last reboot
387 uint32 GetMaxQueuedSessionCount() const { return m_maxQueuedSessionCount; }
388 uint32 GetMaxActiveSessionCount() const { return m_maxActiveSessionCount; }
389 Player* FindPlayerInZone(uint32 zone);
391 Weather* FindWeather(uint32 id) const;
392 Weather* AddWeather(uint32 zone_id);
393 void RemoveWeather(uint32 zone_id);
395 /// Get the active session server limit (or security level limitations)
396 uint32 GetPlayerAmountLimit() const { return m_playerLimit >= 0 ? m_playerLimit : 0; }
397 AccountTypes GetPlayerSecurityLimit() const { return m_playerLimit <= 0 ? AccountTypes(-m_playerLimit) : SEC_PLAYER; }
399 /// Set the active session server limit (or security level limitation)
400 void SetPlayerLimit(int32 limit, bool needUpdate = false);
402 //player Queue
403 typedef std::list<WorldSession*> Queue;
404 void AddQueuedPlayer(WorldSession*);
405 bool RemoveQueuedPlayer(WorldSession* session);
406 int32 GetQueuePos(WorldSession*);
407 uint32 GetQueueSize() const { return m_QueuedPlayer.size(); }
409 /// \todo Actions on m_allowMovement still to be implemented
410 /// Is movement allowed?
411 bool getAllowMovement() const { return m_allowMovement; }
412 /// Allow/Disallow object movements
413 void SetAllowMovement(bool allow) { m_allowMovement = allow; }
415 /// Set a new Message of the Day
416 void SetMotd(const std::string& motd) { m_motd = motd; }
417 /// Get the current Message of the Day
418 const char* GetMotd() const { return m_motd.c_str(); }
420 LocaleConstant GetDefaultDbcLocale() const { return m_defaultDbcLocale; }
422 /// Get the path where data (dbc, maps) are stored on disk
423 std::string GetDataPath() const { return m_dataPath; }
425 /// When server started?
426 time_t const& GetStartTime() const { return m_startTime; }
427 /// What time is it?
428 time_t const& GetGameTime() const { return m_gameTime; }
429 /// Uptime (in secs)
430 uint32 GetUptime() const { return uint32(m_gameTime - m_startTime); }
432 /// Get the maximum skill level a player can reach
433 uint16 GetConfigMaxSkillValue() const
435 uint32 lvl = getConfig(CONFIG_MAX_PLAYER_LEVEL);
436 return lvl > 60 ? 300 + ((lvl - 60) * 75) / 10 : lvl*5;
439 void SetInitialWorldSettings();
440 void LoadConfigSettings(bool reload = false);
442 void SendWorldText(int32 string_id, ...);
443 void SendGlobalText(const char* text, WorldSession *self);
444 void SendGlobalMessage(WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
445 void SendZoneMessage(uint32 zone, WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
446 void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
447 void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
449 /// Are we in the middle of a shutdown?
450 bool IsShutdowning() const { return m_ShutdownTimer > 0; }
451 void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
452 void ShutdownCancel();
453 void ShutdownMsg(bool show = false, Player* player = NULL);
454 static uint8 GetExitCode() { return m_ExitCode; }
455 static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; }
456 static bool IsStopped() { return m_stopEvent; }
458 void Update(uint32 diff);
460 void UpdateSessions( uint32 diff );
461 /// Set a server rate (see #Rates)
462 void setRate(Rates rate,float value) { rate_values[rate]=value; }
463 /// Get a server rate (see #Rates)
464 float getRate(Rates rate) const { return rate_values[rate]; }
466 /// Set a server configuration element (see #WorldConfigs)
467 void setConfig(uint32 index,uint32 value)
469 if(index<CONFIG_VALUE_COUNT)
470 m_configs[index]=value;
473 /// Get a server configuration element (see #WorldConfigs)
474 uint32 getConfig(uint32 index) const
476 if(index<CONFIG_VALUE_COUNT)
477 return m_configs[index];
478 else
479 return 0;
482 /// Are we on a "Player versus Player" server?
483 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); }
484 bool IsFFAPvPRealm() { return getConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP; }
486 void KickAll();
487 void KickAllLess(AccountTypes sec);
488 BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author);
489 bool RemoveBanAccount(BanMode mode, std::string nameOrIP);
491 uint32 IncreaseScheduledScriptsCount() { return (uint32)++m_scheduledScripts; }
492 uint32 DecreaseScheduledScriptCount() { return (uint32)--m_scheduledScripts; }
493 uint32 DecreaseScheduledScriptCount(size_t count) { return (uint32)(m_scheduledScripts -= count); }
494 bool IsScriptScheduled() const { return m_scheduledScripts > 0; }
496 // for max speed access
497 static float GetMaxVisibleDistanceForCreature() { return m_MaxVisibleDistanceForCreature; }
498 static float GetMaxVisibleDistanceForPlayer() { return m_MaxVisibleDistanceForPlayer; }
499 static float GetMaxVisibleDistanceForObject() { return m_MaxVisibleDistanceForObject; }
500 static float GetMaxVisibleDistanceInFlight() { return m_MaxVisibleDistanceInFlight; }
501 static float GetVisibleUnitGreyDistance() { return m_VisibleUnitGreyDistance; }
502 static float GetVisibleObjectGreyDistance() { return m_VisibleObjectGreyDistance; }
504 void ProcessCliCommands();
505 void QueueCliCommand( CliCommandHolder::Print* zprintf, char const* input ) { cliCmdQueue.add(new CliCommandHolder(input, zprintf)); }
507 void UpdateResultQueue();
508 void InitResultQueue();
510 void UpdateRealmCharCount(uint32 accid);
512 LocaleConstant GetAvailableDbcLocale(LocaleConstant locale) const { if(m_availableDbcLocaleMask & (1 << locale)) return locale; else return m_defaultDbcLocale; }
514 //used World DB version
515 void LoadDBVersion();
516 char const* GetDBVersion() { return m_DBVersion.c_str(); }
517 char const* GetCreatureEventAIVersion() { return m_CreatureEventAIVersion.c_str(); }
519 //used Script version
520 void SetScriptsVersion(char const* version) { m_ScriptsVersion = version ? version : "unknown scripting library"; }
521 char const* GetScriptsVersion() { return m_ScriptsVersion.c_str(); }
523 protected:
524 void _UpdateGameTime();
525 // callback for UpdateRealmCharacters
526 void _UpdateRealmCharCount(QueryResult *resultCharCount, uint32 accountId);
528 void InitDailyQuestResetTime();
529 void ResetDailyQuests();
530 private:
531 static volatile bool m_stopEvent;
532 static uint8 m_ExitCode;
533 uint32 m_ShutdownTimer;
534 uint32 m_ShutdownMask;
536 //atomic op counter for active scripts amount
537 ACE_Atomic_Op<ACE_Thread_Mutex, long> m_scheduledScripts;
539 time_t m_startTime;
540 time_t m_gameTime;
541 IntervalTimer m_timers[WUPDATE_COUNT];
542 uint32 mail_timer;
543 uint32 mail_timer_expires;
545 typedef UNORDERED_MAP<uint32, Weather*> WeatherMap;
546 WeatherMap m_weathers;
547 typedef UNORDERED_MAP<uint32, WorldSession*> SessionMap;
548 SessionMap m_sessions;
549 uint32 m_maxActiveSessionCount;
550 uint32 m_maxQueuedSessionCount;
552 float rate_values[MAX_RATES];
553 uint32 m_configs[CONFIG_VALUE_COUNT];
554 int32 m_playerLimit;
555 LocaleConstant m_defaultDbcLocale; // from config for one from loaded DBC locales
556 uint32 m_availableDbcLocaleMask; // by loaded DBC
557 void DetectDBCLang();
558 bool m_allowMovement;
559 std::string m_motd;
560 std::string m_dataPath;
562 // for max speed access
563 static float m_MaxVisibleDistanceForCreature;
564 static float m_MaxVisibleDistanceForPlayer;
565 static float m_MaxVisibleDistanceForObject;
566 static float m_MaxVisibleDistanceInFlight;
567 static float m_VisibleUnitGreyDistance;
568 static float m_VisibleObjectGreyDistance;
570 // CLI command holder to be thread safe
571 ACE_Based::LockedQueue<CliCommandHolder*,ACE_Thread_Mutex> cliCmdQueue;
572 SqlResultQueue *m_resultQueue;
574 // next daily quests reset time
575 time_t m_NextDailyQuestReset;
577 //Player Queue
578 Queue m_QueuedPlayer;
580 //sessions that are added async
581 void AddSession_(WorldSession* s);
582 ACE_Based::LockedQueue<WorldSession*, ACE_Thread_Mutex> addSessQueue;
584 //used versions
585 std::string m_DBVersion;
586 std::string m_CreatureEventAIVersion;
587 std::string m_ScriptsVersion;
590 extern uint32 realmID;
592 #define sWorld MaNGOS::Singleton<World>::Instance()
593 #endif
594 /// @}