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:
Machiavelli
2010-08-25 21:03:28 +02:00
parent 91ebad0016
commit bb5f7b6492
3 changed files with 67 additions and 17 deletions
@@ -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);
+26
View File
@@ -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();
}
} }
+6
View File
@@ -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;