feat(Core/Scripts): implemented a guid map in InstanceScript, this wa… (#8781)
Co-authored-by: joschiwald <joschiwald.trinity@gmail.com>
This commit is contained in:
@@ -46,6 +46,57 @@ void InstanceScript::SaveToDB()
|
|||||||
CharacterDatabase.Execute(stmt);
|
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)
|
void InstanceScript::HandleGameObject(ObjectGuid GUID, bool open, GameObject* go)
|
||||||
{
|
{
|
||||||
if (!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()));
|
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)
|
void InstanceScript::UpdateMinionState(Creature* minion, EncounterState state)
|
||||||
{
|
{
|
||||||
switch (state)
|
switch (state)
|
||||||
@@ -142,6 +217,40 @@ void InstanceScript::UpdateDoorState(GameObject* door)
|
|||||||
door->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY);
|
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)
|
void InstanceScript::AddDoor(GameObject* door, bool add)
|
||||||
{
|
{
|
||||||
DoorInfoMapBounds range = doors.equal_range(door->GetEntry());
|
DoorInfoMapBounds range = doors.equal_range(door->GetEntry());
|
||||||
|
|||||||
@@ -134,6 +134,8 @@ typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap;
|
|||||||
typedef std::pair<DoorInfoMap::const_iterator, DoorInfoMap::const_iterator> DoorInfoMapBounds;
|
typedef std::pair<DoorInfoMap::const_iterator, DoorInfoMap::const_iterator> DoorInfoMapBounds;
|
||||||
|
|
||||||
typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap;
|
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
|
class InstanceScript : public ZoneScript
|
||||||
{
|
{
|
||||||
@@ -164,6 +166,20 @@ public:
|
|||||||
//This is to prevent players from entering during boss encounters.
|
//This is to prevent players from entering during boss encounters.
|
||||||
virtual bool IsEncounterInProgress() const;
|
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.
|
//Called when a player successfully enters the instance.
|
||||||
virtual void OnPlayerEnter(Player* /*player*/) {}
|
virtual void OnPlayerEnter(Player* /*player*/) {}
|
||||||
|
|
||||||
@@ -232,6 +248,11 @@ protected:
|
|||||||
void SetBossNumber(uint32 number) { bosses.resize(number); }
|
void SetBossNumber(uint32 number) { bosses.resize(number); }
|
||||||
void LoadDoorData(DoorData const* data);
|
void LoadDoorData(DoorData const* data);
|
||||||
void LoadMinionData(MinionData 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 AddDoor(GameObject* door, bool add);
|
||||||
void AddMinion(Creature* minion, bool add);
|
void AddMinion(Creature* minion, bool add);
|
||||||
@@ -242,9 +263,14 @@ protected:
|
|||||||
std::string LoadBossState(char const* data);
|
std::string LoadBossState(char const* data);
|
||||||
std::string GetBossSaveData();
|
std::string GetBossSaveData();
|
||||||
private:
|
private:
|
||||||
|
static void LoadObjectData(ObjectData const* creatureData, ObjectInfoMap& objectInfo);
|
||||||
|
|
||||||
std::vector<BossInfo> bosses;
|
std::vector<BossInfo> bosses;
|
||||||
DoorInfoMap doors;
|
DoorInfoMap doors;
|
||||||
MinionInfoMap minions;
|
MinionInfoMap minions;
|
||||||
|
ObjectInfoMap _creatureInfo;
|
||||||
|
ObjectInfoMap _gameObjectInfo;
|
||||||
|
ObjectGuidMap _objectGuids;
|
||||||
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
|
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,12 @@ DoorData const doorData[] =
|
|||||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
|
{ 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
|
class instance_azjol_nerub : public InstanceMapScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -39,30 +45,27 @@ public:
|
|||||||
{
|
{
|
||||||
SetBossNumber(MAX_ENCOUNTERS);
|
SetBossNumber(MAX_ENCOUNTERS);
|
||||||
LoadDoorData(doorData);
|
LoadDoorData(doorData);
|
||||||
|
LoadObjectData(creatureData, nullptr);
|
||||||
};
|
};
|
||||||
|
|
||||||
void OnCreatureCreate(Creature* creature) override
|
void OnCreatureCreate(Creature* creature) override
|
||||||
{
|
{
|
||||||
switch (creature->GetEntry())
|
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_SWARMER:
|
||||||
case NPC_SKITTERING_INFECTIOR:
|
case NPC_SKITTERING_INFECTIOR:
|
||||||
if (Creature* krikthir = instance->GetCreature(_krikthirGUID))
|
if (Creature* krikthir = GetCreature((DATA_KRIKTHIR_THE_GATEWATCHER_EVENT)))
|
||||||
krikthir->AI()->JustSummoned(creature);
|
krikthir->AI()->JustSummoned(creature);
|
||||||
break;
|
break;
|
||||||
case NPC_ANUB_AR_CHAMPION:
|
case NPC_ANUB_AR_CHAMPION:
|
||||||
case NPC_ANUB_AR_NECROMANCER:
|
case NPC_ANUB_AR_NECROMANCER:
|
||||||
case NPC_ANUB_AR_CRYPTFIEND:
|
case NPC_ANUB_AR_CRYPTFIEND:
|
||||||
if (Creature* hadronox = instance->GetCreature(_hadronoxGUID))
|
if (Creature* hadronox = GetCreature(DATA_HADRONOX_EVENT))
|
||||||
hadronox->AI()->JustSummoned(creature);
|
hadronox->AI()->JustSummoned(creature);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InstanceScript::OnCreatureCreate(creature);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnGameObjectCreate(GameObject* go) override
|
void OnGameObjectCreate(GameObject* go) override
|
||||||
@@ -123,10 +126,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
ObjectGuid _krikthirGUID;
|
|
||||||
ObjectGuid _hadronoxGUID;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||||
|
|||||||
Reference in New Issue
Block a user