From d35c6b602234dfc313066a2de9db74eb97798c75 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 2 Nov 2021 15:55:50 -0300 Subject: [PATCH] =?UTF-8?q?feat(Core/Scripts):=20implemented=20a=20guid=20?= =?UTF-8?q?map=20in=20InstanceScript,=20this=20wa=E2=80=A6=20(#8781)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: joschiwald --- src/server/game/Instances/InstanceScript.cpp | 109 ++++++++++++++++++ src/server/game/Instances/InstanceScript.h | 26 +++++ .../AzjolNerub/instance_azjol_nerub.cpp | 23 ++-- 3 files changed, 146 insertions(+), 12 deletions(-) diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index da671a75a..cc5e19e3e 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -46,6 +46,57 @@ void InstanceScript::SaveToDB() CharacterDatabase.Execute(stmt); } +void InstanceScript::OnCreatureCreate(Creature* creature) +{ + AddObject(creature, true); + AddMinion(creature, true); +} + +void InstanceScript::OnCreatureRemove(Creature* creature) +{ + AddObject(creature, false); + AddMinion(creature, false); +} + +void InstanceScript::OnGameObjectCreate(GameObject* go) +{ + AddObject(go, true); + AddDoor(go, true); +} + +void InstanceScript::OnGameObjectRemove(GameObject* go) +{ + AddObject(go, false); + AddDoor(go, false); +} + +ObjectGuid InstanceScript::GetObjectGuid(uint32 type) const +{ + ObjectGuidMap::const_iterator i = _objectGuids.find(type); + + if (i != _objectGuids.end()) + { + return i->second; + } + + return ObjectGuid::Empty; +} + +ObjectGuid InstanceScript::GetGuidData(uint32 type) const +{ + return GetObjectGuid(type); +} + +Creature* InstanceScript::GetCreature(uint32 type) +{ + return instance->GetCreature(GetObjectGuid(type)); +} + +GameObject* InstanceScript::GetGameObject(uint32 type) +{ + return instance->GetGameObject(GetObjectGuid(type)); +} + void InstanceScript::HandleGameObject(ObjectGuid GUID, bool open, GameObject* go) { if (!go) @@ -91,6 +142,30 @@ void InstanceScript::LoadDoorData(const DoorData* data) LOG_DEBUG("scripts.ai", "InstanceScript::LoadDoorData: " UI64FMTD " doors loaded.", uint64(doors.size())); } +void InstanceScript::LoadObjectData(ObjectData const* creatureData, ObjectData const* gameObjectData) +{ + if (creatureData) + { + LoadObjectData(creatureData, _creatureInfo); + } + + if (gameObjectData) + { + LoadObjectData(gameObjectData, _gameObjectInfo); + } + + LOG_ERROR("scripts", "InstanceScript::LoadObjectData: " SZFMTD " objects loaded.", _creatureInfo.size() + _gameObjectInfo.size()); +} + +void InstanceScript::LoadObjectData(ObjectData const* data, ObjectInfoMap& objectInfo) +{ + while (data->entry) + { + objectInfo[data->entry] = data->type; + ++data; + } +} + void InstanceScript::UpdateMinionState(Creature* minion, EncounterState state) { switch (state) @@ -142,6 +217,40 @@ void InstanceScript::UpdateDoorState(GameObject* door) door->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); } +void InstanceScript::AddObject(Creature* obj, bool add) +{ + ObjectInfoMap::const_iterator j = _creatureInfo.find(obj->GetEntry()); + if (j != _creatureInfo.end()) + { + AddObject(obj, j->second, add); + } +} + +void InstanceScript::AddObject(GameObject* obj, bool add) +{ + ObjectInfoMap::const_iterator j = _gameObjectInfo.find(obj->GetEntry()); + if (j != _gameObjectInfo.end()) + { + AddObject(obj, j->second, add); + } +} + +void InstanceScript::AddObject(WorldObject* obj, uint32 type, bool add) +{ + if (add) + { + _objectGuids[type] = obj->GetGUID(); + } + else + { + ObjectGuidMap::iterator i = _objectGuids.find(type); + if (i != _objectGuids.end() && i->second == obj->GetGUID()) + { + _objectGuids.erase(i); + } + } +} + void InstanceScript::AddDoor(GameObject* door, bool add) { DoorInfoMapBounds range = doors.equal_range(door->GetEntry()); diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index efde26c98..859bb4a4f 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -134,6 +134,8 @@ typedef std::multimap DoorInfoMap; typedef std::pair DoorInfoMapBounds; typedef std::map MinionInfoMap; +typedef std::map ObjectGuidMap; +typedef std::map ObjectInfoMap; class InstanceScript : public ZoneScript { @@ -164,6 +166,20 @@ public: //This is to prevent players from entering during boss encounters. virtual bool IsEncounterInProgress() const; + // Called when a creature/gameobject is added to map or removed from map. + // Insert/Remove objectguid to dynamic guid store + void OnCreatureCreate(Creature* creature) override; + void OnCreatureRemove(Creature* creature) override; + + void OnGameObjectCreate(GameObject* go) override; + void OnGameObjectRemove(GameObject* go) override; + + ObjectGuid GetObjectGuid(uint32 type) const; + ObjectGuid GetGuidData(uint32 type) const override; + + Creature* GetCreature(uint32 type); + GameObject* GetGameObject(uint32 type); + //Called when a player successfully enters the instance. virtual void OnPlayerEnter(Player* /*player*/) {} @@ -232,6 +248,11 @@ protected: void SetBossNumber(uint32 number) { bosses.resize(number); } void LoadDoorData(DoorData const* data); void LoadMinionData(MinionData const* data); + void LoadObjectData(ObjectData const* creatureData, ObjectData const* gameObjectData); + + void AddObject(Creature* obj, bool add); + void AddObject(GameObject* obj, bool add); + void AddObject(WorldObject* obj, uint32 type, bool add); void AddDoor(GameObject* door, bool add); void AddMinion(Creature* minion, bool add); @@ -242,9 +263,14 @@ protected: std::string LoadBossState(char const* data); std::string GetBossSaveData(); private: + static void LoadObjectData(ObjectData const* creatureData, ObjectInfoMap& objectInfo); + std::vector bosses; DoorInfoMap doors; MinionInfoMap minions; + ObjectInfoMap _creatureInfo; + ObjectInfoMap _gameObjectInfo; + ObjectGuidMap _objectGuids; uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets }; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 7d3aac85a..61cd72c98 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -28,6 +28,12 @@ DoorData const doorData[] = { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } }; +ObjectData const creatureData[] = +{ + { NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR_THE_GATEWATCHER_EVENT }, + { NPC_HADRONOX, DATA_HADRONOX_EVENT } +}; + class instance_azjol_nerub : public InstanceMapScript { public: @@ -39,30 +45,27 @@ public: { SetBossNumber(MAX_ENCOUNTERS); LoadDoorData(doorData); + LoadObjectData(creatureData, nullptr); }; void OnCreatureCreate(Creature* creature) override { switch (creature->GetEntry()) { - case NPC_KRIKTHIR_THE_GATEWATCHER: - _krikthirGUID = creature->GetGUID(); - break; - case NPC_HADRONOX: - _hadronoxGUID = creature->GetGUID(); - break; case NPC_SKITTERING_SWARMER: case NPC_SKITTERING_INFECTIOR: - if (Creature* krikthir = instance->GetCreature(_krikthirGUID)) + if (Creature* krikthir = GetCreature((DATA_KRIKTHIR_THE_GATEWATCHER_EVENT))) krikthir->AI()->JustSummoned(creature); break; case NPC_ANUB_AR_CHAMPION: case NPC_ANUB_AR_NECROMANCER: case NPC_ANUB_AR_CRYPTFIEND: - if (Creature* hadronox = instance->GetCreature(_hadronoxGUID)) + if (Creature* hadronox = GetCreature(DATA_HADRONOX_EVENT)) hadronox->AI()->JustSummoned(creature); break; } + + InstanceScript::OnCreatureCreate(creature); } void OnGameObjectCreate(GameObject* go) override @@ -123,10 +126,6 @@ public: } } } - - private: - ObjectGuid _krikthirGUID; - ObjectGuid _hadronoxGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override