diff options
author | Discover- <amort11@hotmail.com> | 2011-12-25 01:30:18 +0100 |
---|---|---|
committer | Discover- <amort11@hotmail.com> | 2011-12-25 01:30:18 +0100 |
commit | e40365297343ddd0d66a600908ffefe9255390f6 (patch) | |
tree | a5b5cd5a87bceef868f867166d084bf9874246b6 /src | |
parent | 0a112a2f45c5d021af4414fec717f1a0362a36e4 (diff) | |
parent | 08bd2f1a54c1041f9f090462e12492a116650da8 (diff) |
Merge branch 'master' of https://github.com/TrinityCore/TrinityCore
Diffstat (limited to 'src')
5 files changed, 60 insertions, 46 deletions
diff --git a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp index 92f4a0380f9..28724d630bd 100755 --- a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp @@ -519,14 +519,17 @@ void WorldSession::HandleListStabledPetsOpcode(WorldPacket & recv_data) void WorldSession::SendStablePet(uint64 guid) { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_PET_SLOTS_DETAIL); + + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt8(1, PET_SAVE_FIRST_STABLE_SLOT); + stmt->setUInt8(2, PET_SAVE_LAST_STABLE_SLOT); + _sendStabledPetCallback.SetParam(guid); - _sendStabledPetCallback.SetFutureResult( - CharacterDatabase.AsyncPQuery("SELECT owner, id, entry, level, name FROM character_pet WHERE owner = '%u' AND slot >= '%u' AND slot <= '%u' ORDER BY slot", - _player->GetGUIDLow(), PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT) - ); + _sendStabledPetCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt)); } -void WorldSession::SendStablePetCallback(QueryResult result, uint64 guid) +void WorldSession::SendStablePetCallback(PreparedQueryResult result, uint64 guid) { if (!GetPlayer()) return; @@ -679,14 +682,18 @@ void WorldSession::HandleUnstablePet(WorldPacket & recv_data) if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_PET_ENTRY); + + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt32(1, petnumber); + stmt->setUInt8(2, PET_SAVE_FIRST_STABLE_SLOT); + stmt->setUInt8(3, PET_SAVE_LAST_STABLE_SLOT); + _unstablePetCallback.SetParam(petnumber); - _unstablePetCallback.SetFutureResult( - CharacterDatabase.AsyncPQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot >='%u' AND slot <= '%u'", - _player->GetGUIDLow(), petnumber, PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT) - ); + _unstablePetCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt)); } -void WorldSession::HandleUnstablePetCallback(QueryResult result, uint32 petnumber) +void WorldSession::HandleUnstablePetCallback(PreparedQueryResult result, uint32 petnumber) { if (!GetPlayer()) return; @@ -780,9 +787,9 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recv CMSG_STABLE_SWAP_PET."); uint64 npcGUID; - uint32 pet_number; + uint32 petId; - recv_data >> npcGUID >> pet_number; + recv_data >> npcGUID >> petId; if (!CheckStableMaster(npcGUID)) { @@ -802,15 +809,18 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data) return; } - // find swapped pet slot in stable - _stableSwapCallback.SetParam(pet_number); - _stableSwapCallback.SetFutureResult( - CharacterDatabase.AsyncPQuery("SELECT slot, entry FROM character_pet WHERE owner = '%u' AND id = '%u'", - _player->GetGUIDLow(), pet_number) - ); + // Find swapped pet slot in stable + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_PET_SLOT_BY_ID); + + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt32(1, petId); + + _stableSwapCallback.SetParam(petId); + _stableSwapCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt)); } -void WorldSession::HandleStableSwapPetCallback(QueryResult result, uint32 petnumber) +void WorldSession::HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId) { if (!GetPlayer()) return; @@ -823,16 +833,16 @@ void WorldSession::HandleStableSwapPetCallback(QueryResult result, uint32 petnum Field* fields = result->Fetch(); - uint32 slot = fields[0].GetUInt8(); - uint32 creature_id = fields[1].GetUInt32(); + uint32 slot = fields[0].GetUInt8(); + uint32 petEntry = fields[1].GetUInt32(); - if (!creature_id) + if (!petEntry) { SendStableResult(STABLE_ERR_STABLE); return; } - CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creature_id); + CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(petEntry); if (!creatureInfo || !creatureInfo->isTameable(_player->CanTameExoticPets())) { // if problem in exotic pet @@ -850,7 +860,7 @@ void WorldSession::HandleStableSwapPetCallback(QueryResult result, uint32 petnum // summon unstabled pet Pet* newpet = new Pet(_player); - if (!newpet->LoadPetFromDB(_player, creature_id, petnumber)) + if (!newpet->LoadPetFromDB(_player, petEntry, petId)) { delete newpet; SendStableResult(STABLE_ERR_STABLE); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 54d477abf69..35173387839 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -231,7 +231,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) //! delayed packets that were re-enqueued due to improper timing. To prevent an infinite //! loop caused by re-enqueueing the same packets over and over again, we stop updating this session //! and continue updating others. The re-enqueued packets will be handled in the next Update call for this session. - while (m_Socket && !m_Socket->IsClosed() && + while (m_Socket && !m_Socket->IsClosed() && !_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket && _recvQueue.next(packet, updater)) { @@ -1008,22 +1008,20 @@ void WorldSession::InitializeQueryCallbackParameters() void WorldSession::ProcessQueryCallbacks() { - QueryResult result; - PreparedQueryResult result2; + PreparedQueryResult result; //! HandleCharEnumOpcode if (_charEnumCallback.ready()) { - _charEnumCallback.get(result2); - HandleCharEnum(result2); + _charEnumCallback.get(result); + HandleCharEnum(result); _charEnumCallback.cancel(); } if (_charCreateCallback.IsReady()) { - PreparedQueryResult pResult; - _charCreateCallback.GetResult(pResult); - HandleCharCreateCallback(pResult, _charCreateCallback.GetParam()); + _charCreateCallback.GetResult(result); + HandleCharCreateCallback(result, _charCreateCallback.GetParam()); // Don't call FreeResult() here, the callback handler will do that depending on the events in the callback chain } @@ -1040,8 +1038,8 @@ void WorldSession::ProcessQueryCallbacks() if (_addFriendCallback.IsReady()) { std::string param = _addFriendCallback.GetParam(); - _addFriendCallback.GetResult(result2); - HandleAddFriendOpcodeCallBack(result2, param); + _addFriendCallback.GetResult(result); + HandleAddFriendOpcodeCallBack(result, param); _addFriendCallback.FreeResult(); } @@ -1049,16 +1047,16 @@ void WorldSession::ProcessQueryCallbacks() if (_charRenameCallback.IsReady()) { std::string param = _charRenameCallback.GetParam(); - _charRenameCallback.GetResult(result2); - HandleChangePlayerNameOpcodeCallBack(result2, param); + _charRenameCallback.GetResult(result); + HandleChangePlayerNameOpcodeCallBack(result, param); _charRenameCallback.FreeResult(); } //- HandleCharAddIgnoreOpcode if (_addIgnoreCallback.ready()) { - _addIgnoreCallback.get(result2); - HandleAddIgnoreOpcodeCallBack(result2); + _addIgnoreCallback.get(result); + HandleAddIgnoreOpcodeCallBack(result); _addIgnoreCallback.cancel(); } @@ -1074,8 +1072,8 @@ void WorldSession::ProcessQueryCallbacks() //- HandleStablePet if (_stablePetCallback.ready()) { - _stablePetCallback.get(result2); - HandleStablePetCallback(result2); + _stablePetCallback.get(result); + HandleStablePetCallback(result); _stablePetCallback.cancel(); } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index d1f607704b9..45cb5b64e43 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -301,7 +301,7 @@ class WorldSession // Pet void SendPetNameQuery(uint64 guid, uint32 petnumber); void SendStablePet(uint64 guid); - void SendStablePetCallback(QueryResult result, uint64 guid); + void SendStablePetCallback(PreparedQueryResult result, uint64 guid); void SendStableResult(uint8 guid); bool CheckStableMaster(uint64 guid); @@ -587,11 +587,11 @@ class WorldSession void HandleStablePet(WorldPacket& recvPacket); void HandleStablePetCallback(PreparedQueryResult result); void HandleUnstablePet(WorldPacket& recvPacket); - void HandleUnstablePetCallback(QueryResult result, uint32 petnumber); + void HandleUnstablePetCallback(PreparedQueryResult result, uint32 petnumber); void HandleBuyStableSlot(WorldPacket& recvPacket); void HandleStableRevivePet(WorldPacket& recvPacket); void HandleStableSwapPet(WorldPacket& recvPacket); - void HandleStableSwapPetCallback(QueryResult result, uint32 petnumber); + void HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId); void HandleDuelAcceptedOpcode(WorldPacket& recvPacket); void HandleDuelCancelledOpcode(WorldPacket& recvPacket); @@ -898,9 +898,9 @@ class WorldSession PreparedQueryResultFuture _stablePetCallback; QueryCallback<PreparedQueryResult, std::string> _charRenameCallback; QueryCallback<PreparedQueryResult, std::string> _addFriendCallback; - QueryCallback<QueryResult, uint32> _unstablePetCallback; - QueryCallback<QueryResult, uint32> _stableSwapCallback; - QueryCallback<QueryResult, uint64> _sendStabledPetCallback; + QueryCallback<PreparedQueryResult, uint32> _unstablePetCallback; + QueryCallback<PreparedQueryResult, uint32> _stableSwapCallback; + QueryCallback<PreparedQueryResult, uint64> _sendStabledPetCallback; QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback; QueryResultHolderFuture _charLoginCallback; diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 0cbf4f8f4b4..2cc850f7f1d 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -39,6 +39,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_GET_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_GET_PET_SLOTS_DETAIL, "SELECT owner, id, entry, level, name FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_GET_PET_ENTRY, "SELECT entry FROM character_pet WHERE owner = ? AND id = ? AND slot >= ? AND slot <= ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_GET_PET_SLOT_BY_ID, "SELECT slot, entry FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_ASYNC); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index a9464aed34f..9d2fb4204f3 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -59,6 +59,9 @@ enum CharacterDatabaseStatements CHAR_GET_ENUM, CHAR_GET_ENUM_DECLINED_NAME, CHAR_GET_PET_SLOTS, + CHAR_GET_PET_SLOTS_DETAIL, + CHAR_GET_PET_ENTRY, + CHAR_GET_PET_SLOT_BY_ID, CHAR_GET_FREE_NAME, CHAR_GET_GUID_RACE_ACC_BY_NAME, CHAR_LOAD_PLAYER, |