void WorldSession::HandleBuyStableSlot(WorldPacket& recvData) { ObjectGuid npcGUID; recvData >> npcGUID; if (!CheckStableMaster(npcGUID)) { SendPetStableResult(STABLE_ERR_STABLE); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (GetPlayer()->m_stableSlots < MAX_PET_STABLES) { /*StableSlotPricesEntry const* SlotPrice = sStableSlotPricesStore.LookupEntry(GetPlayer()->m_stableSlots+1); if (_player->HasEnoughMoney(SlotPrice->Price)) { ++GetPlayer()->m_stableSlots; _player->ModifyMoney(-int32(SlotPrice->Price)); SendPetStableResult(STABLE_SUCCESS_BUY_SLOT); } else SendPetStableResult(STABLE_ERR_MONEY);*/ } else SendPetStableResult(STABLE_ERR_STABLE); }
void WorldSession::HandleStableSwapPet(WorldPacket& recvData) { ObjectGuid npcGUID; uint32 petId; recvData >> npcGUID >> petId; if (!CheckStableMaster(npcGUID)) { SendPetStableResult(STABLE_ERR_STABLE); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Pet* pet = _player->GetPet(); if (!pet || pet->getPetType() != HUNTER_PET) { SendPetStableResult(STABLE_ERR_STABLE); return; } // Find swapped pet slot in stable PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SLOT_BY_ID); stmt->setUInt64(0, _player->GetGUID().GetCounter()); stmt->setUInt32(1, petId); _stableSwapCallback.SetParam(petId); _stableSwapCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt)); }
void WorldSession::HandleStablePetCallback(PreparedQueryResult result) { if (!GetPlayer()) return; uint8 freeSlot = 1; if (result) { do { Field* fields = result->Fetch(); uint8 slot = fields[1].GetUInt8(); // slots ordered in query, and if not equal then free if (slot != freeSlot) break; // this slot not free, skip ++freeSlot; } while (result->NextRow()); } if (freeSlot > 0 && freeSlot <= GetPlayer()->m_stableSlots) { _player->RemovePet(_player->GetPet(), PetSaveMode(freeSlot)); SendPetStableResult(STABLE_SUCCESS_STABLE); } else SendPetStableResult(STABLE_ERR_INVALID_SLOT); }
void WorldSession::HandleUnstablePet(WorldPacket& recvData) { ObjectGuid npcGUID; uint32 petnumber; recvData >> npcGUID >> petnumber; if (!CheckStableMaster(npcGUID)) { SendPetStableResult(STABLE_ERR_STABLE); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_ENTRY); stmt->setUInt64(0, _player->GetGUID().GetCounter()); stmt->setUInt32(1, petnumber); stmt->setUInt8(2, PET_SAVE_FIRST_STABLE_SLOT); stmt->setUInt8(3, PET_SAVE_LAST_STABLE_SLOT); _unstablePetCallback.SetParam(petnumber); _unstablePetCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt)); }
void WorldSession::HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId) { if (!GetPlayer()) return; if (!result) { SendPetStableResult(STABLE_ERR_STABLE); return; } Field* fields = result->Fetch(); uint32 slot = fields[0].GetUInt8(); uint32 petEntry = fields[1].GetUInt32(); if (!petEntry) { SendPetStableResult(STABLE_ERR_STABLE); return; } CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(petEntry); if (!creatureInfo || !creatureInfo->IsTameable(true)) { SendPetStableResult(STABLE_ERR_STABLE); return; } if (!creatureInfo->IsTameable(_player->CanTameExoticPets())) { SendPetStableResult(STABLE_ERR_EXOTIC); return; } Pet* pet = _player->GetPet(); // The player's pet could have been removed during the delay of the DB callback if (!pet) { SendPetStableResult(STABLE_ERR_STABLE); return; } // move alive pet to slot or delete dead pet _player->RemovePet(pet, pet->IsAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED); // summon unstabled pet Pet* newPet = new Pet(_player); if (!newPet->LoadPetFromDB(_player, petEntry, petId)) { delete newPet; SendPetStableResult(STABLE_ERR_STABLE); } else SendPetStableResult(STABLE_SUCCESS_UNSTABLE); }
void WorldSession::HandleStablePet(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Recv CMSG_STABLE_PET"); ObjectGuid npcGUID; recvData >> npcGUID; if (!GetPlayer()->IsAlive()) { SendPetStableResult(STABLE_ERR_STABLE); return; } if (!CheckStableMaster(npcGUID)) { SendPetStableResult(STABLE_ERR_STABLE); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Pet* pet = _player->GetPet(); // can't place in stable dead pet if (!pet || !pet->IsAlive() || pet->getPetType() != HUNTER_PET) { SendPetStableResult(STABLE_ERR_STABLE); return; } PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SLOTS); stmt->setUInt64(0, _player->GetGUID().GetCounter()); stmt->setUInt8(1, PET_SAVE_FIRST_STABLE_SLOT); stmt->setUInt8(2, PET_SAVE_LAST_STABLE_SLOT); _stablePetCallback = CharacterDatabase.AsyncQuery(stmt); }
void WorldSession::HandleStablePet(WorldPacket& recvData) { ObjectGuid npcGUID; recvData >> npcGUID; if (!GetPlayer()->IsAlive()) { SendPetStableResult(STABLE_ERR_STABLE); return; } if (!CheckStableMaster(npcGUID)) { SendPetStableResult(STABLE_ERR_STABLE); return; } // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); Pet* pet = _player->GetPet(); // can't place in stable dead pet if (!pet || !pet->IsAlive() || pet->getPetType() != HUNTER_PET) { SendPetStableResult(STABLE_ERR_STABLE); return; } PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SLOTS); stmt->setUInt64(0, _player->GetGUID().GetCounter()); stmt->setUInt8(1, PET_SAVE_FIRST_STABLE_SLOT); stmt->setUInt8(2, PET_SAVE_LAST_STABLE_SLOT); _queryProcessor.AddQuery(CharacterDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSession::HandleStablePetCallback, this, std::placeholders::_1))); }
void WorldSession::HandleUnstablePetCallback(PreparedQueryResult result, uint32 petId) { if (!GetPlayer()) return; uint32 petEntry = 0; if (result) { Field* fields = result->Fetch(); petEntry = fields[0].GetUInt32(); } if (!petEntry) { SendPetStableResult(STABLE_ERR_STABLE); return; } CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(petEntry); if (!creatureInfo || !creatureInfo->IsTameable(_player->CanTameExoticPets())) { // if problem in exotic pet if (creatureInfo && creatureInfo->IsTameable(true)) SendPetStableResult(STABLE_ERR_EXOTIC); else SendPetStableResult(STABLE_ERR_STABLE); return; } Pet* pet = _player->GetPet(); if (pet && pet->IsAlive()) { SendPetStableResult(STABLE_ERR_STABLE); return; } // delete dead pet if (pet) _player->RemovePet(pet, PET_SAVE_AS_DELETED); Pet* newPet = new Pet(_player, HUNTER_PET); if (!newPet->LoadPetFromDB(_player, petEntry, petId)) { delete newPet; newPet = NULL; SendPetStableResult(STABLE_ERR_STABLE); return; } SendPetStableResult(STABLE_SUCCESS_UNSTABLE); }