aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/WorldSession.cpp91
-rw-r--r--src/server/game/Server/WorldSession.h46
-rw-r--r--src/server/game/Server/WorldSocket.cpp17
-rw-r--r--src/server/game/Server/WorldSocket.h3
4 files changed, 30 insertions, 127 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index a7dc3685171..4664d2efb8f 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -24,6 +24,7 @@
#include "Config.h"
#include "Common.h"
#include "DatabaseEnv.h"
+#include "QueryCallback.h"
#include "AccountMgr.h"
#include "Log.h"
#include "Opcodes.h"
@@ -137,7 +138,6 @@ WorldSession::WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldS
LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId()); // One-time query
}
- InitializeQueryCallbackParameters();
}
/// WorldSession destructor
@@ -1085,99 +1085,16 @@ void WorldSession::SetPlayer(Player* player)
m_GUIDLow = _player->GetGUID().GetCounter();
}
-void WorldSession::InitializeQueryCallbackParameters()
-{
- // Callback parameters that have pointers in them should be properly
- // initialized to NULL here.
- _charCreateCallback.SetParam(NULL);
-}
-
void WorldSession::ProcessQueryCallbacks()
{
- PreparedQueryResult result;
+ _queryProcessor.ProcessReadyQueries();
if (_realmAccountLoginCallback.valid() && _realmAccountLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
InitializeSessionCallback(_realmAccountLoginCallback.get());
- //! HandleCharEnumOpcode
- if (_charEnumCallback.valid() && _charEnumCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
- {
- result = _charEnumCallback.get();
- HandleCharEnum(result);
- }
-
- if (_charCreateCallback.IsReady())
- {
- _charCreateCallback.GetResult(result);
- HandleCharCreateCallback(result, _charCreateCallback.GetParam());
- }
-
//! HandlePlayerLoginOpcode
if (_charLoginCallback.valid() && _charLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
- {
- SQLQueryHolder* param = _charLoginCallback.get();
- HandlePlayerLogin((LoginQueryHolder*)param);
- }
-
- //! HandleAddFriendOpcode
- if (_addFriendCallback.IsReady())
- {
- std::string param = _addFriendCallback.GetParam();
- _addFriendCallback.GetResult(result);
- HandleAddFriendOpcodeCallback(result, param);
- _addFriendCallback.FreeResult();
- }
-
- //- HandleCharRenameOpcode
- if (_charRenameCallback.IsReady())
- {
- _charRenameCallback.GetResult(result);
- CharacterRenameInfo* renameInfo = _charRenameCallback.GetParam();
- HandleChangePlayerNameOpcodeCallBack(result, renameInfo);
- delete renameInfo;
- _charRenameCallback.Reset();
- }
-
- //- HandleCharAddIgnoreOpcode
- if (_addIgnoreCallback.valid() && _addIgnoreCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
- {
- result = _addIgnoreCallback.get();
- HandleAddIgnoreOpcodeCallback(result);
- }
-
- //- SendStabledPet
- if (_sendStabledPetCallback.IsReady())
- {
- ObjectGuid param = _sendStabledPetCallback.GetParam();
- _sendStabledPetCallback.GetResult(result);
- SendStablePetCallback(result, param);
- _sendStabledPetCallback.FreeResult();
- }
-
- //- HandleStablePet
- if (_stablePetCallback.valid() && _stablePetCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
- {
- result = _stablePetCallback.get();
- HandleStablePetCallback(result);
- }
-
- //- HandleUnstablePet
- if (_unstablePetCallback.IsReady())
- {
- uint32 param = _unstablePetCallback.GetParam();
- _unstablePetCallback.GetResult(result);
- HandleUnstablePetCallback(result, param);
- _unstablePetCallback.FreeResult();
- }
-
- //- HandleStableSwapPet
- if (_stableSwapCallback.IsReady())
- {
- uint32 param = _stableSwapCallback.GetParam();
- _stableSwapCallback.GetResult(result);
- HandleStableSwapPetCallback(result, param);
- _stableSwapCallback.FreeResult();
- }
+ HandlePlayerLogin(reinterpret_cast<LoginQueryHolder*>(_charLoginCallback.get()));
}
void WorldSession::InitWarden(BigNumber* k, std::string const& os)
@@ -1204,7 +1121,7 @@ void WorldSession::LoadPermissions()
_RBACData->LoadFromDB();
}
-PreparedQueryResultFuture WorldSession::LoadPermissionsAsync()
+QueryCallback WorldSession::LoadPermissionsAsync()
{
uint32 id = GetAccountId();
uint8 secLevel = GetSecurity();
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index d4320923a59..a95aa75cccf 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -239,6 +239,7 @@ struct CharacterFactionChangeInfo : public CharacterCustomizeInfo
protected:
uint8 Race = 0;
+ bool FactionChange = false;
};
struct PacketCounter
@@ -284,7 +285,7 @@ class TC_GAME_API WorldSession
rbac::RBACData* GetRBACData();
bool HasPermission(uint32 permissionId);
void LoadPermissions();
- PreparedQueryResultFuture LoadPermissionsAsync();
+ QueryCallback LoadPermissionsAsync();
void InvalidateRBACData(); // Used to force LoadPermissions at next HasPermission check
AccountTypes GetSecurity() const { return _security; }
@@ -356,7 +357,7 @@ class TC_GAME_API WorldSession
// Pet
void SendPetNameQuery(ObjectGuid guid, uint32 petnumber);
void SendStablePet(ObjectGuid guid);
- void SendStablePetCallback(PreparedQueryResult result, ObjectGuid guid);
+ void SendStablePetCallback(ObjectGuid guid, PreparedQueryResult result);
void SendStableResult(uint8 guid);
bool CheckStableMaster(ObjectGuid guid);
@@ -449,16 +450,23 @@ class TC_GAME_API WorldSession
void HandleCharEnumOpcode(WorldPacket& recvPacket);
void HandleCharDeleteOpcode(WorldPacket& recvPacket);
void HandleCharCreateOpcode(WorldPacket& recvPacket);
- void HandleCharCreateCallback(PreparedQueryResult result, CharacterCreateInfo* createInfo);
void HandlePlayerLoginOpcode(WorldPacket& recvPacket);
void HandleCharEnum(PreparedQueryResult result);
- void HandlePlayerLogin(LoginQueryHolder * holder);
+ void HandlePlayerLogin(LoginQueryHolder* holder);
void HandleCharFactionOrRaceChange(WorldPacket& recvData);
+ void HandleCharFactionOrRaceChangeCallback(std::shared_ptr<CharacterFactionChangeInfo> factionChangeInfo, PreparedQueryResult result);
+ void HandleCharRenameOpcode(WorldPacket& recvData);
+ void HandleCharRenameCallback(std::shared_ptr<CharacterRenameInfo> renameInfo, PreparedQueryResult result);
+ void HandleSetPlayerDeclinedNames(WorldPacket& recvData);
+ void HandleAlterAppearance(WorldPacket& recvData);
+ void HandleCharCustomize(WorldPacket& recvData);
+ void HandleCharCustomizeCallback(std::shared_ptr<CharacterCustomizeInfo> customizeInfo, PreparedQueryResult result);
+
void SendCharCreate(ResponseCodes result);
void SendCharDelete(ResponseCodes result);
- void SendCharRename(ResponseCodes result, CharacterRenameInfo const& renameInfo);
- void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const& customizeInfo);
- void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const& factionChangeInfo);
+ void SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo);
+ void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const* customizeInfo);
+ void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const* factionChangeInfo);
void SendSetPlayerDeclinedNamesResult(DeclinedNameResult result, ObjectGuid guid);
void SendBarberShopResult(BarberShopResult result);
@@ -528,7 +536,7 @@ class TC_GAME_API WorldSession
// Social
void HandleContactListOpcode(WorldPacket& recvPacket);
void HandleAddFriendOpcode(WorldPacket& recvPacket);
- void HandleAddFriendOpcodeCallback(PreparedQueryResult result, std::string const& friendNote);
+ void HandleAddFriendOpcodeCallback(std::string const& friendNote, PreparedQueryResult result);
void HandleDelFriendOpcode(WorldPacket& recvPacket);
void HandleAddIgnoreOpcode(WorldPacket& recvPacket);
void HandleAddIgnoreOpcodeCallback(PreparedQueryResult result);
@@ -651,11 +659,11 @@ class TC_GAME_API WorldSession
void HandleStablePet(WorldPacket& recvPacket);
void HandleStablePetCallback(PreparedQueryResult result);
void HandleUnstablePet(WorldPacket& recvPacket);
- void HandleUnstablePetCallback(PreparedQueryResult result, uint32 petId);
+ void HandleUnstablePetCallback(uint32 petId, PreparedQueryResult result);
void HandleBuyStableSlot(WorldPacket& recvPacket);
void HandleStableRevivePet(WorldPacket& recvPacket);
void HandleStableSwapPet(WorldPacket& recvPacket);
- void HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId);
+ void HandleStableSwapPetCallback(uint32 petId, PreparedQueryResult result);
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
@@ -805,10 +813,6 @@ class TC_GAME_API WorldSession
void HandleSetActionBarToggles(WorldPacket& recvData);
- void HandleCharRenameOpcode(WorldPacket& recvData);
- void HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, CharacterRenameInfo const* renameInfo);
- void HandleSetPlayerDeclinedNames(WorldPacket& recvData);
-
void HandleTotemDestroyed(WorldPacket& recvData);
void HandleDismissCritter(WorldPacket& recvData);
@@ -952,9 +956,7 @@ class TC_GAME_API WorldSession
void HandleSpellClick(WorldPacket& recvData);
void HandleMirrorImageDataRequest(WorldPacket& recvData);
- void HandleAlterAppearance(WorldPacket& recvData);
void HandleRemoveGlyph(WorldPacket& recvData);
- void HandleCharCustomize(WorldPacket& recvData);
void HandleQueryInspectAchievements(WorldPacket& recvData);
void HandleEquipmentSetSave(WorldPacket& recvData);
void HandleEquipmentSetDelete(WorldPacket& recvData);
@@ -969,21 +971,13 @@ class TC_GAME_API WorldSession
void HandleUpdateMissileTrajectory(WorldPacket& recvPacket);
private:
- void InitializeQueryCallbackParameters();
void ProcessQueryCallbacks();
QueryResultHolderFuture _realmAccountLoginCallback;
- PreparedQueryResultFuture _charEnumCallback;
- PreparedQueryResultFuture _addIgnoreCallback;
- PreparedQueryResultFuture _stablePetCallback;
- QueryCallback<PreparedQueryResult, CharacterRenameInfo*> _charRenameCallback;
- QueryCallback<PreparedQueryResult, std::string> _addFriendCallback;
- QueryCallback<PreparedQueryResult, uint32> _unstablePetCallback;
- QueryCallback<PreparedQueryResult, uint32> _stableSwapCallback;
- QueryCallback<PreparedQueryResult, ObjectGuid> _sendStabledPetCallback;
- QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback;
QueryResultHolderFuture _charLoginCallback;
+ QueryCallbackProcessor _queryProcessor;
+
friend class World;
protected:
class DosProtection
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index fae31751358..08fb36dafb5 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -19,6 +19,7 @@
#include "WorldSocket.h"
#include "BigNumber.h"
#include "Opcodes.h"
+#include "QueryCallback.h"
#include "ScriptMgr.h"
#include "SHA1.h"
#include "PacketLog.h"
@@ -51,8 +52,7 @@ void WorldSocket::Start()
stmt->setString(0, ip_address);
stmt->setUInt32(1, inet_addr(ip_address.c_str()));
- _queryCallback = std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1);
- _queryFuture = LoginDatabase.AsyncQuery(stmt);
+ _queryProcessor.AddQuery(LoginDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1)));
}
void WorldSocket::CheckIpCallback(PreparedQueryResult result)
@@ -125,12 +125,7 @@ bool WorldSocket::Update()
if (!BaseSocket::Update())
return false;
- if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
- {
- auto callback = _queryCallback;
- _queryCallback = nullptr;
- callback(_queryFuture.get());
- }
+ _queryProcessor.ProcessReadyQueries();
return true;
}
@@ -444,8 +439,7 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
stmt->setInt32(0, int32(realm.Id.Realm));
stmt->setString(1, authSession->Account);
- _queryCallback = std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1);
- _queryFuture = LoginDatabase.AsyncQuery(stmt);
+ _queryProcessor.AddQuery(LoginDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1)));
}
void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSession, PreparedQueryResult result)
@@ -603,8 +597,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
if (wardenActive)
_worldSession->InitWarden(&account.SessionKey, account.OS);
- _queryCallback = std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1);
- _queryFuture = _worldSession->LoadPermissionsAsync();
+ _queryProcessor.AddQuery(_worldSession->LoadPermissionsAsync().WithPreparedCallback(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)));
AsyncRead();
}
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index b5f2dee2006..36ce6528beb 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -111,8 +111,7 @@ private:
MessageBuffer _packetBuffer;
MPSCQueue<EncryptablePacket> _bufferQueue;
- PreparedQueryResultFuture _queryFuture;
- std::function<void(PreparedQueryResult&&)> _queryCallback;
+ QueryCallbackProcessor _queryProcessor;
std::string _ipCountry;
};