aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-03-18 23:53:29 +0100
committerShauren <shauren.trinity@gmail.com>2016-03-18 23:53:29 +0100
commit8f80b3e0ec05356a12056ef8a178f11a8d3dad48 (patch)
tree27a73e3297a9950c083e6d58102706dc4fa00e9e /src
parentca4e8c6ff8543ce6b5bbd57cf82f4eb4be4b6119 (diff)
Core/PacketIO: Updated and enabled SMSG_DISPEL_FAILED
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp14
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h21
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp48
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;