diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.cpp | 30 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.h | 21 | ||||
-rw-r--r-- | src/server/game/Server/Packets/NPCPackets.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
6 files changed, 85 insertions, 15 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0394911d9fe..8d6e36631bb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8108,19 +8108,38 @@ void Unit::UnsummonAllTotems() } } -void Unit::SendHealSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical) +void Unit::SendHealSpellLog(Unit* victim, uint32 spellID, uint32 health, uint32 overHeal, uint32 absorbed, bool crit) { - // we guess size - WorldPacket data(SMSG_SPELL_HEAL_LOG, 8 + 8 + 4 + 4 + 4 + 4 + 1 + 1); - data << victim->GetPackGUID(); - data << GetPackGUID(); - data << uint32(SpellID); - data << uint32(Damage); - data << uint32(OverHeal); - data << uint32(Absorb); // Absorb amount - data << uint8(critical ? 1 : 0); - data << uint8(0); // unused - SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellHealLog spellHealLog; + + spellHealLog.CasterGUID = GetGUID(); + spellHealLog.TargetGUID = victim->GetGUID(); + + spellHealLog.SpellID = spellID; + spellHealLog.Health = health; + spellHealLog.OverHeal = overHeal; + spellHealLog.Absorbed = absorbed; + + spellHealLog.Crit = crit; + + /// @todo: 6.x Has to be implemented + /* + packet.ReadBit("Multistrike"); + + var hasCritRollMade = packet.ReadBit("HasCritRollMade"); + var hasCritRollNeeded = packet.ReadBit("HasCritRollNeeded"); + var hasLogData = packet.ReadBit("HasLogData"); + + if (hasCritRollMade) + packet.ReadSingle("CritRollMade"); + + if (hasCritRollNeeded) + packet.ReadSingle("CritRollNeeded"); + + if (hasLogData) + SpellParsers.ReadSpellCastLogData(packet); + */ + SendMessageToSet(spellHealLog.Write(), true); } int32 Unit::HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHealth, bool critical) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index e6f6ff13f37..79d402c3695 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1600,7 +1600,7 @@ class Unit : public WorldObject virtual void UpdateUnderwaterState(Map* m, float x, float y, float z); bool isInAccessiblePlaceFor(Creature const* c) const; - void SendHealSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical = false); + void SendHealSpellLog(Unit* victim, uint32 spellID, uint32 health, uint32 overHeal, uint32 absorbed, bool crit = false); int32 HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHealth, bool critical = false); void SendEnergizeSpellLog(Unit* victim, uint32 spellID, int32 damage, Powers powertype); void EnergizeBySpell(Unit* victim, uint32 SpellID, int32 Damage, Powers powertype); diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index ac65bc09fe3..80499f8c130 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -117,3 +117,33 @@ WorldPacket const* WorldPackets::CombatLog::SpellExecuteLog::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write() +{ + _worldPacket << CasterGUID; + _worldPacket << TargetGUID; + + _worldPacket << SpellID; + _worldPacket << Health; + _worldPacket << OverHeal; + _worldPacket << Absorbed; + + _worldPacket.WriteBit(Crit); + _worldPacket.WriteBit(Multistrike); + + _worldPacket.WriteBit(CritRollMade.HasValue); + _worldPacket.WriteBit(CritRollNeeded.HasValue); + _worldPacket.WriteBit(LogData.HasValue); + _worldPacket.FlushBits(); + + if (CritRollMade.HasValue) + _worldPacket << CritRollMade.Value; + + if (CritRollNeeded.HasValue) + _worldPacket << CritRollNeeded.Value; + + if (LogData.HasValue) + _worldPacket << LogData.Value; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index ad727579376..c74e8112698 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -87,6 +87,27 @@ namespace WorldPackets std::vector<SpellLogEffect> Effects; Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; + + class SpellHealLog final : public ServerPacket + { + public: + + SpellHealLog() : ServerPacket(SMSG_SPELL_HEAL_LOG, 16 + 16 + 4 * 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterGUID; + ObjectGuid TargetGUID; + int32 SpellID = 0; + int32 Health = 0; + int32 OverHeal = 0; + int32 Absorbed = 0; + bool Crit = false; + bool Multistrike = false; + Optional<float> CritRollMade; + Optional<float> CritRollNeeded; + Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false + }; } } diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index 02186b58a91..4e44f07fd01 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -174,4 +174,4 @@ WorldPacket const* WorldPackets::NPC::SpiritHealerConfirm::Write() _worldPacket << Unit; return &_worldPacket; -}
\ No newline at end of file +} diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 258fd4a15bb..a9cc63e4eb5 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1647,7 +1647,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INSTAKILL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INTERRUPT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MISS_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); |