diff options
author | Traesh <traesh@farahlon.com> | 2017-03-21 18:14:23 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-03-21 18:14:23 +0100 |
commit | 9cc5273cd27069d7abb8538eca20f429801b6f00 (patch) | |
tree | 2325cfc80cb3c6b9ae4ae907a2abc284d61bb0fa /src/server/game/Scripting/ScriptMgr.cpp | |
parent | 024ae15681736db1adea3ac82f666d725d931e6c (diff) |
Core/AreaTriggers: Areatrigger rework script system + fix priest angelic feather
Closes #19171
Diffstat (limited to 'src/server/game/Scripting/ScriptMgr.cpp')
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 155 |
1 files changed, 54 insertions, 101 deletions
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 4bb870e9e0a..9f912d95177 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -37,6 +37,7 @@ #include "MapManager.h" #include "LFGScripts.h" #include "InstanceScript.h" +#include "AreaTriggerAI.h" // Trait which indicates whether this script type // must be assigned in the database. @@ -332,9 +333,9 @@ public: } }; -/// This hook is responsible for swapping Creature and GameObject AI's +/// This hook is responsible for swapping Creature, GameObject and AreaTrigger AI's template<typename ObjectType, typename ScriptType, typename Base> -class CreatureGameObjectScriptRegistrySwapHooks +class CreatureGameObjectAreaTriggerScriptRegistrySwapHooks : public ScriptRegistrySwapHookBase { template<typename W> @@ -413,6 +414,20 @@ class CreatureGameObjectScriptRegistrySwapHooks "The AI should be null here!"); } + // Hook which is called before a areatrigger is swapped + static void UnloadResetScript(AreaTrigger* at) + { + at->AI()->OnRemove(); + } + + static void UnloadDestroyScript(AreaTrigger* at) + { + at->AI_Destroy(); + + ASSERT(!at->AI(), + "The AI should be null here!"); + } + // Hook which is called after a creature was swapped static void LoadInitializeScript(Creature* creature) { @@ -455,6 +470,20 @@ class CreatureGameObjectScriptRegistrySwapHooks gameobject->AI()->Reset(); } + // Hook which is called after a areatrigger was swapped + static void LoadInitializeScript(AreaTrigger* at) + { + ASSERT(!at->AI(), + "The AI should be null here!"); + + at->AI_Initialize(); + } + + static void LoadResetScript(AreaTrigger* at) + { + at->AI()->OnCreate(); + } + static Creature* GetEntityFromMap(std::common_type<Creature>, Map* map, ObjectGuid const& guid) { return map->GetCreature(guid); @@ -465,6 +494,11 @@ class CreatureGameObjectScriptRegistrySwapHooks return map->GetGameObject(guid); } + static AreaTrigger* GetEntityFromMap(std::common_type<AreaTrigger>, Map* map, ObjectGuid const& guid) + { + return map->GetAreaTrigger(guid); + } + template<typename T> static void VisitObjectsToSwapOnMap(Map* map, std::unordered_set<uint32> const& idsToRemove, T visitor) { @@ -583,17 +617,24 @@ private: // This hook is responsible for swapping CreatureAI's template<typename Base> class ScriptRegistrySwapHooks<CreatureScript, Base> - : public CreatureGameObjectScriptRegistrySwapHooks< + : public CreatureGameObjectAreaTriggerScriptRegistrySwapHooks< Creature, CreatureScript, Base > { }; // This hook is responsible for swapping GameObjectAI's template<typename Base> class ScriptRegistrySwapHooks<GameObjectScript, Base> - : public CreatureGameObjectScriptRegistrySwapHooks< + : public CreatureGameObjectAreaTriggerScriptRegistrySwapHooks< GameObject, GameObjectScript, Base > { }; +// This hook is responsible for swapping AreaTriggerAI's +template<typename Base> +class ScriptRegistrySwapHooks<AreaTriggerEntityScript, Base> + : public CreatureGameObjectAreaTriggerScriptRegistrySwapHooks< + AreaTrigger, AreaTriggerEntityScript, Base + > { }; + /// This hook is responsible for swapping BattlegroundScript's template<typename Base> class ScriptRegistrySwapHooks<BattlegroundScript, Base> @@ -666,35 +707,6 @@ private: bool swapped; }; -/// This hook is responsible for swapping AreaTriggerEntityScript's -template<typename Base> -class ScriptRegistrySwapHooks<AreaTriggerEntityScript, Base> - : public ScriptRegistrySwapHookBase -{ -public: - ScriptRegistrySwapHooks() : swapped(false) { } - - void BeforeReleaseContext(std::string const& context) final override - { - auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context); - if (bounds.first != bounds.second) - swapped = true; - } - - void BeforeSwapContext(bool /*initialize*/) override - { - swapped = false; - } - - void BeforeUnload() final override - { - ASSERT(!swapped); - } - -private: - bool swapped; -}; - /// This hook is responsible for swapping SceneScript's template<typename Base> class ScriptRegistrySwapHooks<SceneScript, Base> @@ -771,7 +783,7 @@ class SpecializedScriptRegistry<ScriptType, true> friend class ScriptRegistrySwapHooks; template<typename, typename, typename> - friend class CreatureGameObjectScriptRegistrySwapHooks; + friend class CreatureGameObjectAreaTriggerScriptRegistrySwapHooks; public: SpecializedScriptRegistry() { } @@ -1734,6 +1746,14 @@ GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* gameobject) return tmpscript->GetAI(gameobject); } +AreaTriggerAI* ScriptMgr::GetAreaTriggerAI(AreaTrigger* areatrigger) +{ + ASSERT(areatrigger); + + GET_SCRIPT_RET(AreaTriggerEntityScript, areatrigger->GetScriptId(), tmpscript, NULL); + return tmpscript->GetAI(areatrigger); +} + void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff) { ASSERT(creature); @@ -2382,73 +2402,6 @@ void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& dama FOREACH_SCRIPT(PlayerScript)->ModifySpellDamageTaken(target, attacker, damage); } -// AreaTriggerEntityScript -void ScriptMgr::OnAreaTriggerEntityInitialize(AreaTrigger* areaTrigger) -{ - ASSERT(areaTrigger); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnInitialize(areaTrigger); -} - -void ScriptMgr::OnAreaTriggerEntityCreate(AreaTrigger* areaTrigger) -{ - ASSERT(areaTrigger); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnCreate(areaTrigger); -} - -void ScriptMgr::OnAreaTriggerEntityUpdate(AreaTrigger* areaTrigger, uint32 diff) -{ - ASSERT(areaTrigger); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnUpdate(areaTrigger, diff); -} - -void ScriptMgr::OnAreaTriggerEntitySplineIndexReached(AreaTrigger* areaTrigger, int splineIndex) -{ - ASSERT(areaTrigger); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnSplineIndexReached(areaTrigger, splineIndex); -} - -void ScriptMgr::OnAreaTriggerEntityDestinationReached(AreaTrigger* areaTrigger) -{ - ASSERT(areaTrigger); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnDestinationReached(areaTrigger); -} - -void ScriptMgr::OnAreaTriggerEntityUnitEnter(AreaTrigger* areaTrigger, Unit* unit) -{ - ASSERT(areaTrigger); - ASSERT(unit); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnUnitEnter(areaTrigger, unit); -} - -void ScriptMgr::OnAreaTriggerEntityUnitExit(AreaTrigger* areaTrigger, Unit* unit) -{ - ASSERT(areaTrigger); - ASSERT(unit); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnUnitExit(areaTrigger, unit); -} - -void ScriptMgr::OnAreaTriggerEntityRemove(AreaTrigger* areaTrigger) -{ - ASSERT(areaTrigger); - - GET_SCRIPT(AreaTriggerEntityScript, areaTrigger->GetScriptId(), tmpscript); - tmpscript->OnRemove(areaTrigger); -} - // Scene void ScriptMgr::OnSceneStart(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate) { |