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(), GetPlayer()->GetGuidStr().c_str()); return; } if (pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0) 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; } pet->resetTalents(); _player->SendTalentsInfoData(true); }
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(); }