aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr4dish <ovitnez@gmail.com>2024-06-17 22:57:52 +0300
committerShauren <shauren.trinity@gmail.com>2024-06-27 14:49:40 +0200
commitc6906948f7352eee52174434c4626ecf98eb8eab (patch)
tree5fb7dfee59ab229e01868887ce81f9ad5dda1808
parent0ebda1168aa08d2b4539de6304c3cbd806448152 (diff)
Core/Misc: Update instance enter times only when it's really needed.
-rw-r--r--src/server/game/Entities/Player/Player.cpp38
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Maps/MapManager.cpp2
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;
}