PageRenderTime 64ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/src/server/game/Scripting/ScriptMgr.cpp

https://gitlab.com/IlluminatiCore/IlluminatiCore
C++ | 1640 lines | 1261 code | 318 blank | 61 comment | 104 complexity | 5a3ea69e7631df32ae76ecd51e4c1330 MD5 | raw file
Possible License(s): GPL-2.0, BSD-2-Clause

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
  3. * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at your
  8. * option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along
  16. * with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include "ScriptMgr.h"
  19. #include "Config.h"
  20. #include "DatabaseEnv.h"
  21. #include "DBCStores.h"
  22. #include "ObjectMgr.h"
  23. #include "OutdoorPvPMgr.h"
  24. #include "ScriptLoader.h"
  25. #include "ScriptSystem.h"
  26. #include "Transport.h"
  27. #include "Vehicle.h"
  28. #include "SpellInfo.h"
  29. #include "SpellScript.h"
  30. #include "GossipDef.h"
  31. #include "CreatureAIImpl.h"
  32. #include "Player.h"
  33. #include "WorldPacket.h"
  34. #include "WorldSession.h"
  35. // This is the global static registry of scripts.
  36. template<class TScript>
  37. class ScriptRegistry
  38. {
  39. public:
  40. typedef std::map<uint32, TScript*> ScriptMap;
  41. typedef typename ScriptMap::iterator ScriptMapIterator;
  42. // The actual list of scripts. This will be accessed concurrently, so it must not be modified
  43. // after server startup.
  44. static ScriptMap ScriptPointerList;
  45. static void AddScript(TScript* const script)
  46. {
  47. ASSERT(script);
  48. // See if the script is using the same memory as another script. If this happens, it means that
  49. // someone forgot to allocate new memory for a script.
  50. for (ScriptMapIterator it = ScriptPointerList.begin(); it != ScriptPointerList.end(); ++it)
  51. {
  52. if (it->second == script)
  53. {
  54. TC_LOG_ERROR("scripts", "Script '%s' has same memory pointer as '%s'.",
  55. script->GetName().c_str(), it->second->GetName().c_str());
  56. return;
  57. }
  58. }
  59. if (script->IsDatabaseBound())
  60. {
  61. // Get an ID for the script. An ID only exists if it's a script that is assigned in the database
  62. // through a script name (or similar).
  63. uint32 id = sObjectMgr->GetScriptId(script->GetName().c_str());
  64. if (id)
  65. {
  66. // Try to find an existing script.
  67. bool existing = false;
  68. for (ScriptMapIterator it = ScriptPointerList.begin(); it != ScriptPointerList.end(); ++it)
  69. {
  70. // If the script names match...
  71. if (it->second->GetName() == script->GetName())
  72. {
  73. // ... It exists.
  74. existing = true;
  75. break;
  76. }
  77. }
  78. // If the script isn't assigned -> assign it!
  79. if (!existing)
  80. {
  81. ScriptPointerList[id] = script;
  82. sScriptMgr->IncrementScriptCount();
  83. }
  84. else
  85. {
  86. // If the script is already assigned -> delete it!
  87. TC_LOG_ERROR("scripts", "Script '%s' already assigned with the same script name, so the script can't work.",
  88. script->GetName().c_str());
  89. ASSERT(false); // Error that should be fixed ASAP.
  90. }
  91. }
  92. else
  93. {
  94. // The script uses a script name from database, but isn't assigned to anything.
  95. TC_LOG_ERROR("sql.sql", "Script named '%s' does not have a script name assigned in database.", script->GetName().c_str());
  96. // Avoid calling "delete script;" because we are currently in the script constructor
  97. // In a valid scenario this will not happen because every script has a name assigned in the database
  98. // If that happens, it's acceptable to just leak a few bytes
  99. return;
  100. }
  101. }
  102. else
  103. {
  104. // We're dealing with a code-only script; just add it.
  105. ScriptPointerList[_scriptIdCounter++] = script;
  106. sScriptMgr->IncrementScriptCount();
  107. }
  108. }
  109. // Gets a script by its ID (assigned by ObjectMgr).
  110. static TScript* GetScriptById(uint32 id)
  111. {
  112. ScriptMapIterator it = ScriptPointerList.find(id);
  113. if (it != ScriptPointerList.end())
  114. return it->second;
  115. return NULL;
  116. }
  117. private:
  118. // Counter used for code-only scripts.
  119. static uint32 _scriptIdCounter;
  120. };
  121. // Utility macros to refer to the script registry.
  122. #define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptMap
  123. #define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptMapIterator
  124. #define SCR_REG_LST(T) ScriptRegistry<T>::ScriptPointerList
  125. // Utility macros for looping over scripts.
  126. #define FOR_SCRIPTS(T, C, E) \
  127. if (SCR_REG_LST(T).empty()) \
  128. return; \
  129. for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
  130. C != SCR_REG_LST(T).end(); ++C)
  131. #define FOR_SCRIPTS_RET(T, C, E, R) \
  132. if (SCR_REG_LST(T).empty()) \
  133. return R; \
  134. for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
  135. C != SCR_REG_LST(T).end(); ++C)
  136. #define FOREACH_SCRIPT(T) \
  137. FOR_SCRIPTS(T, itr, end) \
  138. itr->second
  139. // Utility macros for finding specific scripts.
  140. #define GET_SCRIPT(T, I, V) \
  141. T* V = ScriptRegistry<T>::GetScriptById(I); \
  142. if (!V) \
  143. return;
  144. #define GET_SCRIPT_RET(T, I, V, R) \
  145. T* V = ScriptRegistry<T>::GetScriptById(I); \
  146. if (!V) \
  147. return R;
  148. struct TSpellSummary
  149. {
  150. uint8 Targets; // set of enum SelectTarget
  151. uint8 Effects; // set of enum SelectEffect
  152. } *SpellSummary;
  153. ScriptMgr::ScriptMgr() : _scriptCount(0)
  154. {
  155. _scheduledScripts = 0;
  156. }
  157. ScriptMgr::~ScriptMgr() { }
  158. void ScriptMgr::Initialize()
  159. {
  160. uint32 oldMSTime = getMSTime();
  161. LoadDatabase();
  162. TC_LOG_INFO("server.loading", "Loading C++ scripts");
  163. FillSpellSummary();
  164. AddScripts();
  165. TC_LOG_INFO("server.loading", ">> Loaded %u C++ scripts in %u ms", GetScriptCount(), GetMSTimeDiffToNow(oldMSTime));
  166. }
  167. void ScriptMgr::Unload()
  168. {
  169. #define SCR_CLEAR(T) \
  170. for (SCR_REG_ITR(T) itr = SCR_REG_LST(T).begin(); itr != SCR_REG_LST(T).end(); ++itr) \
  171. delete itr->second; \
  172. SCR_REG_LST(T).clear();
  173. // Clear scripts for every script type.
  174. SCR_CLEAR(SpellScriptLoader);
  175. SCR_CLEAR(ServerScript);
  176. SCR_CLEAR(WorldScript);
  177. SCR_CLEAR(FormulaScript);
  178. SCR_CLEAR(WorldMapScript);
  179. SCR_CLEAR(InstanceMapScript);
  180. SCR_CLEAR(BattlegroundMapScript);
  181. SCR_CLEAR(ItemScript);
  182. SCR_CLEAR(CreatureScript);
  183. SCR_CLEAR(GameObjectScript);
  184. SCR_CLEAR(AreaTriggerScript);
  185. SCR_CLEAR(BattlegroundScript);
  186. SCR_CLEAR(OutdoorPvPScript);
  187. SCR_CLEAR(CommandScript);
  188. SCR_CLEAR(WeatherScript);
  189. SCR_CLEAR(AuctionHouseScript);
  190. SCR_CLEAR(ConditionScript);
  191. SCR_CLEAR(VehicleScript);
  192. SCR_CLEAR(DynamicObjectScript);
  193. SCR_CLEAR(TransportScript);
  194. SCR_CLEAR(AchievementCriteriaScript);
  195. SCR_CLEAR(PlayerScript);
  196. SCR_CLEAR(AccountScript);
  197. SCR_CLEAR(GuildScript);
  198. SCR_CLEAR(GroupScript);
  199. SCR_CLEAR(UnitScript);
  200. #undef SCR_CLEAR
  201. delete[] SpellSummary;
  202. delete[] UnitAI::AISpellInfo;
  203. }
  204. void ScriptMgr::LoadDatabase()
  205. {
  206. sScriptSystemMgr->LoadScriptWaypoints();
  207. }
  208. void ScriptMgr::FillSpellSummary()
  209. {
  210. UnitAI::FillAISpellInfo();
  211. SpellSummary = new TSpellSummary[sSpellMgr->GetSpellInfoStoreSize()];
  212. SpellInfo const* pTempSpell;
  213. for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
  214. {
  215. SpellSummary[i].Effects = 0;
  216. SpellSummary[i].Targets = 0;
  217. pTempSpell = sSpellMgr->GetSpellInfo(i);
  218. // This spell doesn't exist.
  219. if (!pTempSpell)
  220. continue;
  221. for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
  222. {
  223. // Spell targets self.
  224. if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER)
  225. SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SELF-1);
  226. // Spell targets a single enemy.
  227. if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
  228. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY)
  229. SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_ENEMY-1);
  230. // Spell targets AoE at enemy.
  231. if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
  232. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
  233. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER ||
  234. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
  235. SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_ENEMY-1);
  236. // Spell targets an enemy.
  237. if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
  238. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY ||
  239. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
  240. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
  241. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER ||
  242. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
  243. SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_ENEMY-1);
  244. // Spell targets a single friend (or self).
  245. if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER ||
  246. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY ||
  247. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY)
  248. SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_FRIEND-1);
  249. // Spell targets AoE friends.
  250. if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
  251. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
  252. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER)
  253. SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_FRIEND-1);
  254. // Spell targets any friend (or self).
  255. if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER ||
  256. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY ||
  257. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY ||
  258. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
  259. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
  260. pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER)
  261. SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_FRIEND-1);
  262. // Make sure that this spell includes a damage effect.
  263. if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_SCHOOL_DAMAGE ||
  264. pTempSpell->Effects[j].Effect == SPELL_EFFECT_INSTAKILL ||
  265. pTempSpell->Effects[j].Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE ||
  266. pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH)
  267. SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_DAMAGE-1);
  268. // Make sure that this spell includes a healing effect (or an apply aura with a periodic heal).
  269. if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL ||
  270. pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL_MAX_HEALTH ||
  271. pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL_MECHANICAL ||
  272. (pTempSpell->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && pTempSpell->Effects[j].ApplyAuraName == 8))
  273. SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_HEALING-1);
  274. // Make sure that this spell applies an aura.
  275. if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA)
  276. SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_AURA-1);
  277. }
  278. }
  279. }
  280. void ScriptMgr::CreateSpellScripts(uint32 spellId, std::list<SpellScript*>& scriptVector)
  281. {
  282. SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
  283. for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
  284. {
  285. SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::GetScriptById(itr->second);
  286. if (!tmpscript)
  287. continue;
  288. SpellScript* script = tmpscript->GetSpellScript();
  289. if (!script)
  290. continue;
  291. script->_Init(&tmpscript->GetName(), spellId);
  292. scriptVector.push_back(script);
  293. }
  294. }
  295. void ScriptMgr::CreateAuraScripts(uint32 spellId, std::list<AuraScript*>& scriptVector)
  296. {
  297. SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
  298. for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
  299. {
  300. SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::GetScriptById(itr->second);
  301. if (!tmpscript)
  302. continue;
  303. AuraScript* script = tmpscript->GetAuraScript();
  304. if (!script)
  305. continue;
  306. script->_Init(&tmpscript->GetName(), spellId);
  307. scriptVector.push_back(script);
  308. }
  309. }
  310. void ScriptMgr::CreateSpellScriptLoaders(uint32 spellId, std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> >& scriptVector)
  311. {
  312. SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
  313. scriptVector.reserve(std::distance(bounds.first, bounds.second));
  314. for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
  315. {
  316. SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::GetScriptById(itr->second);
  317. if (!tmpscript)
  318. continue;
  319. scriptVector.push_back(std::make_pair(tmpscript, itr));
  320. }
  321. }
  322. void ScriptMgr::OnNetworkStart()
  323. {
  324. FOREACH_SCRIPT(ServerScript)->OnNetworkStart();
  325. }
  326. void ScriptMgr::OnNetworkStop()
  327. {
  328. FOREACH_SCRIPT(ServerScript)->OnNetworkStop();
  329. }
  330. void ScriptMgr::OnSocketOpen(std::shared_ptr<WorldSocket> socket)
  331. {
  332. ASSERT(socket);
  333. FOREACH_SCRIPT(ServerScript)->OnSocketOpen(socket);
  334. }
  335. void ScriptMgr::OnSocketClose(std::shared_ptr<WorldSocket> socket)
  336. {
  337. ASSERT(socket);
  338. FOREACH_SCRIPT(ServerScript)->OnSocketClose(socket);
  339. }
  340. void ScriptMgr::OnPacketReceive(WorldSession* session, WorldPacket const& packet)
  341. {
  342. if (SCR_REG_LST(ServerScript).empty())
  343. return;
  344. WorldPacket copy(packet);
  345. FOREACH_SCRIPT(ServerScript)->OnPacketReceive(session, copy);
  346. }
  347. void ScriptMgr::OnPacketSend(WorldSession* session, WorldPacket const& packet)
  348. {
  349. ASSERT(session);
  350. if (SCR_REG_LST(ServerScript).empty())
  351. return;
  352. WorldPacket copy(packet);
  353. FOREACH_SCRIPT(ServerScript)->OnPacketSend(session, copy);
  354. }
  355. void ScriptMgr::OnUnknownPacketReceive(WorldSession* session, WorldPacket const& packet)
  356. {
  357. ASSERT(session);
  358. if (SCR_REG_LST(ServerScript).empty())
  359. return;
  360. WorldPacket copy(packet);
  361. FOREACH_SCRIPT(ServerScript)->OnUnknownPacketReceive(session, copy);
  362. }
  363. void ScriptMgr::OnOpenStateChange(bool open)
  364. {
  365. FOREACH_SCRIPT(WorldScript)->OnOpenStateChange(open);
  366. }
  367. void ScriptMgr::OnConfigLoad(bool reload)
  368. {
  369. FOREACH_SCRIPT(WorldScript)->OnConfigLoad(reload);
  370. }
  371. void ScriptMgr::OnMotdChange(std::string& newMotd)
  372. {
  373. FOREACH_SCRIPT(WorldScript)->OnMotdChange(newMotd);
  374. }
  375. void ScriptMgr::OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
  376. {
  377. FOREACH_SCRIPT(WorldScript)->OnShutdownInitiate(code, mask);
  378. }
  379. void ScriptMgr::OnShutdownCancel()
  380. {
  381. FOREACH_SCRIPT(WorldScript)->OnShutdownCancel();
  382. }
  383. void ScriptMgr::OnWorldUpdate(uint32 diff)
  384. {
  385. FOREACH_SCRIPT(WorldScript)->OnUpdate(diff);
  386. }
  387. void ScriptMgr::OnHonorCalculation(float& honor, uint8 level, float multiplier)
  388. {
  389. FOREACH_SCRIPT(FormulaScript)->OnHonorCalculation(honor, level, multiplier);
  390. }
  391. void ScriptMgr::OnGrayLevelCalculation(uint8& grayLevel, uint8 playerLevel)
  392. {
  393. FOREACH_SCRIPT(FormulaScript)->OnGrayLevelCalculation(grayLevel, playerLevel);
  394. }
  395. void ScriptMgr::OnColorCodeCalculation(XPColorChar& color, uint8 playerLevel, uint8 mobLevel)
  396. {
  397. FOREACH_SCRIPT(FormulaScript)->OnColorCodeCalculation(color, playerLevel, mobLevel);
  398. }
  399. void ScriptMgr::OnZeroDifferenceCalculation(uint8& diff, uint8 playerLevel)
  400. {
  401. FOREACH_SCRIPT(FormulaScript)->OnZeroDifferenceCalculation(diff, playerLevel);
  402. }
  403. void ScriptMgr::OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content)
  404. {
  405. FOREACH_SCRIPT(FormulaScript)->OnBaseGainCalculation(gain, playerLevel, mobLevel, content);
  406. }
  407. void ScriptMgr::OnGainCalculation(uint32& gain, Player* player, Unit* unit)
  408. {
  409. ASSERT(player);
  410. ASSERT(unit);
  411. FOREACH_SCRIPT(FormulaScript)->OnGainCalculation(gain, player, unit);
  412. }
  413. void ScriptMgr::OnGroupRateCalculation(float& rate, uint32 count, bool isRaid)
  414. {
  415. FOREACH_SCRIPT(FormulaScript)->OnGroupRateCalculation(rate, count, isRaid);
  416. }
  417. #define SCR_MAP_BGN(M, V, I, E, C, T) \
  418. if (V->GetEntry() && V->GetEntry()->T()) \
  419. { \
  420. FOR_SCRIPTS(M, I, E) \
  421. { \
  422. MapEntry const* C = I->second->GetEntry(); \
  423. if (!C) \
  424. continue; \
  425. if (C->MapID == V->GetId()) \
  426. {
  427. #define SCR_MAP_END \
  428. return; \
  429. } \
  430. } \
  431. }
  432. void ScriptMgr::OnCreateMap(Map* map)
  433. {
  434. ASSERT(map);
  435. SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  436. itr->second->OnCreate(map);
  437. SCR_MAP_END;
  438. SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  439. itr->second->OnCreate((InstanceMap*)map);
  440. SCR_MAP_END;
  441. SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  442. itr->second->OnCreate((BattlegroundMap*)map);
  443. SCR_MAP_END;
  444. }
  445. void ScriptMgr::OnDestroyMap(Map* map)
  446. {
  447. ASSERT(map);
  448. SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  449. itr->second->OnDestroy(map);
  450. SCR_MAP_END;
  451. SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  452. itr->second->OnDestroy((InstanceMap*)map);
  453. SCR_MAP_END;
  454. SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  455. itr->second->OnDestroy((BattlegroundMap*)map);
  456. SCR_MAP_END;
  457. }
  458. void ScriptMgr::OnLoadGridMap(Map* map, GridMap* gmap, uint32 gx, uint32 gy)
  459. {
  460. ASSERT(map);
  461. ASSERT(gmap);
  462. SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  463. itr->second->OnLoadGridMap(map, gmap, gx, gy);
  464. SCR_MAP_END;
  465. SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  466. itr->second->OnLoadGridMap((InstanceMap*)map, gmap, gx, gy);
  467. SCR_MAP_END;
  468. SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  469. itr->second->OnLoadGridMap((BattlegroundMap*)map, gmap, gx, gy);
  470. SCR_MAP_END;
  471. }
  472. void ScriptMgr::OnUnloadGridMap(Map* map, GridMap* gmap, uint32 gx, uint32 gy)
  473. {
  474. ASSERT(map);
  475. ASSERT(gmap);
  476. SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  477. itr->second->OnUnloadGridMap(map, gmap, gx, gy);
  478. SCR_MAP_END;
  479. SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  480. itr->second->OnUnloadGridMap((InstanceMap*)map, gmap, gx, gy);
  481. SCR_MAP_END;
  482. SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  483. itr->second->OnUnloadGridMap((BattlegroundMap*)map, gmap, gx, gy);
  484. SCR_MAP_END;
  485. }
  486. void ScriptMgr::OnPlayerEnterMap(Map* map, Player* player)
  487. {
  488. ASSERT(map);
  489. ASSERT(player);
  490. FOREACH_SCRIPT(PlayerScript)->OnMapChanged(player);
  491. SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  492. itr->second->OnPlayerEnter(map, player);
  493. SCR_MAP_END;
  494. SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  495. itr->second->OnPlayerEnter((InstanceMap*)map, player);
  496. SCR_MAP_END;
  497. SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  498. itr->second->OnPlayerEnter((BattlegroundMap*)map, player);
  499. SCR_MAP_END;
  500. }
  501. void ScriptMgr::OnPlayerLeaveMap(Map* map, Player* player)
  502. {
  503. ASSERT(map);
  504. ASSERT(player);
  505. SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  506. itr->second->OnPlayerLeave(map, player);
  507. SCR_MAP_END;
  508. SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  509. itr->second->OnPlayerLeave((InstanceMap*)map, player);
  510. SCR_MAP_END;
  511. SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  512. itr->second->OnPlayerLeave((BattlegroundMap*)map, player);
  513. SCR_MAP_END;
  514. }
  515. void ScriptMgr::OnMapUpdate(Map* map, uint32 diff)
  516. {
  517. ASSERT(map);
  518. SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  519. itr->second->OnUpdate(map, diff);
  520. SCR_MAP_END;
  521. SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  522. itr->second->OnUpdate((InstanceMap*)map, diff);
  523. SCR_MAP_END;
  524. SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  525. itr->second->OnUpdate((BattlegroundMap*)map, diff);
  526. SCR_MAP_END;
  527. }
  528. #undef SCR_MAP_BGN
  529. #undef SCR_MAP_END
  530. InstanceScript* ScriptMgr::CreateInstanceData(InstanceMap* map)
  531. {
  532. ASSERT(map);
  533. GET_SCRIPT_RET(InstanceMapScript, map->GetScriptId(), tmpscript, NULL);
  534. return tmpscript->GetInstanceScript(map);
  535. }
  536. bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, Item* target)
  537. {
  538. ASSERT(caster);
  539. ASSERT(target);
  540. GET_SCRIPT_RET(ItemScript, target->GetScriptId(), tmpscript, false);
  541. return tmpscript->OnDummyEffect(caster, spellId, effIndex, target);
  542. }
  543. bool ScriptMgr::OnQuestAccept(Player* player, Item* item, Quest const* quest)
  544. {
  545. ASSERT(player);
  546. ASSERT(item);
  547. ASSERT(quest);
  548. GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
  549. player->PlayerTalkClass->ClearMenus();
  550. return tmpscript->OnQuestAccept(player, item, quest);
  551. }
  552. bool ScriptMgr::OnItemUse(Player* player, Item* item, SpellCastTargets const& targets)
  553. {
  554. ASSERT(player);
  555. ASSERT(item);
  556. GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
  557. return tmpscript->OnUse(player, item, targets);
  558. }
  559. bool ScriptMgr::OnItemExpire(Player* player, ItemTemplate const* proto)
  560. {
  561. ASSERT(player);
  562. ASSERT(proto);
  563. GET_SCRIPT_RET(ItemScript, proto->ScriptId, tmpscript, false);
  564. return tmpscript->OnExpire(player, proto);
  565. }
  566. bool ScriptMgr::OnItemRemove(Player* player, Item* item)
  567. {
  568. ASSERT(player);
  569. ASSERT(item);
  570. GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
  571. return tmpscript->OnRemove(player, item);
  572. }
  573. bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, Creature* target)
  574. {
  575. ASSERT(caster);
  576. ASSERT(target);
  577. GET_SCRIPT_RET(CreatureScript, target->GetScriptId(), tmpscript, false);
  578. return tmpscript->OnDummyEffect(caster, spellId, effIndex, target);
  579. }
  580. bool ScriptMgr::OnGossipHello(Player* player, Creature* creature)
  581. {
  582. ASSERT(player);
  583. ASSERT(creature);
  584. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  585. player->PlayerTalkClass->ClearMenus();
  586. return tmpscript->OnGossipHello(player, creature);
  587. }
  588. bool ScriptMgr::OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
  589. {
  590. ASSERT(player);
  591. ASSERT(creature);
  592. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  593. return tmpscript->OnGossipSelect(player, creature, sender, action);
  594. }
  595. bool ScriptMgr::OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code)
  596. {
  597. ASSERT(player);
  598. ASSERT(creature);
  599. ASSERT(code);
  600. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  601. return tmpscript->OnGossipSelectCode(player, creature, sender, action, code);
  602. }
  603. bool ScriptMgr::OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
  604. {
  605. ASSERT(player);
  606. ASSERT(creature);
  607. ASSERT(quest);
  608. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  609. player->PlayerTalkClass->ClearMenus();
  610. return tmpscript->OnQuestAccept(player, creature, quest);
  611. }
  612. bool ScriptMgr::OnQuestSelect(Player* player, Creature* creature, Quest const* quest)
  613. {
  614. ASSERT(player);
  615. ASSERT(creature);
  616. ASSERT(quest);
  617. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  618. player->PlayerTalkClass->ClearMenus();
  619. return tmpscript->OnQuestSelect(player, creature, quest);
  620. }
  621. bool ScriptMgr::OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt)
  622. {
  623. ASSERT(player);
  624. ASSERT(creature);
  625. ASSERT(quest);
  626. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  627. player->PlayerTalkClass->ClearMenus();
  628. return tmpscript->OnQuestReward(player, creature, quest, opt);
  629. }
  630. uint32 ScriptMgr::GetDialogStatus(Player* player, Creature* creature)
  631. {
  632. ASSERT(player);
  633. ASSERT(creature);
  634. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS);
  635. player->PlayerTalkClass->ClearMenus();
  636. return tmpscript->GetDialogStatus(player, creature);
  637. }
  638. CreatureAI* ScriptMgr::GetCreatureAI(Creature* creature)
  639. {
  640. ASSERT(creature);
  641. GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, NULL);
  642. return tmpscript->GetAI(creature);
  643. }
  644. GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* gameobject)
  645. {
  646. ASSERT(gameobject);
  647. GET_SCRIPT_RET(GameObjectScript, gameobject->GetScriptId(), tmpscript, NULL);
  648. return tmpscript->GetAI(gameobject);
  649. }
  650. void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff)
  651. {
  652. ASSERT(creature);
  653. GET_SCRIPT(CreatureScript, creature->GetScriptId(), tmpscript);
  654. tmpscript->OnUpdate(creature, diff);
  655. }
  656. bool ScriptMgr::OnGossipHello(Player* player, GameObject* go)
  657. {
  658. ASSERT(player);
  659. ASSERT(go);
  660. GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  661. player->PlayerTalkClass->ClearMenus();
  662. return tmpscript->OnGossipHello(player, go);
  663. }
  664. bool ScriptMgr::OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action)
  665. {
  666. ASSERT(player);
  667. ASSERT(go);
  668. GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  669. return tmpscript->OnGossipSelect(player, go, sender, action);
  670. }
  671. bool ScriptMgr::OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code)
  672. {
  673. ASSERT(player);
  674. ASSERT(go);
  675. ASSERT(code);
  676. GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  677. return tmpscript->OnGossipSelectCode(player, go, sender, action, code);
  678. }
  679. bool ScriptMgr::OnQuestAccept(Player* player, GameObject* go, Quest const* quest)
  680. {
  681. ASSERT(player);
  682. ASSERT(go);
  683. ASSERT(quest);
  684. GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  685. player->PlayerTalkClass->ClearMenus();
  686. return tmpscript->OnQuestAccept(player, go, quest);
  687. }
  688. bool ScriptMgr::OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt)
  689. {
  690. ASSERT(player);
  691. ASSERT(go);
  692. ASSERT(quest);
  693. GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  694. player->PlayerTalkClass->ClearMenus();
  695. return tmpscript->OnQuestReward(player, go, quest, opt);
  696. }
  697. uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go)
  698. {
  699. ASSERT(player);
  700. ASSERT(go);
  701. GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS);
  702. player->PlayerTalkClass->ClearMenus();
  703. return tmpscript->GetDialogStatus(player, go);
  704. }
  705. void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player)
  706. {
  707. ASSERT(go);
  708. GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  709. tmpscript->OnDestroyed(go, player);
  710. }
  711. void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player)
  712. {
  713. ASSERT(go);
  714. GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  715. tmpscript->OnDamaged(go, player);
  716. }
  717. void ScriptMgr::OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit)
  718. {
  719. ASSERT(go);
  720. GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  721. tmpscript->OnLootStateChanged(go, state, unit);
  722. }
  723. void ScriptMgr::OnGameObjectStateChanged(GameObject* go, uint32 state)
  724. {
  725. ASSERT(go);
  726. GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  727. tmpscript->OnGameObjectStateChanged(go, state);
  728. }
  729. void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff)
  730. {
  731. ASSERT(go);
  732. GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  733. tmpscript->OnUpdate(go, diff);
  734. }
  735. bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, GameObject* target)
  736. {
  737. ASSERT(caster);
  738. ASSERT(target);
  739. GET_SCRIPT_RET(GameObjectScript, target->GetScriptId(), tmpscript, false);
  740. return tmpscript->OnDummyEffect(caster, spellId, effIndex, target);
  741. }
  742. bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger)
  743. {
  744. ASSERT(player);
  745. ASSERT(trigger);
  746. GET_SCRIPT_RET(AreaTriggerScript, sObjectMgr->GetAreaTriggerScriptId(trigger->id), tmpscript, false);
  747. return tmpscript->OnTrigger(player, trigger);
  748. }
  749. Battleground* ScriptMgr::CreateBattleground(BattlegroundTypeId /*typeId*/)
  750. {
  751. /// @todo Implement script-side battlegrounds.
  752. ASSERT(false);
  753. return NULL;
  754. }
  755. OutdoorPvP* ScriptMgr::CreateOutdoorPvP(OutdoorPvPData const* data)
  756. {
  757. ASSERT(data);
  758. GET_SCRIPT_RET(OutdoorPvPScript, data->ScriptId, tmpscript, NULL);
  759. return tmpscript->GetOutdoorPvP();
  760. }
  761. std::vector<ChatCommand*> ScriptMgr::GetChatCommands()
  762. {
  763. std::vector<ChatCommand*> table;
  764. FOR_SCRIPTS_RET(CommandScript, itr, end, table)
  765. table.push_back(itr->second->GetCommands());
  766. return table;
  767. }
  768. void ScriptMgr::OnWeatherChange(Weather* weather, WeatherState state, float grade)
  769. {
  770. ASSERT(weather);
  771. GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
  772. tmpscript->OnChange(weather, state, grade);
  773. }
  774. void ScriptMgr::OnWeatherUpdate(Weather* weather, uint32 diff)
  775. {
  776. ASSERT(weather);
  777. GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
  778. tmpscript->OnUpdate(weather, diff);
  779. }
  780. void ScriptMgr::OnAuctionAdd(AuctionHouseObject* ah, AuctionEntry* entry)
  781. {
  782. ASSERT(ah);
  783. ASSERT(entry);
  784. FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionAdd(ah, entry);
  785. }
  786. void ScriptMgr::OnAuctionRemove(AuctionHouseObject* ah, AuctionEntry* entry)
  787. {
  788. ASSERT(ah);
  789. ASSERT(entry);
  790. FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionRemove(ah, entry);
  791. }
  792. void ScriptMgr::OnAuctionSuccessful(AuctionHouseObject* ah, AuctionEntry* entry)
  793. {
  794. ASSERT(ah);
  795. ASSERT(entry);
  796. FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionSuccessful(ah, entry);
  797. }
  798. void ScriptMgr::OnAuctionExpire(AuctionHouseObject* ah, AuctionEntry* entry)
  799. {
  800. ASSERT(ah);
  801. ASSERT(entry);
  802. FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionExpire(ah, entry);
  803. }
  804. bool ScriptMgr::OnConditionCheck(Condition* condition, ConditionSourceInfo& sourceInfo)
  805. {
  806. ASSERT(condition);
  807. GET_SCRIPT_RET(ConditionScript, condition->ScriptId, tmpscript, true);
  808. return tmpscript->OnConditionCheck(condition, sourceInfo);
  809. }
  810. void ScriptMgr::OnInstall(Vehicle* veh)
  811. {
  812. ASSERT(veh);
  813. ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  814. GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  815. tmpscript->OnInstall(veh);
  816. }
  817. void ScriptMgr::OnUninstall(Vehicle* veh)
  818. {
  819. ASSERT(veh);
  820. ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  821. GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  822. tmpscript->OnUninstall(veh);
  823. }
  824. void ScriptMgr::OnReset(Vehicle* veh)
  825. {
  826. ASSERT(veh);
  827. ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  828. GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  829. tmpscript->OnReset(veh);
  830. }
  831. void ScriptMgr::OnInstallAccessory(Vehicle* veh, Creature* accessory)
  832. {
  833. ASSERT(veh);
  834. ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  835. ASSERT(accessory);
  836. GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  837. tmpscript->OnInstallAccessory(veh, accessory);
  838. }
  839. void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId)
  840. {
  841. ASSERT(veh);
  842. ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  843. ASSERT(passenger);
  844. GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  845. tmpscript->OnAddPassenger(veh, passenger, seatId);
  846. }
  847. void ScriptMgr::OnRemovePassenger(Vehicle* veh, Unit* passenger)
  848. {
  849. ASSERT(veh);
  850. ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  851. ASSERT(passenger);
  852. GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  853. tmpscript->OnRemovePassenger(veh, passenger);
  854. }
  855. void ScriptMgr::OnDynamicObjectUpdate(DynamicObject* dynobj, uint32 diff)
  856. {
  857. ASSERT(dynobj);
  858. FOR_SCRIPTS(DynamicObjectScript, itr, end)
  859. itr->second->OnUpdate(dynobj, diff);
  860. }
  861. void ScriptMgr::OnAddPassenger(Transport* transport, Player* player)
  862. {
  863. ASSERT(transport);
  864. ASSERT(player);
  865. GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  866. tmpscript->OnAddPassenger(transport, player);
  867. }
  868. void ScriptMgr::OnAddCreaturePassenger(Transport* transport, Creature* creature)
  869. {
  870. ASSERT(transport);
  871. ASSERT(creature);
  872. GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  873. tmpscript->OnAddCreaturePassenger(transport, creature);
  874. }
  875. void ScriptMgr::OnRemovePassenger(Transport* transport, Player* player)
  876. {
  877. ASSERT(transport);
  878. ASSERT(player);
  879. GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  880. tmpscript->OnRemovePassenger(transport, player);
  881. }
  882. void ScriptMgr::OnTransportUpdate(Transport* transport, uint32 diff)
  883. {
  884. ASSERT(transport);
  885. GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  886. tmpscript->OnUpdate(transport, diff);
  887. }
  888. void ScriptMgr::OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
  889. {
  890. GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  891. tmpscript->OnRelocate(transport, waypointId, mapId, x, y, z);
  892. }
  893. void ScriptMgr::OnStartup()
  894. {
  895. FOREACH_SCRIPT(WorldScript)->OnStartup();
  896. }
  897. void ScriptMgr::OnShutdown()
  898. {
  899. FOREACH_SCRIPT(WorldScript)->OnShutdown();
  900. }
  901. bool ScriptMgr::OnCriteriaCheck(uint32 scriptId, Player* source, Unit* target)
  902. {
  903. ASSERT(source);
  904. // target can be NULL.
  905. GET_SCRIPT_RET(AchievementCriteriaScript, scriptId, tmpscript, false);
  906. return tmpscript->OnCheck(source, target);
  907. }
  908. // Player
  909. void ScriptMgr::OnPVPKill(Player* killer, Player* killed)
  910. {
  911. FOREACH_SCRIPT(PlayerScript)->OnPVPKill(killer, killed);
  912. }
  913. void ScriptMgr::OnCreatureKill(Player* killer, Creature* killed)
  914. {
  915. FOREACH_SCRIPT(PlayerScript)->OnCreatureKill(killer, killed);
  916. }
  917. void ScriptMgr::OnPlayerKilledByCreature(Creature* killer, Player* killed)
  918. {
  919. FOREACH_SCRIPT(PlayerScript)->OnPlayerKilledByCreature(killer, killed);
  920. }
  921. void ScriptMgr::OnPlayerLevelChanged(Player* player, uint8 oldLevel)
  922. {
  923. FOREACH_SCRIPT(PlayerScript)->OnLevelChanged(player, oldLevel);
  924. }
  925. void ScriptMgr::OnPlayerFreeTalentPointsChanged(Player* player, uint32 points)
  926. {
  927. FOREACH_SCRIPT(PlayerScript)->OnFreeTalentPointsChanged(player, points);
  928. }
  929. void ScriptMgr::OnPlayerTalentsReset(Player* player, bool noCost)
  930. {
  931. FOREACH_SCRIPT(PlayerScript)->OnTalentsReset(player, noCost);
  932. }
  933. void ScriptMgr::OnPlayerMoneyChanged(Player* player, int64& amount)
  934. {
  935. FOREACH_SCRIPT(PlayerScript)->OnMoneyChanged(player, amount);
  936. }
  937. void ScriptMgr::OnPlayerMoneyLimit(Player* player, int64 amount)
  938. {
  939. FOREACH_SCRIPT(PlayerScript)->OnMoneyLimit(player, amount);
  940. }
  941. void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim)
  942. {
  943. FOREACH_SCRIPT(PlayerScript)->OnGiveXP(player, amount, victim);
  944. }
  945. void ScriptMgr::OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental)
  946. {
  947. FOREACH_SCRIPT(PlayerScript)->OnReputationChange(player, factionID, standing, incremental);
  948. }
  949. void ScriptMgr::OnPlayerDuelRequest(Player* target, Player* challenger)
  950. {
  951. FOREACH_SCRIPT(PlayerScript)->OnDuelRequest(target, challenger);
  952. }
  953. void ScriptMgr::OnPlayerDuelStart(Player* player1, Player* player2)
  954. {
  955. FOREACH_SCRIPT(PlayerScript)->OnDuelStart(player1, player2);
  956. }
  957. void ScriptMgr::OnPlayerDuelEnd(Player* winner, Player* loser, DuelCompleteType type)
  958. {
  959. FOREACH_SCRIPT(PlayerScript)->OnDuelEnd(winner, loser, type);
  960. }
  961. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg)
  962. {
  963. FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg);
  964. }
  965. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* receiver)
  966. {
  967. FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, receiver);
  968. }
  969. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group)
  970. {
  971. FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, group);
  972. }
  973. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild)
  974. {
  975. FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, guild);
  976. }
  977. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel)
  978. {
  979. FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, channel);
  980. }
  981. void ScriptMgr::OnPlayerEmote(Player* player, uint32 emote)
  982. {
  983. FOREACH_SCRIPT(PlayerScript)->OnEmote(player, emote);
  984. }
  985. void ScriptMgr::OnPlayerTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
  986. {
  987. FOREACH_SCRIPT(PlayerScript)->OnTextEmote(player, textEmote, emoteNum, guid);
  988. }
  989. void ScriptMgr::OnPlayerSpellCast(Player* player, Spell* spell, bool skipCheck)
  990. {
  991. FOREACH_SCRIPT(PlayerScript)->OnSpellCast(player, spell, skipCheck);
  992. }
  993. void ScriptMgr::OnPlayerLogin(Player* player, bool firstLogin)
  994. {
  995. FOREACH_SCRIPT(PlayerScript)->OnLogin(player, firstLogin);
  996. }
  997. void ScriptMgr::OnPlayerLogout(Player* player)
  998. {
  999. FOREACH_SCRIPT(PlayerScript)->OnLogout(player);
  1000. }
  1001. void ScriptMgr::OnPlayerCreate(Player* player)
  1002. {
  1003. FOREACH_SCRIPT(PlayerScript)->OnCreate(player);
  1004. }
  1005. void ScriptMgr::OnPlayerDelete(ObjectGuid guid, uint32 accountId)
  1006. {
  1007. FOREACH_SCRIPT(PlayerScript)->OnDelete(guid, accountId);
  1008. }
  1009. void ScriptMgr::OnPlayerFailedDelete(ObjectGuid guid, uint32 accountId)
  1010. {
  1011. FOREACH_SCRIPT(PlayerScript)->OnFailedDelete(guid, accountId);
  1012. }
  1013. void ScriptMgr::OnPlayerSave(Player* player)
  1014. {
  1015. FOREACH_SCRIPT(PlayerScript)->OnSave(player);
  1016. }
  1017. void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent)
  1018. {
  1019. FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent);
  1020. }
  1021. void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea)
  1022. {
  1023. FOREACH_SCRIPT(PlayerScript)->OnUpdateZone(player, newZone, newArea);
  1024. }
  1025. void ScriptMgr::OnQuestStatusChange(Player* player, uint32 questId, QuestStatus status)
  1026. {
  1027. FOREACH_SCRIPT(PlayerScript)->OnQuestStatusChange(player, questId, status);
  1028. }
  1029. // Account
  1030. void ScriptMgr::OnAccountLogin(uint32 accountId)
  1031. {
  1032. FOREACH_SCRIPT(AccountScript)->OnAccountLogin(accountId);
  1033. }
  1034. void ScriptMgr::OnFailedAccountLogin(uint32 accountId)
  1035. {
  1036. FOREACH_SCRIPT(AccountScript)->OnFailedAccountLogin(accountId);
  1037. }
  1038. void ScriptMgr::OnEmailChange(uint32 accountId)
  1039. {
  1040. FOREACH_SCRIPT(AccountScript)->OnEmailChange(accountId);
  1041. }
  1042. void ScriptMgr::OnFailedEmailChange(uint32 accountId)
  1043. {
  1044. FOREACH_SCRIPT(AccountScript)->OnFailedEmailChange(accountId);
  1045. }
  1046. void ScriptMgr::OnPasswordChange(uint32 accountId)
  1047. {
  1048. FOREACH_SCRIPT(AccountScript)->OnPasswordChange(accountId);
  1049. }
  1050. void ScriptMgr::OnFailedPasswordChange(uint32 accountId)
  1051. {
  1052. FOREACH_SCRIPT(AccountScript)->OnFailedPasswordChange(accountId);
  1053. }
  1054. // Guild
  1055. void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8& plRank)
  1056. {
  1057. FOREACH_SCRIPT(GuildScript)->OnAddMember(guild, player, plRank);
  1058. }
  1059. void ScriptMgr::OnGuildRemoveMember(Guild* guild, Player* player, bool isDisbanding, bool isKicked)
  1060. {
  1061. FOREACH_SCRIPT(GuildScript)->OnRemoveMember(guild, player, isDisbanding, isKicked);
  1062. }
  1063. void ScriptMgr::OnGuildMOTDChanged(Guild* guild, const std::string& newMotd)
  1064. {
  1065. FOREACH_SCRIPT(GuildScript)->OnMOTDChanged(guild, newMotd);
  1066. }
  1067. void ScriptMgr::OnGuildInfoChanged(Guild* guild, const std::string& newInfo)
  1068. {
  1069. FOREACH_SCRIPT(GuildScript)->OnInfoChanged(guild, newInfo);
  1070. }
  1071. void ScriptMgr::OnGuildCreate(Guild* guild, Player* leader, const std::string& name)
  1072. {
  1073. FOREACH_SCRIPT(GuildScript)->OnCreate(guild, leader, name);
  1074. }
  1075. void ScriptMgr::OnGuildDisband(Guild* guild)
  1076. {
  1077. FOREACH_SCRIPT(GuildScript)->OnDisband(guild);
  1078. }
  1079. void ScriptMgr::OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint64 &amount, bool isRepair)
  1080. {
  1081. FOREACH_SCRIPT(GuildScript)->OnMemberWitdrawMoney(guild, player, amount, isRepair);
  1082. }
  1083. void ScriptMgr::OnGuildMemberDepositMoney(Guild* guild, Player* player, uint64 &amount)
  1084. {
  1085. FOREACH_SCRIPT(GuildScript)->OnMemberDepositMoney(guild, player, amount);
  1086. }
  1087. void ScriptMgr::OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId,
  1088. bool isDestBank, uint8 destContainer, uint8 destSlotId)
  1089. {
  1090. FOREACH_SCRIPT(GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
  1091. }
  1092. void ScriptMgr::OnGuildEvent(Guild* guild, uint8 eventType, uint32 playerGuid1, uint32 playerGuid2, uint8 newRank)
  1093. {
  1094. FOREACH_SCRIPT(GuildScript)->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank);
  1095. }
  1096. void ScriptMgr::OnGuildBankEvent(Guild* guild, uint8 eventType, uint8 tabId, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
  1097. {
  1098. FOREACH_SCRIPT(GuildScript)->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId);
  1099. }
  1100. // Group
  1101. void ScriptMgr::OnGroupAddMember(Group* group, ObjectGuid guid)
  1102. {
  1103. ASSERT(group);
  1104. FOREACH_SCRIPT(GroupScript)->OnAddMember(group, guid);
  1105. }
  1106. void ScriptMgr::OnGroupInviteMember(Group* group, ObjectGuid guid)
  1107. {
  1108. ASSERT(group);
  1109. FOREACH_SCRIPT(GroupScript)->OnInviteMember(group, guid);
  1110. }
  1111. void ScriptMgr::OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, const char* reason)
  1112. {
  1113. ASSERT(group);
  1114. FOREACH_SCRIPT(GroupScript)->OnRemoveMember(group, guid, method, kicker, reason);
  1115. }
  1116. void ScriptMgr::OnGroupChangeLeader(Group* group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid)
  1117. {
  1118. ASSERT(group);
  1119. FOREACH_SCRIPT(GroupScript)->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid);
  1120. }
  1121. void ScriptMgr::OnGroupDisband(Group* group)
  1122. {
  1123. ASSERT(group);
  1124. FOREACH_SCRIPT(GroupScript)->OnDisband(group);
  1125. }
  1126. // Unit
  1127. void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain)
  1128. {
  1129. FOREACH_SCRIPT(UnitScript)->OnHeal(healer, reciever, gain);
  1130. }
  1131. void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage)
  1132. {
  1133. FOREACH_SCRIPT(UnitScript)->OnDamage(attacker, victim, damage);
  1134. }
  1135. void ScriptMgr::ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage)
  1136. {
  1137. FOREACH_SCRIPT(UnitScript)->ModifyPeriodicDamageAurasTick(target, attacker, damage);
  1138. }
  1139. void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
  1140. {
  1141. FOREACH_SCRIPT(UnitScript)->ModifyMeleeDamage(target, attacker, damage);
  1142. }
  1143. void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage)
  1144. {
  1145. FOREACH_SCRIPT(UnitScript)->ModifySpellDamageTaken(target, attacker, damage);
  1146. }
  1147. SpellScriptLoader::SpellScriptLoader(const char* name)
  1148. : ScriptObject(name)
  1149. {
  1150. ScriptRegistry<SpellScriptLoader>::AddScript(this);
  1151. }
  1152. ServerScript::ServerScript(const char* name)
  1153. : ScriptObject(name)
  1154. {
  1155. ScriptRegistry<ServerScript>::AddScript(this);
  1156. }
  1157. WorldScript::WorldScript(const char* name)
  1158. : ScriptObject(name)
  1159. {
  1160. ScriptRegistry<WorldScript>::AddScript(this);
  1161. }
  1162. FormulaScript::FormulaScript(const char* name)
  1163. : ScriptObject(name)
  1164. {
  1165. ScriptRegistry<FormulaScript>::AddScript(this);
  1166. }
  1167. UnitScript::UnitScript(const char* name, bool addToScripts)
  1168. : ScriptObject(name)
  1169. {
  1170. if (addToScripts)
  1171. ScriptRegistry<UnitScript>::AddScript(this);
  1172. }
  1173. WorldMapScript::WorldMapScript(const char* name, uint32 mapId)
  1174. : ScriptObject(name), MapScript<Map>(mapId)
  1175. {
  1176. if (GetEntry() && !GetEntry()->IsWorldMap())
  1177. TC_LOG_ERROR("scripts", "WorldMapScript for map %u is invalid.", mapId);
  1178. ScriptRegistry<WorldMapScript>::AddScript(this);
  1179. }
  1180. InstanceMapScript::InstanceMapScript(const char* name, uint32 mapId)
  1181. : ScriptObject(name), MapScript<InstanceMap>(mapId)
  1182. {
  1183. if (GetEntry() && !GetEntry()->IsDungeon())
  1184. TC_LOG_ERROR("scripts", "InstanceMapScript for map %u is invalid.", mapId);
  1185. ScriptRegistry<InstanceMapScript>::AddScript(this);
  1186. }
  1187. BattlegroundMapScript::BattlegroundMapScript(const char* name, uint32 mapId)
  1188. : ScriptObject(name), MapScript<BattlegroundMap>(mapId)
  1189. {
  1190. if (GetEntry() && !GetEntry()->IsBattleground())
  1191. TC_LOG_ERROR("scripts", "BattlegroundMapScript for map %u is invalid.", mapId);
  1192. ScriptRegistry<BattlegroundMapScript>::AddScript(this);
  1193. }
  1194. ItemScript::ItemScript(const char* name)
  1195. : ScriptObject(name)
  1196. {
  1197. ScriptRegistry<ItemScript>::AddScript(this);
  1198. }
  1199. CreatureScript::CreatureScript(const char* name)
  1200. : UnitScript(name, false)
  1201. {
  1202. ScriptRegistry<CreatureScript>::AddScript(this);
  1203. }
  1204. GameObjectScript::GameObjectScript(const char* name)
  1205. : ScriptObject(name)
  1206. {
  1207. ScriptRegistry<GameObjectScript>::AddScript(this);
  1208. }
  1209. AreaTriggerScript::AreaTriggerScript(const char* name)
  1210. : ScriptObject(name)
  1211. {
  1212. ScriptRegistry<AreaTriggerScript>::AddScript(this);
  1213. }
  1214. BattlegroundScript::BattlegroundScript(const char* name)
  1215. : ScriptObject(name)
  1216. {
  1217. ScriptRegistry<BattlegroundScript>::AddScript(this);
  1218. }
  1219. OutdoorPvPScript::OutdoorPvPScript(const char* name)
  1220. : ScriptObject(name)
  1221. {
  1222. ScriptRegistry<OutdoorPvPScript>::AddScript(this);
  1223. }
  1224. CommandScript::CommandScript(const char* name)
  1225. : ScriptObject(name)
  1226. {
  1227. ScriptRegistry<CommandScript>::AddScript(this);
  1228. }
  1229. WeatherScript::WeatherScript(const char* name)
  1230. : ScriptObject(name)
  1231. {
  1232. ScriptRegistry<WeatherScript>::AddScript(this);
  1233. }
  1234. AuctionHouseScript::AuctionHouseScript(const char* name)
  1235. : ScriptObject(name)
  1236. {
  1237. ScriptRegistry<AuctionHouseScript>::AddScript(this);
  1238. }
  1239. ConditionScript::ConditionScript(const char* name)
  1240. : ScriptObject(name)
  1241. {
  1242. ScriptRegistry<ConditionScript>::AddScript(this);
  1243. }
  1244. VehicleScript::VehicleScript(const char* name)
  1245. : ScriptObject(name)
  1246. {
  1247. ScriptRegistry<VehicleScript>::AddScript(this);
  1248. }
  1249. DynamicObjectScript::DynamicObjectScript(const char* name)
  1250. : ScriptObject(name)
  1251. {
  1252. ScriptRegistry<DynamicObjectScript>::AddScript(this);
  1253. }
  1254. TransportScript::TransportScript(const char* name)
  1255. : ScriptObject(name)
  1256. {
  1257. ScriptRegistry<TransportScript>::AddScript(this);
  1258. }
  1259. AchievementCriteriaScript::AchievementCriteriaScript(const char* name)
  1260. : ScriptObject(name)
  1261. {
  1262. ScriptRegistry<AchievementCriteriaScript>::AddScript(this);
  1263. }
  1264. PlayerScript::PlayerScript(const char* name)
  1265. : UnitScript(name, false)
  1266. {
  1267. ScriptRegistry<PlayerScript>::AddScript(this);
  1268. }
  1269. AccountScript::AccountScript(const char* name)
  1270. : ScriptObject(name)
  1271. {
  1272. ScriptRegistry<AccountScript>::AddScript(this);
  1273. }
  1274. GuildScript::GuildScript(const char* name)
  1275. : ScriptObject(name)
  1276. {
  1277. ScriptRegistry<GuildScript>::AddScript(this);
  1278. }
  1279. GroupScript::GroupScript(const char* name)
  1280. : ScriptObject(name)
  1281. {
  1282. ScriptRegistry<GroupScript>::AddScript(this);
  1283. }
  1284. // Instantiate static members of ScriptRegistry.
  1285. template<class TScript> std::map<uint32, TScript*> ScriptRegistry<TScript>::ScriptPointerList;
  1286. template<class TScript> uint32 ScriptRegistry<TScript>::_scriptIdCounter = 0;
  1287. // Specialize for each script type class like so:
  1288. template class ScriptRegistry<SpellScriptLoader>;
  1289. template class ScriptRegistry<ServerScript>;
  1290. template class ScriptRegistry<WorldScript>;
  1291. template class ScriptRegistry<FormulaScript>;
  1292. template class ScriptRegistry<WorldMapScript>;
  1293. template class ScriptRegistry<InstanceMapScript>;
  1294. template class ScriptRegistry<BattlegroundMapScript>;
  1295. template class ScriptRegistry<ItemScript>;
  1296. template class ScriptRegistry<CreatureScript>;
  1297. template class ScriptRegistry<GameObjectScript>;
  1298. template class ScriptRegistry<AreaTriggerScript>;
  1299. template class ScriptRegistry<BattlegroundScript>;
  1300. template class ScriptRegistry<OutdoorPvPScript>;
  1301. template class ScriptRegistry<CommandScript>;
  1302. template class ScriptRegistry<WeatherScript>;
  1303. template class ScriptRegistry<AuctionHouseScript>;
  1304. template class ScriptRegistry<ConditionScript>;
  1305. template class Scrip

Large files files are truncated, but you can click here to view the full file