/src/server/game/World/World.h

http://github.com/SingularityCore/Singularity · C Header · 829 lines · 666 code · 88 blank · 75 comment · 12 complexity · c7db82b06f69f2f510bf1bd1ed1eabfe MD5 · raw file

  1. /*
  2. * Copyright (C) 2011 SingularityCore <http://www.singularitycore.org/>
  3. * Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
  4. * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by the
  8. * Free Software Foundation; either version 2 of the License, or (at your
  9. * option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  14. * more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. /// \addtogroup world The World
  20. /// @{
  21. /// \file
  22. #ifndef __WORLD_H
  23. #define __WORLD_H
  24. #include "Common.h"
  25. #include "Timer.h"
  26. #include <ace/Singleton.h>
  27. #include "SharedDefines.h"
  28. #include "QueryResult.h"
  29. #include "Callback.h"
  30. #include <map>
  31. #include <set>
  32. #include <list>
  33. class Object;
  34. class WorldPacket;
  35. class WorldSession;
  36. class Player;
  37. class WorldSocket;
  38. class SystemMgr;
  39. // ServerMessages.dbc
  40. enum ServerMessageType
  41. {
  42. SERVER_MSG_SHUTDOWN_TIME = 1,
  43. SERVER_MSG_RESTART_TIME = 2,
  44. SERVER_MSG_STRING = 3,
  45. SERVER_MSG_SHUTDOWN_CANCELLED = 4,
  46. SERVER_MSG_RESTART_CANCELLED = 5
  47. };
  48. enum ShutdownMask
  49. {
  50. SHUTDOWN_MASK_RESTART = 1,
  51. SHUTDOWN_MASK_IDLE = 2,
  52. };
  53. enum ShutdownExitCode
  54. {
  55. SHUTDOWN_EXIT_CODE = 0,
  56. ERROR_EXIT_CODE = 1,
  57. RESTART_EXIT_CODE = 2,
  58. };
  59. /// Timers for different object refresh rates
  60. enum WorldTimers
  61. {
  62. WUPDATE_AUCTIONS,
  63. WUPDATE_WEATHERS,
  64. WUPDATE_UPTIME,
  65. WUPDATE_CORPSES,
  66. WUPDATE_EVENTS,
  67. WUPDATE_CLEANDB,
  68. WUPDATE_AUTOBROADCAST,
  69. WUPDATE_MAILBOXQUEUE,
  70. WUPDATE_DELETECHARS,
  71. WUPDATE_PINGDB,
  72. WUPDATE_COUNT
  73. };
  74. /// Configuration elements
  75. enum WorldBoolConfigs
  76. {
  77. CONFIG_DURABILITY_LOSS_IN_PVP = 0,
  78. CONFIG_ADDON_CHANNEL,
  79. CONFIG_ALLOW_PLAYER_COMMANDS,
  80. CONFIG_CLEAN_CHARACTER_DB,
  81. CONFIG_GRID_UNLOAD,
  82. CONFIG_STATS_SAVE_ONLY_ON_LOGOUT,
  83. CONFIG_ALLOW_TWO_SIDE_ACCOUNTS,
  84. CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT,
  85. CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL,
  86. CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP,
  87. CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
  88. CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
  89. CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL,
  90. CONFIG_ALLOW_TWO_SIDE_WHO_LIST,
  91. CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND,
  92. CONFIG_ALLOW_TWO_SIDE_TRADE,
  93. CONFIG_ALL_TAXI_PATHS,
  94. CONFIG_INSTANT_TAXI,
  95. CONFIG_INSTANCE_IGNORE_LEVEL,
  96. CONFIG_INSTANCE_IGNORE_RAID,
  97. CONFIG_CAST_UNSTUCK,
  98. CONFIG_GM_LOG_TRADE,
  99. CONFIG_ALLOW_GM_GROUP,
  100. CONFIG_ALLOW_GM_FRIEND,
  101. CONFIG_GM_LOWER_SECURITY,
  102. CONFIG_SKILL_PROSPECTING,
  103. CONFIG_SKILL_MILLING,
  104. CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY,
  105. CONFIG_WEATHER,
  106. CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL,
  107. CONFIG_QUEST_IGNORE_RAID,
  108. CONFIG_DETECT_POS_COLLISION,
  109. CONFIG_RESTRICTED_LFG_CHANNEL,
  110. CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL,
  111. CONFIG_TALENTS_INSPECTING,
  112. CONFIG_CHAT_FAKE_MESSAGE_PREVENTING,
  113. CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP,
  114. CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE,
  115. CONFIG_DEATH_BONES_WORLD,
  116. CONFIG_DEATH_BONES_BG_OR_ARENA,
  117. CONFIG_DIE_COMMAND_MODE,
  118. CONFIG_DECLINED_NAMES_USED,
  119. CONFIG_BATTLEGROUND_CAST_DESERTER,
  120. CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE,
  121. CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY,
  122. CONFIG_BG_XP_FOR_KILL,
  123. CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
  124. CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE,
  125. CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY,
  126. CONFIG_ARENA_SEASON_IN_PROGRESS,
  127. CONFIG_ARENA_LOG_EXTENDED_INFO,
  128. CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN,
  129. CONFIG_VMAP_INDOOR_CHECK,
  130. CONFIG_PET_LOS,
  131. CONFIG_START_ALL_SPELLS,
  132. CONFIG_START_ALL_EXPLORED,
  133. CONFIG_START_ALL_REP,
  134. CONFIG_ALWAYS_MAXSKILL,
  135. CONFIG_PVP_TOKEN_ENABLE,
  136. CONFIG_NO_RESET_TALENT_COST,
  137. CONFIG_SHOW_KICK_IN_WORLD,
  138. CONFIG_CHATLOG_CHANNEL,
  139. CONFIG_CHATLOG_WHISPER,
  140. CONFIG_CHATLOG_SYSCHAN,
  141. CONFIG_CHATLOG_PARTY,
  142. CONFIG_CHATLOG_RAID,
  143. CONFIG_CHATLOG_GUILD,
  144. CONFIG_CHATLOG_PUBLIC,
  145. CONFIG_CHATLOG_ADDON,
  146. CONFIG_CHATLOG_BGROUND,
  147. CONFIG_DUNGEON_FINDER_ENABLE,
  148. CONFIG_AUTOBROADCAST,
  149. CONFIG_ALLOW_TICKETS,
  150. CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES,
  151. CONFIG_PRESERVE_CUSTOM_CHANNELS,
  152. BOOL_CONFIG_VALUE_COUNT
  153. };
  154. enum WorldFloatConfigs
  155. {
  156. CONFIG_GROUP_XP_DISTANCE = 0,
  157. CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE,
  158. CONFIG_SIGHT_MONSTER,
  159. CONFIG_SIGHT_GUARDER,
  160. CONFIG_LISTEN_RANGE_SAY,
  161. CONFIG_LISTEN_RANGE_TEXTEMOTE,
  162. CONFIG_LISTEN_RANGE_YELL,
  163. CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS,
  164. CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS,
  165. CONFIG_THREAT_RADIUS,
  166. CONFIG_CHANCE_OF_GM_SURVEY,
  167. FLOAT_CONFIG_VALUE_COUNT
  168. };
  169. enum WorldIntConfigs
  170. {
  171. CONFIG_COMPRESSION = 0,
  172. CONFIG_INTERVAL_SAVE,
  173. CONFIG_INTERVAL_GRIDCLEAN,
  174. CONFIG_INTERVAL_MAPUPDATE,
  175. CONFIG_INTERVAL_CHANGEWEATHER,
  176. CONFIG_INTERVAL_DISCONNECT_TOLERANCE,
  177. CONFIG_PORT_WORLD,
  178. CONFIG_SOCKET_TIMEOUTTIME,
  179. CONFIG_SESSION_ADD_DELAY,
  180. CONFIG_GAME_TYPE,
  181. CONFIG_REALM_ZONE,
  182. CONFIG_STRICT_PLAYER_NAMES,
  183. CONFIG_STRICT_CHARTER_NAMES,
  184. CONFIG_STRICT_PET_NAMES,
  185. CONFIG_MIN_PLAYER_NAME,
  186. CONFIG_MIN_CHARTER_NAME,
  187. CONFIG_MIN_PET_NAME,
  188. CONFIG_CHARACTER_CREATING_DISABLED,
  189. CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK,
  190. CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK,
  191. CONFIG_CHARACTERS_PER_ACCOUNT,
  192. CONFIG_CHARACTERS_PER_REALM,
  193. CONFIG_HEROIC_CHARACTERS_PER_REALM,
  194. CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER,
  195. CONFIG_SKIP_CINEMATICS,
  196. CONFIG_MAX_PLAYER_LEVEL,
  197. CONFIG_MIN_DUALSPEC_LEVEL,
  198. CONFIG_START_PLAYER_LEVEL,
  199. CONFIG_START_HEROIC_PLAYER_LEVEL,
  200. CONFIG_START_PLAYER_MONEY,
  201. CONFIG_MAX_HONOR_POINTS,
  202. CONFIG_START_HONOR_POINTS,
  203. CONFIG_MAX_JUSTICE_POINTS,
  204. CONFIG_START_JUSTICE_POINTS,
  205. CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL,
  206. CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE,
  207. CONFIG_INSTANCE_RESET_TIME_HOUR,
  208. CONFIG_INSTANCE_UNLOAD_DELAY,
  209. CONFIG_MAX_PRIMARY_TRADE_SKILL,
  210. CONFIG_MIN_PETITION_SIGNS,
  211. CONFIG_GM_LOGIN_STATE,
  212. CONFIG_GM_VISIBLE_STATE,
  213. CONFIG_GM_ACCEPT_TICKETS,
  214. CONFIG_GM_CHAT,
  215. CONFIG_GM_WHISPERING_TO,
  216. CONFIG_GM_LEVEL_IN_GM_LIST,
  217. CONFIG_GM_LEVEL_IN_WHO_LIST,
  218. CONFIG_START_GM_LEVEL,
  219. CONFIG_GROUP_VISIBILITY,
  220. CONFIG_MAIL_DELIVERY_DELAY,
  221. CONFIG_UPTIME_UPDATE,
  222. CONFIG_SKILL_CHANCE_ORANGE,
  223. CONFIG_SKILL_CHANCE_YELLOW,
  224. CONFIG_SKILL_CHANCE_GREEN,
  225. CONFIG_SKILL_CHANCE_GREY,
  226. CONFIG_SKILL_CHANCE_MINING_STEPS,
  227. CONFIG_SKILL_CHANCE_SKINNING_STEPS,
  228. CONFIG_SKILL_GAIN_CRAFTING,
  229. CONFIG_SKILL_GAIN_DEFENSE,
  230. CONFIG_SKILL_GAIN_GATHERING,
  231. CONFIG_SKILL_GAIN_WEAPON,
  232. CONFIG_MAX_OVERSPEED_PINGS,
  233. CONFIG_EXPANSION,
  234. CONFIG_CHATFLOOD_MESSAGE_COUNT,
  235. CONFIG_CHATFLOOD_MESSAGE_DELAY,
  236. CONFIG_CHATFLOOD_MUTE_TIME,
  237. CONFIG_EVENT_ANNOUNCE,
  238. CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY,
  239. CONFIG_CREATURE_FAMILY_FLEE_DELAY,
  240. CONFIG_WORLD_BOSS_LEVEL_DIFF,
  241. CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF,
  242. CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF,
  243. CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY,
  244. CONFIG_CHAT_STRICT_LINK_CHECKING_KICK,
  245. CONFIG_CHAT_CHANNEL_LEVEL_REQ,
  246. CONFIG_CHAT_WHISPER_LEVEL_REQ,
  247. CONFIG_CHAT_SAY_LEVEL_REQ,
  248. CONFIG_TRADE_LEVEL_REQ,
  249. CONFIG_TICKET_LEVEL_REQ,
  250. CONFIG_AUCTION_LEVEL_REQ,
  251. CONFIG_MAIL_LEVEL_REQ,
  252. CONFIG_CORPSE_DECAY_NORMAL,
  253. CONFIG_CORPSE_DECAY_RARE,
  254. CONFIG_CORPSE_DECAY_ELITE,
  255. CONFIG_CORPSE_DECAY_RAREELITE,
  256. CONFIG_CORPSE_DECAY_WORLDBOSS,
  257. CONFIG_DEATH_SICKNESS_LEVEL,
  258. CONFIG_INSTANT_LOGOUT,
  259. CONFIG_DISABLE_BREATHING,
  260. CONFIG_BATTLEGROUND_INVITATION_TYPE,
  261. CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
  262. CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH,
  263. CONFIG_ARENA_MAX_RATING_DIFFERENCE,
  264. CONFIG_ARENA_RATING_DISCARD_TIMER,
  265. CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
  266. CONFIG_ARENA_SEASON_ID,
  267. CONFIG_ARENA_START_RATING,
  268. CONFIG_ARENA_START_PERSONAL_RATING,
  269. CONFIG_ARENA_START_MATCHMAKER_RATING,
  270. CONFIG_MAX_WHO,
  271. CONFIG_HONOR_AFTER_DUEL,
  272. CONFIG_PVP_TOKEN_MAP_TYPE,
  273. CONFIG_PVP_TOKEN_ID,
  274. CONFIG_PVP_TOKEN_COUNT,
  275. CONFIG_INTERVAL_LOG_UPDATE,
  276. CONFIG_MIN_LOG_UPDATE,
  277. CONFIG_ENABLE_SINFO_LOGIN,
  278. CONFIG_PLAYER_ALLOW_COMMANDS,
  279. CONFIG_NUMTHREADS,
  280. CONFIG_LOGDB_CLEARINTERVAL,
  281. CONFIG_LOGDB_CLEARTIME,
  282. CONFIG_CLIENTCACHE_VERSION,
  283. CONFIG_GUILD_EVENT_LOG_COUNT,
  284. CONFIG_GUILD_BANK_EVENT_LOG_COUNT,
  285. CONFIG_MIN_LEVEL_STAT_SAVE,
  286. CONFIG_RANDOM_BG_RESET_HOUR,
  287. CONFIG_CHARDELETE_KEEP_DAYS,
  288. CONFIG_CHARDELETE_METHOD,
  289. CONFIG_CHARDELETE_MIN_LEVEL,
  290. CONFIG_AUTOBROADCAST_CENTER,
  291. CONFIG_AUTOBROADCAST_INTERVAL,
  292. CONFIG_MAX_RESULTS_LOOKUP_COMMANDS,
  293. CONFIG_DB_PING_INTERVAL,
  294. CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION,
  295. CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS,
  296. CONFIG_MAX_INSTANCES_PER_HOUR,
  297. INT_CONFIG_VALUE_COUNT
  298. };
  299. /// Server rates
  300. enum Rates
  301. {
  302. RATE_HEALTH = 0,
  303. RATE_POWER_MANA,
  304. RATE_POWER_RAGE_INCOME,
  305. RATE_POWER_RAGE_LOSS,
  306. RATE_POWER_RUNICPOWER_INCOME,
  307. RATE_POWER_RUNICPOWER_LOSS,
  308. RATE_POWER_FOCUS,
  309. RATE_POWER_ENERGY,
  310. RATE_SKILL_DISCOVERY,
  311. RATE_DROP_ITEM_POOR,
  312. RATE_DROP_ITEM_NORMAL,
  313. RATE_DROP_ITEM_UNCOMMON,
  314. RATE_DROP_ITEM_RARE,
  315. RATE_DROP_ITEM_EPIC,
  316. RATE_DROP_ITEM_LEGENDARY,
  317. RATE_DROP_ITEM_ARTIFACT,
  318. RATE_DROP_ITEM_REFERENCED,
  319. RATE_DROP_ITEM_REFERENCED_AMOUNT,
  320. RATE_DROP_MONEY,
  321. RATE_XP_KILL,
  322. RATE_XP_QUEST,
  323. RATE_XP_EXPLORE,
  324. RATE_REPAIRCOST,
  325. RATE_REPUTATION_GAIN,
  326. RATE_REPUTATION_LOWLEVEL_KILL,
  327. RATE_REPUTATION_LOWLEVEL_QUEST,
  328. RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS,
  329. RATE_CREATURE_NORMAL_HP,
  330. RATE_CREATURE_ELITE_ELITE_HP,
  331. RATE_CREATURE_ELITE_RAREELITE_HP,
  332. RATE_CREATURE_ELITE_WORLDBOSS_HP,
  333. RATE_CREATURE_ELITE_RARE_HP,
  334. RATE_CREATURE_NORMAL_DAMAGE,
  335. RATE_CREATURE_ELITE_ELITE_DAMAGE,
  336. RATE_CREATURE_ELITE_RAREELITE_DAMAGE,
  337. RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE,
  338. RATE_CREATURE_ELITE_RARE_DAMAGE,
  339. RATE_CREATURE_NORMAL_SPELLDAMAGE,
  340. RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE,
  341. RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE,
  342. RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE,
  343. RATE_CREATURE_ELITE_RARE_SPELLDAMAGE,
  344. RATE_CREATURE_AGGRO,
  345. RATE_REST_INGAME,
  346. RATE_REST_OFFLINE_IN_TAVERN_OR_CITY,
  347. RATE_REST_OFFLINE_IN_WILDERNESS,
  348. RATE_DAMAGE_FALL,
  349. RATE_AUCTION_TIME,
  350. RATE_AUCTION_DEPOSIT,
  351. RATE_AUCTION_CUT,
  352. RATE_HONOR,
  353. RATE_MINING_AMOUNT,
  354. RATE_MINING_NEXT,
  355. RATE_TALENT,
  356. RATE_CORPSE_DECAY_LOOTED,
  357. RATE_INSTANCE_RESET_TIME,
  358. RATE_TARGET_POS_RECALCULATION_RANGE,
  359. RATE_DURABILITY_LOSS_ON_DEATH,
  360. RATE_DURABILITY_LOSS_DAMAGE,
  361. RATE_DURABILITY_LOSS_PARRY,
  362. RATE_DURABILITY_LOSS_ABSORB,
  363. RATE_DURABILITY_LOSS_BLOCK,
  364. RATE_MOVESPEED,
  365. MAX_RATES
  366. };
  367. /// Can be used in SMSG_AUTH_RESPONSE packet
  368. enum BillingPlanFlags
  369. {
  370. SESSION_NONE = 0x00,
  371. SESSION_UNUSED = 0x01,
  372. SESSION_RECURRING_BILL = 0x02,
  373. SESSION_FREE_TRIAL = 0x04,
  374. SESSION_IGR = 0x08,
  375. SESSION_USAGE = 0x10,
  376. SESSION_TIME_MIXTURE = 0x20,
  377. SESSION_RESTRICTED = 0x40,
  378. SESSION_ENABLE_CAIS = 0x80,
  379. };
  380. /// Type of server, this is values from second column of Cfg_Configs.dbc
  381. enum RealmType
  382. {
  383. REALM_TYPE_NORMAL = 0,
  384. REALM_TYPE_PVP = 1,
  385. REALM_TYPE_NORMAL2 = 4,
  386. REALM_TYPE_RP = 6,
  387. REALM_TYPE_RPPVP = 8,
  388. REALM_TYPE_FFA_PVP = 16 // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries
  389. // replaced by REALM_PVP in realm list
  390. };
  391. enum RealmZone
  392. {
  393. REALM_ZONE_UNKNOWN = 0, // any language
  394. REALM_ZONE_DEVELOPMENT = 1, // any language
  395. REALM_ZONE_UNITED_STATES = 2, // extended-Latin
  396. REALM_ZONE_OCEANIC = 3, // extended-Latin
  397. REALM_ZONE_LATIN_AMERICA = 4, // extended-Latin
  398. REALM_ZONE_TOURNAMENT_5 = 5, // basic-Latin at create, any at login
  399. REALM_ZONE_KOREA = 6, // East-Asian
  400. REALM_ZONE_TOURNAMENT_7 = 7, // basic-Latin at create, any at login
  401. REALM_ZONE_ENGLISH = 8, // extended-Latin
  402. REALM_ZONE_GERMAN = 9, // extended-Latin
  403. REALM_ZONE_FRENCH = 10, // extended-Latin
  404. REALM_ZONE_SPANISH = 11, // extended-Latin
  405. REALM_ZONE_RUSSIAN = 12, // Cyrillic
  406. REALM_ZONE_TOURNAMENT_13 = 13, // basic-Latin at create, any at login
  407. REALM_ZONE_TAIWAN = 14, // East-Asian
  408. REALM_ZONE_TOURNAMENT_15 = 15, // basic-Latin at create, any at login
  409. REALM_ZONE_CHINA = 16, // East-Asian
  410. REALM_ZONE_CN1 = 17, // basic-Latin at create, any at login
  411. REALM_ZONE_CN2 = 18, // basic-Latin at create, any at login
  412. REALM_ZONE_CN3 = 19, // basic-Latin at create, any at login
  413. REALM_ZONE_CN4 = 20, // basic-Latin at create, any at login
  414. REALM_ZONE_CN5 = 21, // basic-Latin at create, any at login
  415. REALM_ZONE_CN6 = 22, // basic-Latin at create, any at login
  416. REALM_ZONE_CN7 = 23, // basic-Latin at create, any at login
  417. REALM_ZONE_CN8 = 24, // basic-Latin at create, any at login
  418. REALM_ZONE_TOURNAMENT_25 = 25, // basic-Latin at create, any at login
  419. REALM_ZONE_TEST_SERVER = 26, // any language
  420. REALM_ZONE_TOURNAMENT_27 = 27, // basic-Latin at create, any at login
  421. REALM_ZONE_QA_SERVER = 28, // any language
  422. REALM_ZONE_CN9 = 29, // basic-Latin at create, any at login
  423. REALM_ZONE_TEST_SERVER_2 = 30, // any language
  424. REALM_ZONE_CN10 = 31, // basic-Latin at create, any at login
  425. REALM_ZONE_CTC = 32,
  426. REALM_ZONE_CNC = 33,
  427. REALM_ZONE_CN1_4 = 34, // basic-Latin at create, any at login
  428. REALM_ZONE_CN2_6_9 = 35, // basic-Latin at create, any at login
  429. REALM_ZONE_CN3_7 = 36, // basic-Latin at create, any at login
  430. REALM_ZONE_CN5_8 = 37 // basic-Latin at create, any at login
  431. };
  432. enum WorldStates
  433. {
  434. WS_WEEKLY_QUEST_RESET_TIME = 20002, // Next weekly reset time
  435. WS_BG_DAILY_RESET_TIME = 20003 // Next daily BG reset time
  436. };
  437. // DB scripting commands
  438. enum ScriptCommands
  439. {
  440. 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
  441. SCRIPT_COMMAND_EMOTE = 1, // source/target = Creature, datalong = emote id, datalong2 = 0: set emote state; > 0: play emote state
  442. SCRIPT_COMMAND_FIELD_SET = 2, // source/target = Creature, datalong = field id, datalog2 = value
  443. SCRIPT_COMMAND_MOVE_TO = 3, // source/target = Creature, datalong2 = time to reach, x/y/z = destination
  444. SCRIPT_COMMAND_FLAG_SET = 4, // source/target = Creature, datalong = field id, datalog2 = bitmask
  445. SCRIPT_COMMAND_FLAG_REMOVE = 5, // source/target = Creature, datalong = field id, datalog2 = bitmask
  446. 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
  447. SCRIPT_COMMAND_QUEST_EXPLORED = 7, // target/source = Player, target/source = GO/Creature, datalong = quest id, datalong2 = distance or 0
  448. SCRIPT_COMMAND_KILL_CREDIT = 8, // target/source = Player, datalong = creature entry, datalong2 = 0: personal credit, 1: group credit
  449. SCRIPT_COMMAND_RESPAWN_GAMEOBJECT = 9, // source = WorldObject (summoner), datalong = GO guid, datalong2 = despawn delay
  450. SCRIPT_COMMAND_TEMP_SUMMON_CREATURE = 10, // source = WorldObject (summoner), datalong = creature entry, datalong2 = despawn delay, x/y/z = summon position, o = orientation
  451. SCRIPT_COMMAND_OPEN_DOOR = 11, // source = Unit, datalong = GO guid, datalong2 = reset delay (min 15)
  452. SCRIPT_COMMAND_CLOSE_DOOR = 12, // source = Unit, datalong = GO guid, datalong2 = reset delay (min 15)
  453. SCRIPT_COMMAND_ACTIVATE_OBJECT = 13, // source = Unit, target = GO
  454. SCRIPT_COMMAND_REMOVE_AURA = 14, // source (datalong2 != 0) or target (datalong2 == 0) = Unit, datalong = spell id
  455. 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
  456. 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)
  457. SCRIPT_COMMAND_CREATE_ITEM = 17, // target/source = Player, datalong = item entry, datalong2 = amount
  458. SCRIPT_COMMAND_DESPAWN_SELF = 18, // target/source = Creature, datalong = despawn delay
  459. SCRIPT_COMMAND_LOAD_PATH = 20, // source = Unit, datalong = path id, datalong2 = is repeatable
  460. 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)
  461. SCRIPT_COMMAND_KILL = 22, // source/target = Creature, dataint = remove corpse attribute
  462. // TrinityCore only
  463. SCRIPT_COMMAND_ORIENTATION = 30, // source = Unit, target (datalong > 0) = Unit, datalong = > 0 turn source to face target, o = orientation
  464. SCRIPT_COMMAND_EQUIP = 31, // soucre = Creature, datalong = equipment id
  465. SCRIPT_COMMAND_MODEL = 32, // source = Creature, datalong = model id
  466. SCRIPT_COMMAND_CLOSE_GOSSIP = 33, // source = Player
  467. SCRIPT_COMMAND_PLAYMOVIE = 34 // source = Player, datalong = movie id
  468. };
  469. /// Storage class for commands issued for delayed execution
  470. struct CliCommandHolder
  471. {
  472. typedef void Print(void*, const char*);
  473. typedef void CommandFinished(void*, bool success);
  474. void* m_callbackArg;
  475. char *m_command;
  476. Print* m_print;
  477. CommandFinished* m_commandFinished;
  478. CliCommandHolder(void* callbackArg, const char *command, Print* zprint, CommandFinished* commandFinished)
  479. : m_callbackArg(callbackArg), m_print(zprint), m_commandFinished(commandFinished)
  480. {
  481. size_t len = strlen(command)+1;
  482. m_command = new char[len];
  483. memcpy(m_command, command, len);
  484. }
  485. ~CliCommandHolder() { delete[] m_command; }
  486. };
  487. typedef UNORDERED_MAP<uint32, WorldSession*> SessionMap;
  488. /// The World
  489. class World
  490. {
  491. public:
  492. static volatile uint32 m_worldLoopCounter;
  493. World();
  494. ~World();
  495. WorldSession* FindSession(uint32 id) const;
  496. void AddSession(WorldSession *s);
  497. void SendAutoBroadcast();
  498. bool RemoveSession(uint32 id);
  499. /// Get the number of current active sessions
  500. void UpdateMaxSessionCounters();
  501. const SessionMap& GetAllSessions() const { return m_sessions; }
  502. uint32 GetActiveAndQueuedSessionCount() const { return m_sessions.size(); }
  503. uint32 GetActiveSessionCount() const { return m_sessions.size() - m_QueuedPlayer.size(); }
  504. uint32 GetQueuedSessionCount() const { return m_QueuedPlayer.size(); }
  505. /// Get the maximum number of parallel sessions on the server since last reboot
  506. uint32 GetMaxQueuedSessionCount() const { return m_maxQueuedSessionCount; }
  507. uint32 GetMaxActiveSessionCount() const { return m_maxActiveSessionCount; }
  508. /// Get number of players
  509. inline uint32 GetPlayerCount() const { return m_PlayerCount; }
  510. inline uint32 GetMaxPlayerCount() const { return m_MaxPlayerCount; }
  511. /// Increase/Decrease number of players
  512. inline void IncreasePlayerCount()
  513. {
  514. m_PlayerCount++;
  515. m_MaxPlayerCount = std::max(m_MaxPlayerCount, m_PlayerCount);
  516. }
  517. inline void DecreasePlayerCount() { m_PlayerCount--; }
  518. Player* FindPlayerInZone(uint32 zone);
  519. /// Deny clients?
  520. bool IsClosed() const;
  521. /// Close world
  522. void SetClosed(bool val);
  523. /// Security level limitations
  524. AccountTypes GetPlayerSecurityLimit() const { return m_allowedSecurityLevel; }
  525. void SetPlayerSecurityLimit(AccountTypes sec);
  526. void LoadDBAllowedSecurityLevel();
  527. /// Active session server limit
  528. void SetPlayerAmountLimit(uint32 limit) { m_playerLimit = limit; }
  529. uint32 GetPlayerAmountLimit() const { return m_playerLimit; }
  530. //player Queue
  531. typedef std::list<WorldSession*> Queue;
  532. void AddQueuedPlayer(WorldSession*);
  533. bool RemoveQueuedPlayer(WorldSession* session);
  534. int32 GetQueuePos(WorldSession*);
  535. bool HasRecentlyDisconnected(WorldSession*);
  536. /// \todo Actions on m_allowMovement still to be implemented
  537. /// Is movement allowed?
  538. bool getAllowMovement() const { return m_allowMovement; }
  539. /// Allow/Disallow object movements
  540. void SetAllowMovement(bool allow) { m_allowMovement = allow; }
  541. /// Set a new Message of the Day
  542. void SetMotd(const std::string& motd);
  543. /// Get the current Message of the Day
  544. const char* GetMotd() const;
  545. /// Set the string for new characters (first login)
  546. void SetNewCharString(std::string str) { m_newCharString = str; }
  547. /// Get the string for new characters (first login)
  548. const std::string& GetNewCharString() const { return m_newCharString; }
  549. LocaleConstant GetDefaultDbcLocale() const { return m_defaultDbcLocale; }
  550. /// Get the path where data (dbc, maps) are stored on disk
  551. std::string GetDataPath() const { return m_dataPath; }
  552. /// When server started?
  553. time_t const& GetStartTime() const { return m_startTime; }
  554. /// What time is it?
  555. time_t const& GetGameTime() const { return m_gameTime; }
  556. /// Uptime (in secs)
  557. uint32 GetUptime() const { return uint32(m_gameTime - m_startTime); }
  558. /// Update time
  559. uint32 GetUpdateTime() const { return m_updateTime; }
  560. void SetRecordDiffInterval(int32 t) { if (t >= 0) m_int_configs[CONFIG_INTERVAL_LOG_UPDATE] = (uint32)t; }
  561. /// Next daily quests and random bg reset time
  562. time_t GetNextDailyQuestsResetTime() const { return m_NextDailyQuestReset; }
  563. time_t GetNextWeeklyQuestsResetTime() const { return m_NextWeeklyQuestReset; }
  564. time_t GetNextRandomBGResetTime() const { return m_NextRandomBGReset; }
  565. /// Get the maximum skill level a player can reach
  566. uint16 GetConfigMaxSkillValue() const
  567. {
  568. uint8 lvl = getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
  569. return lvl > 60 ? 300 + ((lvl - 60) * 75) / 10 : lvl*5;
  570. }
  571. void SetInitialWorldSettings();
  572. void LoadConfigSettings(bool reload = false);
  573. void SendWorldText(int32 string_id, ...);
  574. void SendGlobalText(const char* text, WorldSession* self);
  575. void SendGMText(int32 string_id, ...);
  576. void SendGlobalMessage(WorldPacket* packet, WorldSession* self = 0, uint32 team = 0);
  577. void SendGlobalGMMessage(WorldPacket* packet, WorldSession* self = 0, uint32 team = 0);
  578. void SendZoneMessage(uint32 zone, WorldPacket* packet, WorldSession* self = 0, uint32 team = 0);
  579. void SendZoneText(uint32 zone, const char *text, WorldSession* self = 0, uint32 team = 0);
  580. void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
  581. /// Are we in the middle of a shutdown?
  582. bool IsShutdowning() const { return m_ShutdownTimer > 0; }
  583. void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
  584. void ShutdownCancel();
  585. void ShutdownMsg(bool show = false, Player* player = NULL);
  586. static uint8 GetExitCode() { return m_ExitCode; }
  587. static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; }
  588. static bool IsStopped() { return m_stopEvent; }
  589. void Update(uint32 diff);
  590. void UpdateSessions(uint32 diff);
  591. /// Set a server rate (see #Rates)
  592. void setRate(Rates rate, float value) { rate_values[rate]=value; }
  593. /// Get a server rate (see #Rates)
  594. float getRate(Rates rate) const { return rate_values[rate]; }
  595. /// Set a server configuration element (see #WorldConfigs)
  596. void setBoolConfig(WorldBoolConfigs index, bool value)
  597. {
  598. if (index < BOOL_CONFIG_VALUE_COUNT)
  599. m_bool_configs[index] = value;
  600. }
  601. /// Get a server configuration element (see #WorldConfigs)
  602. bool getBoolConfig(WorldBoolConfigs index) const
  603. {
  604. return index < BOOL_CONFIG_VALUE_COUNT ? m_bool_configs[index] : 0;
  605. }
  606. /// Set a server configuration element (see #WorldConfigs)
  607. void setFloatConfig(WorldFloatConfigs index, float value)
  608. {
  609. if (index < FLOAT_CONFIG_VALUE_COUNT)
  610. m_float_configs[index] = value;
  611. }
  612. /// Get a server configuration element (see #WorldConfigs)
  613. float getFloatConfig(WorldFloatConfigs index) const
  614. {
  615. return index < FLOAT_CONFIG_VALUE_COUNT ? m_float_configs[index] : 0;
  616. }
  617. /// Set a server configuration element (see #WorldConfigs)
  618. void setIntConfig(WorldIntConfigs index, uint32 value)
  619. {
  620. if (index < INT_CONFIG_VALUE_COUNT)
  621. m_int_configs[index] = value;
  622. }
  623. /// Get a server configuration element (see #WorldConfigs)
  624. uint32 getIntConfig(WorldIntConfigs index) const
  625. {
  626. return index < INT_CONFIG_VALUE_COUNT ? m_int_configs[index] : 0;
  627. }
  628. void setWorldState(uint32 index, uint64 value);
  629. uint64 getWorldState(uint32 index) const;
  630. void LoadWorldStates();
  631. /// Are we on a "Player versus Player" server?
  632. bool IsPvPRealm() const { return (getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP); }
  633. bool IsFFAPvPRealm() const { return getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP; }
  634. void KickAll();
  635. void KickAllLess(AccountTypes sec);
  636. BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author);
  637. bool RemoveBanAccount(BanMode mode, std::string nameOrIP);
  638. BanReturn BanCharacter(std::string name, std::string duration, std::string reason, std::string author);
  639. bool RemoveBanCharacter(std::string name);
  640. // for max speed access
  641. static float GetMaxVisibleDistanceOnContinents() { return m_MaxVisibleDistanceOnContinents; }
  642. static float GetMaxVisibleDistanceInInstances() { return m_MaxVisibleDistanceInInstances; }
  643. static float GetMaxVisibleDistanceInBGArenas() { return m_MaxVisibleDistanceInBGArenas; }
  644. static int32 GetVisibilityNotifyPeriodOnContinents(){ return m_visibility_notify_periodOnContinents; }
  645. static int32 GetVisibilityNotifyPeriodInInstances() { return m_visibility_notify_periodInInstances; }
  646. static int32 GetVisibilityNotifyPeriodInBGArenas() { return m_visibility_notify_periodInBGArenas; }
  647. void ProcessCliCommands();
  648. void QueueCliCommand(CliCommandHolder* commandHolder) { cliCmdQueue.add(commandHolder); }
  649. void ForceGameEventUpdate();
  650. void UpdateRealmCharCount(uint32 accid);
  651. LocaleConstant GetAvailableDbcLocale(LocaleConstant locale) const { if (m_availableDbcLocaleMask & (1 << locale)) return locale; else return m_defaultDbcLocale; }
  652. //used World DB version
  653. void LoadDBVersion();
  654. char const* GetDBVersion() const { return m_DBVersion.c_str(); }
  655. char const* GetCreatureEventAIVersion() const { return m_CreatureEventAIVersion.c_str(); }
  656. void RecordTimeDiff(const char * text, ...);
  657. void LoadAutobroadcasts();
  658. void UpdateAreaDependentAuras();
  659. void ProcessStartEvent();
  660. void ProcessStopEvent();
  661. bool GetEventKill() const { return isEventKillStart; }
  662. bool isEventKillStart;
  663. uint32 GetCleaningFlags() const { return m_CleaningFlags; }
  664. void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; }
  665. protected:
  666. void _UpdateGameTime();
  667. // callback for UpdateRealmCharacters
  668. void _UpdateRealmCharCount(PreparedQueryResult resultCharCount);
  669. void InitDailyQuestResetTime();
  670. void InitWeeklyQuestResetTime();
  671. void InitRandomBGResetTime();
  672. void ResetDailyQuests();
  673. void ResetWeeklyQuests();
  674. void ResetRandomBG();
  675. private:
  676. static volatile bool m_stopEvent;
  677. static uint8 m_ExitCode;
  678. uint32 m_ShutdownTimer;
  679. uint32 m_ShutdownMask;
  680. uint32 m_CleaningFlags;
  681. bool m_isClosed;
  682. time_t m_startTime;
  683. time_t m_gameTime;
  684. IntervalTimer m_timers[WUPDATE_COUNT];
  685. time_t mail_timer;
  686. time_t mail_timer_expires;
  687. uint32 m_updateTime, m_updateTimeSum;
  688. uint32 m_updateTimeCount;
  689. uint32 m_currentTime;
  690. SessionMap m_sessions;
  691. typedef UNORDERED_MAP<uint32, time_t> DisconnectMap;
  692. DisconnectMap m_disconnects;
  693. uint32 m_maxActiveSessionCount;
  694. uint32 m_maxQueuedSessionCount;
  695. uint32 m_PlayerCount;
  696. uint32 m_MaxPlayerCount;
  697. std::string m_newCharString;
  698. float rate_values[MAX_RATES];
  699. uint32 m_int_configs[INT_CONFIG_VALUE_COUNT];
  700. bool m_bool_configs[BOOL_CONFIG_VALUE_COUNT];
  701. float m_float_configs[FLOAT_CONFIG_VALUE_COUNT];
  702. typedef std::map<uint32, uint64> WorldStatesMap;
  703. WorldStatesMap m_worldstates;
  704. uint32 m_playerLimit;
  705. AccountTypes m_allowedSecurityLevel;
  706. LocaleConstant m_defaultDbcLocale; // from config for one from loaded DBC locales
  707. uint32 m_availableDbcLocaleMask; // by loaded DBC
  708. void DetectDBCLang();
  709. bool m_allowMovement;
  710. std::string m_motd;
  711. std::string m_dataPath;
  712. // for max speed access
  713. static float m_MaxVisibleDistanceOnContinents;
  714. static float m_MaxVisibleDistanceInInstances;
  715. static float m_MaxVisibleDistanceInBGArenas;
  716. static int32 m_visibility_notify_periodOnContinents;
  717. static int32 m_visibility_notify_periodInInstances;
  718. static int32 m_visibility_notify_periodInBGArenas;
  719. // CLI command holder to be thread safe
  720. ACE_Based::LockedQueue<CliCommandHolder*, ACE_Thread_Mutex> cliCmdQueue;
  721. // next daily quests and random bg reset time
  722. time_t m_NextDailyQuestReset;
  723. time_t m_NextWeeklyQuestReset;
  724. time_t m_NextRandomBGReset;
  725. //Player Queue
  726. Queue m_QueuedPlayer;
  727. //sessions that are added async
  728. void AddSession_(WorldSession* s);
  729. ACE_Based::LockedQueue<WorldSession*, ACE_Thread_Mutex> addSessQueue;
  730. //used versions
  731. std::string m_DBVersion;
  732. std::string m_CreatureEventAIVersion;
  733. std::list<std::string> m_Autobroadcasts;
  734. private:
  735. void ProcessQueryCallbacks();
  736. ACE_Future_Set<PreparedQueryResult> m_realmCharCallbacks;
  737. };
  738. extern uint32 realmID;
  739. #define sWorld ACE_Singleton<World, ACE_Null_Mutex>::instance()
  740. #endif
  741. /// @}