diff options
| author | Shauren <shauren.trinity@gmail.com> | 2018-09-15 17:55:26 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2018-09-15 17:55:26 +0200 |
| commit | 738f37d3cf45d4e10eda9d44a4cb17079b7bbc1b (patch) | |
| tree | 9db45160ed8a0c68090dec2aebb9b73c9f2ea335 /src/server/game/Entities/Player | |
| parent | 0f3156d324ff8134171bada01b40f5c23f5c43cc (diff) | |
Core/Maps: Replaced spawnmask with difficulty list
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 50 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 8 |
2 files changed, 37 insertions, 21 deletions
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); |
