aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/server/game/Server/Protocol/Handlers/NPCHandler.cpp52
-rw-r--r--src/server/game/Server/WorldSession.cpp26
-rw-r--r--src/server/game/Server/WorldSession.h6
3 files changed, 67 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);
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index f77b1c0e2c8..f68cf739947 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -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();
+ }
}
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index b19cfea9f5e..ccc97fad75b 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -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;