void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket) { CHECK_PACKET_SIZE(recvPacket,8); sLog.outDetail("CMSG_PET_UNLEARN"); uint64 guid; recvPacket >> guid; Pet* pet = _player->GetPet(); if(!pet || pet->getPetType() != HUNTER_PET || pet->m_spells.size() <= 1) return; if(guid != pet->GetGUID()) { sLog.outError( "HandlePetUnlearnOpcode.Pet %u isn't pet of player %s .\n", uint32(GUID_LOPART(guid)),GetPlayer()->GetName() ); return; } CharmInfo *charmInfo = pet->GetCharmInfo(); if(!charmInfo) { sLog.outError("WorldSession::HandlePetUnlearnOpcode: object "I64FMTD" is considered pet-like but doesn't have a charminfo!", pet->GetGUID()); return; } uint32 cost = pet->resetTalentsCost(); if (GetPlayer()->GetMoney() < cost) { GetPlayer()->SendBuyError( BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); return; } for(PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end();) { uint32 spell_id = itr->first; // Pet::removeSpell can invalidate iterator at erase NEW spell ++itr; pet->removeSpell(spell_id); } pet->SetTP(pet->getLevel() * (pet->GetLoyaltyLevel() - 1)); for(uint8 i = 0; i < 10; i++) { if(charmInfo->GetActionBarEntry(i)->SpellOrAction && charmInfo->GetActionBarEntry(i)->Type == ACT_ENABLED || charmInfo->GetActionBarEntry(i)->Type == ACT_DISABLED) charmInfo->GetActionBarEntry(i)->SpellOrAction = 0; } // relearn pet passives pet->LearnPetPassives(); pet->m_resetTalentsTime = time(NULL); pet->m_resetTalentsCost = cost; GetPlayer()->ModifyMoney(-(int32)cost); GetPlayer()->PetSpellInitialize(); }
void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket) { DETAIL_LOG("CMSG_PET_UNLEARN"); ObjectGuid guid; recvPacket >> guid; // Pet guid Pet* pet = _player->GetPet(); if (!pet || guid != pet->GetObjectGuid()) { sLog.outError("HandlePetUnlearnOpcode. %s isn't pet of %s .", guid.GetString().c_str(), _player->GetGuidStr().c_str()); return; } if (pet->getPetType() != HUNTER_PET || pet->m_spells.size() <= 1) return; CharmInfo* charmInfo = pet->GetCharmInfo(); if (!charmInfo) { sLog.outError("WorldSession::HandlePetUnlearnOpcode: %s is considered pet-like but doesn't have a charminfo!", pet->GetGuidStr().c_str()); return; } uint32 cost = pet->resetTalentsCost(); if (_player->GetMoney() < cost) { _player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); return; } for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end();) { uint32 spell_id = itr->first; // Pet::removeSpell can invalidate iterator at erase NEW spell ++itr; pet->unlearnSpell(spell_id, false); } pet->SetTP(pet->getLevel() * (pet->GetLoyaltyLevel() - 1)); for (int i = 0; i < MAX_UNIT_ACTION_BAR_INDEX; ++i) if (UnitActionBarEntry const* ab = charmInfo->GetActionBarEntry(i)) if (ab->GetAction() && ab->IsActionBarForSpell()) charmInfo->SetActionBar(i, 0, ACT_DISABLED); // relearn pet passives pet->LearnPetPassives(); pet->m_resetTalentsTime = time(nullptr); pet->m_resetTalentsCost = cost; _player->ModifyMoney(-(int32)cost); _player->PetSpellInitialize(); }
void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket) { sLog.outDetail("CMSG_PET_UNLEARN"); uint64 guid; recvPacket >> guid; Pet* pet = _player->GetPet(); if(!pet || pet->getPetType() != HUNTER_PET || pet->m_spells.size() <= 1) return; if(guid != pet->GetGUID()) { sLog.outError( "HandlePetUnlearnOpcode.Pet %u isn't pet of player %s .", uint32(GUID_LOPART(guid)),GetPlayer()->GetName() ); return; } CharmInfo *charmInfo = pet->GetCharmInfo(); if(!charmInfo) { sLog.outError("WorldSession::HandlePetUnlearnOpcode: object (GUID: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!", pet->GetGUIDLow(), pet->GetTypeId()); return; } uint32 cost = pet->resetTalentsCost(); if (GetPlayer()->GetMoney() < cost) { GetPlayer()->SendBuyError( BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); return; } for(PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end();) { uint32 spell_id = itr->first; // Pet::removeSpell can invalidate iterator at erase NEW spell ++itr; pet->unlearnSpell(spell_id,false); } pet->SetTP(pet->getLevel() * (pet->GetLoyaltyLevel() - 1)); for(int i = 0; i < MAX_UNIT_ACTION_BAR_INDEX; ++i) if(UnitActionBarEntry const* ab = charmInfo->GetActionBarEntry(i)) if(ab->GetAction() && ab->IsActionBarForSpell()) charmInfo->SetActionBar(i,0,ACT_DISABLED); // relearn pet passives pet->LearnPetPassives(); pet->m_resetTalentsTime = time(NULL); pet->m_resetTalentsCost = cost; GetPlayer()->ModifyMoney(-(int32)cost); GetPlayer()->PetSpellInitialize(); }
void WorldSession::SendStablePet(uint64 guid) { sLog->outDebug("WORLD: Recv MSG_LIST_STABLED_PETS Send."); WorldPacket data(MSG_LIST_STABLED_PETS, 200); // guess size data << uint64 (guid); Pet *pet = _player->GetPet(); data << uint8(0); // place holder for slot show number data << uint8(GetPlayer()->m_stableSlots); uint8 num = 0; // counter for place holder // not let move dead pet in slot if (pet && pet->isAlive() && pet->getPetType() == HUNTER_PET) { data << uint32(pet->GetCharmInfo()->GetPetNumber()); data << uint32(pet->GetEntry()); data << uint32(pet->getLevel()); data << pet->GetName(); // petname data << uint32(pet->GetLoyaltyLevel()); // loyalty data << uint8(0x01); // client slot 1 == current pet (0) ++num; } // 0 1 2 3 4 5 6 QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT owner, slot, id, entry, level, loyalty, name FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 3", _player->GetGUIDLow()); if (result) { do { 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[6].GetString(); // name data << uint32(fields[5].GetUInt32()); // loyalty data << uint8(fields[1].GetUInt32()+1); // slot ++num; }while (result->NextRow()); } data.put<uint8>(8, num); // set real data to placeholder SendPacket(&data); }