aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Scripting
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2017-01-29 00:00:43 +0100
committerjoschiwald <joschiwald.trinity@gmail.com>2017-01-29 00:00:43 +0100
commit6ab3877c91c9440b81cf1c7c66a1275ee04ea26a (patch)
tree9930d19512eef247d1c0a23284caa446ceef21c8 /src/server/game/Scripting
parent5818dd364ca6a8b0cb068710291adf26b571aa23 (diff)
Core/Entities: Basic AreaTrigger System (#18035)
* Implemented AreaTrigger Templates * Implemented AreaTrigger Splines * Implemented SPELL_AURA_AREA_TRIGGER * and many more
Diffstat (limited to 'src/server/game/Scripting')
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp107
-rw-r--r--src/server/game/Scripting/ScriptMgr.h44
2 files changed, 151 insertions, 0 deletions
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
@@ -97,6 +97,10 @@ struct is_script_database_bound<AchievementCriteriaScript>
: std::true_type { };
template<>
+struct is_script_database_bound<AreaTriggerEntityScript>
+ : std::true_type { };
+
+template<>
struct is_script_database_bound<SceneScript>
: std::true_type { };
@@ -662,6 +666,35 @@ 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>
@@ -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<GroupScript>::Instance()->AddScript(this);
}
+AreaTriggerEntityScript::AreaTriggerEntityScript(const char* name)
+ : ScriptObject(name)
+{
+ ScriptRegistry<AreaTriggerEntityScript>::Instance()->AddScript(this);
+}
+
// Specialize for each script type class like so:
template class TC_GAME_API ScriptRegistry<SpellScriptLoader>;
template class TC_GAME_API ScriptRegistry<ServerScript>;
@@ -2573,4 +2679,5 @@ template class TC_GAME_API ScriptRegistry<GuildScript>;
template class TC_GAME_API ScriptRegistry<GroupScript>;
template class TC_GAME_API ScriptRegistry<UnitScript>;
template class TC_GAME_API ScriptRegistry<AccountScript>;
+template class TC_GAME_API ScriptRegistry<AreaTriggerEntityScript>;
template class TC_GAME_API ScriptRegistry<SceneScript>;
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index 6c0b660fb0b..76a5f663f82 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -28,6 +28,7 @@
#include "Weather.h"
class AccountMgr;
+class AreaTrigger;
class AuctionHouseObject;
class Aura;
class AuraScript;
@@ -836,6 +837,38 @@ class TC_GAME_API GroupScript : public ScriptObject
virtual void OnDisband(Group* /*group*/) { }
};
+class TC_GAME_API AreaTriggerEntityScript : public ScriptObject
+{
+ protected:
+
+ AreaTriggerEntityScript(const char* name);
+
+ public:
+ // Called when the AreaTrigger has just been initialized, just before added to map
+ virtual void OnInitialize(AreaTrigger* /*areaTrigger*/) { }
+
+ // Called when the AreaTrigger has just been created
+ virtual void OnCreate(AreaTrigger* /*areaTrigger*/) { }
+
+ // Called on each AreaTrigger update
+ virtual void OnUpdate(AreaTrigger* /*areaTrigger*/, uint32 /*diff*/) { }
+
+ // Called when the AreaTrigger reach splineIndex
+ virtual void OnSplineIndexReached(AreaTrigger* /*areaTrigger*/, int /*splineIndex*/) { }
+
+ // Called when the AreaTrigger reach its destination
+ virtual void OnDestinationReached(AreaTrigger* /*areaTrigger*/) { }
+
+ // Called when an unit enter the AreaTrigger
+ virtual void OnUnitEnter(AreaTrigger* /*areaTrigger*/, Unit* /*unit*/) { }
+
+ // Called when an unit exit the AreaTrigger, or when the AreaTrigger is removed
+ virtual void OnUnitExit(AreaTrigger* /*areaTrigger*/, Unit* /*unit*/) { }
+
+ // Called when the AreaTrigger is removed
+ virtual void OnRemove(AreaTrigger* /*areaTrigger*/) { }
+};
+
class TC_GAME_API SceneScript : public ScriptObject
{
protected:
@@ -1133,6 +1166,17 @@ class TC_GAME_API ScriptMgr
void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage);
void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage);
+ public: /* AreaTriggerEntityScript */
+
+ void OnAreaTriggerEntityInitialize(AreaTrigger* areaTrigger);
+ void OnAreaTriggerEntityCreate(AreaTrigger* areaTrigger);
+ void OnAreaTriggerEntityUpdate(AreaTrigger* areaTrigger, uint32 diff);
+ void OnAreaTriggerEntitySplineIndexReached(AreaTrigger* areaTrigger, int splineIndex);
+ void OnAreaTriggerEntityDestinationReached(AreaTrigger* areaTrigger);
+ void OnAreaTriggerEntityUnitEnter(AreaTrigger* areaTrigger, Unit* unit);
+ void OnAreaTriggerEntityUnitExit(AreaTrigger* areaTrigger, Unit* unit);
+ void OnAreaTriggerEntityRemove(AreaTrigger* areaTrigger);
+
public: /* SceneScript */
void OnSceneStart(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate);
void OnSceneTrigger(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate, std::string const& triggerName);