aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server/Protocol
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-08-25 21:03:28 +0200
committerMachiavelli <none@none>2010-08-25 21:03:28 +0200
commitbb5f7b64927713911331f81f9c0a5abc33e0c3ab (patch)
tree976f2ec685f066cc3540acd6ba01472eeb3de5ed /src/server/game/Server/Protocol
parent91ebad0016d102ee9a10c5804ace08b41e6ac4e2 (diff)
More async queries in stable master opcode handlers instead of blocking queries
Please report any issues that pop up. --HG-- branch : trunk
Diffstat (limited to 'src/server/game/Server/Protocol')
-rw-r--r--src/server/game/Server/Protocol/Handlers/NPCHandler.cpp52
1 files changed, 35 insertions, 17 deletions
diff --git a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
index 0619b98684e..aa05a964ebe 100644
--- a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
@@ -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,16 +667,20 @@ 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)
+{
+ 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'",
- _player->GetGUIDLow(),petnumber,PET_SAVE_FIRST_STABLE_SLOT,PET_SAVE_LAST_STABLE_SLOT);
- if (result)
- {
- Field *fields = result->Fetch();
- creature_id = fields[0].GetUInt32();
- }
+ 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
- _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
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);