diff options
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/TemporarySummon.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObjectData.h | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Pet/Pet.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 50 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 2 |
11 files changed, 55 insertions, 39 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 105a780beca..8f2c6980762 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -307,7 +307,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) // get difficulty 1 mode entry CreatureTemplate const* cinfo = nullptr; - DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(GetMap()->GetSpawnMode()); + DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(GetMap()->GetDifficultyID()); while (!cinfo && difficultyEntry) { int32 idx = CreatureTemplate::DifficultyIDToDifficultyEntryIndex(difficultyEntry->ID); @@ -1103,10 +1103,10 @@ void Creature::SaveToDB() } uint32 mapId = GetTransport() ? GetTransport()->GetGOInfo()->moTransport.SpawnMap : GetMapId(); - SaveToDB(mapId, data->spawnMask); + SaveToDB(mapId, data->spawnDifficulties); } -void Creature::SaveToDB(uint32 mapid, uint64 spawnMask) +void Creature::SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties) { // update in loaded data if (!m_spawnId) @@ -1174,7 +1174,7 @@ void Creature::SaveToDB(uint32 mapid, uint64 spawnMask) // prevent add data integrity problems data.movementType = !m_respawnradius && GetDefaultMovementType() == RANDOM_MOTION_TYPE ? IDLE_MOTION_TYPE : GetDefaultMovementType(); - data.spawnMask = spawnMask; + data.spawnDifficulties = spawnDifficulties; data.npcflag = npcflag; data.unit_flags = unitFlags; data.unit_flags2 = unitFlags2; @@ -1197,7 +1197,7 @@ void Creature::SaveToDB(uint32 mapid, uint64 spawnMask) stmt->setUInt64(index++, m_spawnId); stmt->setUInt32(index++, GetEntry()); stmt->setUInt16(index++, uint16(mapid)); - stmt->setUInt64(index++, spawnMask); + stmt->setString(index++, StringJoin(data.spawnDifficulties, ",")); stmt->setUInt32(index++, data.phaseId); stmt->setUInt32(index++, data.phaseGroup); stmt->setUInt32(index++, displayId); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 0470a4cc41f..d87db9be2ca 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -187,7 +187,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma public: void SaveToDB(); // overriden in Pet - virtual void SaveToDB(uint32 mapid, uint64 spawnMask); + virtual void SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties); virtual void DeleteFromDB(); // overriden in Pet Loot loot; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index e1d0fea528e..45a13c6f603 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -500,7 +500,7 @@ struct CreatureData CreatureData() : id(0), mapid(0), displayid(0), equipmentId(0), posX(0.0f), posY(0.0f), posZ(0.0f), orientation(0.0f), spawntimesecs(0), spawndist(0.0f), currentwaypoint(0), curhealth(0), curmana(0), movementType(0), - spawnMask(0), npcflag(0), unit_flags(0), unit_flags2(0), unit_flags3(0), dynamicflags(0), + spawnDifficulties(), npcflag(0), unit_flags(0), unit_flags2(0), unit_flags3(0), dynamicflags(0), phaseUseFlags(0), phaseId(0), phaseGroup(0), terrainSwapMap(-1), ScriptId(0), dbData(true) { } uint32 id; // entry in creature_template uint16 mapid; @@ -516,7 +516,7 @@ struct CreatureData uint32 curhealth; uint32 curmana; uint8 movementType; - uint64 spawnMask; + std::vector<Difficulty> spawnDifficulties; uint64 npcflag; uint32 unit_flags; // enum UnitFlags mask values uint32 unit_flags2; // enum UnitFlags2 mask values diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 785b848529b..f4a05581ea5 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -53,7 +53,7 @@ class TC_GAME_API TempSummon : public Creature virtual void UnSummon(uint32 msTime = 0); void RemoveFromWorld() override; void SetTempSummonType(TempSummonType type); - void SaveToDB(uint32 /*mapid*/, uint64 /*spawnMask*/) override { } + void SaveToDB(uint32 /*mapid*/, std::vector<Difficulty> const& /*spawnDifficulties*/) override { } Unit* GetSummoner() const; Creature* GetSummonerCreatureBase() const; ObjectGuid GetSummonerGUID() const { return m_summonerGUID; } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index d0a458a7946..89b59a11ab2 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -911,10 +911,10 @@ void GameObject::SaveToDB() return; } - SaveToDB(GetMapId(), data->spawnMask); + SaveToDB(GetMapId(), data->spawnDifficulties); } -void GameObject::SaveToDB(uint32 mapid, uint64 spawnMask) +void GameObject::SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties) { const GameObjectTemplate* goI = GetGOInfo(); @@ -938,7 +938,7 @@ void GameObject::SaveToDB(uint32 mapid, uint64 spawnMask) data.spawntimesecs = m_spawnedByDefault ? m_respawnDelayTime : -(int32)m_respawnDelayTime; data.animprogress = GetGoAnimProgress(); data.go_state = GetGoState(); - data.spawnMask = spawnMask; + data.spawnDifficulties = spawnDifficulties; data.artKit = GetGoArtKit(); data.phaseId = GetDBPhase() > 0 ? GetDBPhase() : data.phaseId; @@ -957,7 +957,7 @@ void GameObject::SaveToDB(uint32 mapid, uint64 spawnMask) stmt->setUInt64(index++, m_spawnId); stmt->setUInt32(index++, GetEntry()); stmt->setUInt16(index++, uint16(mapid)); - stmt->setUInt64(index++, spawnMask); + stmt->setString(index++, StringJoin(data.spawnDifficulties, ",")); stmt->setUInt32(index++, data.phaseId); stmt->setUInt32(index++, data.phaseGroup); stmt->setFloat(index++, GetPositionX()); diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 12ff942a6ba..24b70b9ce73 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -119,7 +119,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> std::string const& GetNameForLocaleIdx(LocaleConstant locale_idx) const override; void SaveToDB(); - void SaveToDB(uint32 mapid, uint64 spawnMask); + void SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties); bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map) { return LoadGameObjectFromDB(spawnId, map, false); } private: bool LoadGameObjectFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap); diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 7491a3d8ac9..c6411c24f0a 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -855,7 +855,7 @@ struct GameObjectAddon struct GameObjectData { explicit GameObjectData() : id(0), mapid(0), posX(0.0f), posY(0.0f), posZ(0.0f), orientation(0.0f), spawntimesecs(0), - animprogress(0), go_state(GO_STATE_ACTIVE), spawnMask(0), artKit(0), + animprogress(0), go_state(GO_STATE_ACTIVE), spawnDifficulties(), artKit(0), phaseUseFlags(0), phaseId(0), phaseGroup(0), terrainSwapMap(-1), ScriptId(0), dbData(true) { } uint32 id; // entry in gamobject_template uint16 mapid; @@ -867,7 +867,7 @@ struct GameObjectData int32 spawntimesecs; uint32 animprogress; GOState go_state; - uint64 spawnMask; + std::vector<Difficulty> spawnDifficulties; uint8 artKit; uint8 phaseUseFlags; uint32 phaseId; diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index e6652501b86..e411d2251af 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -160,7 +160,7 @@ class TC_GAME_API Pet : public Guardian uint16 m_petSpecialization; private: - void SaveToDB(uint32, uint64) override // override of Creature::SaveToDB - must not be called + void SaveToDB(uint32, std::vector<Difficulty> const&) override // override of Creature::SaveToDB - must not be called { ABORT(); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2aae0333ebf..f956d970992 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -397,8 +397,8 @@ void Player::CleanupsBeforeDelete(bool finalCleanup) Unit::CleanupsBeforeDelete(finalCleanup); // clean up player-instance binds, may unload some instance saves - for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) - for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) + for (auto difficultyItr = m_boundInstances.begin(); difficultyItr != m_boundInstances.end(); ++difficultyItr) + for (auto itr = difficultyItr->second.begin(); itr != difficultyItr->second.end(); ++itr) itr->second.save->RemovePlayer(this); } @@ -19428,8 +19428,7 @@ void Player::_LoadGroup(PreparedQueryResult result) void Player::_LoadBoundInstances(PreparedQueryResult result) { - for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) - m_boundInstances[i].clear(); + m_boundInstances.clear(); Group* group = GetGroup(); @@ -19514,8 +19513,12 @@ InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty if (!mapDiff) return nullptr; - BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid); - if (itr != m_boundInstances[difficulty].end()) + auto difficultyItr = m_boundInstances.find(difficulty); + if (difficultyItr == m_boundInstances.end()) + return nullptr; + + auto itr = difficultyItr->second.find(mapid); + if (itr != difficultyItr->second.end()) if (itr->second.extendState || withExpired) return &itr->second; return nullptr; @@ -19528,8 +19531,12 @@ InstancePlayerBind const* Player::GetBoundInstance(uint32 mapid, Difficulty diff if (!mapDiff) return nullptr; - auto itr = m_boundInstances[difficulty].find(mapid); - if (itr != m_boundInstances[difficulty].end()) + auto difficultyItr = m_boundInstances.find(difficulty); + if (difficultyItr == m_boundInstances.end()) + return nullptr; + + auto itr = difficultyItr->second.find(mapid); + if (itr != difficultyItr->second.end()) return &itr->second; return nullptr; @@ -19550,13 +19557,18 @@ InstanceSave* Player::GetInstanceSave(uint32 mapid) void Player::UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload) { - BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid); - UnbindInstance(itr, difficulty, unload); + auto difficultyItr = m_boundInstances.find(difficulty); + if (difficultyItr != m_boundInstances.end()) + { + auto itr = difficultyItr->second.find(mapid); + if (itr != difficultyItr->second.end()) + UnbindInstance(itr, difficultyItr, unload); + } } -void Player::UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload) +void Player::UnbindInstance(BoundInstancesMap::mapped_type::iterator& itr, BoundInstancesMap::iterator& difficultyItr, bool unload) { - if (itr != m_boundInstances[difficulty].end()) + if (itr != difficultyItr->second.end()) { if (!unload) { @@ -19572,7 +19584,7 @@ void Player::UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficu GetSession()->SendCalendarRaidLockout(itr->second.save, false); itr->second.save->RemovePlayer(this); // save can become invalid - m_boundInstances[difficulty].erase(itr++); + difficultyItr->second.erase(itr++); } } @@ -19669,9 +19681,9 @@ void Player::SendRaidInfo() time_t now = time(nullptr); - for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) + for (auto difficultyItr = m_boundInstances.begin(); difficultyItr != m_boundInstances.end(); ++difficultyItr) { - for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) + for (auto itr = difficultyItr->second.begin(); itr != difficultyItr->second.end(); ++itr) { InstancePlayerBind const& bind = itr->second; if (bind.perm) @@ -21193,7 +21205,11 @@ void Player::ResetInstances(uint8 method, bool isRaid, bool isLegacy) diff = GetLegacyRaidDifficultyID(); } - for (BoundInstancesMap::iterator itr = m_boundInstances[diff].begin(); itr != m_boundInstances[diff].end();) + auto difficultyItr = m_boundInstances.find(diff); + if (difficultyItr == m_boundInstances.end()) + return; + + for (auto itr = difficultyItr->second.begin(); itr != difficultyItr->second.end();) { InstanceSave* p = itr->second.save; const MapEntry* entry = sMapStore.LookupEntry(itr->first); @@ -21227,7 +21243,7 @@ void Player::ResetInstances(uint8 method, bool isRaid, bool isLegacy) SendResetInstanceSuccess(p->GetMapId()); p->DeleteFromDB(); - m_boundInstances[diff].erase(itr++); + difficultyItr->second.erase(itr++); // the following should remove the instance save from the manager and delete it as well p->RemovePlayer(this); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 7cbea6951f0..fd2b6e9a049 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2234,20 +2234,20 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*** INSTANCE SYSTEM ***/ /*********************************************************/ - typedef std::unordered_map< uint32 /*mapId*/, InstancePlayerBind > BoundInstancesMap; + typedef std::unordered_map<Difficulty, std::unordered_map<uint32 /*mapId*/, InstancePlayerBind>> BoundInstancesMap; void UpdateHomebindTime(uint32 time); uint32 m_HomebindTimer; bool m_InstanceValid; // permanent binds and solo binds by difficulty - BoundInstancesMap m_boundInstances[MAX_DIFFICULTY]; + BoundInstancesMap m_boundInstances; InstancePlayerBind* GetBoundInstance(uint32 mapid, Difficulty difficulty, bool withExpired = false); InstancePlayerBind const* GetBoundInstance(uint32 mapid, Difficulty difficulty) const; - BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; } + BoundInstancesMap::iterator GetBoundInstances(Difficulty difficulty) { return m_boundInstances.find(difficulty); } InstanceSave* GetInstanceSave(uint32 mapid); void UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload = false); - void UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload = false); + void UnbindInstance(BoundInstancesMap::mapped_type::iterator& itr, BoundInstancesMap::iterator& difficultyItr, bool unload = false); InstancePlayerBind* BindToInstance(InstanceSave* save, bool permanent, BindExtensionState extendState = EXTEND_STATE_NORMAL, bool load = false); void BindToInstance(); void SetPendingBind(uint32 instanceId, uint32 bindTimer); diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index bd86313e004..50b1897e2c5 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -529,7 +529,7 @@ void Transport::LoadStaticPassengers() { if (uint32 mapId = GetGOInfo()->moTransport.SpawnMap) { - CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetSpawnMode()); + CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetDifficultyID()); CellGuidSet::const_iterator guidEnd; for (CellObjectGuidsMap::const_iterator cellItr = cells.begin(); cellItr != cells.end(); ++cellItr) { |
