aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.h2
-rw-r--r--src/server/game/Instances/InstanceScript.h6
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp15
-rw-r--r--src/server/game/Scripting/ScriptMgr.h13
5 files changed, 36 insertions, 2 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index c87282efa36..9e2546f2df7 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1105,7 +1105,7 @@ void WorldObject::RemoveFromWorld()
Object::RemoveFromWorld();
}
-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 2e0bef23916..b6cee547126 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -291,7 +291,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
uint32 GetAreaId() const { return m_areaId; }
void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const { zoneid = m_zoneId, areaid = m_areaId; }
- InstanceScript* GetInstanceScript();
+ InstanceScript* GetInstanceScript() const;
std::string const& GetName() const { return m_name; }
void SetName(std::string const& newname) { m_name = newname; }
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 36fea3990eb..d9802aa548b 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -253,6 +253,11 @@ class TC_GAME_API InstanceScript : public ZoneScript
uint32 GetEncounterCount() const { return bosses.size(); }
+ // 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(); }
+
protected:
void SetHeaders(std::string const& dataHeaders);
void SetBossNumber(uint32 number) { bosses.resize(number); }
@@ -300,6 +305,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;
#ifdef TRINITY_API_USE_DYNAMIC_LINKING
// Strong reference to the associated script module
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 7d678656079..2a26261d9f1 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -2229,6 +2229,21 @@ AreaTriggerScript::AreaTriggerScript(char const* name)
ScriptRegistry<AreaTriggerScript>::Instance()->AddScript(this);
}
+bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const* trigger)
+{
+ uint32 const triggerId = trigger->id;
+ if (InstanceScript* instance = player->GetInstanceScript())
+ {
+ if (instance->IsAreaTriggerDone(triggerId))
+ return true;
+ else
+ instance->MarkAreaTriggerDone(triggerId);
+ }
+ return _OnTrigger(player, trigger);
+}
+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)
{
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index 65c5be6be37..d801aba496d 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -448,6 +448,19 @@ class TC_GAME_API AreaTriggerScript : public ScriptObject
virtual bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) { return false; }
};
+class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript
+{
+ using AreaTriggerScript::AreaTriggerScript;
+
+ public:
+ bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) override;
+
+ protected:
+ virtual bool _OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) = 0;
+ void ResetAreaTriggerDone(InstanceScript* /*instance*/, uint32 /*triggerId*/);
+ void ResetAreaTriggerDone(Player const* /*player*/, AreaTriggerEntry const* /*trigger*/);
+};
+
class TC_GAME_API BattlegroundScript : public ScriptObject
{
protected: