mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 15:40:45 +01:00
Core/Entities: Basic AreaTrigger System (#18035)
* Implemented AreaTrigger Templates * Implemented AreaTrigger Splines * Implemented SPELL_AURA_AREA_TRIGGER * and many more
This commit is contained in:
@@ -96,6 +96,10 @@ template<>
|
||||
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>;
|
||||
|
||||
Reference in New Issue
Block a user