diff options
| author | r4dish <ovitnez@gmail.com> | 2024-06-19 18:38:19 +0300 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-06-27 14:49:40 +0200 |
| commit | 0327f16d110baa4479c73b4fcece6c99b2f89a8b (patch) | |
| tree | f0e2d6bdaf24522153db0430c3e4480dfe81bcc5 /src/server/game/Server | |
| parent | c6906948f7352eee52174434c4626ecf98eb8eab (diff) | |
Core/Misc: Move instance enter times handling from Player to WorldSession.
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 67 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 9 |
2 files changed, 76 insertions, 0 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 465e2efe683..2950b72ce8e 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -26,6 +26,7 @@ #include "CharacterPackets.h" #include "Config.h" #include "Common.h" +#include "Containers.h" #include "DatabaseEnv.h" #include "DBCStructure.h" #include "GameClient.h" @@ -889,6 +890,66 @@ void WorldSession::SaveTutorialsData(CharacterDatabaseTransaction trans) m_TutorialsChanged &= ~TUTORIALS_FLAG_CHANGED; } +void WorldSession::LoadInstanceTimeRestrictions(PreparedQueryResult result) +{ + if (!result) + return; + + SystemTimePoint now = GameTime::GetSystemTime(); + do + { + Field* fields = result->Fetch(); + SystemTimePoint restrictionExpireTime = SystemTimePoint::clock::from_time_t(fields[1].GetUInt64()); + if (restrictionExpireTime > now) + _instanceResetTimes.try_emplace(fields[0].GetUInt32(), restrictionExpireTime); + } while (result->NextRow()); +} + +void WorldSession::SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans) +{ + if (_instanceResetTimes.empty()) + return; + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES); + stmt->setUInt32(0, GetAccountId()); + trans->Append(stmt); + + for (auto const& [instanceId, restrictionExpireTime] : _instanceResetTimes) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES); + stmt->setUInt32(0, GetAccountId()); + stmt->setUInt32(1, instanceId); + stmt->setUInt64(2, SystemTimePoint::clock::to_time_t(restrictionExpireTime)); + trans->Append(stmt); + } +} + +bool WorldSession::UpdateAndCheckInstanceCount(uint32 instanceId) +{ + UpdateInstanceEnterTimes(); + + if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR)) + return true; + + if (instanceId == 0) + return false; + + return _instanceResetTimes.contains(instanceId); +} + +void WorldSession::AddInstanceEnterTime(uint32 instanceId, SystemTimePoint enterTime) +{ + _instanceResetTimes.try_emplace(instanceId, enterTime + 1h); +} + +void WorldSession::UpdateInstanceEnterTimes() +{ + Trinity::Containers::EraseIf(_instanceResetTimes, [now = GameTime::GetSystemTime()](std::pair<uint32 const, SystemTimePoint> const& value) + { + return value.second < now; + }); +} + void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) { data >> mi->flags; @@ -1290,6 +1351,7 @@ public: { GLOBAL_ACCOUNT_DATA = 0, TUTORIALS, + INSTANCE_TIMES, MAX_QUERIES }; @@ -1308,6 +1370,10 @@ public: stmt->setUInt32(0, accountId); ok = SetPreparedQuery(TUTORIALS, stmt) && ok; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES); + stmt->setUInt32(0, accountId); + ok = SetPreparedQuery(INSTANCE_TIMES, stmt) && ok; + return ok; } }; @@ -1331,6 +1397,7 @@ void WorldSession::InitializeSessionCallback(CharacterDatabaseQueryHolder const& { LoadAccountData(realmHolder.GetPreparedResult(AccountInfoQueryHolderPerRealm::GLOBAL_ACCOUNT_DATA), GLOBAL_CACHE_MASK); LoadTutorialsData(realmHolder.GetPreparedResult(AccountInfoQueryHolderPerRealm::TUTORIALS)); + LoadInstanceTimeRestrictions(realmHolder.GetPreparedResult(AccountInfoQueryHolderPerRealm::INSTANCE_TIMES)); if (!m_inQueue) SendAuthResponse(AUTH_OK, true); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 5b367defd57..843a2565cd5 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -26,6 +26,7 @@ #include "AsyncCallbackProcessor.h" #include "AuthDefines.h" #include "DatabaseEnvFwd.h" +#include "Duration.h" #include "LockedQueue.h" #include "ObjectGuid.h" #include "Packet.h" @@ -570,6 +571,11 @@ class TC_GAME_API WorldSession m_TutorialsChanged |= TUTORIALS_FLAG_CHANGED; } } + void LoadInstanceTimeRestrictions(PreparedQueryResult result); + void SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans); + bool UpdateAndCheckInstanceCount(uint32 instanceId); + void AddInstanceEnterTime(uint32 instanceId, SystemTimePoint enterTime); + void UpdateInstanceEnterTimes(); //auction void SendAuctionHello(ObjectGuid guid, Creature* unit); void SendAuctionCommandResult(uint32 auctionItemId, AuctionAction command, AuctionError errorCode, InventoryResult bagResult = InventoryResult(0)); @@ -1244,6 +1250,9 @@ class TC_GAME_API WorldSession AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES]; uint32 m_Tutorials[MAX_ACCOUNT_TUTORIAL_VALUES]; uint8 m_TutorialsChanged; + + std::unordered_map<uint32 /*instanceId*/, SystemTimePoint/*releaseTime*/> _instanceResetTimes; + struct Addons { struct SecureAddonInfo |
