diff options
author | ForesterDev <11771800+ForesterDev@users.noreply.github.com> | 2020-05-10 17:25:08 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-10 16:25:08 +0200 |
commit | 6caba625721c94f08488dae466bc6c5862f23935 (patch) | |
tree | 77f94cbb32b062091362ff93fb4529a78f0ea3bd /src | |
parent | 34fecde022e6e2a228111ee79a0e9f5f8a7bed12 (diff) |
Core/PacketIO: updated some pet packets (#24531)
* Core/PacketIO: Updated and enabled CMSG_PET_ABANDON
(cherry picked from commit 0b763812833be6802bcc63955d9b4531268960e7)
# Conflicts:
# src/server/game/Handlers/PetHandler.cpp
# src/server/game/Server/Packets/PetPackets.h
# src/server/game/Server/Protocol/Opcodes.cpp
# src/server/game/Server/WorldSession.h
* Core/PacketIO: Updated and enabled CMSG_PET_STOP_ATTACK
(cherry picked from commit dea718e4ed89cf6006c5456c4fec82e0ceac6536)
# Conflicts:
# src/server/game/Handlers/PetHandler.cpp
# src/server/game/Server/Packets/PetPackets.h
# src/server/game/Server/Protocol/Opcodes.cpp
# src/server/game/Server/WorldSession.h
* Core/PacketIO: Updated and enabled CMSG_PET_SPELL_AUTOCAST
(cherry picked from commit 1f8268c89c73312faff67e3b2d271bfec0ccefc3)
# Conflicts:
# src/server/game/Handlers/PetHandler.cpp
# src/server/game/Server/Packets/PetPackets.h
# src/server/game/Server/Protocol/Opcodes.cpp
# src/server/game/Server/WorldSession.h
* Core/PacketIO: Updated SMSG_PET_LEARNED_SPELL
* Core/PacketIO: Updated SMSG_PET_UNLEARNED_SPELL
* fix build
* Remove whitespaces
* Unify naming for PetGUID
* Initialize variables
Co-authored-by: Carbenium <carbenium@outlook.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Handlers/PetHandler.cpp | 63 | ||||
-rwxr-xr-x | src/server/game/Server/Packets/PetPackets.cpp | 29 | ||||
-rwxr-xr-x | src/server/game/Server/Packets/PetPackets.h | 52 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 9 |
7 files changed, 129 insertions, 65 deletions
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index dd25348d517..2685fa1ae57 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -23,6 +23,7 @@ #include "InstanceScript.h" #include "Log.h" #include "ObjectMgr.h" +#include "PetPackets.h" #include "Player.h" #include "Spell.h" #include "SpellAuraEffects.h" @@ -1456,9 +1457,9 @@ bool Pet::learnSpell(uint32 spell_id) if (!m_loading) { - WorldPacket data(SMSG_PET_LEARNED_SPELL, 4); - data << uint32(spell_id); - GetOwner()->SendDirectMessage(&data); + WorldPackets::Pet::PetLearnedSpell packet; + packet.SpellID = spell_id; + GetOwner()->SendDirectMessage(packet.Write()); GetOwner()->PetSpellInitialize(); } return true; @@ -1509,9 +1510,9 @@ bool Pet::unlearnSpell(uint32 spell_id, bool learn_prev, bool clear_ab) { if (!m_loading) { - WorldPacket data(SMSG_PET_REMOVED_SPELL, 4); - data << uint32(spell_id); - GetOwner()->SendDirectMessage(&data); + WorldPackets::Pet::PetUnlearnedSpell packet; + packet.SpellID = spell_id; + GetOwner()->SendDirectMessage(packet.Write()); } return true; } @@ -1765,25 +1766,22 @@ uint8 Pet::GetMaxTalentPointsForLevel(uint8 level) const void Pet::ToggleAutocast(SpellInfo const* spellInfo, bool apply) { + ASSERT(spellInfo); + if (!spellInfo->IsAutocastable()) return; - uint32 spellid = spellInfo->Id; - - PetSpellMap::iterator itr = m_spells.find(spellid); + PetSpellMap::iterator itr = m_spells.find(spellInfo->Id); if (itr == m_spells.end()) return; - uint32 i; + auto autospellItr = std::find(m_autospells.begin(), m_autospells.end(), spellInfo->Id); if (apply) { - for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; ++i) - ; // just search - - if (i == m_autospells.size()) + if (autospellItr == m_autospells.end()) { - m_autospells.push_back(spellid); + m_autospells.push_back(spellInfo->Id); if (itr->second.active != ACT_ENABLED) { @@ -1795,13 +1793,10 @@ void Pet::ToggleAutocast(SpellInfo const* spellInfo, bool apply) } else { - AutoSpellList::iterator itr2 = m_autospells.begin(); - for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; ++i, ++itr2) - ; // just search - - if (i < m_autospells.size()) + if (autospellItr != m_autospells.end()) { - m_autospells.erase(itr2); + m_autospells.erase(autospellItr); + if (itr->second.active != ACT_DISABLED) { itr->second.active = ACT_DISABLED; diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index dd3672697cd..81687efefd1 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -110,25 +110,20 @@ void WorldSession::HandlePetAction(WorldPacket& recvData) } } -void WorldSession::HandlePetStopAttack(WorldPacket &recvData) +void WorldSession::HandlePetStopAttack(WorldPackets::Pet::PetStopAttack& packet) { - ObjectGuid guid; - recvData >> guid; - - TC_LOG_DEBUG("network.opcode", "WORLD: Received CMSG_PET_STOP_ATTACK for %s", guid.ToString().c_str()); - - Unit* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); + Unit* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.PetGUID); if (!pet) { - TC_LOG_ERROR("entities.pet", "HandlePetStopAttack: %s does not exist", guid.ToString().c_str()); + TC_LOG_ERROR("entities.pet", "HandlePetStopAttack: %s does not exist", packet.PetGUID.ToString().c_str()); return; } if (pet != GetPlayer()->GetPet() && pet != GetPlayer()->GetCharmed()) { TC_LOG_ERROR("entities.pet", "HandlePetStopAttack: %s isn't a pet or charmed creature of player %s", - guid.ToString().c_str(), GetPlayer()->GetName().c_str()); + packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str()); return; } @@ -672,17 +667,13 @@ void WorldSession::HandlePetRename(WorldPacket& recvData) pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime())); // cast can't be helped } -void WorldSession::HandlePetAbandon(WorldPacket& recvData) +void WorldSession::HandlePetAbandon(WorldPackets::Pet::PetAbandon& packet) { - ObjectGuid guid; - recvData >> guid; // pet guid - TC_LOG_DEBUG("network.opcode", "WORLD: Received CMSG_PET_ABANDON %s", guid.ToString().c_str()); - if (!_player->IsInWorld()) return; // pet/charmed - Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); + Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.PetGUID); if (pet && pet->ToPet() && pet->ToPet()->getPetType() == HUNTER_PET) { if (pet->GetGUID() == _player->GetPetGUID()) @@ -691,36 +682,30 @@ void WorldSession::HandlePetAbandon(WorldPacket& recvData) pet->SetPower(POWER_HAPPINESS, feelty > 50000 ? (feelty-50000) : 0); } - _player->RemovePet((Pet*)pet, PET_SAVE_AS_DELETED); + _player->RemovePet(pet->ToPet(), PET_SAVE_AS_DELETED); } } -void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) +void WorldSession::HandlePetSpellAutocastOpcode(WorldPackets::Pet::PetSpellAutocast& packet) { - TC_LOG_DEBUG("network.opcode", "WORLD: Received CMSG_PET_SPELL_AUTOCAST"); - ObjectGuid guid; - uint32 spellid; - uint8 state; // 1 for on, 0 for off - recvPacket >> guid >> spellid >> state; - - if (!_player->GetGuardianPet() && !_player->GetCharmed()) - return; - - if (guid.IsPlayer()) + Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.PetGUID); + if (!pet) + { + TC_LOG_ERROR("entities.pet", "WorldSession::HandlePetSpellAutocastOpcode: Pet %s not found.", packet.PetGUID.ToString().c_str()); return; + } - Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); - - if (!pet || (pet != _player->GetGuardianPet() && pet != _player->GetCharmed())) + if (pet != _player->GetGuardianPet() && pet != _player->GetCharmed()) { - TC_LOG_ERROR("entities.pet", "HandlePetSpellAutocastOpcode. %s isn't pet of player %s (%s).", guid.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); + TC_LOG_ERROR("entities.pet", "WorldSession::HandlePetSpellAutocastOpcode: %s isn't pet of player %s (%s).", + packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); return; } - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(packet.SpellID); if (!spellInfo) { - TC_LOG_ERROR("spells.pet", "WORLD: unknown PET spell id %u", spellid); + TC_LOG_ERROR("spells.pet", "WorldSession::HandlePetSpellAutocastOpcode: Unknown spell id %u used by %s.", packet.SpellID, packet.PetGUID.ToString().c_str()); return; } @@ -732,22 +717,22 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) for (Unit* petControlled : pets) { // do not add not learned spells/ passive spells - if (!petControlled->HasSpell(spellid) || !spellInfo->IsAutocastable()) + if (!petControlled->HasSpell(packet.SpellID) || !spellInfo->IsAutocastable()) return; CharmInfo* charmInfo = petControlled->GetCharmInfo(); if (!charmInfo) { - TC_LOG_ERROR("entities.pet", "WorldSession::HandlePetSpellAutocastOpcod: object %s is considered pet-like but doesn't have a charminfo!", petControlled->GetGUID().ToString().c_str()); + TC_LOG_ERROR("entities.pet", "WorldSession::HandlePetSpellAutocastOpcode: object %s is considered pet-like but doesn't have a charminfo!", petControlled->GetGUID().ToString().c_str()); return; } - if (petControlled->IsPet()) - ((Pet*)petControlled)->ToggleAutocast(spellInfo, state != 0); + if (Pet* summon = petControlled->ToPet()) + summon->ToggleAutocast(spellInfo, packet.AutocastEnabled); else - petControlled->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, state != 0); + charmInfo->ToggleCreatureAutocast(spellInfo, packet.AutocastEnabled); - charmInfo->SetSpellAutocast(spellInfo, state != 0); + charmInfo->SetSpellAutocast(spellInfo, packet.AutocastEnabled); } } diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp index ce2c2950719..7653e2a2328 100755 --- a/src/server/game/Server/Packets/PetPackets.cpp +++ b/src/server/game/Server/Packets/PetPackets.cpp @@ -21,3 +21,32 @@ void WorldPackets::Pet::DismissCritter::Read() { _worldPacket >> CritterGUID; } + +void WorldPackets::Pet::PetAbandon::Read() +{ + _worldPacket >> PetGUID; +} + +void WorldPackets::Pet::PetStopAttack::Read() +{ + _worldPacket >> PetGUID; +} + +void WorldPackets::Pet::PetSpellAutocast::Read() +{ + _worldPacket >> PetGUID; + _worldPacket >> SpellID; + _worldPacket >> AutocastEnabled; +} + +WorldPacket const* WorldPackets::Pet::PetLearnedSpell::Write() +{ + _worldPacket << uint32(SpellID); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Pet::PetUnlearnedSpell::Write() +{ + _worldPacket << uint32(SpellID); + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h index f953f5ff57b..cf175fb6f5a 100755 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -35,6 +35,58 @@ namespace WorldPackets ObjectGuid CritterGUID; }; + class PetAbandon final : public ClientPacket + { + public: + PetAbandon(WorldPacket&& packet) : ClientPacket(CMSG_PET_ABANDON, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGUID; + }; + + class PetStopAttack final : public ClientPacket + { + public: + PetStopAttack(WorldPacket&& packet) : ClientPacket(CMSG_PET_STOP_ATTACK, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGUID; + }; + + class PetSpellAutocast final : public ClientPacket + { + public: + PetSpellAutocast(WorldPacket&& packet) : ClientPacket(CMSG_PET_SPELL_AUTOCAST, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGUID; + uint32 SpellID = 0; + bool AutocastEnabled = false; + }; + + class PetLearnedSpell final : public ServerPacket + { + public: + PetLearnedSpell() : ServerPacket(SMSG_PET_LEARNED_SPELL, 4) { } + + WorldPacket const* Write() override; + + uint32 SpellID = 0; + }; + + class PetUnlearnedSpell final : public ServerPacket + { + public: + PetUnlearnedSpell() : ServerPacket(SMSG_PET_UNLEARNED_SPELL, 4) { } + + WorldPacket const* Write() override; + + uint32 SpellID = 0; + }; + class RequestPetInfo final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index fbf2a232570..4fe8e30959b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1306,7 +1306,7 @@ void OpcodeTable::Initialize() /*0x497*/ DEFINE_HANDLER(CMSG_FLOOD_GRACE_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x498*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_NEVER); /*0x499*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_LEARNED_SPELL, STATUS_NEVER); - /*0x49A*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_REMOVED_SPELL, STATUS_NEVER); + /*0x49A*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_UNLEARNED_SPELL, STATUS_NEVER); /*0x49B*/ DEFINE_HANDLER(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeSeatsOnControlledVehicle); /*0x49C*/ DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthAndResurrect ); /*0x49D*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_NEVER); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 28edaa7d9a0..47901cb2cc0 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1204,7 +1204,7 @@ enum Opcodes : uint16 CMSG_FLOOD_GRACE_CHEAT = 0x497, SMSG_SERVER_FIRST_ACHIEVEMENT = 0x498, SMSG_PET_LEARNED_SPELL = 0x499, - SMSG_PET_REMOVED_SPELL = 0x49A, + SMSG_PET_UNLEARNED_SPELL = 0x49A, CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B, CMSG_HEARTH_AND_RESURRECT = 0x49C, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index e3dcad28265..5b2348db8f3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -152,6 +152,9 @@ namespace WorldPackets namespace Pet { class DismissCritter; + class PetAbandon; + class PetStopAttack; + class PetSpellAutocast; class RequestPetInfo; } @@ -906,14 +909,14 @@ class TC_GAME_API WorldSession //Pet void HandlePetAction(WorldPacket& recvData); - void HandlePetStopAttack(WorldPacket& recvData); + void HandlePetStopAttack(WorldPackets::Pet::PetStopAttack& packet); void HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spellid, uint16 flag, ObjectGuid guid2); void HandlePetNameQuery(WorldPacket& recvData); void HandlePetSetAction(WorldPacket& recvData); - void HandlePetAbandon(WorldPacket& recvData); + void HandlePetAbandon(WorldPackets::Pet::PetAbandon& packet); void HandlePetRename(WorldPacket& recvData); void HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura& packet); - void HandlePetSpellAutocastOpcode(WorldPacket& recvPacket); + void HandlePetSpellAutocastOpcode(WorldPackets::Pet::PetSpellAutocast& packet); void HandlePetCastSpellOpcode(WorldPacket& recvPacket); void HandlePetLearnTalent(WorldPacket& recvPacket); void HandleLearnPreviewTalentsPet(WorldPacket& recvPacket); |