diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Maps/MapManager.cpp | 2 |
3 files changed, 29 insertions, 14 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8bdbf143117..7884b183f4a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1297,17 +1297,6 @@ void Player::Update(uint32 p_time) UpdateEnchantTime(p_time); UpdateHomebindTime(p_time); - if (!_instanceResetTimes.empty()) - { - for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end();) - { - if (itr->second < now) - _instanceResetTimes.erase(itr++); - else - ++itr; - } - } - if (GetClass() == CLASS_DEATH_KNIGHT) { // Update rune timers @@ -17265,7 +17254,10 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].GetUInt16()); _LoadBoundInstances(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BOUND_INSTANCES)); + _LoadInstanceTimeRestrictions(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES)); + UpdateInstanceEnterTimes(); + _LoadBGData(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BG_DATA)); GetSession()->SetPlayer(this); @@ -19113,10 +19105,16 @@ bool Player::CheckInstanceValidity(bool /*isLogin*/) return true; } -bool Player::CheckInstanceCount(uint32 instanceId) const +bool Player::UpdateAndCheckInstanceCount(uint32 instanceId) { + UpdateInstanceEnterTimes(); + if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR)) return true; + + if (instanceId == 0) + return false; + return _instanceResetTimes.find(instanceId) != _instanceResetTimes.end(); } @@ -19126,6 +19124,22 @@ void Player::AddInstanceEnterTime(uint32 instanceId, time_t enterTime) _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR)); } +void Player::UpdateInstanceEnterTimes() +{ + if (_instanceResetTimes.empty()) + return; + + time_t now = GameTime::GetGameTime(); + + for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end();) + { + if (itr->second < now) + itr = _instanceResetTimes.erase(itr); + else + ++itr; + } +} + bool Player::_LoadHomeBind(PreparedQueryResult result) { PlayerInfo const* info = sObjectMgr->GetPlayerInfo(GetRace(), GetClass()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 870eb868da7..ada2bb98d7c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2090,8 +2090,9 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SendSavedInstances(); bool Satisfy(AccessRequirement const* ar, uint32 target_map, bool report = false); bool CheckInstanceValidity(bool /*isLogin*/); - bool CheckInstanceCount(uint32 instanceId) const; + bool UpdateAndCheckInstanceCount(uint32 instanceId); void AddInstanceEnterTime(uint32 instanceId, time_t enterTime); + void UpdateInstanceEnterTimes(); // last used pet number (for BG's) uint32 GetLastPetNumber() const { return m_lastpetnumber; } diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index d1ffc63a4c0..acf3d604f2b 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -205,7 +205,7 @@ Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool instanceIdToCheck = save->GetInstanceId(); // instanceId can never be 0 - will not be found - if (!player->CheckInstanceCount(instanceIdToCheck) && !player->isDead()) + if (!player->UpdateAndCheckInstanceCount(instanceIdToCheck) && !player->isDead()) return Map::CANNOT_ENTER_TOO_MANY_INSTANCES; } |