From 6ab3877c91c9440b81cf1c7c66a1275ee04ea26a Mon Sep 17 00:00:00 2001 From: Traesh Date: Sun, 29 Jan 2017 00:00:43 +0100 Subject: Core/Entities: Basic AreaTrigger System (#18035) * Implemented AreaTrigger Templates * Implemented AreaTrigger Splines * Implemented SPELL_AURA_AREA_TRIGGER * and many more --- src/server/game/Scripting/ScriptMgr.cpp | 107 ++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) (limited to 'src/server/game/Scripting/ScriptMgr.cpp') diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 2e48d791525..7c94aa3ed55 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -96,6 +96,10 @@ template<> struct is_script_database_bound : std::true_type { }; +template<> +struct is_script_database_bound + : std::true_type { }; + template<> struct is_script_database_bound : std::true_type { }; @@ -662,6 +666,35 @@ private: bool swapped; }; +/// This hook is responsible for swapping AreaTriggerEntityScript's +template +class ScriptRegistrySwapHooks + : public ScriptRegistrySwapHookBase +{ +public: + ScriptRegistrySwapHooks() : swapped(false) { } + + void BeforeReleaseContext(std::string const& context) final override + { + auto const bounds = static_cast(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 class ScriptRegistrySwapHooks @@ -2337,6 +2370,73 @@ 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) { @@ -2546,6 +2646,12 @@ GroupScript::GroupScript(const char* name) ScriptRegistry::Instance()->AddScript(this); } +AreaTriggerEntityScript::AreaTriggerEntityScript(const char* name) + : ScriptObject(name) +{ + ScriptRegistry::Instance()->AddScript(this); +} + // Specialize for each script type class like so: template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; @@ -2573,4 +2679,5 @@ template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; +template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; -- cgit v1.2.3