Advertisement
Daveido1h

ScriptMgr.cpp

Jun 6th, 2014
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 56.68 KB | None | 0 0
  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.  
  19. #include "ScriptMgr.h"
  20. #include "Config.h"
  21. #include "DatabaseEnv.h"
  22. #include "DBCStores.h"
  23. #include "ObjectMgr.h"
  24. #include "OutdoorPvPMgr.h"
  25. #include "ScriptLoader.h"
  26. #include "ScriptSystem.h"
  27. #include "Transport.h"
  28. #include "Vehicle.h"
  29. #include "SpellInfo.h"
  30. #include "SpellScript.h"
  31. #include "GossipDef.h"
  32. #include "CreatureAIImpl.h"
  33. #include "Player.h"
  34. #include "WorldPacket.h"
  35. #include "LuaEngine.h"
  36.  
  37. namespace
  38. {
  39.     typedef std::set<ScriptObject*> ExampleScriptContainer;
  40.     ExampleScriptContainer ExampleScripts;
  41. }
  42.  
  43. // This is the global static registry of scripts.
  44. template<class TScript>
  45. class ScriptRegistry
  46. {
  47.     public:
  48.  
  49.         typedef std::map<uint32, TScript*> ScriptMap;
  50.         typedef typename ScriptMap::iterator ScriptMapIterator;
  51.  
  52.         // The actual list of scripts. This will be accessed concurrently, so it must not be modified
  53.         // after server startup.
  54.         static ScriptMap ScriptPointerList;
  55.  
  56.         static void AddScript(TScript* const script)
  57.         {
  58.             ASSERT(script);
  59.  
  60.             // See if the script is using the same memory as another script. If this happens, it means that
  61.             // someone forgot to allocate new memory for a script.
  62.             for (ScriptMapIterator it = ScriptPointerList.begin(); it != ScriptPointerList.end(); ++it)
  63.             {
  64.                 if (it->second == script)
  65.                 {
  66.                     TC_LOG_ERROR("scripts", "Script '%s' has same memory pointer as '%s'.",
  67.                         script->GetName().c_str(), it->second->GetName().c_str());
  68.  
  69.                     return;
  70.                 }
  71.             }
  72.  
  73.             if (script->IsDatabaseBound())
  74.             {
  75.                 // Get an ID for the script. An ID only exists if it's a script that is assigned in the database
  76.                 // through a script name (or similar).
  77.                 uint32 id = sObjectMgr->GetScriptId(script->GetName().c_str());
  78.                 if (id)
  79.                 {
  80.                     // Try to find an existing script.
  81.                     bool existing = false;
  82.                     for (ScriptMapIterator it = ScriptPointerList.begin(); it != ScriptPointerList.end(); ++it)
  83.                     {
  84.                         // If the script names match...
  85.                         if (it->second->GetName() == script->GetName())
  86.                         {
  87.                             // ... It exists.
  88.                             existing = true;
  89.                             break;
  90.                         }
  91.                     }
  92.  
  93.                     // If the script isn't assigned -> assign it!
  94.                     if (!existing)
  95.                     {
  96.                         ScriptPointerList[id] = script;
  97.                         sScriptMgr->IncrementScriptCount();
  98.                     }
  99.                     else
  100.                     {
  101.                         // If the script is already assigned -> delete it!
  102.                         TC_LOG_ERROR("scripts", "Script '%s' already assigned with the same script name, so the script can't work.",
  103.                             script->GetName().c_str());
  104.  
  105.                         ASSERT(false); // Error that should be fixed ASAP.
  106.                     }
  107.                 }
  108.                 else
  109.                 {
  110.                     // The script uses a script name from database, but isn't assigned to anything.
  111.                     if (script->GetName().find("example") == std::string::npos && script->GetName().find("Smart") == std::string::npos)
  112.                         TC_LOG_ERROR("sql.sql", "Script named '%s' does not have a script name assigned in database.",
  113.                             script->GetName().c_str());
  114.  
  115.                     // These scripts don't get stored anywhere so throw them into this to avoid leaking memory
  116.                     ExampleScripts.insert(script);
  117.                 }
  118.             }
  119.             else
  120.             {
  121.                 // We're dealing with a code-only script; just add it.
  122.                 ScriptPointerList[_scriptIdCounter++] = script;
  123.                 sScriptMgr->IncrementScriptCount();
  124.             }
  125.         }
  126.  
  127.         // Gets a script by its ID (assigned by ObjectMgr).
  128.         static TScript* GetScriptById(uint32 id)
  129.         {
  130.             ScriptMapIterator it = ScriptPointerList.find(id);
  131.             if (it != ScriptPointerList.end())
  132.                 return it->second;
  133.  
  134.             return NULL;
  135.         }
  136.  
  137.     private:
  138.  
  139.         // Counter used for code-only scripts.
  140.         static uint32 _scriptIdCounter;
  141. };
  142.  
  143. // Utility macros to refer to the script registry.
  144. #define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptMap
  145. #define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptMapIterator
  146. #define SCR_REG_LST(T) ScriptRegistry<T>::ScriptPointerList
  147.  
  148. // Utility macros for looping over scripts.
  149. #define FOR_SCRIPTS(T, C, E) \
  150.     if (SCR_REG_LST(T).empty()) \
  151.         return; \
  152.     for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
  153.         C != SCR_REG_LST(T).end(); ++C)
  154. #define FOR_SCRIPTS_RET(T, C, E, R) \
  155.     if (SCR_REG_LST(T).empty()) \
  156.         return R; \
  157.     for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
  158.         C != SCR_REG_LST(T).end(); ++C)
  159. #define FOREACH_SCRIPT(T) \
  160.     FOR_SCRIPTS(T, itr, end) \
  161.     itr->second
  162.  
  163. // Utility macros for finding specific scripts.
  164. #define GET_SCRIPT(T, I, V) \
  165.     T* V = ScriptRegistry<T>::GetScriptById(I); \
  166.     if (!V) \
  167.         return;
  168. #define GET_SCRIPT_RET(T, I, V, R) \
  169.     T* V = ScriptRegistry<T>::GetScriptById(I); \
  170.     if (!V) \
  171.         return R;
  172.  
  173. struct TSpellSummary
  174. {
  175.     uint8 Targets;                                          // set of enum SelectTarget
  176.     uint8 Effects;                                          // set of enum SelectEffect
  177. } *SpellSummary;
  178.  
  179. ScriptMgr::ScriptMgr()
  180.     : _scriptCount(0), _scheduledScripts(0) { }
  181.  
  182. ScriptMgr::~ScriptMgr() { }
  183.  
  184. void ScriptMgr::Initialize()
  185. {
  186.     uint32 oldMSTime = getMSTime();
  187.  
  188.     LoadDatabase();
  189.  
  190.     TC_LOG_INFO("server.loading", "Loading C++ scripts");
  191.  
  192.     FillSpellSummary();
  193.     AddScripts();
  194.  
  195.     TC_LOG_INFO("server.loading", ">> Loaded %u C++ scripts in %u ms", GetScriptCount(), GetMSTimeDiffToNow(oldMSTime));
  196.  
  197. #ifdef ELUNA
  198.     Eluna::Initialize();
  199. #endif
  200. }
  201.  
  202. void ScriptMgr::Unload()
  203. {
  204.     #define SCR_CLEAR(T) \
  205.         for (SCR_REG_ITR(T) itr = SCR_REG_LST(T).begin(); itr != SCR_REG_LST(T).end(); ++itr) \
  206.             delete itr->second; \
  207.         SCR_REG_LST(T).clear();
  208.  
  209.     // Clear scripts for every script type.
  210.     SCR_CLEAR(SpellScriptLoader);
  211.     SCR_CLEAR(ServerScript);
  212.     SCR_CLEAR(WorldScript);
  213.     SCR_CLEAR(FormulaScript);
  214.     SCR_CLEAR(WorldMapScript);
  215.     SCR_CLEAR(InstanceMapScript);
  216.     SCR_CLEAR(BattlegroundMapScript);
  217.     SCR_CLEAR(ItemScript);
  218.     SCR_CLEAR(CreatureScript);
  219.     SCR_CLEAR(GameObjectScript);
  220.     SCR_CLEAR(AreaTriggerScript);
  221.     SCR_CLEAR(BattlegroundScript);
  222.     SCR_CLEAR(OutdoorPvPScript);
  223.     SCR_CLEAR(CommandScript);
  224.     SCR_CLEAR(WeatherScript);
  225.     SCR_CLEAR(AuctionHouseScript);
  226.     SCR_CLEAR(ConditionScript);
  227.     SCR_CLEAR(VehicleScript);
  228.     SCR_CLEAR(DynamicObjectScript);
  229.     SCR_CLEAR(TransportScript);
  230.     SCR_CLEAR(AchievementCriteriaScript);
  231.     SCR_CLEAR(PlayerScript);
  232.     SCR_CLEAR(GuildScript);
  233.     SCR_CLEAR(GroupScript);
  234.     SCR_CLEAR(UnitScript);
  235.  
  236.     #undef SCR_CLEAR
  237.  
  238.     for (ExampleScriptContainer::iterator itr = ExampleScripts.begin(); itr != ExampleScripts.end(); ++itr)
  239.         delete *itr;
  240.     ExampleScripts.clear();
  241.  
  242.     delete[] SpellSummary;
  243.     delete[] UnitAI::AISpellInfo;
  244. }
  245.  
  246. void ScriptMgr::LoadDatabase()
  247. {
  248.     sScriptSystemMgr->LoadScriptWaypoints();
  249. }
  250.  
  251. void ScriptMgr::FillSpellSummary()
  252. {
  253.     UnitAI::FillAISpellInfo();
  254.  
  255.     SpellSummary = new TSpellSummary[sSpellMgr->GetSpellInfoStoreSize()];
  256.  
  257.     SpellInfo const* pTempSpell;
  258.  
  259.     for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
  260.     {
  261.         SpellSummary[i].Effects = 0;
  262.         SpellSummary[i].Targets = 0;
  263.  
  264.         pTempSpell = sSpellMgr->GetSpellInfo(i);
  265.         // This spell doesn't exist.
  266.         if (!pTempSpell)
  267.             continue;
  268.  
  269.         for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
  270.         {
  271.             // Spell targets self.
  272.             if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER)
  273.                 SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SELF-1);
  274.  
  275.             // Spell targets a single enemy.
  276.             if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
  277.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY)
  278.                 SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_ENEMY-1);
  279.  
  280.             // Spell targets AoE at enemy.
  281.             if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
  282.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
  283.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER ||
  284.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
  285.                 SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_ENEMY-1);
  286.  
  287.             // Spell targets an enemy.
  288.             if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY ||
  289.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_TARGET_ENEMY ||
  290.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY ||
  291.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY ||
  292.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER ||
  293.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY)
  294.                 SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_ENEMY-1);
  295.  
  296.             // Spell targets a single friend (or self).
  297.             if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER ||
  298.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY ||
  299.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY)
  300.                 SpellSummary[i].Targets |= 1 << (SELECT_TARGET_SINGLE_FRIEND-1);
  301.  
  302.             // Spell targets AoE friends.
  303.             if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
  304.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
  305.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER)
  306.                 SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_FRIEND-1);
  307.  
  308.             // Spell targets any friend (or self).
  309.             if (pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER ||
  310.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_ALLY ||
  311.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_TARGET_PARTY ||
  312.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_CASTER_AREA_PARTY ||
  313.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_UNIT_LASTTARGET_AREA_PARTY ||
  314.                 pTempSpell->Effects[j].TargetA.GetTarget() == TARGET_SRC_CASTER)
  315.                 SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_FRIEND-1);
  316.  
  317.             // Make sure that this spell includes a damage effect.
  318.             if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_SCHOOL_DAMAGE ||
  319.                 pTempSpell->Effects[j].Effect == SPELL_EFFECT_INSTAKILL ||
  320.                 pTempSpell->Effects[j].Effect == SPELL_EFFECT_ENVIRONMENTAL_DAMAGE ||
  321.                 pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH)
  322.                 SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_DAMAGE-1);
  323.  
  324.             // Make sure that this spell includes a healing effect (or an apply aura with a periodic heal).
  325.             if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL ||
  326.                 pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL_MAX_HEALTH ||
  327.                 pTempSpell->Effects[j].Effect == SPELL_EFFECT_HEAL_MECHANICAL ||
  328.                 (pTempSpell->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA  && pTempSpell->Effects[j].ApplyAuraName == 8))
  329.                 SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_HEALING-1);
  330.  
  331.             // Make sure that this spell applies an aura.
  332.             if (pTempSpell->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA)
  333.                 SpellSummary[i].Effects |= 1 << (SELECT_EFFECT_AURA-1);
  334.         }
  335.     }
  336. }
  337.  
  338. void ScriptMgr::CreateSpellScripts(uint32 spellId, std::list<SpellScript*>& scriptVector)
  339. {
  340.     SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
  341.  
  342.     for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
  343.     {
  344.         SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::GetScriptById(itr->second);
  345.         if (!tmpscript)
  346.             continue;
  347.  
  348.         SpellScript* script = tmpscript->GetSpellScript();
  349.  
  350.         if (!script)
  351.             continue;
  352.  
  353.         script->_Init(&tmpscript->GetName(), spellId);
  354.  
  355.         scriptVector.push_back(script);
  356.     }
  357. }
  358.  
  359. void ScriptMgr::CreateAuraScripts(uint32 spellId, std::list<AuraScript*>& scriptVector)
  360. {
  361.     SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
  362.  
  363.     for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
  364.     {
  365.         SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::GetScriptById(itr->second);
  366.         if (!tmpscript)
  367.             continue;
  368.  
  369.         AuraScript* script = tmpscript->GetAuraScript();
  370.  
  371.         if (!script)
  372.             continue;
  373.  
  374.         script->_Init(&tmpscript->GetName(), spellId);
  375.  
  376.         scriptVector.push_back(script);
  377.     }
  378. }
  379.  
  380. void ScriptMgr::CreateSpellScriptLoaders(uint32 spellId, std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> >& scriptVector)
  381. {
  382.     SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
  383.     scriptVector.reserve(std::distance(bounds.first, bounds.second));
  384.  
  385.     for (SpellScriptsContainer::iterator itr = bounds.first; itr != bounds.second; ++itr)
  386.     {
  387.         SpellScriptLoader* tmpscript = ScriptRegistry<SpellScriptLoader>::GetScriptById(itr->second);
  388.         if (!tmpscript)
  389.             continue;
  390.  
  391.         scriptVector.push_back(std::make_pair(tmpscript, itr));
  392.     }
  393. }
  394.  
  395. void ScriptMgr::OnNetworkStart()
  396. {
  397.     FOREACH_SCRIPT(ServerScript)->OnNetworkStart();
  398. }
  399.  
  400. void ScriptMgr::OnNetworkStop()
  401. {
  402.     FOREACH_SCRIPT(ServerScript)->OnNetworkStop();
  403. }
  404.  
  405. void ScriptMgr::OnSocketOpen(WorldSocket* socket)
  406. {
  407.     ASSERT(socket);
  408.  
  409.     FOREACH_SCRIPT(ServerScript)->OnSocketOpen(socket);
  410. }
  411.  
  412. void ScriptMgr::OnSocketClose(WorldSocket* socket, bool wasNew)
  413. {
  414.     ASSERT(socket);
  415.  
  416.     FOREACH_SCRIPT(ServerScript)->OnSocketClose(socket, wasNew);
  417. }
  418.  
  419. void ScriptMgr::OnPacketReceive(WorldSocket* socket, WorldPacket packet)
  420. {
  421.     ASSERT(socket);
  422.  
  423.     FOREACH_SCRIPT(ServerScript)->OnPacketReceive(socket, packet);
  424. }
  425.  
  426. void ScriptMgr::OnPacketSend(WorldSocket* socket, WorldPacket packet)
  427. {
  428.     ASSERT(socket);
  429.  
  430.     FOREACH_SCRIPT(ServerScript)->OnPacketSend(socket, packet);
  431. }
  432.  
  433. void ScriptMgr::OnUnknownPacketReceive(WorldSocket* socket, WorldPacket packet)
  434. {
  435.     ASSERT(socket);
  436.  
  437.     FOREACH_SCRIPT(ServerScript)->OnUnknownPacketReceive(socket, packet);
  438. }
  439.  
  440. void ScriptMgr::OnOpenStateChange(bool open)
  441. {
  442. #ifdef ELUNA
  443.     sEluna->OnOpenStateChange(open);
  444. #endif
  445.     FOREACH_SCRIPT(WorldScript)->OnOpenStateChange(open);
  446. }
  447.  
  448. void ScriptMgr::OnConfigLoad(bool reload)
  449. {
  450. #ifdef ELUNA
  451.     sEluna->OnConfigLoad(reload);
  452. #endif
  453.     FOREACH_SCRIPT(WorldScript)->OnConfigLoad(reload);
  454. }
  455.  
  456. void ScriptMgr::OnMotdChange(std::string& newMotd)
  457. {
  458.     FOREACH_SCRIPT(WorldScript)->OnMotdChange(newMotd);
  459. }
  460.  
  461. void ScriptMgr::OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
  462. {
  463. #ifdef ELUNA
  464.     sEluna->OnShutdownInitiate(code, mask);
  465. #endif
  466.     FOREACH_SCRIPT(WorldScript)->OnShutdownInitiate(code, mask);
  467. }
  468.  
  469. void ScriptMgr::OnShutdownCancel()
  470. {
  471. #ifdef ELUNA
  472.     sEluna->OnShutdownCancel();
  473. #endif
  474.     FOREACH_SCRIPT(WorldScript)->OnShutdownCancel();
  475. }
  476.  
  477. void ScriptMgr::OnWorldUpdate(uint32 diff)
  478. {
  479. #ifdef ELUNA
  480.     sEluna->OnWorldUpdate(diff);
  481. #endif
  482.     FOREACH_SCRIPT(WorldScript)->OnUpdate(diff);
  483. }
  484.  
  485. void ScriptMgr::OnHonorCalculation(float& honor, uint8 level, float multiplier)
  486. {
  487.     FOREACH_SCRIPT(FormulaScript)->OnHonorCalculation(honor, level, multiplier);
  488. }
  489.  
  490. void ScriptMgr::OnGrayLevelCalculation(uint8& grayLevel, uint8 playerLevel)
  491. {
  492.     FOREACH_SCRIPT(FormulaScript)->OnGrayLevelCalculation(grayLevel, playerLevel);
  493. }
  494.  
  495. void ScriptMgr::OnColorCodeCalculation(XPColorChar& color, uint8 playerLevel, uint8 mobLevel)
  496. {
  497.     FOREACH_SCRIPT(FormulaScript)->OnColorCodeCalculation(color, playerLevel, mobLevel);
  498. }
  499.  
  500. void ScriptMgr::OnZeroDifferenceCalculation(uint8& diff, uint8 playerLevel)
  501. {
  502.     FOREACH_SCRIPT(FormulaScript)->OnZeroDifferenceCalculation(diff, playerLevel);
  503. }
  504.  
  505. void ScriptMgr::OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content)
  506. {
  507.     FOREACH_SCRIPT(FormulaScript)->OnBaseGainCalculation(gain, playerLevel, mobLevel, content);
  508. }
  509.  
  510. void ScriptMgr::OnGainCalculation(uint32& gain, Player* player, Unit* unit)
  511. {
  512.     ASSERT(player);
  513.     ASSERT(unit);
  514.  
  515.     FOREACH_SCRIPT(FormulaScript)->OnGainCalculation(gain, player, unit);
  516. }
  517.  
  518. void ScriptMgr::OnGroupRateCalculation(float& rate, uint32 count, bool isRaid)
  519. {
  520.     FOREACH_SCRIPT(FormulaScript)->OnGroupRateCalculation(rate, count, isRaid);
  521. }
  522.  
  523. #define SCR_MAP_BGN(M, V, I, E, C, T) \
  524.     if (V->GetEntry() && V->GetEntry()->T()) \
  525.     { \
  526.         FOR_SCRIPTS(M, I, E) \
  527.         { \
  528.             MapEntry const* C = I->second->GetEntry(); \
  529.             if (!C) \
  530.                 continue; \
  531.             if (C->MapID == V->GetId()) \
  532.             {
  533.  
  534. #define SCR_MAP_END \
  535.                 return; \
  536.             } \
  537.         } \
  538.     }
  539.  
  540. void ScriptMgr::OnCreateMap(Map* map)
  541. {
  542.     ASSERT(map);
  543.  
  544.     SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  545.         itr->second->OnCreate(map);
  546.     SCR_MAP_END;
  547.  
  548.     SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  549.         itr->second->OnCreate((InstanceMap*)map);
  550.     SCR_MAP_END;
  551.  
  552.     SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  553.         itr->second->OnCreate((BattlegroundMap*)map);
  554.     SCR_MAP_END;
  555.  
  556. #ifdef ELUNA
  557.     sEluna->OnCreate(map);
  558. #endif
  559. }
  560.  
  561. void ScriptMgr::OnDestroyMap(Map* map)
  562. {
  563.     ASSERT(map);
  564.  
  565.     SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  566.         itr->second->OnDestroy(map);
  567.     SCR_MAP_END;
  568.  
  569.     SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  570.         itr->second->OnDestroy((InstanceMap*)map);
  571.     SCR_MAP_END;
  572.  
  573.     SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  574.         itr->second->OnDestroy((BattlegroundMap*)map);
  575.     SCR_MAP_END;
  576.  
  577. #ifdef ELUNA
  578.     sEluna->OnDestroy(map);
  579. #endif
  580. }
  581.  
  582. void ScriptMgr::OnLoadGridMap(Map* map, GridMap* gmap, uint32 gx, uint32 gy)
  583. {
  584.     ASSERT(map);
  585.     ASSERT(gmap);
  586.  
  587.     SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  588.         itr->second->OnLoadGridMap(map, gmap, gx, gy);
  589.     SCR_MAP_END;
  590.  
  591.     SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  592.         itr->second->OnLoadGridMap((InstanceMap*)map, gmap, gx, gy);
  593.     SCR_MAP_END;
  594.  
  595.     SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  596.         itr->second->OnLoadGridMap((BattlegroundMap*)map, gmap, gx, gy);
  597.     SCR_MAP_END;
  598. }
  599.  
  600. void ScriptMgr::OnUnloadGridMap(Map* map, GridMap* gmap, uint32 gx, uint32 gy)
  601. {
  602.     ASSERT(map);
  603.     ASSERT(gmap);
  604.  
  605.     SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  606.         itr->second->OnUnloadGridMap(map, gmap, gx, gy);
  607.     SCR_MAP_END;
  608.  
  609.     SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  610.         itr->second->OnUnloadGridMap((InstanceMap*)map, gmap, gx, gy);
  611.     SCR_MAP_END;
  612.  
  613.     SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  614.         itr->second->OnUnloadGridMap((BattlegroundMap*)map, gmap, gx, gy);
  615.     SCR_MAP_END;
  616. }
  617.  
  618. void ScriptMgr::OnPlayerEnterMap(Map* map, Player* player)
  619. {
  620.     ASSERT(map);
  621.     ASSERT(player);
  622.  
  623.     FOREACH_SCRIPT(PlayerScript)->OnMapChanged(player);
  624.  
  625.     SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  626.         itr->second->OnPlayerEnter(map, player);
  627.     SCR_MAP_END;
  628.  
  629.     SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  630.         itr->second->OnPlayerEnter((InstanceMap*)map, player);
  631.     SCR_MAP_END;
  632.  
  633.     SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  634.         itr->second->OnPlayerEnter((BattlegroundMap*)map, player);
  635.     SCR_MAP_END;
  636.  
  637. #ifdef ELUNA
  638.     sEluna->OnMapChanged(player);
  639.     sEluna->OnPlayerEnter(map, player);
  640. #endif
  641. }
  642.  
  643. void ScriptMgr::OnPlayerLeaveMap(Map* map, Player* player)
  644. {
  645.     ASSERT(map);
  646.     ASSERT(player);
  647.  
  648.     SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  649.         itr->second->OnPlayerLeave(map, player);
  650.     SCR_MAP_END;
  651.  
  652.     SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  653.         itr->second->OnPlayerLeave((InstanceMap*)map, player);
  654.     SCR_MAP_END;
  655.  
  656.     SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  657.         itr->second->OnPlayerLeave((BattlegroundMap*)map, player);
  658.     SCR_MAP_END;
  659.  
  660. #ifdef ELUNA
  661.     sEluna->OnPlayerLeave(map, player);
  662. #endif
  663. }
  664.  
  665. void ScriptMgr::OnMapUpdate(Map* map, uint32 diff)
  666. {
  667.     ASSERT(map);
  668.  
  669.     SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap);
  670.         itr->second->OnUpdate(map, diff);
  671.     SCR_MAP_END;
  672.  
  673.     SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon);
  674.         itr->second->OnUpdate((InstanceMap*)map, diff);
  675.     SCR_MAP_END;
  676.  
  677.     SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground);
  678.         itr->second->OnUpdate((BattlegroundMap*)map, diff);
  679.     SCR_MAP_END;
  680.  
  681. #ifdef ELUNA
  682.     sEluna->OnUpdate(map, diff);
  683. #endif
  684. }
  685.  
  686. #undef SCR_MAP_BGN
  687. #undef SCR_MAP_END
  688.  
  689. InstanceScript* ScriptMgr::CreateInstanceData(InstanceMap* map)
  690. {
  691.     ASSERT(map);
  692.  
  693.     GET_SCRIPT_RET(InstanceMapScript, map->GetScriptId(), tmpscript, NULL);
  694.     return tmpscript->GetInstanceScript(map);
  695. }
  696.  
  697. bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, Item* target)
  698. {
  699.     ASSERT(caster);
  700.     ASSERT(target);
  701. #ifdef ELUNA
  702.     if(sEluna->OnDummyEffect(caster, spellId, effIndex, target))
  703.         return false;
  704. #endif
  705.  
  706.     GET_SCRIPT_RET(ItemScript, target->GetScriptId(), tmpscript, false);
  707.     return tmpscript->OnDummyEffect(caster, spellId, effIndex, target);
  708. }
  709.  
  710. bool ScriptMgr::OnQuestAccept(Player* player, Item* item, Quest const* quest)
  711. {
  712.     ASSERT(player);
  713.     ASSERT(item);
  714.     ASSERT(quest);
  715. #ifdef ELUNA
  716.     if(sEluna->OnQuestAccept(player, item, quest))
  717.         return false;
  718. #endif
  719.  
  720.     GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
  721.     player->PlayerTalkClass->ClearMenus();
  722.     return tmpscript->OnQuestAccept(player, item, quest);
  723. }
  724.  
  725. bool ScriptMgr::OnItemUse(Player* player, Item* item, SpellCastTargets const& targets)
  726. {
  727.     ASSERT(player);
  728.     ASSERT(item);
  729.  
  730.     GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
  731.     player->PlayerTalkClass->ClearMenus();
  732.     return tmpscript->OnUse(player, item, targets);
  733. }
  734.  
  735. bool ScriptMgr::OnItemExpire(Player* player, ItemTemplate const* proto)
  736. {
  737.     ASSERT(player);
  738.     ASSERT(proto);
  739. #ifdef ELUNA
  740.     if(sEluna->OnExpire(player, proto))
  741.         return false;
  742. #endif
  743.  
  744.     GET_SCRIPT_RET(ItemScript, proto->ScriptId, tmpscript, false);
  745.     return tmpscript->OnExpire(player, proto);
  746. }
  747.  
  748. bool ScriptMgr::OnItemRemove(Player* player, Item* item)
  749. {
  750.     ASSERT(player);
  751.     ASSERT(item);
  752. #ifdef ELUNA
  753.     if (sEluna->OnRemove(player, item))
  754.         return false;
  755. #endif
  756.  
  757.     GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false);
  758.     return tmpscript->OnRemove(player, item);
  759. }
  760.  
  761. bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, Creature* target)
  762. {
  763.     ASSERT(caster);
  764.     ASSERT(target);
  765. #ifdef ELUNA
  766.     if(sEluna->OnDummyEffect(caster, spellId, effIndex, target))
  767.         return false;
  768. #endif
  769.  
  770.     GET_SCRIPT_RET(CreatureScript, target->GetScriptId(), tmpscript, false);
  771.     return tmpscript->OnDummyEffect(caster, spellId, effIndex, target);
  772. }
  773.  
  774. bool ScriptMgr::OnGossipHello(Player* player, Creature* creature)
  775. {
  776.     ASSERT(player);
  777.     ASSERT(creature);
  778. #ifdef ELUNA
  779.     if(sEluna->OnGossipHello(player, creature))
  780.         return true;
  781. #endif
  782.  
  783.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  784.     player->PlayerTalkClass->ClearMenus();
  785.     return tmpscript->OnGossipHello(player, creature);
  786. }
  787.  
  788. bool ScriptMgr::OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
  789. {
  790.     ASSERT(player);
  791.     ASSERT(creature);
  792. #ifdef ELUNA
  793.     if(sEluna->OnGossipSelect(player, creature, sender, action))
  794.         return true;
  795. #endif
  796.  
  797.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  798.     return tmpscript->OnGossipSelect(player, creature, sender, action);
  799. }
  800.  
  801. bool ScriptMgr::OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code)
  802. {
  803.     ASSERT(player);
  804.     ASSERT(creature);
  805.     ASSERT(code);
  806. #ifdef ELUNA
  807.     if(sEluna->OnGossipSelectCode(player, creature, sender, action, code))
  808.         return true;
  809. #endif
  810.  
  811.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  812.     return tmpscript->OnGossipSelectCode(player, creature, sender, action, code);
  813. }
  814.  
  815. bool ScriptMgr::OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
  816. {
  817.     ASSERT(player);
  818.     ASSERT(creature);
  819.     ASSERT(quest);
  820. #ifdef ELUNA
  821.     if(sEluna->OnQuestAccept(player, creature, quest))
  822.     {
  823.         player->PlayerTalkClass->ClearMenus();
  824.         return false;
  825.     }
  826. #endif
  827.  
  828.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  829.     player->PlayerTalkClass->ClearMenus();
  830.     return tmpscript->OnQuestAccept(player, creature, quest);
  831. }
  832.  
  833. bool ScriptMgr::OnQuestSelect(Player* player, Creature* creature, Quest const* quest)
  834. {
  835.     ASSERT(player);
  836.     ASSERT(creature);
  837.     ASSERT(quest);
  838.  
  839.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  840.     player->PlayerTalkClass->ClearMenus();
  841.     return tmpscript->OnQuestSelect(player, creature, quest);
  842. }
  843.  
  844. bool ScriptMgr::OnQuestComplete(Player* player, Creature* creature, Quest const* quest)
  845. {
  846.     ASSERT(player);
  847.     ASSERT(creature);
  848.     ASSERT(quest);
  849. #ifdef ELUNA
  850.     if(sEluna->OnQuestComplete(player, creature, quest))
  851.     {
  852.         player->PlayerTalkClass->ClearMenus();
  853.         return false;
  854.     }
  855. #endif
  856.  
  857.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  858.     player->PlayerTalkClass->ClearMenus();
  859.     return tmpscript->OnQuestComplete(player, creature, quest);
  860. }
  861.  
  862. bool ScriptMgr::OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt)
  863. {
  864.     ASSERT(player);
  865.     ASSERT(creature);
  866.     ASSERT(quest);
  867. #ifdef ELUNA
  868.     if(sEluna->OnQuestReward(player, creature, quest))
  869.     {
  870.         player->PlayerTalkClass->ClearMenus();
  871.         return false;
  872.     }
  873. #endif
  874.  
  875.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
  876.     player->PlayerTalkClass->ClearMenus();
  877.     return tmpscript->OnQuestReward(player, creature, quest, opt);
  878. }
  879.  
  880. uint32 ScriptMgr::GetDialogStatus(Player* player, Creature* creature)
  881. {
  882.     ASSERT(player);
  883.     ASSERT(creature);
  884. #ifdef ELUNA
  885.     if(uint32 dialogid = sEluna->GetDialogStatus(player, creature))
  886.     {
  887.         player->PlayerTalkClass->ClearMenus();
  888.         return dialogid;
  889.     }
  890. #endif
  891.  
  892.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS);
  893.     player->PlayerTalkClass->ClearMenus();
  894.     return tmpscript->GetDialogStatus(player, creature);
  895. }
  896.  
  897. CreatureAI* ScriptMgr::GetCreatureAI(Creature* creature)
  898. {
  899.     ASSERT(creature);
  900. #ifdef ELUNA
  901.     if(CreatureAI* luaAI = sEluna->GetAI(creature))
  902.         return luaAI;
  903. #endif
  904.  
  905.     GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, NULL);
  906.     return tmpscript->GetAI(creature);
  907. }
  908.  
  909. GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* gameobject)
  910. {
  911.     ASSERT(gameobject);
  912. #ifdef ELUNA
  913.     sEluna->OnSpawn(gameobject);
  914. #endif
  915.  
  916.     GET_SCRIPT_RET(GameObjectScript, gameobject->GetScriptId(), tmpscript, NULL);
  917.     return tmpscript->GetAI(gameobject);
  918. }
  919.  
  920. void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff)
  921. {
  922.     ASSERT(creature);
  923.  
  924.     GET_SCRIPT(CreatureScript, creature->GetScriptId(), tmpscript);
  925.     tmpscript->OnUpdate(creature, diff);
  926. }
  927.  
  928. bool ScriptMgr::OnGossipHello(Player* player, GameObject* go)
  929. {
  930.     ASSERT(player);
  931.     ASSERT(go);
  932. #ifdef ELUNA
  933.     if(sEluna->OnGossipHello(player, go))
  934.         return true;
  935. #endif
  936.  
  937.     GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  938.     player->PlayerTalkClass->ClearMenus();
  939.     return tmpscript->OnGossipHello(player, go);
  940. }
  941.  
  942. bool ScriptMgr::OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action)
  943. {
  944.     ASSERT(player);
  945.     ASSERT(go);
  946. #ifdef ELUNA
  947.     if(sEluna->OnGossipSelect(player, go, sender, action))
  948.         return true;
  949. #endif
  950.  
  951.     GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  952.     return tmpscript->OnGossipSelect(player, go, sender, action);
  953. }
  954.  
  955. bool ScriptMgr::OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code)
  956. {
  957.     ASSERT(player);
  958.     ASSERT(go);
  959.     ASSERT(code);
  960. #ifdef ELUNA
  961.     if(sEluna->OnGossipSelectCode(player, go, sender, action, code))
  962.         return true;
  963. #endif
  964.  
  965.     GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  966.     return tmpscript->OnGossipSelectCode(player, go, sender, action, code);
  967. }
  968.  
  969. bool ScriptMgr::OnQuestAccept(Player* player, GameObject* go, Quest const* quest)
  970. {
  971.     ASSERT(player);
  972.     ASSERT(go);
  973.     ASSERT(quest);
  974. #ifdef ELUNA
  975.     if(sEluna->OnQuestAccept(player, go, quest))
  976.         return false;
  977. #endif
  978.  
  979.     GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  980.     player->PlayerTalkClass->ClearMenus();
  981.     return tmpscript->OnQuestAccept(player, go, quest);
  982. }
  983.  
  984. bool ScriptMgr::OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt)
  985. {
  986.     ASSERT(player);
  987.     ASSERT(go);
  988.     ASSERT(quest);
  989. #ifdef ELUNA
  990.     if(sEluna->OnQuestReward(player, go, quest))
  991.         return false;
  992. #endif
  993.  
  994.     GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
  995.     player->PlayerTalkClass->ClearMenus();
  996.     return tmpscript->OnQuestReward(player, go, quest, opt);
  997. }
  998.  
  999. uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go)
  1000. {
  1001.     ASSERT(player);
  1002.     ASSERT(go);
  1003. #ifdef ELUNA
  1004.     if(uint32 dialogid = sEluna->GetDialogStatus(player, go))
  1005.     {
  1006.         player->PlayerTalkClass->ClearMenus();
  1007.         return dialogid;
  1008.     }
  1009. #endif
  1010.  
  1011.     GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS);
  1012.     player->PlayerTalkClass->ClearMenus();
  1013.     return tmpscript->GetDialogStatus(player, go);
  1014. }
  1015.  
  1016. void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player)
  1017. {
  1018.     ASSERT(go);
  1019. #ifdef ELUNA
  1020.     sEluna->OnDestroyed(go, player);
  1021. #endif
  1022.  
  1023.     GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  1024.     tmpscript->OnDestroyed(go, player);
  1025. }
  1026.  
  1027. void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player)
  1028. {
  1029.     ASSERT(go);
  1030. #ifdef ELUNA
  1031.     sEluna->OnDamaged(go, player);
  1032. #endif
  1033.  
  1034.     GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  1035.     tmpscript->OnDamaged(go, player);
  1036. }
  1037.  
  1038. void ScriptMgr::OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit)
  1039. {
  1040.     ASSERT(go);
  1041. #ifdef ELUNA
  1042.     sEluna->OnLootStateChanged(go, state);
  1043. #endif
  1044.  
  1045.     GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  1046.     tmpscript->OnLootStateChanged(go, state, unit);
  1047. }
  1048.  
  1049. void ScriptMgr::OnGameObjectStateChanged(GameObject* go, uint32 state)
  1050. {
  1051.     ASSERT(go);
  1052. #ifdef ELUNA
  1053.     sEluna->OnGameObjectStateChanged(go, state);
  1054. #endif
  1055.  
  1056.     GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  1057.     tmpscript->OnGameObjectStateChanged(go, state);
  1058. }
  1059.  
  1060. void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff)
  1061. {
  1062.     ASSERT(go);
  1063. #ifdef ELUNA
  1064.     sEluna->UpdateAI(go, diff);
  1065. #endif
  1066.  
  1067.     GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
  1068.     tmpscript->OnUpdate(go, diff);
  1069. }
  1070.  
  1071. bool ScriptMgr::OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, GameObject* target)
  1072. {
  1073.     ASSERT(caster);
  1074.     ASSERT(target);
  1075. #ifdef ELUNA
  1076.     if(sEluna->OnDummyEffect(caster, spellId, effIndex, target))
  1077.         return false;
  1078. #endif
  1079.  
  1080.     GET_SCRIPT_RET(GameObjectScript, target->GetScriptId(), tmpscript, false);
  1081.     return tmpscript->OnDummyEffect(caster, spellId, effIndex, target);
  1082. }
  1083.  
  1084. bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger)
  1085. {
  1086.     ASSERT(player);
  1087.     ASSERT(trigger);
  1088. #ifdef ELUNA
  1089.     if(sEluna->OnAreaTrigger(player, trigger))
  1090.         return false;
  1091. #endif
  1092.  
  1093.     GET_SCRIPT_RET(AreaTriggerScript, sObjectMgr->GetAreaTriggerScriptId(trigger->id), tmpscript, false);
  1094.     return tmpscript->OnTrigger(player, trigger);
  1095. }
  1096.  
  1097. Battleground* ScriptMgr::CreateBattleground(BattlegroundTypeId /*typeId*/)
  1098. {
  1099.     /// @todo Implement script-side battlegrounds.
  1100.     ASSERT(false);
  1101.     return NULL;
  1102. }
  1103.  
  1104. OutdoorPvP* ScriptMgr::CreateOutdoorPvP(OutdoorPvPData const* data)
  1105. {
  1106.     ASSERT(data);
  1107.  
  1108.     GET_SCRIPT_RET(OutdoorPvPScript, data->ScriptId, tmpscript, NULL);
  1109.     return tmpscript->GetOutdoorPvP();
  1110. }
  1111.  
  1112. std::vector<ChatCommand*> ScriptMgr::GetChatCommands()
  1113. {
  1114.     std::vector<ChatCommand*> table;
  1115.  
  1116.     FOR_SCRIPTS_RET(CommandScript, itr, end, table)
  1117.         table.push_back(itr->second->GetCommands());
  1118.  
  1119.     return table;
  1120. }
  1121.  
  1122. void ScriptMgr::OnWeatherChange(Weather* weather, WeatherState state, float grade)
  1123. {
  1124.     ASSERT(weather);
  1125. #ifdef ELUNA
  1126.     sEluna->OnChange(weather, state, grade);
  1127. #endif
  1128.  
  1129.     GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
  1130.     tmpscript->OnChange(weather, state, grade);
  1131. }
  1132.  
  1133. void ScriptMgr::OnWeatherUpdate(Weather* weather, uint32 diff)
  1134. {
  1135.     ASSERT(weather);
  1136.  
  1137.     GET_SCRIPT(WeatherScript, weather->GetScriptId(), tmpscript);
  1138.     tmpscript->OnUpdate(weather, diff);
  1139. }
  1140.  
  1141. void ScriptMgr::OnAuctionAdd(AuctionHouseObject* ah, AuctionEntry* entry)
  1142. {
  1143.     ASSERT(ah);
  1144.     ASSERT(entry);
  1145. #ifdef ELUNA
  1146.     sEluna->OnAdd(ah);
  1147. #endif
  1148.  
  1149.     FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionAdd(ah, entry);
  1150. }
  1151.  
  1152. void ScriptMgr::OnAuctionRemove(AuctionHouseObject* ah, AuctionEntry* entry)
  1153. {
  1154.     ASSERT(ah);
  1155.     ASSERT(entry);
  1156. #ifdef ELUNA
  1157.     sEluna->OnRemove(ah);
  1158. #endif
  1159.  
  1160.     FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionRemove(ah, entry);
  1161. }
  1162.  
  1163. void ScriptMgr::OnAuctionSuccessful(AuctionHouseObject* ah, AuctionEntry* entry)
  1164. {
  1165.     ASSERT(ah);
  1166.     ASSERT(entry);
  1167. #ifdef ELUNA
  1168.     sEluna->OnSuccessful(ah);
  1169. #endif
  1170.  
  1171.     FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionSuccessful(ah, entry);
  1172. }
  1173.  
  1174. void ScriptMgr::OnAuctionExpire(AuctionHouseObject* ah, AuctionEntry* entry)
  1175. {
  1176.     ASSERT(ah);
  1177.     ASSERT(entry);
  1178. #ifdef ELUNA
  1179.     sEluna->OnExpire(ah);
  1180. #endif
  1181.  
  1182.     FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionExpire(ah, entry);
  1183. }
  1184.  
  1185. bool ScriptMgr::OnConditionCheck(Condition* condition, ConditionSourceInfo& sourceInfo)
  1186. {
  1187.     ASSERT(condition);
  1188.  
  1189.     GET_SCRIPT_RET(ConditionScript, condition->ScriptId, tmpscript, true);
  1190.     return tmpscript->OnConditionCheck(condition, sourceInfo);
  1191. }
  1192.  
  1193. void ScriptMgr::OnInstall(Vehicle* veh)
  1194. {
  1195.     ASSERT(veh);
  1196.     ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  1197. #ifdef ELUNA
  1198.     sEluna->OnInstall(veh);
  1199. #endif
  1200.  
  1201.     GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  1202.     tmpscript->OnInstall(veh);
  1203. }
  1204.  
  1205. void ScriptMgr::OnUninstall(Vehicle* veh)
  1206. {
  1207.     ASSERT(veh);
  1208.     ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  1209. #ifdef ELUNA
  1210.     sEluna->OnUninstall(veh);
  1211. #endif
  1212.  
  1213.     GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  1214.     tmpscript->OnUninstall(veh);
  1215. }
  1216.  
  1217. void ScriptMgr::OnReset(Vehicle* veh)
  1218. {
  1219.     ASSERT(veh);
  1220.     ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  1221.  
  1222.     GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  1223.     tmpscript->OnReset(veh);
  1224. }
  1225.  
  1226. void ScriptMgr::OnInstallAccessory(Vehicle* veh, Creature* accessory)
  1227. {
  1228.     ASSERT(veh);
  1229.     ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  1230.     ASSERT(accessory);
  1231. #ifdef ELUNA
  1232.     sEluna->OnInstallAccessory(veh, accessory);
  1233. #endif
  1234.  
  1235.     GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  1236.     tmpscript->OnInstallAccessory(veh, accessory);
  1237. }
  1238.  
  1239. void ScriptMgr::OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId)
  1240. {
  1241.     ASSERT(veh);
  1242.     ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  1243.     ASSERT(passenger);
  1244. #ifdef ELUNA
  1245.     sEluna->OnAddPassenger(veh, passenger, seatId);
  1246. #endif
  1247.  
  1248.     GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  1249.     tmpscript->OnAddPassenger(veh, passenger, seatId);
  1250. }
  1251.  
  1252. void ScriptMgr::OnRemovePassenger(Vehicle* veh, Unit* passenger)
  1253. {
  1254.     ASSERT(veh);
  1255.     ASSERT(veh->GetBase()->GetTypeId() == TYPEID_UNIT);
  1256.     ASSERT(passenger);
  1257. #ifdef ELUNA
  1258.     sEluna->OnRemovePassenger(veh, passenger);
  1259. #endif
  1260.  
  1261.     GET_SCRIPT(VehicleScript, veh->GetBase()->ToCreature()->GetScriptId(), tmpscript);
  1262.     tmpscript->OnRemovePassenger(veh, passenger);
  1263. }
  1264.  
  1265. void ScriptMgr::OnDynamicObjectUpdate(DynamicObject* dynobj, uint32 diff)
  1266. {
  1267.     ASSERT(dynobj);
  1268.  
  1269.     FOR_SCRIPTS(DynamicObjectScript, itr, end)
  1270.         itr->second->OnUpdate(dynobj, diff);
  1271. }
  1272.  
  1273. void ScriptMgr::OnAddPassenger(Transport* transport, Player* player)
  1274. {
  1275.     ASSERT(transport);
  1276.     ASSERT(player);
  1277.  
  1278.     GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  1279.     tmpscript->OnAddPassenger(transport, player);
  1280. }
  1281.  
  1282. void ScriptMgr::OnAddCreaturePassenger(Transport* transport, Creature* creature)
  1283. {
  1284.     ASSERT(transport);
  1285.     ASSERT(creature);
  1286.  
  1287.     GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  1288.     tmpscript->OnAddCreaturePassenger(transport, creature);
  1289. }
  1290.  
  1291. void ScriptMgr::OnRemovePassenger(Transport* transport, Player* player)
  1292. {
  1293.     ASSERT(transport);
  1294.     ASSERT(player);
  1295.  
  1296.     GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  1297.     tmpscript->OnRemovePassenger(transport, player);
  1298. }
  1299.  
  1300. void ScriptMgr::OnTransportUpdate(Transport* transport, uint32 diff)
  1301. {
  1302.     ASSERT(transport);
  1303.  
  1304.     GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  1305.     tmpscript->OnUpdate(transport, diff);
  1306. }
  1307.  
  1308. void ScriptMgr::OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
  1309. {
  1310.     GET_SCRIPT(TransportScript, transport->GetScriptId(), tmpscript);
  1311.     tmpscript->OnRelocate(transport, waypointId, mapId, x, y, z);
  1312. }
  1313.  
  1314. void ScriptMgr::OnStartup()
  1315. {
  1316. #ifdef ELUNA
  1317.     sEluna->OnStartup();
  1318. #endif
  1319.     FOREACH_SCRIPT(WorldScript)->OnStartup();
  1320. }
  1321.  
  1322. void ScriptMgr::OnShutdown()
  1323. {
  1324. #ifdef ELUNA
  1325.     sEluna->OnShutdown();
  1326. #endif
  1327.     FOREACH_SCRIPT(WorldScript)->OnShutdown();
  1328. }
  1329.  
  1330. bool ScriptMgr::OnCriteriaCheck(uint32 scriptId, Player* source, Unit* target)
  1331. {
  1332.     ASSERT(source);
  1333.     // target can be NULL.
  1334.  
  1335.     GET_SCRIPT_RET(AchievementCriteriaScript, scriptId, tmpscript, false);
  1336.     return tmpscript->OnCheck(source, target);
  1337. }
  1338.  
  1339. // Player
  1340. void ScriptMgr::OnPVPKill(Player* killer, Player* killed)
  1341. {
  1342. #ifdef ELUNA
  1343.     sEluna->OnPVPKill(killer, killed);
  1344. #endif
  1345.     FOREACH_SCRIPT(PlayerScript)->OnPVPKill(killer, killed);
  1346. }
  1347.  
  1348. void ScriptMgr::OnCreatureKill(Player* killer, Creature* killed)
  1349. {
  1350. #ifdef ELUNA
  1351.     sEluna->OnCreatureKill(killer, killed);
  1352. #endif
  1353.     FOREACH_SCRIPT(PlayerScript)->OnCreatureKill(killer, killed);
  1354. }
  1355.  
  1356. void ScriptMgr::OnPlayerKilledByCreature(Creature* killer, Player* killed)
  1357. {
  1358. #ifdef ELUNA
  1359.     sEluna->OnPlayerKilledByCreature(killer, killed);
  1360. #endif
  1361.     FOREACH_SCRIPT(PlayerScript)->OnPlayerKilledByCreature(killer, killed);
  1362. }
  1363.  
  1364. void ScriptMgr::OnPlayerLevelChanged(Player* player, uint8 oldLevel)
  1365. {
  1366. #ifdef ELUNA
  1367.     sEluna->OnLevelChanged(player, oldLevel);
  1368. #endif
  1369.     FOREACH_SCRIPT(PlayerScript)->OnLevelChanged(player, oldLevel);
  1370. }
  1371.  
  1372. void ScriptMgr::OnPlayerFreeTalentPointsChanged(Player* player, uint32 points)
  1373. {
  1374. #ifdef ELUNA
  1375.     sEluna->OnFreeTalentPointsChanged(player, points);
  1376. #endif
  1377.     FOREACH_SCRIPT(PlayerScript)->OnFreeTalentPointsChanged(player, points);
  1378. }
  1379.  
  1380. void ScriptMgr::OnPlayerTalentsReset(Player* player, bool noCost)
  1381. {
  1382. #ifdef ELUNA
  1383.     sEluna->OnTalentsReset(player, noCost);
  1384. #endif
  1385.     FOREACH_SCRIPT(PlayerScript)->OnTalentsReset(player, noCost);
  1386. }
  1387.  
  1388. void ScriptMgr::OnPlayerMoneyChanged(Player* player, int64& amount)
  1389. {
  1390. #ifdef ELUNA
  1391.     sEluna->OnMoneyChanged(player, (int32&)amount);
  1392. #endif
  1393.     FOREACH_SCRIPT(PlayerScript)->OnMoneyChanged(player, amount);
  1394. }
  1395.  
  1396. void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim)
  1397. {
  1398. #ifdef ELUNA
  1399.     sEluna->OnGiveXP(player, amount, victim);
  1400. #endif
  1401.     FOREACH_SCRIPT(PlayerScript)->OnGiveXP(player, amount, victim);
  1402. }
  1403.  
  1404. void ScriptMgr::OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental)
  1405. {
  1406. #ifdef ELUNA
  1407.     sEluna->OnReputationChange(player, factionID, standing, incremental);
  1408. #endif
  1409.     FOREACH_SCRIPT(PlayerScript)->OnReputationChange(player, factionID, standing, incremental);
  1410. }
  1411.  
  1412. void ScriptMgr::OnPlayerDuelRequest(Player* target, Player* challenger)
  1413. {
  1414. #ifdef ELUNA
  1415.     sEluna->OnDuelRequest(target, challenger);
  1416. #endif
  1417.     FOREACH_SCRIPT(PlayerScript)->OnDuelRequest(target, challenger);
  1418. }
  1419.  
  1420. void ScriptMgr::OnPlayerDuelStart(Player* player1, Player* player2)
  1421. {
  1422. #ifdef ELUNA
  1423.     sEluna->OnDuelStart(player1, player2);
  1424. #endif
  1425.     FOREACH_SCRIPT(PlayerScript)->OnDuelStart(player1, player2);
  1426. }
  1427.  
  1428. void ScriptMgr::OnPlayerDuelEnd(Player* winner, Player* loser, DuelCompleteType type)
  1429. {
  1430. #ifdef ELUNA
  1431.     sEluna->OnDuelEnd(winner, loser, type);
  1432. #endif
  1433.     FOREACH_SCRIPT(PlayerScript)->OnDuelEnd(winner, loser, type);
  1434. }
  1435.  
  1436. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg)
  1437. {
  1438.     FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg);
  1439. }
  1440.  
  1441. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* receiver)
  1442. {
  1443.     FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, receiver);
  1444. }
  1445.  
  1446. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group)
  1447. {
  1448.     FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, group);
  1449. }
  1450.  
  1451. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild)
  1452. {
  1453.     FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, guild);
  1454. }
  1455.  
  1456. void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel)
  1457. {
  1458.     FOREACH_SCRIPT(PlayerScript)->OnChat(player, type, lang, msg, channel);
  1459. }
  1460.  
  1461. void ScriptMgr::OnPlayerEmote(Player* player, uint32 emote)
  1462. {
  1463. #ifdef ELUNA
  1464.     sEluna->OnEmote(player, emote);
  1465. #endif
  1466.     FOREACH_SCRIPT(PlayerScript)->OnEmote(player, emote);
  1467. }
  1468.  
  1469. void ScriptMgr::OnPlayerTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, uint64 guid)
  1470. {
  1471. #ifdef ELUNA
  1472.     sEluna->OnTextEmote(player, textEmote, emoteNum, guid);
  1473. #endif
  1474.     FOREACH_SCRIPT(PlayerScript)->OnTextEmote(player, textEmote, emoteNum, guid);
  1475. }
  1476.  
  1477. void ScriptMgr::OnPlayerSpellCast(Player* player, Spell* spell, bool skipCheck)
  1478. {
  1479. #ifdef ELUNA
  1480.     sEluna->OnSpellCast(player, spell, skipCheck);
  1481. #endif
  1482.     FOREACH_SCRIPT(PlayerScript)->OnSpellCast(player, spell, skipCheck);
  1483. }
  1484.  
  1485. void ScriptMgr::OnPlayerLogin(Player* player)
  1486. {
  1487. #ifdef ELUNA
  1488.     sEluna->OnLogin(player);
  1489. #endif
  1490.     FOREACH_SCRIPT(PlayerScript)->OnLogin(player);
  1491. }
  1492.  
  1493. void ScriptMgr::OnPlayerLogout(Player* player)
  1494. {
  1495. #ifdef ELUNA
  1496.     sEluna->OnLogout(player);
  1497. #endif
  1498.     FOREACH_SCRIPT(PlayerScript)->OnLogout(player);
  1499. }
  1500.  
  1501. void ScriptMgr::OnPlayerCreate(Player* player)
  1502. {
  1503. #ifdef ELUNA
  1504.     sEluna->OnCreate(player);
  1505. #endif
  1506.     FOREACH_SCRIPT(PlayerScript)->OnCreate(player);
  1507. }
  1508.  
  1509. void ScriptMgr::OnPlayerDelete(uint64 guid)
  1510. {
  1511. #ifdef ELUNA
  1512.     sEluna->OnDelete(GUID_LOPART(guid));
  1513. #endif
  1514.     FOREACH_SCRIPT(PlayerScript)->OnDelete(guid);
  1515. }
  1516.  
  1517. void ScriptMgr::OnPlayerSave(Player* player)
  1518. {
  1519. #ifdef ELUNA
  1520.     sEluna->OnSave(player);
  1521. #endif
  1522.     FOREACH_SCRIPT(PlayerScript)->OnSave(player);
  1523. }
  1524.  
  1525. void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent)
  1526. {
  1527. #ifdef ELUNA
  1528.     sEluna->OnBindToInstance(player, difficulty, mapid, permanent);
  1529. #endif
  1530.     FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent);
  1531. }
  1532.  
  1533. void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea)
  1534. {
  1535. #ifdef ELUNA
  1536.     sEluna->OnUpdateZone(player, newZone, newArea);
  1537. #endif
  1538.     FOREACH_SCRIPT(PlayerScript)->OnUpdateZone(player, newZone, newArea);
  1539. }
  1540.  
  1541. // Guild
  1542. void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8& plRank)
  1543. {
  1544. #ifdef ELUNA
  1545.     sEluna->OnAddMember(guild, player, plRank);
  1546. #endif
  1547.     FOREACH_SCRIPT(GuildScript)->OnAddMember(guild, player, plRank);
  1548. }
  1549.  
  1550. void ScriptMgr::OnGuildRemoveMember(Guild* guild, Player* player, bool isDisbanding, bool isKicked)
  1551. {
  1552. #ifdef ELUNA
  1553.     sEluna->OnRemoveMember(guild, player, isDisbanding);
  1554. #endif
  1555.     FOREACH_SCRIPT(GuildScript)->OnRemoveMember(guild, player, isDisbanding, isKicked);
  1556. }
  1557.  
  1558. void ScriptMgr::OnGuildMOTDChanged(Guild* guild, const std::string& newMotd)
  1559. {
  1560. #ifdef ELUNA
  1561.     sEluna->OnMOTDChanged(guild, newMotd);
  1562. #endif
  1563.     FOREACH_SCRIPT(GuildScript)->OnMOTDChanged(guild, newMotd);
  1564. }
  1565.  
  1566. void ScriptMgr::OnGuildInfoChanged(Guild* guild, const std::string& newInfo)
  1567. {
  1568. #ifdef ELUNA
  1569.     sEluna->OnInfoChanged(guild, newInfo);
  1570. #endif
  1571.     FOREACH_SCRIPT(GuildScript)->OnInfoChanged(guild, newInfo);
  1572. }
  1573.  
  1574. void ScriptMgr::OnGuildCreate(Guild* guild, Player* leader, const std::string& name)
  1575. {
  1576. #ifdef ELUNA
  1577.     sEluna->OnCreate(guild, leader, name);
  1578. #endif
  1579.     FOREACH_SCRIPT(GuildScript)->OnCreate(guild, leader, name);
  1580. }
  1581.  
  1582. void ScriptMgr::OnGuildDisband(Guild* guild)
  1583. {
  1584. #ifdef ELUNA
  1585.     sEluna->OnDisband(guild);
  1586. #endif
  1587.     FOREACH_SCRIPT(GuildScript)->OnDisband(guild);
  1588. }
  1589.  
  1590. void ScriptMgr::OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint64 &amount, bool isRepair)
  1591. {
  1592. #ifdef ELUNA
  1593.     sEluna->OnMemberWitdrawMoney(guild, player, (uint32&)amount, isRepair);
  1594. #endif
  1595.     FOREACH_SCRIPT(GuildScript)->OnMemberWitdrawMoney(guild, player, amount, isRepair);
  1596. }
  1597.  
  1598. void ScriptMgr::OnGuildMemberDepositMoney(Guild* guild, Player* player, uint64 &amount)
  1599. {
  1600. #ifdef ELUNA
  1601.     sEluna->OnMemberDepositMoney(guild, player, (uint32&)amount);
  1602. #endif
  1603.     FOREACH_SCRIPT(GuildScript)->OnMemberDepositMoney(guild, player, amount);
  1604. }
  1605.  
  1606. void ScriptMgr::OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId,
  1607.             bool isDestBank, uint8 destContainer, uint8 destSlotId)
  1608. {
  1609. #ifdef ELUNA
  1610.     sEluna->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
  1611. #endif
  1612.     FOREACH_SCRIPT(GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
  1613. }
  1614.  
  1615. void ScriptMgr::OnGuildEvent(Guild* guild, uint8 eventType, uint32 playerGuid1, uint32 playerGuid2, uint8 newRank)
  1616. {
  1617. #ifdef ELUNA
  1618.     sEluna->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank);
  1619. #endif
  1620.     FOREACH_SCRIPT(GuildScript)->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank);
  1621. }
  1622.  
  1623. void ScriptMgr::OnGuildBankEvent(Guild* guild, uint8 eventType, uint8 tabId, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
  1624. {
  1625. #ifdef ELUNA
  1626.     sEluna->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId);
  1627. #endif
  1628.     FOREACH_SCRIPT(GuildScript)->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId);
  1629. }
  1630.  
  1631. // Group
  1632. void ScriptMgr::OnGroupAddMember(Group* group, uint64 guid)
  1633. {
  1634.     ASSERT(group);
  1635. #ifdef ELUNA
  1636.     sEluna->OnAddMember(group, guid);
  1637. #endif
  1638.     FOREACH_SCRIPT(GroupScript)->OnAddMember(group, guid);
  1639. }
  1640.  
  1641. void ScriptMgr::OnGroupInviteMember(Group* group, uint64 guid)
  1642. {
  1643.     ASSERT(group);
  1644. #ifdef ELUNA
  1645.     sEluna->OnInviteMember(group, guid);
  1646. #endif
  1647.     FOREACH_SCRIPT(GroupScript)->OnInviteMember(group, guid);
  1648. }
  1649.  
  1650. void ScriptMgr::OnGroupRemoveMember(Group* group, uint64 guid, RemoveMethod method, uint64 kicker, const char* reason)
  1651. {
  1652.     ASSERT(group);
  1653. #ifdef ELUNA
  1654.     sEluna->OnRemoveMember(group, guid, method);
  1655. #endif
  1656.     FOREACH_SCRIPT(GroupScript)->OnRemoveMember(group, guid, method, kicker, reason);
  1657. }
  1658.  
  1659. void ScriptMgr::OnGroupChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLeaderGuid)
  1660. {
  1661.     ASSERT(group);
  1662. #ifdef ELUNA
  1663.     sEluna->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid);
  1664. #endif
  1665.     FOREACH_SCRIPT(GroupScript)->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid);
  1666. }
  1667.  
  1668. void ScriptMgr::OnGroupDisband(Group* group)
  1669. {
  1670.     ASSERT(group);
  1671. #ifdef ELUNA
  1672.     sEluna->OnDisband(group);
  1673. #endif
  1674.     FOREACH_SCRIPT(GroupScript)->OnDisband(group);
  1675. }
  1676.  
  1677. // Unit
  1678. void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain)
  1679. {
  1680.     FOREACH_SCRIPT(UnitScript)->OnHeal(healer, reciever, gain);
  1681. }
  1682.  
  1683. void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage)
  1684. {
  1685.     FOREACH_SCRIPT(UnitScript)->OnDamage(attacker, victim, damage);
  1686. }
  1687.  
  1688. void ScriptMgr::ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage)
  1689. {
  1690.     FOREACH_SCRIPT(UnitScript)->ModifyPeriodicDamageAurasTick(target, attacker, damage);
  1691. }
  1692.  
  1693. void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
  1694. {
  1695.     FOREACH_SCRIPT(UnitScript)->ModifyMeleeDamage(target, attacker, damage);
  1696. }
  1697.  
  1698. void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage)
  1699. {
  1700.     FOREACH_SCRIPT(UnitScript)->ModifySpellDamageTaken(target, attacker, damage);
  1701. }
  1702.  
  1703. SpellScriptLoader::SpellScriptLoader(const char* name)
  1704.     : ScriptObject(name)
  1705. {
  1706.     ScriptRegistry<SpellScriptLoader>::AddScript(this);
  1707. }
  1708.  
  1709. ServerScript::ServerScript(const char* name)
  1710.     : ScriptObject(name)
  1711. {
  1712.     ScriptRegistry<ServerScript>::AddScript(this);
  1713. }
  1714.  
  1715. WorldScript::WorldScript(const char* name)
  1716.     : ScriptObject(name)
  1717. {
  1718.     ScriptRegistry<WorldScript>::AddScript(this);
  1719. }
  1720.  
  1721. FormulaScript::FormulaScript(const char* name)
  1722.     : ScriptObject(name)
  1723. {
  1724.     ScriptRegistry<FormulaScript>::AddScript(this);
  1725. }
  1726.  
  1727. UnitScript::UnitScript(const char* name, bool addToScripts)
  1728.     : ScriptObject(name)
  1729. {
  1730.     if (addToScripts)
  1731.         ScriptRegistry<UnitScript>::AddScript(this);
  1732. }
  1733.  
  1734. WorldMapScript::WorldMapScript(const char* name, uint32 mapId)
  1735.     : ScriptObject(name), MapScript<Map>(mapId)
  1736. {
  1737.     if (GetEntry() && !GetEntry()->IsWorldMap())
  1738.         TC_LOG_ERROR("scripts", "WorldMapScript for map %u is invalid.", mapId);
  1739.  
  1740.     ScriptRegistry<WorldMapScript>::AddScript(this);
  1741. }
  1742.  
  1743. InstanceMapScript::InstanceMapScript(const char* name, uint32 mapId)
  1744.     : ScriptObject(name), MapScript<InstanceMap>(mapId)
  1745. {
  1746.     if (GetEntry() && !GetEntry()->IsDungeon())
  1747.         TC_LOG_ERROR("scripts", "InstanceMapScript for map %u is invalid.", mapId);
  1748.  
  1749.     ScriptRegistry<InstanceMapScript>::AddScript(this);
  1750. }
  1751.  
  1752. BattlegroundMapScript::BattlegroundMapScript(const char* name, uint32 mapId)
  1753.     : ScriptObject(name), MapScript<BattlegroundMap>(mapId)
  1754. {
  1755.     if (GetEntry() && !GetEntry()->IsBattleground())
  1756.         TC_LOG_ERROR("scripts", "BattlegroundMapScript for map %u is invalid.", mapId);
  1757.  
  1758.     ScriptRegistry<BattlegroundMapScript>::AddScript(this);
  1759. }
  1760.  
  1761. ItemScript::ItemScript(const char* name)
  1762.     : ScriptObject(name)
  1763. {
  1764.     ScriptRegistry<ItemScript>::AddScript(this);
  1765. }
  1766.  
  1767. CreatureScript::CreatureScript(const char* name)
  1768.     : UnitScript(name, false)
  1769. {
  1770.     ScriptRegistry<CreatureScript>::AddScript(this);
  1771. }
  1772.  
  1773. GameObjectScript::GameObjectScript(const char* name)
  1774.     : ScriptObject(name)
  1775. {
  1776.     ScriptRegistry<GameObjectScript>::AddScript(this);
  1777. }
  1778.  
  1779. AreaTriggerScript::AreaTriggerScript(const char* name)
  1780.     : ScriptObject(name)
  1781. {
  1782.     ScriptRegistry<AreaTriggerScript>::AddScript(this);
  1783. }
  1784.  
  1785. BattlegroundScript::BattlegroundScript(const char* name)
  1786.     : ScriptObject(name)
  1787. {
  1788.     ScriptRegistry<BattlegroundScript>::AddScript(this);
  1789. }
  1790.  
  1791. OutdoorPvPScript::OutdoorPvPScript(const char* name)
  1792.     : ScriptObject(name)
  1793. {
  1794.     ScriptRegistry<OutdoorPvPScript>::AddScript(this);
  1795. }
  1796.  
  1797. CommandScript::CommandScript(const char* name)
  1798.     : ScriptObject(name)
  1799. {
  1800.     ScriptRegistry<CommandScript>::AddScript(this);
  1801. }
  1802.  
  1803. WeatherScript::WeatherScript(const char* name)
  1804.     : ScriptObject(name)
  1805. {
  1806.     ScriptRegistry<WeatherScript>::AddScript(this);
  1807. }
  1808.  
  1809. AuctionHouseScript::AuctionHouseScript(const char* name)
  1810.     : ScriptObject(name)
  1811. {
  1812.     ScriptRegistry<AuctionHouseScript>::AddScript(this);
  1813. }
  1814.  
  1815. ConditionScript::ConditionScript(const char* name)
  1816.     : ScriptObject(name)
  1817. {
  1818.     ScriptRegistry<ConditionScript>::AddScript(this);
  1819. }
  1820.  
  1821. VehicleScript::VehicleScript(const char* name)
  1822.     : ScriptObject(name)
  1823. {
  1824.     ScriptRegistry<VehicleScript>::AddScript(this);
  1825. }
  1826.  
  1827. DynamicObjectScript::DynamicObjectScript(const char* name)
  1828.     : ScriptObject(name)
  1829. {
  1830.     ScriptRegistry<DynamicObjectScript>::AddScript(this);
  1831. }
  1832.  
  1833. TransportScript::TransportScript(const char* name)
  1834.     : ScriptObject(name)
  1835. {
  1836.     ScriptRegistry<TransportScript>::AddScript(this);
  1837. }
  1838.  
  1839. AchievementCriteriaScript::AchievementCriteriaScript(const char* name)
  1840.     : ScriptObject(name)
  1841. {
  1842.     ScriptRegistry<AchievementCriteriaScript>::AddScript(this);
  1843. }
  1844.  
  1845. PlayerScript::PlayerScript(const char* name)
  1846.     : UnitScript(name, false)
  1847. {
  1848.     ScriptRegistry<PlayerScript>::AddScript(this);
  1849. }
  1850.  
  1851. GuildScript::GuildScript(const char* name)
  1852.     : ScriptObject(name)
  1853. {
  1854.     ScriptRegistry<GuildScript>::AddScript(this);
  1855. }
  1856.  
  1857. GroupScript::GroupScript(const char* name)
  1858.     : ScriptObject(name)
  1859. {
  1860.     ScriptRegistry<GroupScript>::AddScript(this);
  1861. }
  1862.  
  1863. // Instantiate static members of ScriptRegistry.
  1864. template<class TScript> std::map<uint32, TScript*> ScriptRegistry<TScript>::ScriptPointerList;
  1865. template<class TScript> uint32 ScriptRegistry<TScript>::_scriptIdCounter = 0;
  1866.  
  1867. // Specialize for each script type class like so:
  1868. template class ScriptRegistry<SpellScriptLoader>;
  1869. template class ScriptRegistry<ServerScript>;
  1870. template class ScriptRegistry<WorldScript>;
  1871. template class ScriptRegistry<FormulaScript>;
  1872. template class ScriptRegistry<WorldMapScript>;
  1873. template class ScriptRegistry<InstanceMapScript>;
  1874. template class ScriptRegistry<BattlegroundMapScript>;
  1875. template class ScriptRegistry<ItemScript>;
  1876. template class ScriptRegistry<CreatureScript>;
  1877. template class ScriptRegistry<GameObjectScript>;
  1878. template class ScriptRegistry<AreaTriggerScript>;
  1879. template class ScriptRegistry<BattlegroundScript>;
  1880. template class ScriptRegistry<OutdoorPvPScript>;
  1881. template class ScriptRegistry<CommandScript>;
  1882. template class ScriptRegistry<WeatherScript>;
  1883. template class ScriptRegistry<AuctionHouseScript>;
  1884. template class ScriptRegistry<ConditionScript>;
  1885. template class ScriptRegistry<VehicleScript>;
  1886. template class ScriptRegistry<DynamicObjectScript>;
  1887. template class ScriptRegistry<TransportScript>;
  1888. template class ScriptRegistry<AchievementCriteriaScript>;
  1889. template class ScriptRegistry<PlayerScript>;
  1890. template class ScriptRegistry<GuildScript>;
  1891. template class ScriptRegistry<GroupScript>;
  1892. template class ScriptRegistry<UnitScript>;
  1893.  
  1894. // Undefine utility macros.
  1895. #undef GET_SCRIPT_RET
  1896. #undef GET_SCRIPT
  1897. #undef FOREACH_SCRIPT
  1898. #undef FOR_SCRIPTS_RET
  1899. #undef FOR_SCRIPTS
  1900. #undef SCR_REG_LST
  1901. #undef SCR_REG_ITR
  1902. #undef SCR_REG_MAP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement