diff options
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 91 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 46 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.h | 3 |
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; }; |
