diff options
Diffstat (limited to 'src/server/game/Instances/InstanceScript.h')
-rw-r--r-- | src/server/game/Instances/InstanceScript.h | 53 |
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 }; |