aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorForesterDev <11771800+ForesterDev@users.noreply.github.com>2020-05-10 17:25:08 +0300
committerGitHub <noreply@github.com>2020-05-10 16:25:08 +0200
commit6caba625721c94f08488dae466bc6c5862f23935 (patch)
tree77f94cbb32b062091362ff93fb4529a78f0ea3bd /src
parent34fecde022e6e2a228111ee79a0e9f5f8a7bed12 (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.cpp37
-rw-r--r--src/server/game/Handlers/PetHandler.cpp63
-rwxr-xr-xsrc/server/game/Server/Packets/PetPackets.cpp29
-rwxr-xr-xsrc/server/game/Server/Packets/PetPackets.h52
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Server/WorldSession.h9
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);