aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp22
-rw-r--r--src/server/game/Handlers/CombatHandler.cpp26
-rw-r--r--src/server/game/Server/Packets/CombatPackets.cpp21
-rw-r--r--src/server/game/Server/Packets/CombatPackets.h33
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h3
6 files changed, 75 insertions, 34 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 55cd53e523e..fe16759ff98 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -2134,11 +2134,10 @@ void Unit::SendMeleeAttackStop(Unit* victim)
if (victim)
{
packet.Victim = victim->GetGUID();
- packet.Dead = victim->isDead();
+ packet.NowDead = victim->isDead();
}
SendMessageToSet(packet.Write(), true);
- TC_LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
if (victim)
TC_LOG_INFO("entities.unit", "%s stopped attacking %s", GetGUID().ToString().c_str(), victim->GetGUID().ToString().c_str());
@@ -11465,12 +11464,19 @@ void Unit::SetPower(Powers power, int32 val)
if (IsInWorld())
{
- WorldPacket data(SMSG_POWER_UPDATE, 8 + 4 + 1 + 4);
- data << GetPackGUID();
- data << uint32(1); //power count
- data << uint8(powerIndex);
- data << int32(val);
- SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER);
+ WorldPackets::Combat::PowerUpdate packet;
+ WorldPackets::Combat::PowerUpdatePower power;
+ packet.Guid = GetGUID();
+ /// @todo: Support multiple counts ?
+ /*for (uint8 i = 0; i < 1; i++)
+ {
+ _power.Power = val;
+ _power.PowerType = powerIndex;
+ }*/
+ power.Power = val;
+ power.PowerType = powerIndex;
+ packet.Powers.push_back(power);
+ SendMessageToSet(packet.Write(), GetTypeId() == TYPEID_PLAYER);
}
// group update
diff --git a/src/server/game/Handlers/CombatHandler.cpp b/src/server/game/Handlers/CombatHandler.cpp
index 13115da3df3..36f37403f32 100644
--- a/src/server/game/Handlers/CombatHandler.cpp
+++ b/src/server/game/Handlers/CombatHandler.cpp
@@ -31,8 +31,6 @@
void WorldSession::HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet)
{
- TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_ATTACKSWING Message %s", packet.Victim.ToString().c_str());
-
Unit* pEnemy = ObjectAccessor::GetUnit(*_player, packet.Victim);
if (!pEnemy)
@@ -71,31 +69,19 @@ void WorldSession::HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& /*re
GetPlayer()->AttackStop();
}
-void WorldSession::HandleSetSheathedOpcode(WorldPacket& recvData)
+void WorldSession::HandleSetSheathedOpcode(WorldPackets::Combat::SetSheathed& packet)
{
- uint32 sheathed;
- recvData >> sheathed;
-
- //TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_SETSHEATHED Message guidlow:%u value1:%u", GetPlayer()->GetGUIDLow(), sheathed);
-
- if (sheathed >= MAX_SHEATH_STATE)
+ if (packet.CurrentSheathState >= MAX_SHEATH_STATE)
{
- TC_LOG_ERROR("network", "Unknown sheath state %u ??", sheathed);
+ TC_LOG_ERROR("network", "Unknown sheath state %u ??", packet.CurrentSheathState);
return;
}
- GetPlayer()->SetSheath(SheathState(sheathed));
+ GetPlayer()->SetSheath(SheathState(packet.CurrentSheathState));
}
void WorldSession::SendAttackStop(Unit const* enemy)
{
- WorldPacket data(SMSG_ATTACKSTOP, (8+8+4)); // we guess size
- data << GetPlayer()->GetPackGUID();
- if (enemy)
- data << enemy->GetPackGUID();
- else
- data << uint8(0);
-
- data << uint32(0); // unk, can be 1 also
- SendPacket(&data);
+ WorldPackets::Combat::SAttackStop packet(GetPlayer()->GetGUID(), enemy->GetGUID(), enemy->isDead());
+ SendPacket(packet.Write());
}
diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp
index 53a489ebc21..5a23729f7bc 100644
--- a/src/server/game/Server/Packets/CombatPackets.cpp
+++ b/src/server/game/Server/Packets/CombatPackets.cpp
@@ -35,7 +35,7 @@ WorldPacket const* WorldPackets::Combat::SAttackStop::Write()
{
_worldPacket << Attacker;
_worldPacket << Victim;
- _worldPacket.WriteBit(Dead);
+ _worldPacket.WriteBit(NowDead);
_worldPacket.FlushBits();
return &_worldPacket;
@@ -147,3 +147,22 @@ WorldPacket const* WorldPackets::Combat::AttackSwingError::Write()
_worldPacket.FlushBits();
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Combat::PowerUpdate::Write()
+{
+ _worldPacket << Guid;
+ _worldPacket << uint32(Powers.size());
+ for (WorldPackets::Combat::PowerUpdatePower const& power : Powers)
+ {
+ _worldPacket << power.Power;
+ _worldPacket << power.PowerType;
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Combat::SetSheathed::Read()
+{
+ _worldPacket >> CurrentSheathState;
+ Animate = _worldPacket.ReadBit();
+}
diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h
index 54d97e5774c..4e2aa3c34b2 100644
--- a/src/server/game/Server/Packets/CombatPackets.h
+++ b/src/server/game/Server/Packets/CombatPackets.h
@@ -69,13 +69,14 @@ namespace WorldPackets
class SAttackStop final : public ServerPacket
{
public:
- SAttackStop() : ServerPacket(SMSG_ATTACKSTOP, 17) { }
+ SAttackStop() : ServerPacket(SMSG_ATTACKSTOP, 16 + 16 + 1) { }
+ SAttackStop(ObjectGuid attacker, ObjectGuid victim, bool nowDead) : ServerPacket(SMSG_ATTACKSTOP, 16 + 16 + 1), Attacker(attacker), Victim(victim), NowDead(nowDead) { }
WorldPacket const* Write() override;
ObjectGuid Attacker;
ObjectGuid Victim;
- bool Dead = false;
+ bool NowDead = false;
};
struct ThreatInfo
@@ -184,6 +185,34 @@ namespace WorldPackets
WorldPacket const* Write() override { return &_worldPacket; }
};
+
+ struct PowerUpdatePower
+ {
+ int32 Power = 0;
+ uint8 PowerType = 0;
+ };
+
+ class PowerUpdate final : public ServerPacket
+ {
+ public:
+ PowerUpdate() : ServerPacket(SMSG_POWER_UPDATE, 16 + 4 + 1) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Guid;
+ std::vector<PowerUpdatePower> Powers;
+ };
+
+ class SetSheathed final : public ClientPacket
+ {
+ public:
+ SetSheathed(WorldPacket&& packet) : ClientPacket(CMSG_SET_SHEATHED, std::move(packet)) { }
+
+ void Read() override;
+
+ int32 CurrentSheathState = 0;
+ bool Animate = true;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index c6a24f5be15..c9f450c5e78 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -793,7 +793,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ROLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend );
DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SHEATHED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSheathedOpcode );
+ DEFINE_HANDLER(CMSG_SET_SHEATHED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::SetSheathed, &WorldSession::HandleSetSheathedOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SKILL_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode);
@@ -1650,7 +1650,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_TIME_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PONG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 4ad9e35c01e..0cab4b9bf7a 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -145,6 +145,7 @@ namespace WorldPackets
{
class AttackSwing;
class AttackStop;
+ class SetSheathed;
}
namespace Duel
@@ -1048,7 +1049,7 @@ class WorldSession
void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet);
void HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& packet);
- void HandleSetSheathedOpcode(WorldPacket& recvPacket);
+ void HandleSetSheathedOpcode(WorldPackets::Combat::SetSheathed& packet);
void HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet);
void HandleOpenItemOpcode(WorldPacket& recvPacket);