diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-03-18 23:53:29 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-03-18 23:53:29 +0100 |
commit | 8f80b3e0ec05356a12056ef8a178f11a8d3dad48 (patch) | |
tree | 27a73e3297a9950c083e6d58102706dc4fa00e9e /src | |
parent | ca4e8c6ff8543ce6b5bbd57cf82f4eb4be4b6119 (diff) |
Core/PacketIO: Updated and enabled SMSG_DISPEL_FAILED
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 21 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 48 |
4 files changed, 49 insertions, 36 deletions
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 5c800497039..aa78cae6deb 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -813,7 +813,7 @@ WorldPacket const* WorldPackets::Spells::NotifyMissileTrajectoryCollision::Write _worldPacket << Caster; _worldPacket << uint8(CastID); _worldPacket << CollisionPos; - + return &_worldPacket; } @@ -844,3 +844,15 @@ WorldPacket const* WorldPackets::Spells::SpellDelayed::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Spells::DispelFailed::Write() +{ + _worldPacket << CasterGUID; + _worldPacket << VictimGUID; + _worldPacket << uint32(SpellID); + _worldPacket << uint32(FailedSpells.size()); + if (!FailedSpells.empty()) + _worldPacket.append(FailedSpells.data(), FailedSpells.size()); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 18194255316..e6c0fedd221 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -830,7 +830,7 @@ namespace WorldPackets { public: MissileTrajectoryCollision(WorldPacket&& packet) : ClientPacket(CMSG_MISSILE_TRAJECTORY_COLLISION, std::move(packet)) { } - + void Read() override; ObjectGuid Target; @@ -839,7 +839,7 @@ namespace WorldPackets G3D::Vector3 CollisionPos; }; - class NotifyMissileTrajectoryCollision : public ServerPacket + class NotifyMissileTrajectoryCollision final : public ServerPacket { public: NotifyMissileTrajectoryCollision() : ServerPacket(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, 8 + 1 + 12) { } @@ -855,7 +855,7 @@ namespace WorldPackets { public: UpdateMissileTrajectory(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_MISSILE_TRAJECTORY, std::move(packet)) { } - + void Read() override; ObjectGuid Guid; @@ -868,7 +868,7 @@ namespace WorldPackets Optional<MovementInfo> Status; }; - class SpellDelayed : public ServerPacket + class SpellDelayed final : public ServerPacket { public: SpellDelayed() : ServerPacket(SMSG_SPELL_DELAYED, sizeof(ObjectGuid) + 4) { } @@ -878,6 +878,19 @@ namespace WorldPackets ObjectGuid Caster; int32 ActualDelay = 0; }; + + class DispelFailed final : public ServerPacket + { + public: + DispelFailed() : ServerPacket(SMSG_DISPEL_FAILED, 16 + 16 + 4 + 4 + 4 /* predict a single failure on average */) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterGUID; + ObjectGuid VictimGUID; + uint32 SpellID = 0; + std::vector<int32> FailedSpells; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 7357ee15b03..03e41fc0b0c 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1023,7 +1023,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PLAYER_CHOICE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 59428220bea..0c2fc2e5d91 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2307,9 +2307,12 @@ void Spell::EffectDispel(SpellEffIndex effIndex) return; // Ok if exist some buffs for dispel try dispel it - uint32 failCount = 0; DispelChargesList success_list; - WorldPacket dataFail(SMSG_DISPEL_FAILED, 8+8+4+4+damage*4); + WorldPackets::Spells::DispelFailed dispelFailed; + dispelFailed.CasterGUID = m_caster->GetGUID(); + dispelFailed.VictimGUID = unitTarget->GetGUID(); + dispelFailed.SpellID = m_spellInfo->Id; + // dispel N = damage buffs (or while exist buffs for dispel) for (int32 count = 0; count < damage && !dispel_list.empty();) { @@ -2344,23 +2347,14 @@ void Spell::EffectDispel(SpellEffIndex effIndex) dispel_list.erase(itr); } else - { - if (!failCount) - { - // Failed to dispell - dataFail << m_caster->GetGUID(); // Caster GUID - dataFail << unitTarget->GetGUID(); // Victim GUID - dataFail << uint32(m_spellInfo->Id); // dispel spell id - } - ++failCount; - dataFail << uint32(itr->first->GetId()); // Spell Id - } + dispelFailed.FailedSpells.push_back(int32(itr->first->GetId())); + ++count; } } - if (failCount) - m_caster->SendMessageToSet(&dataFail, true); + if (!dispelFailed.FailedSpells.empty()) + m_caster->SendMessageToSet(dispelFailed.Write(), true); if (success_list.empty()) return; @@ -5163,9 +5157,12 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex /*effIndex*/) return; // Ok if exist some buffs for dispel try dispel it - uint32 failCount = 0; DispelList success_list; - WorldPacket dataFail(SMSG_DISPEL_FAILED, 8+8+4+4+damage*4); + WorldPackets::Spells::DispelFailed dispelFailed; + dispelFailed.CasterGUID = m_caster->GetGUID(); + dispelFailed.VictimGUID = unitTarget->GetGUID(); + dispelFailed.SpellID = m_spellInfo->Id; + // dispel N = damage buffs (or while exist buffs for dispel) for (int32 count = 0; count < damage && !steal_list.empty();) { @@ -5190,23 +5187,14 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex /*effIndex*/) steal_list.erase(itr); } else - { - if (!failCount) - { - // Failed to dispell - dataFail << m_caster->GetGUID(); // Caster GUID - dataFail << unitTarget->GetGUID(); // Victim GUID - dataFail << uint32(m_spellInfo->Id); // dispel spell id - } - ++failCount; - dataFail << uint32(itr->first->GetId()); // Spell Id - } + dispelFailed.FailedSpells.push_back(int32(itr->first->GetId())); + ++count; } } - if (failCount) - m_caster->SendMessageToSet(&dataFail, true); + if (!dispelFailed.FailedSpells.empty()) + m_caster->SendMessageToSet(dispelFailed.Write(), true); if (success_list.empty()) return; |