mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 19:06:49 +01:00
Core/Scripts: implemented a guid map in InstanceScript, this way you can easier store guids and access its objects
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user