More async queries in stable master opcode handlers instead of blocking queries
Please report any issues that pop up. --HG-- branch : trunk
This commit is contained in:
@@ -613,10 +613,14 @@ void WorldSession::HandleStablePet(WorldPacket & recv_data)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 free_slot = 1;
|
m_stablePetCallback = CharacterDatabase.AsyncPQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot >= '%u' AND slot <= '%u' ORDER BY slot ",
|
||||||
|
|
||||||
QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT owner,slot,id 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);
|
_player->GetGUIDLow(),PET_SAVE_FIRST_STABLE_SLOT,PET_SAVE_LAST_STABLE_SLOT);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldSession::HandleStablePetCallback(QueryResult_AutoPtr result)
|
||||||
|
{
|
||||||
|
uint32 free_slot = 1;
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
@@ -631,13 +635,14 @@ void WorldSession::HandleStablePet(WorldPacket & recv_data)
|
|||||||
|
|
||||||
// this slot not free, skip
|
// this slot not free, skip
|
||||||
++free_slot;
|
++free_slot;
|
||||||
}while (result->NextRow());
|
}
|
||||||
|
while (result->NextRow());
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldPacket data(SMSG_STABLE_RESULT, 1);
|
WorldPacket data(SMSG_STABLE_RESULT, 1);
|
||||||
if (free_slot > 0 && free_slot <= GetPlayer()->m_stableSlots)
|
if (free_slot > 0 && free_slot <= GetPlayer()->m_stableSlots)
|
||||||
{
|
{
|
||||||
_player->RemovePet(pet,PetSaveMode(free_slot));
|
_player->RemovePet(_player->GetPet(), PetSaveMode(free_slot));
|
||||||
SendStableResult(STABLE_SUCCESS_STABLE);
|
SendStableResult(STABLE_SUCCESS_STABLE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -662,16 +667,20 @@ void WorldSession::HandleUnstablePet(WorldPacket & recv_data)
|
|||||||
if (GetPlayer()->hasUnitState(UNIT_STAT_DIED))
|
if (GetPlayer()->hasUnitState(UNIT_STAT_DIED))
|
||||||
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
|
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
|
||||||
|
|
||||||
uint32 creature_id = 0;
|
m_unstablePetCallback.SetParam(petnumber);
|
||||||
|
m_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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldSession::HandleUnstablePetCallback(QueryResult_AutoPtr result, uint32 petnumber)
|
||||||
|
{
|
||||||
|
uint32 creature_id = 0;
|
||||||
|
if (result)
|
||||||
{
|
{
|
||||||
QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot >='%u' AND slot <= '%u'",
|
Field *fields = result->Fetch();
|
||||||
_player->GetGUIDLow(),petnumber,PET_SAVE_FIRST_STABLE_SLOT,PET_SAVE_LAST_STABLE_SLOT);
|
creature_id = fields[0].GetUInt32();
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
Field *fields = result->Fetch();
|
|
||||||
creature_id = fields[0].GetUInt32();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!creature_id)
|
if (!creature_id)
|
||||||
@@ -779,8 +788,15 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// find swapped pet slot in stable
|
// find swapped pet slot in stable
|
||||||
QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT slot,entry FROM character_pet WHERE owner = '%u' AND id = '%u'",
|
m_stableSwapCallback.SetParam(pet_number);
|
||||||
_player->GetGUIDLow(),pet_number);
|
m_stableSwapCallback.SetFutureResult(
|
||||||
|
CharacterDatabase.PQuery("SELECT slot,entry FROM character_pet WHERE owner = '%u' AND id = '%u'",
|
||||||
|
_player->GetGUIDLow(), pet_number)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldSession::HandleStableSwapPetCallback(QueryResult_AutoPtr result, uint32 petnumber)
|
||||||
|
{
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
SendStableResult(STABLE_ERR_STABLE);
|
SendStableResult(STABLE_ERR_STABLE);
|
||||||
@@ -810,11 +826,13 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// move alive pet to slot or delete dead pet
|
// move alive pet to slot or delete dead pet
|
||||||
_player->RemovePet(pet,pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED);
|
Pet* pet = _player->GetPet();
|
||||||
|
|
||||||
|
_player->RemovePet(pet, pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED);
|
||||||
|
|
||||||
// summon unstabled pet
|
// summon unstabled pet
|
||||||
Pet *newpet = new Pet(_player);
|
Pet *newpet = new Pet(_player);
|
||||||
if (!newpet->LoadPetFromDB(_player,creature_id,pet_number))
|
if (!newpet->LoadPetFromDB(_player,creature_id, petnumber))
|
||||||
{
|
{
|
||||||
delete newpet;
|
delete newpet;
|
||||||
SendStableResult(STABLE_ERR_STABLE);
|
SendStableResult(STABLE_ERR_STABLE);
|
||||||
|
|||||||
@@ -1024,4 +1024,30 @@ void WorldSession::ProcessQueryCallbacks()
|
|||||||
SendStablePetCallback(result, param);
|
SendStablePetCallback(result, param);
|
||||||
m_sendStabledPetCallback.FreeResult();
|
m_sendStabledPetCallback.FreeResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- HandleStablePet
|
||||||
|
if (m_stablePetCallback.ready())
|
||||||
|
{
|
||||||
|
m_stablePetCallback.get(result);
|
||||||
|
HandleStablePetCallback(result);
|
||||||
|
m_stablePetCallback.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- HandleUnstablePet
|
||||||
|
if (m_unstablePetCallback.IsReady())
|
||||||
|
{
|
||||||
|
uint32 param = m_unstablePetCallback.GetParam();
|
||||||
|
m_unstablePetCallback.GetResult(result);
|
||||||
|
HandleUnstablePetCallback(result, param);
|
||||||
|
m_unstablePetCallback.FreeResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- HandleStableSwapPet
|
||||||
|
if (m_stableSwapCallback.IsReady())
|
||||||
|
{
|
||||||
|
uint32 param = m_stableSwapCallback.GetParam();
|
||||||
|
m_stableSwapCallback.GetResult(result);
|
||||||
|
HandleStableSwapPetCallback(result, param);
|
||||||
|
m_stableSwapCallback.FreeResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -508,10 +508,13 @@ class WorldSession
|
|||||||
void HandleBinderActivateOpcode(WorldPacket& recvPacket);
|
void HandleBinderActivateOpcode(WorldPacket& recvPacket);
|
||||||
void HandleListStabledPetsOpcode(WorldPacket& recvPacket);
|
void HandleListStabledPetsOpcode(WorldPacket& recvPacket);
|
||||||
void HandleStablePet(WorldPacket& recvPacket);
|
void HandleStablePet(WorldPacket& recvPacket);
|
||||||
|
void HandleStablePetCallback(QueryResult_AutoPtr result);
|
||||||
void HandleUnstablePet(WorldPacket& recvPacket);
|
void HandleUnstablePet(WorldPacket& recvPacket);
|
||||||
|
void HandleUnstablePetCallback(QueryResult_AutoPtr result, uint32 petnumber);
|
||||||
void HandleBuyStableSlot(WorldPacket& recvPacket);
|
void HandleBuyStableSlot(WorldPacket& recvPacket);
|
||||||
void HandleStableRevivePet(WorldPacket& recvPacket);
|
void HandleStableRevivePet(WorldPacket& recvPacket);
|
||||||
void HandleStableSwapPet(WorldPacket& recvPacket);
|
void HandleStableSwapPet(WorldPacket& recvPacket);
|
||||||
|
void HandleStableSwapPetCallback(QueryResult_AutoPtr result, uint32 petnumber);
|
||||||
|
|
||||||
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
|
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
|
||||||
void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
|
void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
|
||||||
@@ -804,8 +807,11 @@ class WorldSession
|
|||||||
ACE_Future_Set<QueryResult_AutoPtr> m_nameQueryCallbacks;
|
ACE_Future_Set<QueryResult_AutoPtr> m_nameQueryCallbacks;
|
||||||
QueryResultFuture m_charEnumCallback;
|
QueryResultFuture m_charEnumCallback;
|
||||||
QueryResultFuture m_addIgnoreCallback;
|
QueryResultFuture m_addIgnoreCallback;
|
||||||
|
QueryResultFuture m_stablePetCallback;
|
||||||
QueryCallback<std::string> m_charRenameCallback;
|
QueryCallback<std::string> m_charRenameCallback;
|
||||||
QueryCallback<std::string> m_addFriendCallback;
|
QueryCallback<std::string> m_addFriendCallback;
|
||||||
|
QueryCallback<uint32> m_unstablePetCallback;
|
||||||
|
QueryCallback<uint32> m_stableSwapCallback;
|
||||||
QueryCallback<uint64> m_sendStabledPetCallback;
|
QueryCallback<uint64> m_sendStabledPetCallback;
|
||||||
QueryResultHolderFuture m_charLoginCallback;
|
QueryResultHolderFuture m_charLoginCallback;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user