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;
}
uint32 free_slot = 1;
QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot >= '%u' AND slot <= '%u' ORDER BY slot ",
m_stablePetCallback = CharacterDatabase.AsyncPQuery("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);
}
void WorldSession::HandleStablePetCallback(QueryResult_AutoPtr result)
{
uint32 free_slot = 1;
if (result)
{
do
@@ -631,13 +635,14 @@ void WorldSession::HandleStablePet(WorldPacket & recv_data)
// this slot not free, skip
++free_slot;
}while (result->NextRow());
}
while (result->NextRow());
}
WorldPacket data(SMSG_STABLE_RESULT, 1);
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);
}
else
@@ -662,17 +667,21 @@ void WorldSession::HandleUnstablePet(WorldPacket & recv_data)
if (GetPlayer()->hasUnitState(UNIT_STAT_DIED))
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)
{
QueryResult_AutoPtr result = CharacterDatabase.PQuery("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);
uint32 creature_id = 0;
if (result)
{
Field *fields = result->Fetch();
creature_id = fields[0].GetUInt32();
}
}
if (!creature_id)
{
@@ -779,8 +788,15 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data)
}
// find swapped pet slot in stable
QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT slot,entry FROM character_pet WHERE owner = '%u' AND id = '%u'",
_player->GetGUIDLow(),pet_number);
m_stableSwapCallback.SetParam(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)
{
SendStableResult(STABLE_ERR_STABLE);
@@ -810,11 +826,13 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data)
}
// move alive pet to slot or delete dead pet
Pet* pet = _player->GetPet();
_player->RemovePet(pet, pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED);
// summon unstabled pet
Pet *newpet = new Pet(_player);
if (!newpet->LoadPetFromDB(_player,creature_id,pet_number))
if (!newpet->LoadPetFromDB(_player,creature_id, petnumber))
{
delete newpet;
SendStableResult(STABLE_ERR_STABLE);
+26
View File
@@ -1024,4 +1024,30 @@ void WorldSession::ProcessQueryCallbacks()
SendStablePetCallback(result, param);
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 HandleListStabledPetsOpcode(WorldPacket& recvPacket);
void HandleStablePet(WorldPacket& recvPacket);
void HandleStablePetCallback(QueryResult_AutoPtr result);
void HandleUnstablePet(WorldPacket& recvPacket);
void HandleUnstablePetCallback(QueryResult_AutoPtr result, uint32 petnumber);
void HandleBuyStableSlot(WorldPacket& recvPacket);
void HandleStableRevivePet(WorldPacket& recvPacket);
void HandleStableSwapPet(WorldPacket& recvPacket);
void HandleStableSwapPetCallback(QueryResult_AutoPtr result, uint32 petnumber);
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
@@ -804,8 +807,11 @@ class WorldSession
ACE_Future_Set<QueryResult_AutoPtr> m_nameQueryCallbacks;
QueryResultFuture m_charEnumCallback;
QueryResultFuture m_addIgnoreCallback;
QueryResultFuture m_stablePetCallback;
QueryCallback<std::string> m_charRenameCallback;
QueryCallback<std::string> m_addFriendCallback;
QueryCallback<uint32> m_unstablePetCallback;
QueryCallback<uint32> m_stableSwapCallback;
QueryCallback<uint64> m_sendStabledPetCallback;
QueryResultHolderFuture m_charLoginCallback;