aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorr4dish <ovitnez@gmail.com>2024-06-19 18:38:19 +0300
committerShauren <shauren.trinity@gmail.com>2024-06-27 14:49:40 +0200
commit0327f16d110baa4479c73b4fcece6c99b2f89a8b (patch)
treef0e2d6bdaf24522153db0430c3e4480dfe81bcc5 /src/server/game/Server
parentc6906948f7352eee52174434c4626ecf98eb8eab (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.cpp67
-rw-r--r--src/server/game/Server/WorldSession.h9
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