diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Handlers/CombatHandler.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatPackets.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatPackets.h | 33 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
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); |