PageRenderTime 52ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/src/game/World.h

https://bitbucket.org/oneb1t/crocoduckcore/
C Header | 729 lines | 581 code | 79 blank | 69 comment | 12 complexity | f237512ad3bc368a5ead54492f2bd00a MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. /*
  2. * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
  3. *
  4. * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
  5. *
  6. * Copyright (C) 2010 Oregon <http://www.oregoncore.com/>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. */
  22. #ifndef __WORLD_H
  23. #define __WORLD_H
  24. #include "Common.h"
  25. #include "Timer.h"
  26. #include "Policies/Singleton.h"
  27. #include "SharedDefines.h"
  28. #include "ace/Atomic_Op.h"
  29. #include "QueryResult.h"
  30. #include <map>
  31. #include <set>
  32. #include <list>
  33. class Object;
  34. class WorldPacket;
  35. class WorldSession;
  36. class Player;
  37. class Weather;
  38. struct ScriptInfo;
  39. class SqlResultQueue;
  40. class QueryResult;
  41. class WorldSocket;
  42. // ServerMessages.dbc
  43. enum ServerMessageType
  44. {
  45. SERVER_MSG_SHUTDOWN_TIME = 1,
  46. SERVER_MSG_RESTART_TIME = 2,
  47. SERVER_MSG_STRING = 3,
  48. SERVER_MSG_SHUTDOWN_CANCELLED = 4,
  49. SERVER_MSG_RESTART_CANCELLED = 5
  50. };
  51. enum ShutdownMask
  52. {
  53. SHUTDOWN_MASK_RESTART = 1,
  54. SHUTDOWN_MASK_IDLE = 2,
  55. };
  56. enum ShutdownExitCode
  57. {
  58. SHUTDOWN_EXIT_CODE = 0,
  59. ERROR_EXIT_CODE = 1,
  60. RESTART_EXIT_CODE = 2,
  61. };
  62. // Timers for different object refresh rates
  63. enum WorldTimers
  64. {
  65. WUPDATE_OBJECTS = 0,
  66. WUPDATE_SESSIONS = 1,
  67. WUPDATE_AUCTIONS = 2,
  68. WUPDATE_WEATHERS = 3,
  69. WUPDATE_UPTIME = 4,
  70. WUPDATE_CORPSES = 5,
  71. WUPDATE_EVENTS = 6,
  72. WUPDATE_CLEANDB = 7,
  73. WUPDATE_DELETECHARS = 8,
  74. WUPDATE_AUTOBROADCAST = 9,
  75. WUPDATE_COUNT = 10
  76. };
  77. // Configuration elements
  78. enum WorldConfigs
  79. {
  80. CONFIG_COMPRESSION = 0,
  81. CONFIG_GRID_UNLOAD,
  82. CONFIG_INTERVAL_SAVE,
  83. CONFIG_INTERVAL_GRIDCLEAN,
  84. CONFIG_INTERVAL_MAPUPDATE,
  85. CONFIG_INTERVAL_CHANGEWEATHER,
  86. CONFIG_INTERVAL_DISCONNECT_TOLERANCE,
  87. CONFIG_PORT_WORLD,
  88. CONFIG_SOCKET_SELECTTIME,
  89. CONFIG_SOCKET_TIMEOUTTIME,
  90. CONFIG_SESSION_ADD_DELAY,
  91. CONFIG_GROUP_XP_DISTANCE,
  92. CONFIG_SIGHT_MONSTER,
  93. CONFIG_SIGHT_GUARDER,
  94. CONFIG_GAME_TYPE,
  95. CONFIG_REALM_ZONE,
  96. CONFIG_ALLOW_TWO_SIDE_ACCOUNTS,
  97. CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT,
  98. CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL,
  99. CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP,
  100. CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
  101. CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
  102. CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL,
  103. CONFIG_ALLOW_TWO_SIDE_WHO_LIST,
  104. CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND,
  105. CONFIG_ALLOW_TWO_SIDE_TRADE,
  106. CONFIG_STRICT_PLAYER_NAMES,
  107. CONFIG_STRICT_CHARTER_NAMES,
  108. CONFIG_STRICT_PET_NAMES,
  109. CONFIG_CHARACTERS_CREATING_DISABLED,
  110. CONFIG_CHARACTERS_PER_ACCOUNT,
  111. CONFIG_CHARACTERS_PER_REALM,
  112. CONFIG_SKIP_CINEMATICS,
  113. CONFIG_MAX_PLAYER_LEVEL,
  114. CONFIG_START_PLAYER_LEVEL,
  115. CONFIG_START_PLAYER_MONEY,
  116. CONFIG_MAX_HONOR_POINTS,
  117. CONFIG_START_HONOR_POINTS,
  118. CONFIG_MAX_ARENA_POINTS,
  119. CONFIG_START_ARENA_POINTS,
  120. CONFIG_INSTANCE_IGNORE_LEVEL,
  121. CONFIG_INSTANCE_IGNORE_RAID,
  122. CONFIG_INSTANCE_RESET_TIME_HOUR,
  123. CONFIG_INSTANCE_UNLOAD_DELAY,
  124. CONFIG_CAST_UNSTUCK,
  125. CONFIG_MAX_PRIMARY_TRADE_SKILL,
  126. CONFIG_MIN_PETITION_SIGNS,
  127. CONFIG_GM_LOGIN_STATE,
  128. CONFIG_GM_VISIBLE_STATE,
  129. CONFIG_GM_CHAT,
  130. CONFIG_GM_WISPERING_TO,
  131. CONFIG_GM_IN_GM_LIST,
  132. CONFIG_GM_IN_WHO_LIST,
  133. CONFIG_GM_MAIL,
  134. CONFIG_GM_LOG_TRADE,
  135. CONFIG_START_GM_LEVEL,
  136. CONFIG_ALLOW_GM_GROUP,
  137. CONFIG_ALLOW_GM_FRIEND,
  138. CONFIG_GROUP_VISIBILITY,
  139. CONFIG_MAIL_DELIVERY_DELAY,
  140. CONFIG_EXTERNAL_MAIL,
  141. CONFIG_EXTERNAL_MAIL_INTERVAL,
  142. CONFIG_UPTIME_UPDATE,
  143. CONFIG_SKILL_CHANCE_ORANGE,
  144. CONFIG_SKILL_CHANCE_YELLOW,
  145. CONFIG_SKILL_CHANCE_GREEN,
  146. CONFIG_SKILL_CHANCE_GREY,
  147. CONFIG_SKILL_CHANCE_MINING_STEPS,
  148. CONFIG_SKILL_CHANCE_SKINNING_STEPS,
  149. CONFIG_SKILL_PROSPECTING,
  150. CONFIG_SKILL_GAIN_CRAFTING,
  151. CONFIG_SKILL_GAIN_DEFENSE,
  152. CONFIG_SKILL_GAIN_GATHERING,
  153. CONFIG_SKILL_GAIN_WEAPON,
  154. CONFIG_MAX_OVERSPEED_PINGS,
  155. CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY,
  156. CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL,
  157. CONFIG_WEATHER,
  158. CONFIG_EXPANSION,
  159. CONFIG_CHATFLOOD_MESSAGE_COUNT,
  160. CONFIG_CHATFLOOD_MESSAGE_DELAY,
  161. CONFIG_CHATFLOOD_MUTE_TIME,
  162. CONFIG_EVENT_ANNOUNCE,
  163. CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS,
  164. CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS,
  165. CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY,
  166. CONFIG_CREATURE_FAMILY_FLEE_DELAY,
  167. CONFIG_WORLD_BOSS_LEVEL_DIFF,
  168. CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF,
  169. CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF,
  170. CONFIG_DETECT_POS_COLLISION,
  171. CONFIG_RESTRICTED_LFG_CHANNEL,
  172. CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL,
  173. CONFIG_TALENTS_INSPECTING,
  174. CONFIG_CHAT_FAKE_MESSAGE_PREVENTING,
  175. CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY,
  176. CONFIG_CHAT_STRICT_LINK_CHECKING_KICK,
  177. CONFIG_CORPSE_DECAY_NORMAL,
  178. CONFIG_CORPSE_DECAY_RARE,
  179. CONFIG_CORPSE_DECAY_ELITE,
  180. CONFIG_CORPSE_DECAY_RAREELITE,
  181. CONFIG_CORPSE_DECAY_WORLDBOSS,
  182. CONFIG_ADDON_CHANNEL,
  183. CONFIG_DEATH_SICKNESS_LEVEL,
  184. CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP,
  185. CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE,
  186. CONFIG_DEATH_BONES_WORLD,
  187. CONFIG_DEATH_BONES_BG_OR_ARENA,
  188. CONFIG_THREAT_RADIUS,
  189. CONFIG_CHANCE_OF_GM_SURVEY,
  190. CONFIG_INSTANT_LOGOUT,
  191. CONFIG_DISABLE_BREATHING,
  192. CONFIG_ALL_TAXI_PATHS,
  193. CONFIG_DECLINED_NAMES_USED,
  194. CONFIG_LISTEN_RANGE_SAY,
  195. CONFIG_LISTEN_RANGE_TEXTEMOTE,
  196. CONFIG_LISTEN_RANGE_YELL,
  197. CONFIG_BATTLEGROUND_CAST_DESERTER,
  198. CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE,
  199. CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY,
  200. CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ONSTART,
  201. CONFIG_BATTLEGROUND_PREMATURE_REWARD,
  202. CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
  203. CONFIG_BATTLEGROUND_WRATH_LEAVE_MODE,
  204. CONFIG_ARENA_MAX_RATING_DIFFERENCE,
  205. CONFIG_ARENA_RATING_DISCARD_TIMER,
  206. CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
  207. CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
  208. CONFIG_ARENA_LOG_EXTENDED_INFO,
  209. CONFIG_MAX_WHO,
  210. CONFIG_BG_START_MUSIC,
  211. CONFIG_START_ALL_SPELLS,
  212. CONFIG_HONOR_AFTER_DUEL,
  213. CONFIG_START_ALL_EXPLORED,
  214. CONFIG_START_ALL_REP,
  215. CONFIG_ALWAYS_MAXSKILL,
  216. CONFIG_PVP_TOKEN_ENABLE,
  217. CONFIG_PVP_TOKEN_MAP_TYPE,
  218. CONFIG_PVP_TOKEN_ID,
  219. CONFIG_PVP_TOKEN_COUNT,
  220. CONFIG_NO_RESET_TALENT_COST,
  221. CONFIG_SHOW_KICK_IN_WORLD,
  222. CONFIG_INTERVAL_LOG_UPDATE,
  223. CONFIG_MIN_LOG_UPDATE,
  224. CONFIG_ENABLE_SINFO_LOGIN,
  225. CONFIG_PET_LOS,
  226. CONFIG_VMAP_TOTEM,
  227. CONFIG_ENABLE_PATHFINDING,
  228. CONFIG_NUMTHREADS,
  229. CONFIG_CHATLOG_CHANNEL,
  230. CONFIG_CHATLOG_WHISPER,
  231. CONFIG_CHATLOG_SYSCHAN,
  232. CONFIG_CHATLOG_PARTY,
  233. CONFIG_CHATLOG_RAID,
  234. CONFIG_CHATLOG_GUILD,
  235. CONFIG_CHATLOG_PUBLIC,
  236. CONFIG_CHATLOG_ADDON,
  237. CONFIG_CHATLOG_BGROUND,
  238. CONFIG_LOGDB_CLEARINTERVAL,
  239. CONFIG_LOGDB_CLEARTIME,
  240. CONFIG_VMAP_INDOOR_CHECK,
  241. CONFIG_DUEL_MOD,
  242. CONFIG_DUEL_CD_RESET,
  243. CONFIG_CHARDELETE_KEEP_DAYS,
  244. CONFIG_CHARDELETE_METHOD,
  245. CONFIG_CHARDELETE_MIN_LEVEL,
  246. CONFIG_AUTOBROADCAST,
  247. CONFIG_AUTOBROADCAST_CENTER,
  248. CONFIG_AUTOBROADCAST_INTERVAL,
  249. CONFIG_VALUE_COUNT
  250. };
  251. // Server rates
  252. enum Rates
  253. {
  254. RATE_HEALTH = 0,
  255. RATE_POWER_MANA,
  256. RATE_POWER_RAGE_INCOME,
  257. RATE_POWER_RAGE_LOSS,
  258. RATE_POWER_FOCUS,
  259. RATE_POWER_ENERGY,
  260. RATE_SKILL_DISCOVERY,
  261. RATE_DROP_ITEM_POOR,
  262. RATE_DROP_ITEM_NORMAL,
  263. RATE_DROP_ITEM_UNCOMMON,
  264. RATE_DROP_ITEM_RARE,
  265. RATE_DROP_ITEM_EPIC,
  266. RATE_DROP_ITEM_LEGENDARY,
  267. RATE_DROP_ITEM_ARTIFACT,
  268. RATE_DROP_ITEM_REFERENCED,
  269. RATE_DROP_MONEY,
  270. RATE_XP_KILL,
  271. RATE_XP_QUEST,
  272. RATE_XP_EXPLORE,
  273. RATE_XP_PAST_70,
  274. RATE_REPUTATION_GAIN,
  275. RATE_CREATURE_NORMAL_HP,
  276. RATE_CREATURE_ELITE_ELITE_HP,
  277. RATE_CREATURE_ELITE_RAREELITE_HP,
  278. RATE_CREATURE_ELITE_WORLDBOSS_HP,
  279. RATE_CREATURE_ELITE_RARE_HP,
  280. RATE_CREATURE_NORMAL_DAMAGE,
  281. RATE_CREATURE_ELITE_ELITE_DAMAGE,
  282. RATE_CREATURE_ELITE_RAREELITE_DAMAGE,
  283. RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE,
  284. RATE_CREATURE_ELITE_RARE_DAMAGE,
  285. RATE_CREATURE_NORMAL_SPELLDAMAGE,
  286. RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE,
  287. RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE,
  288. RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE,
  289. RATE_CREATURE_ELITE_RARE_SPELLDAMAGE,
  290. RATE_CREATURE_AGGRO,
  291. RATE_REST_INGAME,
  292. RATE_REST_OFFLINE_IN_TAVERN_OR_CITY,
  293. RATE_REST_OFFLINE_IN_WILDERNESS,
  294. RATE_DAMAGE_FALL,
  295. RATE_AUCTION_TIME,
  296. RATE_AUCTION_DEPOSIT,
  297. RATE_AUCTION_CUT,
  298. RATE_HONOR,
  299. RATE_MINING_AMOUNT,
  300. RATE_MINING_NEXT,
  301. RATE_TALENT,
  302. RATE_LOYALTY,
  303. RATE_CORPSE_DECAY_LOOTED,
  304. RATE_INSTANCE_RESET_TIME,
  305. RATE_TARGET_POS_RECALCULATION_RANGE,
  306. RATE_DURABILITY_LOSS_DAMAGE,
  307. RATE_DURABILITY_LOSS_PARRY,
  308. RATE_DURABILITY_LOSS_ABSORB,
  309. RATE_DURABILITY_LOSS_BLOCK,
  310. RATE_PVP_RANK_EXTRA_HONOR,
  311. MAX_RATES
  312. };
  313. enum HonorKillPvPRank
  314. {
  315. HKRANK00,
  316. HKRANK01,
  317. HKRANK02,
  318. HKRANK03,
  319. HKRANK04,
  320. HKRANK05,
  321. HKRANK06,
  322. HKRANK07,
  323. HKRANK08,
  324. HKRANK09,
  325. HKRANK10,
  326. HKRANK11,
  327. HKRANK12,
  328. HKRANK13,
  329. HKRANK14,
  330. HKRANKMAX
  331. };
  332. // Type of server
  333. enum RealmType
  334. {
  335. REALM_TYPE_NORMAL = 0,
  336. REALM_TYPE_PVP = 1,
  337. REALM_TYPE_NORMAL2 = 4,
  338. REALM_TYPE_RP = 6,
  339. REALM_TYPE_RPPVP = 8,
  340. REALM_TYPE_FFA_PVP = 16 // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries
  341. // replaced by REALM_PVP in realm list
  342. };
  343. enum RealmZone
  344. {
  345. REALM_ZONE_UNKNOWN = 0, // any language
  346. REALM_ZONE_DEVELOPMENT = 1, // any language
  347. REALM_ZONE_UNITED_STATES = 2, // extended-Latin
  348. REALM_ZONE_OCEANIC = 3, // extended-Latin
  349. REALM_ZONE_LATIN_AMERICA = 4, // extended-Latin
  350. REALM_ZONE_TOURNAMENT_5 = 5, // basic-Latin at create, any at login
  351. REALM_ZONE_KOREA = 6, // East-Asian
  352. REALM_ZONE_TOURNAMENT_7 = 7, // basic-Latin at create, any at login
  353. REALM_ZONE_ENGLISH = 8, // extended-Latin
  354. REALM_ZONE_GERMAN = 9, // extended-Latin
  355. REALM_ZONE_FRENCH = 10, // extended-Latin
  356. REALM_ZONE_SPANISH = 11, // extended-Latin
  357. REALM_ZONE_RUSSIAN = 12, // Cyrillic
  358. REALM_ZONE_TOURNAMENT_13 = 13, // basic-Latin at create, any at login
  359. REALM_ZONE_TAIWAN = 14, // East-Asian
  360. REALM_ZONE_TOURNAMENT_15 = 15, // basic-Latin at create, any at login
  361. REALM_ZONE_CHINA = 16, // East-Asian
  362. REALM_ZONE_CN1 = 17, // basic-Latin at create, any at login
  363. REALM_ZONE_CN2 = 18, // basic-Latin at create, any at login
  364. REALM_ZONE_CN3 = 19, // basic-Latin at create, any at login
  365. REALM_ZONE_CN4 = 20, // basic-Latin at create, any at login
  366. REALM_ZONE_CN5 = 21, // basic-Latin at create, any at login
  367. REALM_ZONE_CN6 = 22, // basic-Latin at create, any at login
  368. REALM_ZONE_CN7 = 23, // basic-Latin at create, any at login
  369. REALM_ZONE_CN8 = 24, // basic-Latin at create, any at login
  370. REALM_ZONE_TOURNAMENT_25 = 25, // basic-Latin at create, any at login
  371. REALM_ZONE_TEST_SERVER = 26, // any language
  372. REALM_ZONE_TOURNAMENT_27 = 27, // basic-Latin at create, any at login
  373. REALM_ZONE_QA_SERVER = 28, // any language
  374. REALM_ZONE_CN9 = 29 // basic-Latin at create, any at login
  375. };
  376. // DB scripting commands
  377. enum ScriptCommands
  378. {
  379. SCRIPT_COMMAND_TALK = 0, // source/target = Creature, target = any, datalong = talk type (0=say, 1=whisper, 2=yell, 3=emote text, 4=boss emote text), datalong2 & 1 = player talk (instead of creature), dataint = string_id
  380. SCRIPT_COMMAND_EMOTE = 1, // source/target = Creature, datalong = emote id, datalong2 = 0: set emote state; > 0: play emote state
  381. SCRIPT_COMMAND_FIELD_SET = 2, // source/target = Creature, datalong = field id, datalog2 = value
  382. SCRIPT_COMMAND_MOVE_TO = 3, // source/target = Creature, datalong2 = time to reach, x/y/z = destination
  383. SCRIPT_COMMAND_FLAG_SET = 4, // source/target = Creature, datalong = field id, datalog2 = bitmask
  384. SCRIPT_COMMAND_FLAG_REMOVE = 5, // source/target = Creature, datalong = field id, datalog2 = bitmask
  385. SCRIPT_COMMAND_TELEPORT_TO = 6, // source/target = Creature/Player (see datalong2), datalong = map_id, datalong2 = 0: Player; 1: Creature, x/y/z = destination, o = orientation
  386. SCRIPT_COMMAND_QUEST_EXPLORED = 7, // target/source = Player, target/source = GO/Creature, datalong = quest id, datalong2 = distance or 0
  387. SCRIPT_COMMAND_KILL_CREDIT = 8, // target/source = Player, datalong = creature entry, datalong2 = 0: personal credit, 1: group credit
  388. SCRIPT_COMMAND_RESPAWN_GAMEOBJECT = 9, // source = WorldObject (summoner), datalong = GO guid, datalong2 = despawn delay
  389. SCRIPT_COMMAND_TEMP_SUMMON_CREATURE = 10, // source = WorldObject (summoner), datalong = creature entry, datalong2 = despawn delay, x/y/z = summon position, o = orientation
  390. SCRIPT_COMMAND_OPEN_DOOR = 11, // source = Unit, datalong = GO guid, datalong2 = reset delay (min 15)
  391. SCRIPT_COMMAND_CLOSE_DOOR = 12, // source = Unit, datalong = GO guid, datalong2 = reset delay (min 15)
  392. SCRIPT_COMMAND_ACTIVATE_OBJECT = 13, // source = Unit, target = GO
  393. SCRIPT_COMMAND_REMOVE_AURA = 14, // source (datalong2 != 0) or target (datalong2 == 0) = Unit, datalong = spell id
  394. SCRIPT_COMMAND_CAST_SPELL = 15, // source and/or target = Unit, datalong2 = cast direction (0: s->t 1: s->s 2: t->t 3: t->s 4: s->creature with dataint entry), dataint & 1 = triggered flag
  395. SCRIPT_COMMAND_PLAY_SOUND = 16, // source = WorldObject, target = none/Player, datalong = sound id, datalong2 (bitmask: 0/1=anyone/player, 0/2=without/with distance dependency, so 1|2 = 3 is target with distance dependency)
  396. SCRIPT_COMMAND_CREATE_ITEM = 17, // target/source = Player, datalong = item entry, datalong2 = amount
  397. SCRIPT_COMMAND_DESPAWN_SELF = 18, // target/source = Creature, datalong = despawn delay
  398. SCRIPT_COMMAND_LOAD_PATH = 20, // source = Unit, datalong = path id, datalong2 = is repeatable
  399. SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT = 21, // source = WorldObject (if present used as a search center), datalong = script id, datalong2 = unit lowguid, dataint = script table to use (see ScriptsType)
  400. SCRIPT_COMMAND_KILL = 22, // source/target = Creature, dataint = remove corpse attribute
  401. //Oregon only
  402. SCRIPT_COMMAND_ORIENTATION = 30, // source = Unit, target (datalong > 0) = Unit, datalong = > 0 turn source to face target, o = orientation
  403. SCRIPT_COMMAND_EQUIP = 31, // soucre = Creature, datalong = equipment id
  404. SCRIPT_COMMAND_MODEL = 32, // source = Creature, datalong = model id
  405. SCRIPT_COMMAND_CLOSE_GOSSIP = 33, // source = Player
  406. };
  407. // Storage class for commands issued for delayed execution
  408. struct CliCommandHolder
  409. {
  410. typedef void Print(void*, const char*);
  411. typedef void CommandFinished(void*, bool success);
  412. void* m_callbackArg;
  413. char *m_command;
  414. Print* m_print;
  415. CommandFinished* m_commandFinished;
  416. CliCommandHolder(void* callbackArg, const char *command, Print* zprint, CommandFinished* commandFinished)
  417. : m_callbackArg(callbackArg), m_print(zprint), m_commandFinished(commandFinished)
  418. {
  419. size_t len = strlen(command)+1;
  420. m_command = new char[len];
  421. memcpy(m_command, command, len);
  422. }
  423. ~CliCommandHolder() { delete[] m_command; }
  424. };
  425. // The World
  426. class World
  427. {
  428. public:
  429. static volatile uint32 m_worldLoopCounter;
  430. World();
  431. ~World();
  432. WorldSession* FindSession(uint32 id) const;
  433. void AddSession(WorldSession *s);
  434. void SendAutoBroadcast();
  435. bool RemoveSession(uint32 id);
  436. // Get the number of current active sessions
  437. void UpdateMaxSessionCounters();
  438. uint32 GetActiveAndQueuedSessionCount() const { return m_sessions.size(); }
  439. uint32 GetActiveSessionCount() const { return m_sessions.size() - m_QueuedPlayer.size(); }
  440. uint32 GetQueuedSessionCount() const { return m_QueuedPlayer.size(); }
  441. // Get the maximum number of parallel sessions on the server since last reboot
  442. uint32 GetMaxQueuedSessionCount() const { return m_maxQueuedSessionCount; }
  443. uint32 GetMaxActiveSessionCount() const { return m_maxActiveSessionCount; }
  444. Player* FindPlayerInZone(uint32 zone);
  445. Weather* FindWeather(uint32 id) const;
  446. Weather* AddWeather(uint32 zone_id);
  447. void RemoveWeather(uint32 zone_id);
  448. // Get the active session server limit (or security level limitations)
  449. uint32 GetPlayerAmountLimit() const { return m_playerLimit >= 0 ? m_playerLimit : 0; }
  450. AccountTypes GetPlayerSecurityLimit() const { return m_allowedSecurityLevel < 0 ? SEC_PLAYER : m_allowedSecurityLevel; }
  451. void SetPlayerSecurityLimit(AccountTypes sec) { m_allowedSecurityLevel = (sec < SEC_PLAYER ? SEC_PLAYER : sec); }
  452. // Set the active session server limit (or security level limitation)
  453. void SetPlayerLimit(int32 limit, bool needUpdate = false);
  454. //player Queue
  455. typedef std::list<WorldSession*> Queue;
  456. void AddQueuedPlayer(WorldSession*);
  457. bool RemoveQueuedPlayer(WorldSession* session);
  458. int32 GetQueuePos(WorldSession*);
  459. bool HasRecentlyDisconnected(WorldSession*);
  460. uint32 GetQueueSize() const { return m_QueuedPlayer.size(); }
  461. // todo Actions on m_allowMovement still to be implemented
  462. // Is movement allowed?
  463. bool getAllowMovement() const { return m_allowMovement; }
  464. // Allow/Disallow object movements
  465. void SetAllowMovement(bool allow) { m_allowMovement = allow; }
  466. // Set a new Message of the Day
  467. void SetMotd(std::string motd) { m_motd = motd; }
  468. // Get the current Message of the Day
  469. const char* GetMotd() const { return m_motd.c_str(); }
  470. // Set the string for new characters (first login)
  471. void SetNewCharString(std::string str) { m_newCharString = str; }
  472. // Get the string for new characters (first login)
  473. const std::string& GetNewCharString() const { return m_newCharString; }
  474. uint32 GetDefaultDbcLocale() const { return m_defaultDbcLocale; }
  475. // Get the path where data (dbc, maps) are stored on disk
  476. std::string GetDataPath() const { return m_dataPath; }
  477. // When server started?
  478. time_t const& GetStartTime() const { return m_startTime; }
  479. // What time is it?
  480. time_t const& GetGameTime() const { return m_gameTime; }
  481. // Uptime (in secs)
  482. uint32 GetUptime() const { return uint32(m_gameTime - m_startTime); }
  483. // Update time
  484. uint32 GetUpdateTime() const { return m_updateTime; }
  485. void SetRecordDiffInterval(int32 t) { if (t >= 0) m_configs[CONFIG_INTERVAL_LOG_UPDATE] = (uint32)t; }
  486. // Get the maximum skill level a player can reach
  487. uint16 GetConfigMaxSkillValue() const
  488. {
  489. uint32 lvl = getConfig(CONFIG_MAX_PLAYER_LEVEL);
  490. return lvl > 60 ? 300 + ((lvl - 60) * 75) / 10 : lvl*5;
  491. }
  492. void SetInitialWorldSettings();
  493. void LoadConfigSettings(bool reload = false);
  494. void SendWorldText(int32 string_id, ...);
  495. void SendGlobalText(const char* text, WorldSession *self);
  496. void SendGMText(int32 string_id, ...);
  497. void SendGlobalMessage(WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
  498. void SendGlobalGMMessage(WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
  499. void SendZoneMessage(uint32 zone, WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
  500. void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
  501. void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
  502. uint32 pvp_ranks[HKRANKMAX];
  503. // Are we in the middle of a shutdown?
  504. bool IsShutdowning() const { return m_ShutdownTimer > 0; }
  505. void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
  506. void ShutdownCancel();
  507. void ShutdownMsg(bool show = false, Player* player = NULL);
  508. static uint8 GetExitCode() { return m_ExitCode; }
  509. static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; }
  510. static bool IsStopped() { return m_stopEvent; }
  511. void Update(time_t diff);
  512. void UpdateSessions(time_t diff);
  513. // Set a server rate (see #Rates)
  514. void setRate(Rates rate,float value) { rate_values[rate]=value; }
  515. // Get a server rate (see #Rates)
  516. float getRate(Rates rate) const { return rate_values[rate]; }
  517. // Set a server configuration element (see #WorldConfigs)
  518. void setConfig(uint32 index,uint32 value)
  519. {
  520. if (index<CONFIG_VALUE_COUNT)
  521. m_configs[index]=value;
  522. }
  523. // Get a server configuration element (see #WorldConfigs)
  524. uint32 getConfig(uint32 index) const
  525. {
  526. if (index<CONFIG_VALUE_COUNT)
  527. return m_configs[index];
  528. else
  529. return 0;
  530. }
  531. // Are we on a "Player versus Player" server?
  532. 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); }
  533. bool IsFFAPvPRealm() { return getConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP; }
  534. bool KickPlayer(const std::string& playerName);
  535. void KickAll();
  536. void KickAllLess(AccountTypes sec);
  537. BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author);
  538. bool RemoveBanAccount(BanMode mode, std::string nameOrIP);
  539. uint32 IncreaseScheduledScriptsCount() { return (uint32)++m_scheduledScripts; }
  540. uint32 DecreaseScheduledScriptCount() { return (uint32)--m_scheduledScripts; }
  541. uint32 DecreaseScheduledScriptCount(size_t count) { return (uint32)(m_scheduledScripts -= count); }
  542. bool IsScriptScheduled() const { return m_scheduledScripts > 0; }
  543. bool IsAllowedMap(uint32 mapid) { return m_forbiddenMapIds.count(mapid) == 0 ;}
  544. // for max speed access
  545. static float GetMaxVisibleDistanceOnContinents() { return m_MaxVisibleDistanceOnContinents; }
  546. static float GetMaxVisibleDistanceInInstances() { return m_MaxVisibleDistanceInInstances; }
  547. static float GetMaxVisibleDistanceInBGArenas() { return m_MaxVisibleDistanceInBGArenas; }
  548. static float GetMaxVisibleDistanceForObject() { return m_MaxVisibleDistanceForObject; }
  549. static float GetMaxVisibleDistanceInFlight() { return m_MaxVisibleDistanceInFlight; }
  550. static float GetVisibleUnitGreyDistance() { return m_VisibleUnitGreyDistance; }
  551. static float GetVisibleObjectGreyDistance() { return m_VisibleObjectGreyDistance; }
  552. static int32 GetVisibilityNotifyPeriodOnContinents(){ return m_visibility_notify_periodOnContinents; }
  553. static int32 GetVisibilityNotifyPeriodInInstances() { return m_visibility_notify_periodInInstances; }
  554. static int32 GetVisibilityNotifyPeriodInBGArenas() { return m_visibility_notify_periodInBGArenas; }
  555. // movement anticheat
  556. static bool GetEnableMvAnticheat() { return m_EnableMvAnticheat; }
  557. static uint32 GetTeleportToPlaneAlarms() { return m_TeleportToPlaneAlarms; }
  558. static uint32 GetMaxMovementAlarms() { return m_MaxMovementAlarms; }
  559. //<<< end movement anticheat
  560. void ProcessCliCommands();
  561. void QueueCliCommand(CliCommandHolder* commandHolder) { cliCmdQueue.add(commandHolder); }
  562. void UpdateResultQueue();
  563. void InitResultQueue();
  564. void ForceGameEventUpdate();
  565. void UpdateRealmCharCount(uint32 accid);
  566. void UpdateAllowedSecurity();
  567. LocaleConstant GetAvailableDbcLocale(LocaleConstant locale) const { if (m_availableDbcLocaleMask & (1 << locale)) return locale; else return m_defaultDbcLocale; }
  568. //used World DB version
  569. void LoadDBVersion();
  570. char const* GetDBVersion() { return m_DBVersion.c_str(); }
  571. //used Script version
  572. void SetScriptsVersion(char const* version) { m_ScriptsVersion = version ? version : "unknown scripting library"; }
  573. char const* GetScriptsVersion() { return m_ScriptsVersion.c_str(); }
  574. void RecordTimeDiff(const char * text, ...);
  575. void LoadAutobroadcasts();
  576. protected:
  577. void _UpdateGameTime();
  578. // callback for UpdateRealmCharacters
  579. void _UpdateRealmCharCount(QueryResult_AutoPtr resultCharCount, uint32 accountId);
  580. void InitDailyQuestResetTime();
  581. void ResetDailyQuests();
  582. private:
  583. static volatile bool m_stopEvent;
  584. static uint8 m_ExitCode;
  585. uint32 m_ShutdownTimer;
  586. uint32 m_ShutdownMask;
  587. //atomic op counter for active scripts amount
  588. ACE_Atomic_Op<ACE_Thread_Mutex, long> m_scheduledScripts;
  589. time_t m_startTime;
  590. time_t m_gameTime;
  591. IntervalTimer m_timers[WUPDATE_COUNT];
  592. IntervalTimer extmail_timer;
  593. uint32 mail_timer;
  594. uint32 mail_timer_expires;
  595. uint32 m_updateTime, m_updateTimeSum;
  596. uint32 m_updateTimeCount;
  597. uint32 m_currentTime;
  598. typedef UNORDERED_MAP<uint32, Weather*> WeatherMap;
  599. WeatherMap m_weathers;
  600. typedef UNORDERED_MAP<uint32, WorldSession*> SessionMap;
  601. SessionMap m_sessions;
  602. typedef UNORDERED_MAP<uint32, time_t> DisconnectMap;
  603. DisconnectMap m_disconnects;
  604. uint32 m_maxActiveSessionCount;
  605. uint32 m_maxQueuedSessionCount;
  606. std::string m_newCharString;
  607. float rate_values[MAX_RATES];
  608. uint32 m_configs[CONFIG_VALUE_COUNT];
  609. int32 m_playerLimit;
  610. AccountTypes m_allowedSecurityLevel;
  611. LocaleConstant m_defaultDbcLocale; // from config for one from loaded DBC locales
  612. uint32 m_availableDbcLocaleMask; // by loaded DBC
  613. void DetectDBCLang();
  614. bool m_allowMovement;
  615. std::string m_motd;
  616. std::string m_dataPath;
  617. std::set<uint32> m_forbiddenMapIds;
  618. // for max speed access
  619. static float m_MaxVisibleDistanceOnContinents;
  620. static float m_MaxVisibleDistanceInInstances;
  621. static float m_MaxVisibleDistanceInBGArenas;
  622. static float m_MaxVisibleDistanceForObject;
  623. static float m_MaxVisibleDistanceInFlight;
  624. static float m_VisibleUnitGreyDistance;
  625. static float m_VisibleObjectGreyDistance;
  626. static int32 m_visibility_notify_periodOnContinents;
  627. static int32 m_visibility_notify_periodInInstances;
  628. static int32 m_visibility_notify_periodInBGArenas;
  629. // movement anticheat enable flag
  630. static bool m_EnableMvAnticheat;
  631. static uint32 m_TeleportToPlaneAlarms;
  632. static uint32 m_MaxMovementAlarms;
  633. // CLI command holder to be thread safe
  634. ACE_Based::LockedQueue<CliCommandHolder*, ACE_Thread_Mutex> cliCmdQueue;
  635. SqlResultQueue *m_resultQueue;
  636. // next daily quests reset time
  637. time_t m_NextDailyQuestReset;
  638. //Player Queue
  639. Queue m_QueuedPlayer;
  640. //sessions that are added async
  641. void AddSession_(WorldSession* s);
  642. ACE_Based::LockedQueue<WorldSession*, ACE_Thread_Mutex> addSessQueue;
  643. //used versions
  644. std::string m_DBVersion;
  645. std::string m_ScriptsVersion;
  646. std::list<std::string> m_Autobroadcasts;
  647. };
  648. extern uint32 realmID;
  649. #define sWorld Oregon::Singleton<World>::Instance()
  650. #endif