diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index 691a059d6..e487c3f50 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -18,12 +18,11 @@ #include "Totem.h" #include "Group.h" #include "ObjectMgr.h" -#include "Opcodes.h" #include "Player.h" #include "SpellAuraEffects.h" #include "SpellInfo.h" #include "SpellMgr.h" -#include "WorldPacket.h" +#include "TotemPackets.h" Totem::Totem(SummonPropertiesEntry const* properties, ObjectGuid owner) : Minion(properties, owner, false) { @@ -57,14 +56,15 @@ void Totem::InitStats(uint32 duration) // Xinef: Set level for Unit totems if (Unit* owner = ObjectAccessor::GetUnit(*this, m_owner)) { - if (owner->GetTypeId() == TYPEID_PLAYER && m_Properties->Slot >= SUMMON_SLOT_TOTEM && m_Properties->Slot < MAX_TOTEM_SLOT) + uint32 slot = m_Properties->Slot; + if (owner->GetTypeId() == TYPEID_PLAYER && slot >= SUMMON_SLOT_TOTEM && slot < MAX_TOTEM_SLOT) { - WorldPacket data(SMSG_TOTEM_CREATED, 1 + 8 + 4 + 4); - data << uint8(m_Properties->Slot - 1); - data << GetGUID(); - data << uint32(duration); - data << uint32(GetUInt32Value(UNIT_CREATED_BY_SPELL)); - owner->ToPlayer()->SendDirectMessage(&data); + WorldPackets::Totem::TotemCreated data; + data.Totem = GetGUID(); + data.Slot = slot - SUMMON_SLOT_TOTEM; + data.Duration = duration; + data.SpellID = GetUInt32Value(UNIT_CREATED_BY_SPELL); + owner->ToPlayer()->SendDirectMessage(data.Write()); // set display id depending on caster's race SetDisplayId(owner->GetModelForTotem(PlayerTotemType(m_Properties->Id))); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 3508f8ec9..a3b587291 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -28,6 +28,7 @@ #include "SpellMgr.h" #include "TemporarySummon.h" #include "Totem.h" +#include "TotemPackets.h" #include "Vehicle.h" #include "WorldPacket.h" #include "WorldSession.h" @@ -578,17 +579,15 @@ void WorldSession::HandleCancelChanneling(WorldPacket& recvData) mover->InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, true); } -void WorldSession::HandleTotemDestroyed(WorldPacket& recvPacket) +void WorldSession::HandleTotemDestroyed(WorldPackets::Totem::TotemDestroyed& totemDestroyed) { // ignore for remote control state if (_player->m_mover != _player) return; - uint8 slotId; + uint8 slotId = totemDestroyed.Slot; + slotId += SUMMON_SLOT_TOTEM; - recvPacket >> slotId; - - ++slotId; if (slotId >= MAX_TOTEM_SLOT) return; diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 7fa5eb5b0..e6b5273aa 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -18,6 +18,7 @@ #ifndef AllPackets_h__ #define AllPackets_h__ +#include "TotemPackets.h" #include "BankPackets.h" #include "GuildPackets.h" diff --git a/src/server/game/Server/Packets/TotemPackets.cpp b/src/server/game/Server/Packets/TotemPackets.cpp new file mode 100644 index 000000000..82531e3db --- /dev/null +++ b/src/server/game/Server/Packets/TotemPackets.cpp @@ -0,0 +1,33 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "TotemPackets.h" + +void WorldPackets::Totem::TotemDestroyed::Read() +{ + _worldPacket >> Slot; +} + +WorldPacket const* WorldPackets::Totem::TotemCreated::Write() +{ + _worldPacket << Slot; + _worldPacket << Totem; + _worldPacket << Duration; + _worldPacket << SpellID; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/TotemPackets.h b/src/server/game/Server/Packets/TotemPackets.h new file mode 100644 index 000000000..69cb03311 --- /dev/null +++ b/src/server/game/Server/Packets/TotemPackets.h @@ -0,0 +1,54 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef TotemPackets_h__ +#define TotemPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" + +namespace WorldPackets +{ + namespace Totem + { + class TotemDestroyed final : public ClientPacket + { + public: + TotemDestroyed(WorldPacket&& packet) : ClientPacket(CMSG_TOTEM_DESTROYED, std::move(packet)) { } + + void Read() override; + + uint8 Slot = 0; + }; + + class TotemCreated final : public ServerPacket + { + public: + TotemCreated() : ServerPacket(SMSG_TOTEM_CREATED, 1 + 8 + 4 + 4) { } + + WorldPacket const* Write() override; + + uint8 Slot = 0; + ObjectGuid Totem; + uint32 Duration = 0; + uint32 SpellID = 0; + + }; + } +} + +#endif // TotemPackets_h__ diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8ac0a6e6c..c9f836b76 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -71,6 +71,10 @@ namespace lfg namespace WorldPackets { + namespace Totem + { + class TotemDestroyed; + } namespace Bank { @@ -852,7 +856,7 @@ public: // opcodes handlers void HandleCharRenameCallBack(std::shared_ptr renameInfo, PreparedQueryResult result); void HandleSetPlayerDeclinedNames(WorldPacket& recvData); - void HandleTotemDestroyed(WorldPacket& recvData); + void HandleTotemDestroyed(WorldPackets::Totem::TotemDestroyed& totemDestroyed); void HandleDismissCritter(WorldPacket& recvData); //Battleground