aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Instances/InstanceScript.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Instances/InstanceScript.h')
-rw-r--r--src/server/game/Instances/InstanceScript.h53
1 files changed, 44 insertions, 9 deletions
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 5451849506e..1f190355b15 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -35,9 +35,6 @@ class Player;
class GameObject;
class Creature;
-typedef std::set<uint64> DoorSet;
-typedef std::set<uint64> MinionSet;
-
enum EncounterFrameType
{
ENCOUNTER_FRAME_SET_COMBAT_RES_LIMIT = 0,
@@ -102,12 +99,18 @@ struct MinionData
uint32 entry, bossId;
};
+struct ObjectData
+{
+ uint32 entry;
+ uint32 type;
+};
+
struct BossInfo
{
BossInfo() : state(TO_BE_DECIDED) { }
EncounterState state;
- DoorSet door[MAX_DOOR_TYPES];
- MinionSet minion;
+ GuidSet door[MAX_DOOR_TYPES];
+ GuidSet minion;
BossBoundaryMap boundary;
};
@@ -130,6 +133,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
{
@@ -157,19 +162,39 @@ 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*/) { }
// Handle open / close objects
// * use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts
// * use HandleGameObject(GUID, boolen, NULL); in any other script
- void HandleGameObject(uint64 guid, bool open, GameObject* go = nullptr);
+ void HandleGameObject(ObjectGuid guid, bool open, GameObject* go = nullptr);
// Change active state of doors or buttons
- void DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime = 0, bool useAlternativeState = false);
+ void DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime = 0, bool useAlternativeState = false);
// Respawns a GO having negative spawntimesecs in gameobject-table
- void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn = MINUTE);
+ void DoRespawnGameObject(ObjectGuid guid, uint32 timeToDespawn = MINUTE);
// Sends world state update to all players in instance
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue);
@@ -202,7 +227,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);
@@ -225,6 +250,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);
@@ -241,10 +271,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
};