diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 32 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 55 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 63 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 26 |
7 files changed, 164 insertions, 42 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index be86bf2b13d..7c7f0bb976e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20822,14 +20822,18 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply) TC_LOG_DEBUG("spells", "Player::AddSpellMod %d", mod->spellId); OpcodeServer opcode = (mod->type == SPELLMOD_FLAT) ? SMSG_SET_FLAT_SPELL_MODIFIER : SMSG_SET_PCT_SPELL_MODIFIER; + WorldPackets::Spells::SetSpellModifier packet(opcode); + int i = 0; flag96 _mask; uint32 modTypeCount = 0; // count of mods per one mod->op - WorldPacket data(opcode); - data << uint32(1); // count of different mod->op's in packet - size_t writePos = data.wpos(); - data << uint32(modTypeCount); - data << uint8(mod->op); + + /// @todo Implement sending of bulk modifiers instead of single + packet.Modifiers.resize(1); + WorldPackets::Spells::SpellModifier& spellMod = packet.Modifiers[0]; + + spellMod.ModIndex = mod->op; + for (int eff = 0; eff < 96; ++eff) { if (eff != 0 && (eff % 32) == 0) @@ -20838,19 +20842,21 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply) _mask[i] = uint32(1) << (eff - (32 * i)); if (mod->mask & _mask) { - int32 val = 0; + WorldPackets::Spells::SpellModifierData modData; + for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr) if ((*itr)->type == mod->type && (*itr)->mask & _mask) - val += (*itr)->value; - val += apply ? mod->value : -(mod->value); + modData.ModifierValue += (*itr)->value; - data << uint8(eff); - data << float(val); - ++modTypeCount; + modData.ModifierValue += apply ? mod->value : -(mod->value); + modData.ClassIndex = eff; + + spellMod.ModifierData.push_back(modData); } } - data.put<uint32>(writePos, modTypeCount); - SendDirectMessage(&data); + + SendDirectMessage(packet.Write()); + if (apply) m_spellMods[mod->op].push_back(mod); else diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 3a48c29ce03..9598ce216fb 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -52,6 +52,7 @@ #include "Group.h" #include "AccountMgr.h" #include "Spell.h" +#include "SpellPackets.h" #include "BattlegroundMgr.h" #include "Battlefield.h" #include "BattlefieldMgr.h" @@ -1038,17 +1039,17 @@ int32 WorldSession::HandleEnableNagleAlgorithm() return 0; } -void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recvData) +void WorldSession::HandleSetActionButtonOpcode(WorldPackets::Spells::SetActionButton& packet) { - uint8 button; - uint32 packetData; - recvData >> button >> packetData; - TC_LOG_DEBUG("network", "CMSG_SET_ACTION_BUTTON Button: %u Data: %u", button, packetData); + uint32 action = ACTION_BUTTON_ACTION(packet.Action); + uint32 type = ACTION_BUTTON_TYPE(packet.Action); - if (!packetData) - GetPlayer()->removeActionButton(button); + TC_LOG_DEBUG("network", "CMSG_SET_ACTION_BUTTON Button: %u Action: %u Type: %u", packet.Index, action, type); + + if (!packet.Action) + GetPlayer()->removeActionButton(packet.Index); else - GetPlayer()->addActionButton(button, ACTION_BUTTON_ACTION(packetData), ACTION_BUTTON_TYPE(packetData)); + GetPlayer()->addActionButton(packet.Index, action, type); } void WorldSession::HandleCompleteCinematic(WorldPacket& /*recvData*/) diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index ee2e0e8dfdf..7c536363335 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -57,6 +57,12 @@ WorldPacket const* WorldPackets::Spells::UpdateActionButtons::Write() return &_worldPacket; } +void WorldPackets::Spells::SetActionButton::Read() +{ + _worldPacket >> Action; + _worldPacket >> Index; +} + WorldPacket const* WorldPackets::Spells::SendUnlearnSpells::Write() { _worldPacket << uint32(Spells.size()); @@ -66,7 +72,7 @@ WorldPacket const* WorldPackets::Spells::SendUnlearnSpells::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData& spellCastLogData) +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData) { data << spellCastLogData.Health; data << spellCastLogData.AttackPower; @@ -416,3 +422,50 @@ WorldPacket const* WorldPackets::Spells::LearnedSpells::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Spells::SpellFailure::Write() +{ + _worldPacket << CasterUnit; + _worldPacket << CastID; + _worldPacket << SpellID; + _worldPacket << Reason; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::SpellFailedOther::Write() +{ + _worldPacket << CasterUnit; + _worldPacket << CastID; + _worldPacket << SpellID; + _worldPacket << Reason; + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifierData const& spellModifierData) +{ + data << spellModifierData.ModifierValue; + data << spellModifierData.ClassIndex; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifier const& spellModifier) +{ + data << spellModifier.ModIndex; + data << uint32(spellModifier.ModifierData.size()); + for (WorldPackets::Spells::SpellModifierData const& modData : spellModifier.ModifierData) + data << modData; + + return data; +} + +WorldPacket const* WorldPackets::Spells::SetSpellModifier::Write() +{ + _worldPacket << uint32(Modifiers.size()); + for (WorldPackets::Spells::SpellModifier const& spellMod : Modifiers) + _worldPacket << spellMod; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 2c971107268..e9ae7ada77b 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -77,6 +77,17 @@ namespace WorldPackets */ }; + class SetActionButton final : public ClientPacket + { + public: + SetActionButton(WorldPacket&& packet) : ClientPacket(CMSG_SET_ACTION_BUTTON, std::move(packet)) {} + + void Read() override; + + uint64 Action = 0; ///< two packed uint32 (action and type) + uint8 Index = 0; + }; + class SendUnlearnSpells final : public ServerPacket { public: @@ -164,9 +175,59 @@ namespace WorldPackets std::vector<int32> SpellID; bool SuppressMessaging = false; }; + + class SpellFailure final : public ServerPacket + { + public: + SpellFailure() : ServerPacket(SMSG_SPELL_FAILURE, 16+4+1+1) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterUnit; + uint32 SpellID = 0; + uint8 Reason = 0; + uint8 CastID = 0; + }; + + class SpellFailedOther final : public ServerPacket + { + public: + SpellFailedOther() : ServerPacket(SMSG_SPELL_FAILED_OTHER, 16+4+1+1) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterUnit; + uint32 SpellID = 0; + uint8 Reason = 0; + uint8 CastID = 0; + }; + + struct SpellModifierData + { + float ModifierValue = 0.0f; + uint8 ClassIndex = 0; + }; + + struct SpellModifier + { + uint8 ModIndex = 0; + std::vector<SpellModifierData> ModifierData; + }; + + class SetSpellModifier final : public ServerPacket + { + public: + SetSpellModifier(OpcodeServer opcode) : ServerPacket(opcode, 20) { } + + WorldPacket const* Write() override; + + std::vector<SpellModifier> Modifiers; + }; } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData& spellCastLogData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifierData const& spellModifierData); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifier const& spellModifier); #endif // SpellPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3b92433fb2d..67aa0efe9f3 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -576,7 +576,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SETSHEATHED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSheathedOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIONBAR_TOGGLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActionBarToggles ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTION_BUTTON, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActionButtonOpcode ); + DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SetActionButton, &WorldSession::HandleSetActionButtonOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_MOVER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveMoverOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveVoiceChannel ); // STATUS_AUTHED DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ALLOW_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -1282,12 +1282,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_STANDING, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED); @@ -1315,8 +1315,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 1442bf2576d..a04bb45dfe7 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -141,6 +141,7 @@ namespace WorldPackets namespace Spells { class SpellCastRequest; + class SetActionButton; } namespace Talent @@ -680,7 +681,7 @@ class WorldSession void HandleUpdateAccountData(WorldPackets::ClientConfig::UserClientUpdateAccountData& packet); void HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request); - void HandleSetActionButtonOpcode(WorldPacket& recvPacket); + void HandleSetActionButtonOpcode(WorldPackets::Spells::SetActionButton& packet); void HandleGameObjectUseOpcode(WorldPacket& recPacket); void HandleMeetingStoneInfo(WorldPacket& recPacket); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 0a55735eae5..c6b92f66fb9 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4248,19 +4248,19 @@ void Spell::ExecuteLogEffectResurrect(uint8 effIndex, Unit* target) void Spell::SendInterrupted(uint8 result) { - WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1)); - data << m_caster->GetPackGUID(); - data << uint8(m_cast_count); - data << uint32(m_spellInfo->Id); - data << uint8(result); - m_caster->SendMessageToSet(&data, true); - - data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4)); - data << m_caster->GetPackGUID(); - data << uint8(m_cast_count); - data << uint32(m_spellInfo->Id); - data << uint8(result); - m_caster->SendMessageToSet(&data, true); + WorldPackets::Spells::SpellFailure failurePacket; + failurePacket.CasterUnit = m_caster->GetGUID(); + failurePacket.CastID = m_cast_count; + failurePacket.SpellID = m_spellInfo->Id; + failurePacket.Reason = result; + m_caster->SendMessageToSet(failurePacket.Write(), true); + + WorldPackets::Spells::SpellFailedOther failedPacket; + failedPacket.CasterUnit = m_caster->GetGUID(); + failedPacket.CastID = m_cast_count; + failedPacket.SpellID = m_spellInfo->Id; + failedPacket.Reason = result; + m_caster->SendMessageToSet(failedPacket.Write(), true); } void Spell::SendChannelUpdate(uint32 time) |