mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[7644] Fixed pet slot values using in pet save.
Problem exist from client version switch when stable slot amount changed. In result this has been source problems with stable use (3-4 slots) and possible pet lost in some cases or "not save state" for summoned pets. Use enums to avoid repeating problem, use more safe value for not-in-slot save (for summoned pets) Fixed data preparing for MSG_LIST_STABLED_PETS.
This commit is contained in:
parent
34d69bbfdd
commit
263bf2ab22
9 changed files with 142 additions and 124 deletions
|
|
@ -475,7 +475,6 @@ void WorldSession::SendBindPoint(Creature *npc)
|
|||
_player->PlayerTalkClass->CloseGossip();
|
||||
}
|
||||
|
||||
//Need fix
|
||||
void WorldSession::HandleListStabledPetsOpcode( WorldPacket & recv_data )
|
||||
{
|
||||
CHECK_PACKET_SIZE(recv_data,8);
|
||||
|
|
@ -508,7 +507,9 @@ void WorldSession::SendStablePet(uint64 guid )
|
|||
|
||||
Pet *pet = _player->GetPet();
|
||||
|
||||
size_t wpos = data.wpos();
|
||||
data << uint8(0); // place holder for slot show number
|
||||
|
||||
data << uint8(GetPlayer()->m_stableSlots);
|
||||
|
||||
uint8 num = 0; // counter for place holder
|
||||
|
|
@ -520,12 +521,13 @@ void WorldSession::SendStablePet(uint64 guid )
|
|||
data << uint32(pet->GetEntry());
|
||||
data << uint32(pet->getLevel());
|
||||
data << pet->GetName(); // petname
|
||||
data << uint8(0x01); // flags?, client slot 1 == current pet (0)
|
||||
data << uint8(1); // 1 = current, 2/3 = in stable (any from 4,5,... create problems with proper show)
|
||||
++num;
|
||||
}
|
||||
|
||||
// 0 1 2 3 4 5
|
||||
QueryResult* result = CharacterDatabase.PQuery("SELECT owner, slot, id, entry, level, name FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 5",_player->GetGUIDLow());
|
||||
// 0 1 2 3 4
|
||||
QueryResult* result = CharacterDatabase.PQuery("SELECT owner, id, entry, level, name 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);
|
||||
|
||||
if(result)
|
||||
{
|
||||
|
|
@ -533,11 +535,11 @@ void WorldSession::SendStablePet(uint64 guid )
|
|||
{
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
data << uint32(fields[2].GetUInt32()); // petnumber
|
||||
data << uint32(fields[3].GetUInt32()); // creature entry
|
||||
data << uint32(fields[4].GetUInt32()); // level
|
||||
data << fields[5].GetString(); // name
|
||||
data << uint8(fields[1].GetUInt32()+1); // slot
|
||||
data << uint32(fields[1].GetUInt32()); // petnumber
|
||||
data << uint32(fields[2].GetUInt32()); // creature entry
|
||||
data << uint32(fields[3].GetUInt32()); // level
|
||||
data << fields[4].GetString(); // name
|
||||
data << uint8(2); // 1 = current, 2/3 = in stable (any from 4,5,... create problems with proper show)
|
||||
|
||||
++num;
|
||||
}while( result->NextRow() );
|
||||
|
|
@ -545,7 +547,7 @@ void WorldSession::SendStablePet(uint64 guid )
|
|||
delete result;
|
||||
}
|
||||
|
||||
data.put<uint8>(8, num); // set real data to placeholder
|
||||
data.put<uint8>(wpos, num); // set real data to placeholder
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
|
|
@ -586,7 +588,8 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data )
|
|||
|
||||
uint32 free_slot = 1;
|
||||
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 5 ORDER BY slot ",_player->GetGUIDLow());
|
||||
QueryResult *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);
|
||||
if(result)
|
||||
{
|
||||
do
|
||||
|
|
@ -595,8 +598,12 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data )
|
|||
|
||||
uint32 slot = fields[1].GetUInt32();
|
||||
|
||||
if(slot==free_slot) // this slot not free
|
||||
++free_slot;
|
||||
// slots ordered in query, and if not equal then free
|
||||
if(slot!=free_slot)
|
||||
break;
|
||||
|
||||
// this slot not free, skip
|
||||
++free_slot;
|
||||
}while( result->NextRow() );
|
||||
}
|
||||
delete result;
|
||||
|
|
@ -638,8 +645,7 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data )
|
|||
Pet* pet = _player->GetPet();
|
||||
if(pet && pet->isAlive())
|
||||
{
|
||||
uint8 i = 0x06;
|
||||
data << uint8(i);
|
||||
data << uint8(0x06);
|
||||
SendPacket(&data);
|
||||
return;
|
||||
}
|
||||
|
|
@ -650,7 +656,8 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data )
|
|||
|
||||
Pet *newpet = NULL;
|
||||
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot > 0 AND slot < 5",_player->GetGUIDLow(),petnumber);
|
||||
QueryResult *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();
|
||||
|
|
@ -694,7 +701,7 @@ void WorldSession::HandleBuyStableSlot( WorldPacket & recv_data )
|
|||
|
||||
WorldPacket data(SMSG_STABLE_RESULT, 200);
|
||||
|
||||
if(GetPlayer()->m_stableSlots < 4) // max slots amount = 4
|
||||
if(GetPlayer()->m_stableSlots < MAX_PET_STABLES)
|
||||
{
|
||||
StableSlotPricesEntry const *SlotPrice = sStableSlotPricesStore.LookupEntry(GetPlayer()->m_stableSlots+1);
|
||||
if(_player->GetMoney() >= SlotPrice->Price)
|
||||
|
|
@ -746,7 +753,8 @@ void WorldSession::HandleStableSwapPet( WorldPacket & recv_data )
|
|||
return;
|
||||
|
||||
// find swapped pet slot in stable
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT slot,entry FROM character_pet WHERE owner = '%u' AND id = '%u'",_player->GetGUIDLow(),pet_number);
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT slot,entry FROM character_pet WHERE owner = '%u' AND id = '%u'",
|
||||
_player->GetGUIDLow(),pet_number);
|
||||
if(!result)
|
||||
return;
|
||||
|
||||
|
|
@ -756,7 +764,7 @@ void WorldSession::HandleStableSwapPet( WorldPacket & recv_data )
|
|||
uint32 petentry = fields[1].GetUInt32();
|
||||
delete result;
|
||||
|
||||
// move alive pet to slot or delele dead pet
|
||||
// move alive pet to slot or delete dead pet
|
||||
_player->RemovePet(pet,pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED);
|
||||
|
||||
// summon unstabled pet
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue