diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2017-09-15 03:53:02 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-08-29 00:41:22 +0200 |
| commit | fe938b99f843df3f6c120695db38f327bd55ea94 (patch) | |
| tree | b6e47409a22c4262ac6657272842c1205f986f0c /src/server/game | |
| parent | 77d13a7b97d4b9d243ce753ca02ae94d9e10b17e (diff) | |
Core/Scripts: Implemented OnlyOnceAreaTriggerScript (#20288)
(cherry picked from commit 971ed856a49dc56ea33d9a0779b1386eea5cd3ca)
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 2 | ||||
| -rw-r--r-- | src/server/game/Instances/InstanceScript.h | 6 | ||||
| -rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 18 | ||||
| -rw-r--r-- | src/server/game/Scripting/ScriptMgr.h | 13 |
5 files changed, 38 insertions, 3 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 696d8a05555..dd2fb6486f5 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -967,7 +967,7 @@ bool WorldObject::IsInWorldPvpZone() const } } -InstanceScript* WorldObject::GetInstanceScript() +InstanceScript* WorldObject::GetInstanceScript() const { Map* map = GetMap(); return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceScript() : nullptr; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 865d4095bff..9ba475fce44 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -425,7 +425,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const { zoneid = m_zoneId, areaid = m_areaId; } bool IsInWorldPvpZone() const; - InstanceScript* GetInstanceScript(); + InstanceScript* GetInstanceScript() const; std::string const& GetName() const { return m_name; } void SetName(std::string newname) { m_name = std::move(newname); } diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 06324f553a9..823996f2481 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -266,6 +266,11 @@ class TC_GAME_API InstanceScript : public ZoneScript // Get's the current entrance id uint32 GetEntranceLocation() const { return _temporaryEntranceId ? _temporaryEntranceId : _entranceId; } + // Only used by areatriggers that inherit from OnlyOnceAreaTriggerScript + void MarkAreaTriggerDone(uint32 id) { _activatedAreaTriggers.insert(id); } + void ResetAreaTriggerDone(uint32 id) { _activatedAreaTriggers.erase(id); } + bool IsAreaTriggerDone(uint32 id) const { return _activatedAreaTriggers.find(id) != _activatedAreaTriggers.end(); } + void SendEncounterUnit(uint32 type, Unit* unit = nullptr, uint8 priority = 0); void SendEncounterStart(uint32 inCombatResCount = 0, uint32 maxInCombatResCount = 0, uint32 inCombatResChargeRecovery = 0, uint32 nextCombatResChargeTime = 0); void SendEncounterEnd(); @@ -333,6 +338,7 @@ class TC_GAME_API InstanceScript : public ZoneScript ObjectGuidMap _objectGuids; uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets std::vector<InstanceSpawnGroupInfo> const* const _instanceSpawnGroups; + std::unordered_set<uint32> _activatedAreaTriggers; uint32 _entranceId; uint32 _temporaryEntranceId; uint32 _combatResurrectionTimer; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index f6f26e457f2..b70994a3ed2 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -26,6 +26,7 @@ #include "Errors.h" #include "GameObject.h" #include "GossipDef.h" +#include "InstanceScript.h" #include "Item.h" #include "LFGScripts.h" #include "Log.h" @@ -2353,7 +2354,22 @@ AreaTriggerScript::AreaTriggerScript(const char* name) ScriptRegistry<AreaTriggerScript>::Instance()->AddScript(this); } -BattlegroundScript::BattlegroundScript(const char* name) +bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered) +{ + uint32 const triggerId = trigger->ID; + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (instance->IsAreaTriggerDone(triggerId)) + return true; + else + instance->MarkAreaTriggerDone(triggerId); + } + return _OnTrigger(player, trigger, entered); +} +void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(InstanceScript* script, uint32 triggerId) { script->ResetAreaTriggerDone(triggerId); } +void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger) { if (InstanceScript* instance = player->GetInstanceScript()) ResetAreaTriggerDone(instance, trigger->ID); } + +BattlegroundScript::BattlegroundScript(char const* name) : ScriptObject(name) { ScriptRegistry<BattlegroundScript>::Instance()->AddScript(this); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 79925f338ce..375b75264b2 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -451,6 +451,19 @@ class TC_GAME_API AreaTriggerScript : public ScriptObject virtual bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/, bool /*entered*/) { return false; } }; +class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript +{ + using AreaTriggerScript::AreaTriggerScript; + + public: + bool OnTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered) override; + + protected: + virtual bool _OnTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered) = 0; + void ResetAreaTriggerDone(InstanceScript* instance, uint32 triggerId); + void ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger); +}; + class TC_GAME_API BattlegroundScript : public ScriptObject { protected: |
