diff options
author | joschiwald <joschiwald.trinity@gmail.com> | 2014-09-18 00:25:05 +0200 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2014-09-18 00:25:05 +0200 |
commit | b08dcb1d99fe91b7dc1cb3168a34d722f9ea5505 (patch) | |
tree | ccc860cd179424f129c1ba93904d1a4fd6a399de /src | |
parent | 053beae172fe57f6495f8c6112063ea80deb0d66 (diff) |
Core/Scripts: implemented a guid map in InstanceScript, this way you can easier store guids and access its objects
Diffstat (limited to 'src')
7 files changed, 146 insertions, 98 deletions
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 932c55559ad..88ee153423f 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -52,6 +52,43 @@ bool InstanceScript::IsEncounterInProgress() const return false; } +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); +} + void InstanceScript::SetHeaders(std::string const& dataHeaders) { for (char header : dataHeaders) @@ -83,6 +120,27 @@ void InstanceScript::LoadDoorData(const DoorData* data) TC_LOG_DEBUG("scripts", "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); + + TC_LOG_ERROR("scripts", "InstanceScript::LoadObjectData: " SZFMTD " objects loaded.", _creatureInfo.size() + _gameObjectInfo.size()); +} + +void InstanceScript::LoadObjectData(ObjectData const* data, ObjectInfoMap& objectInfo) +{ + while (data->entry) + { + ASSERT(objectInfo.find(data->entry) == objectInfo.end()); + objectInfo[data->entry] = data->type; + ++data; + } +} + void InstanceScript::UpdateMinionState(Creature* minion, EncounterState state) { switch (state) @@ -133,6 +191,32 @@ 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 81c6c588297..24df397bf46 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -96,6 +96,12 @@ struct MinionData uint32 entry, bossId; }; +struct ObjectData +{ + uint32 entry; + uint32 type; +}; + struct BossInfo { BossInfo() : state(TO_BE_DECIDED) { } @@ -124,6 +130,8 @@ typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap; typedef std::pair<DoorInfoMap::const_iterator, DoorInfoMap::const_iterator> DoorInfoMapBounds; typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap; +typedef std::map<uint32 /*type*/, ObjectGuid /*guid*/> ObjectGuidMap; +typedef std::map<uint32 /*entry*/, uint32 /*type*/> ObjectInfoMap; class InstanceScript : public ZoneScript { @@ -151,6 +159,26 @@ class InstanceScript : public ZoneScript // 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 + virtual void OnCreatureCreate(Creature* creature) override; + virtual void OnCreatureRemove(Creature* creature) override; + + virtual void OnGameObjectCreate(GameObject* go) override; + virtual void OnGameObjectRemove(GameObject* go) override; + + ObjectGuid GetObjectGuid(uint32 type) const; + virtual ObjectGuid GetGuidData(uint32 type) const override; + + inline Creature* GetCreature(uint32 type) + { + return ObjectAccessor::GetObjectInMap<Creature>(GetObjectGuid(type), instance, nullptr); + } + inline GameObject* GetGameObject(uint32 type) + { + return ObjectAccessor::GetObjectInMap<GameObject>(GetObjectGuid(type), instance, nullptr); + } + // Called when a player successfully enters the instance. virtual void OnPlayerEnter(Player* /*player*/) { } @@ -196,7 +224,7 @@ class InstanceScript : public ZoneScript virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); // Checks boss requirements (one boss required to kill other) - virtual bool CheckRequiredBosses(uint32 /*bossId*/, Player const* /*player*/ = NULL) const { return true; } + virtual bool CheckRequiredBosses(uint32 /*bossId*/, Player const* /*player*/ = nullptr) const { return true; } // Checks encounter state at kill/spellcast void UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit* source); @@ -216,6 +244,11 @@ class InstanceScript : public ZoneScript 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); @@ -232,10 +265,15 @@ class InstanceScript : public ZoneScript virtual void WriteSaveDataMore(std::ostringstream& /*data*/) { } private: + static void LoadObjectData(ObjectData const* creatureData, ObjectInfoMap& objectInfo); + std::vector<char> headers; std::vector<BossInfo> 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/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 0982ea20f00..bdb060815d2 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -441,7 +441,7 @@ class npc_watcher_gashra : public CreatureScript void JustDied(Unit* /*killer*/) override { - Creature* krikthir = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_KRIKTHIR_THE_GATEWATCHER)); + Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR_THE_GATEWATCHER); if (krikthir && krikthir->IsAlive()) krikthir->AI()->Talk(SAY_PREFIGHT); } @@ -514,7 +514,7 @@ class npc_watcher_narjil : public CreatureScript void JustDied(Unit* /*killer*/) override { - Creature* krikthir = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_KRIKTHIR_THE_GATEWATCHER)); + Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR_THE_GATEWATCHER); if (krikthir && krikthir->IsAlive()) krikthir->AI()->Talk(SAY_PREFIGHT); } @@ -591,7 +591,7 @@ class npc_watcher_silthik : public CreatureScript void JustDied(Unit* /*killer*/) override { - Creature* krikthir = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_KRIKTHIR_THE_GATEWATCHER)); + Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR_THE_GATEWATCHER); if (krikthir && krikthir->IsAlive()) krikthir->AI()->Talk(SAY_PREFIGHT); } @@ -645,9 +645,7 @@ class npc_watcher_silthik : public CreatureScript class achievement_watch_him_die : public AchievementCriteriaScript { public: - achievement_watch_him_die() : AchievementCriteriaScript("achievement_watch_him_die") - { - } + achievement_watch_him_die() : AchievementCriteriaScript("achievement_watch_him_die") { } bool OnCheck(Player* /*player*/, Unit* target) override { @@ -660,7 +658,7 @@ class achievement_watch_him_die : public AchievementCriteriaScript for (uint8 n = 0; n < 3; ++n) { - if (Creature* watcher = ObjectAccessor::GetCreature(*target, instance->GetGuidData(DATA_WATCHER_GASHRA + n))) + if (Creature* watcher = instance->GetCreature(DATA_WATCHER_GASHRA + n)) if (!watcher->IsAlive()) return false; } 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 0cb34f7b1d2..1f474e5ddd5 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,15 @@ DoorData const doorData[] = { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END }; +ObjectData const creatureData[] = +{ + { NPC_KRIKTHIR, DATA_KRIKTHIR_THE_GATEWATCHER }, + { NPC_WATCHER_NARJIL, DATA_WATCHER_GASHRA }, + { NPC_WATCHER_GASHRA, DATA_WATCHER_SILTHIK }, + { NPC_WATCHER_SILTHIK, DATA_WATCHER_NARJIL }, + { 0, 0 } // END +}; + class instance_azjol_nerub : public InstanceMapScript { public: @@ -40,95 +49,8 @@ class instance_azjol_nerub : public InstanceMapScript SetHeaders(DataHeader); SetBossNumber(EncounterCount); LoadDoorData(doorData); + LoadObjectData(creatureData, nullptr); } - - void OnCreatureCreate(Creature* creature) override - { - switch (creature->GetEntry()) - { - case NPC_KRIKTHIR: - KrikthirGUID = creature->GetGUID(); - break; - case NPC_HADRONOX: - HadronoxGUID = creature->GetGUID(); - break; - case NPC_ANUBARAK: - AnubarakGUID = creature->GetGUID(); - break; - case NPC_WATCHER_NARJIL: - WatcherNarjilGUID = creature->GetGUID(); - break; - case NPC_WATCHER_GASHRA: - WatcherGashraGUID = creature->GetGUID(); - break; - case NPC_WATCHER_SILTHIK: - WatcherSilthikGUID = creature->GetGUID(); - break; - default: - break; - } - } - - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_KRIKTHIR_DOOR: - case GO_ANUBARAK_DOOR_1: - case GO_ANUBARAK_DOOR_2: - case GO_ANUBARAK_DOOR_3: - AddDoor(go, true); - break; - default: - break; - } - } - - void OnGameObjectRemove(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_KRIKTHIR_DOOR: - case GO_ANUBARAK_DOOR_1: - case GO_ANUBARAK_DOOR_2: - case GO_ANUBARAK_DOOR_3: - AddDoor(go, false); - break; - default: - break; - } - } - - ObjectGuid GetGuidData(uint32 type) const override - { - switch (type) - { - case DATA_KRIKTHIR_THE_GATEWATCHER: - return KrikthirGUID; - case DATA_HADRONOX: - return HadronoxGUID; - case DATA_ANUBARAK: - return AnubarakGUID; - case DATA_WATCHER_GASHRA: - return WatcherGashraGUID; - case DATA_WATCHER_SILTHIK: - return WatcherSilthikGUID; - case DATA_WATCHER_NARJIL: - return WatcherNarjilGUID; - default: - break; - } - - return ObjectGuid::Empty; - } - - protected: - ObjectGuid KrikthirGUID; - ObjectGuid HadronoxGUID; - ObjectGuid AnubarakGUID; - ObjectGuid WatcherGashraGUID; - ObjectGuid WatcherSilthikGUID; - ObjectGuid WatcherNarjilGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index f1a1aae030f..dd821a5e5e5 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -1119,7 +1119,7 @@ class instance_icecrown_citadel : public InstanceMapScript return false; } - bool CheckRequiredBosses(uint32 bossId, Player const* player = NULL) const override + bool CheckRequiredBosses(uint32 bossId, Player const* player = nullptr) const override { if (player && player->GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES)) return true; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index d5849d43e37..d6c7b18eabd 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -170,7 +170,7 @@ class instance_halls_of_stone : public InstanceMapScript return true; } - bool CheckRequiredBosses(uint32 bossId, Player const* player /*= NULL*/) const override + bool CheckRequiredBosses(uint32 bossId, Player const* player = nullptr) const override { if (player && player->GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES)) return true; diff --git a/src/server/shared/Define.h b/src/server/shared/Define.h index c33c8222ebb..12850948881 100644 --- a/src/server/shared/Define.h +++ b/src/server/shared/Define.h @@ -88,6 +88,12 @@ #define SI64FMTD "%" PRId64 #define SI64LIT(N) INT64_C(N) +#if COMPILER == COMPILER_MICROSOFT +# define SZFMTD "%Iu" +#else +# define SZFMTD "%zu" +#endif + typedef int64_t int64; typedef int32_t int32; typedef int16_t int16; |