mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-25 14:46:24 +00:00
feat(Core/Scripting): implement OnlyOnceAreaTrigger & Zul'Gurub's in… (#8850)
Co-authored-by: Treeston <treeston.mmoc@gmail.com>
This commit is contained in:
@@ -1101,7 +1101,7 @@ void WorldObject::RemoveFromWorld()
|
||||
Object::RemoveFromWorld();
|
||||
}
|
||||
|
||||
InstanceScript* WorldObject::GetInstanceScript()
|
||||
InstanceScript* WorldObject::GetInstanceScript() const
|
||||
{
|
||||
Map* map = GetMap();
|
||||
return map->IsDungeon() ? map->ToInstanceMap()->GetInstanceScript() : nullptr;
|
||||
|
||||
@@ -853,7 +853,7 @@ public:
|
||||
[[nodiscard]] bool IsOutdoors() const;
|
||||
LiquidData const& GetLiquidData() const;
|
||||
|
||||
InstanceScript* GetInstanceScript();
|
||||
InstanceScript* GetInstanceScript() const;
|
||||
|
||||
[[nodiscard]] std::string const& GetName() const { return m_name; }
|
||||
void SetName(std::string const& newname) { m_name = newname; }
|
||||
|
||||
@@ -242,6 +242,11 @@ public:
|
||||
|
||||
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(); }
|
||||
|
||||
// Allows to perform particular actions
|
||||
virtual void DoAction(int32 /*action*/) {}
|
||||
protected:
|
||||
@@ -272,6 +277,7 @@ private:
|
||||
ObjectInfoMap _gameObjectInfo;
|
||||
ObjectGuidMap _objectGuids;
|
||||
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
|
||||
std::unordered_set<uint32> _activatedAreaTriggers;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "DatabaseEnv.h"
|
||||
#include "DBCStores.h"
|
||||
#include "GossipDef.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "OutdoorPvPMgr.h"
|
||||
#include "Player.h"
|
||||
@@ -3239,6 +3240,36 @@ AreaTriggerScript::AreaTriggerScript(const char* name)
|
||||
ScriptRegistry<AreaTriggerScript>::AddScript(this);
|
||||
}
|
||||
|
||||
bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
uint32 const triggerId = trigger->entry;
|
||||
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, AreaTrigger const* trigger)
|
||||
{
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
{
|
||||
ResetAreaTriggerDone(instance, trigger->entry);
|
||||
}
|
||||
}
|
||||
|
||||
BattlegroundScript::BattlegroundScript(const char* name)
|
||||
: ScriptObject(name)
|
||||
{
|
||||
|
||||
@@ -552,6 +552,19 @@ public:
|
||||
[[nodiscard]] virtual bool OnTrigger(Player* /*player*/, AreaTrigger const* /*trigger*/) { return false; }
|
||||
};
|
||||
|
||||
class OnlyOnceAreaTriggerScript : public AreaTriggerScript
|
||||
{
|
||||
using AreaTriggerScript::AreaTriggerScript;
|
||||
|
||||
public:
|
||||
[[nodiscard]] bool OnTrigger(Player* /*player*/, AreaTrigger const* /*trigger*/) override;
|
||||
|
||||
protected:
|
||||
virtual bool _OnTrigger(Player* /*player*/, AreaTrigger const* /*trigger*/) = 0;
|
||||
void ResetAreaTriggerDone(InstanceScript* /*instance*/, uint32 /*triggerId*/);
|
||||
void ResetAreaTriggerDone(Player const* /*player*/, AreaTrigger const* /*trigger*/);
|
||||
};
|
||||
|
||||
class BattlegroundScript : public ScriptObject
|
||||
{
|
||||
protected:
|
||||
|
||||
Reference in New Issue
Block a user