aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjoschiwald <joschiwald.trinity@gmail.com>2014-09-18 00:25:05 +0200
committerjoschiwald <joschiwald.trinity@gmail.com>2014-09-18 00:25:05 +0200
commitb08dcb1d99fe91b7dc1cb3168a34d722f9ea5505 (patch)
treeccc860cd179424f129c1ba93904d1a4fd6a399de /src
parent053beae172fe57f6495f8c6112063ea80deb0d66 (diff)
Core/Scripts: implemented a guid map in InstanceScript, this way you can easier store guids and access its objects
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Instances/InstanceScript.cpp84
-rw-r--r--src/server/game/Instances/InstanceScript.h40
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp12
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp98
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp2
-rw-r--r--src/server/shared/Define.h6
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;