aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2017-09-15 03:53:02 +0200
committerShauren <shauren.trinity@gmail.com>2020-08-29 00:41:22 +0200
commitfe938b99f843df3f6c120695db38f327bd55ea94 (patch)
treeb6e47409a22c4262ac6657272842c1205f986f0c /src/server/game
parent77d13a7b97d4b9d243ce753ca02ae94d9e10b17e (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.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.cpp18
-rw-r--r--src/server/game/Scripting/ScriptMgr.h13
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: