aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp32
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp17
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp55
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h63
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp10
-rw-r--r--src/server/game/Server/WorldSession.h3
-rw-r--r--src/server/game/Spells/Spell.cpp26
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)