diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index 4795f39f6..0e334d45e 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -1548,7 +1548,8 @@ namespace Game.Entities internal void SendCombatLogMessage(CombatLogServerPacket combatLog) { - CombatLogSender notifier = new(this, combatLog, GetVisibilityRange()); + CombatLogSender combatLogCustomizer = new(combatLog); + MessageDistDeliverer notifier = new(this, combatLogCustomizer, GetVisibilityRange()); Cell.VisitWorldObjects(this, notifier, GetVisibilityRange()); } diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index bf07e0b26..651446ccd 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -23,6 +23,7 @@ using Game.Combat; using Game.DataStorage; using Game.Maps; using Game.Movement; +using Game.Networking; using Game.Networking.Packets; using Game.Spells; using System; @@ -577,93 +578,20 @@ namespace Game.Entities public StringArray name = new(SharedConst.MaxDeclinedNameCases); } - class CombatLogSender : Notifier + class CombatLogSender : MessageDistDelivererCustomizer { - public CombatLogSender(WorldObject src, CombatLogServerPacket msg, float dist) - { - i_source = src; - i_message = msg; - i_distSq = dist * dist; - } - - bool IsInRangeHelper(WorldObject obj) - { - if (!obj.IsInPhase(i_source)) - return false; - - return obj.GetExactDist2dSq(i_source) <= i_distSq; - } - - public override void Visit(IList objs) - { - for (var i = 0; i < objs.Count; ++i) - { - Player player = objs[i]; - if (!IsInRangeHelper(player)) - continue; - - // Send packet to all who are sharing the player's vision - if (player.HasSharedVision()) - { - foreach (var visionTarget in player.GetSharedVisionList()) - if (visionTarget.seerView == player) - SendPacket(visionTarget); - } - - if (player.seerView == player || player.GetVehicle()) - SendPacket(player); - } - } - - public override void Visit(IList objs) - { - for (var i = 0; i < objs.Count; ++i) - { - Creature creature = objs[i]; - if (!IsInRangeHelper(creature)) - continue; - - // Send packet to all who are sharing the creature's vision - if (creature.HasSharedVision()) - { - foreach (var visionTarget in creature.GetSharedVisionList()) - if (visionTarget.seerView == creature) - SendPacket(visionTarget); - } - } - } - public override void Visit(IList objs) - { - for (var i = 0; i < objs.Count; ++i) - { - DynamicObject dynamicObject = objs[i]; - if (!IsInRangeHelper(dynamicObject)) - continue; - - Unit caster = dynamicObject.GetCaster(); - if (caster) - { - // Send packet back to the caster if the caster has vision of dynamic object - Player player = caster.ToPlayer(); - if (player && player.seerView == dynamicObject) - SendPacket(player); - } - } - } - - void SendPacket(Player player) - { - if (!player.HaveAtClient(i_source)) - return; - - if (!player.IsAdvancedCombatLoggingEnabled()) - i_message.DisableAdvancedCombatLogging(); - - player.SendPacket(i_message); - } - - WorldObject i_source; CombatLogServerPacket i_message; - float i_distSq; + + public CombatLogSender(CombatLogServerPacket msg) + { + i_message = msg; + } + + public override ServerPacket Invoke(Player player) + { + i_message.SetAdvancedCombatLogging(player.IsAdvancedCombatLoggingEnabled()); + + return i_message; + } } } diff --git a/Source/Game/Maps/GridNotifiers.cs b/Source/Game/Maps/GridNotifiers.cs index 7655d95c4..3ba048231 100644 --- a/Source/Game/Maps/GridNotifiers.cs +++ b/Source/Game/Maps/GridNotifiers.cs @@ -23,7 +23,6 @@ using Game.Networking.Packets; using Game.Spells; using System; using System.Collections.Generic; -using System.Linq; namespace Game.Maps { @@ -379,12 +378,44 @@ namespace Game.Maps bool isCreature; } + public class MessageDistDelivererCustomizer + { + ServerPacket i_message; + + public MessageDistDelivererCustomizer() { } + + public MessageDistDelivererCustomizer(ServerPacket message) + { + i_message = message; + } + + public virtual ServerPacket Invoke(Player player) + { + return i_message; + } + } + public class MessageDistDeliverer : Notifier { - public MessageDistDeliverer(WorldObject src, ServerPacket msg, float dist, bool own_team_only = false, Player skipped = null) + WorldObject i_source; + MessageDistDelivererCustomizer i_messageCustomizer; + float i_distSq; + uint team; + Player skipped_receiver; + + public MessageDistDeliverer(WorldObject src, ServerPacket pkt, float dist, bool own_team_only = false, Player skipped = null) { i_source = src; - i_message = msg; + i_messageCustomizer = new(pkt); + i_distSq = dist * dist; + team = (uint)((own_team_only && src.IsTypeId(TypeId.Player)) ? ((Player)src).GetTeam() : 0); + skipped_receiver = skipped; + } + + public MessageDistDeliverer(WorldObject src, MessageDistDelivererCustomizer packetCustomizer, float dist, bool own_team_only = false, Player skipped = null) + { + i_source = src; + i_messageCustomizer = packetCustomizer; i_distSq = dist * dist; team = (uint)((own_team_only && src.IsTypeId(TypeId.Player)) ? ((Player)src).GetTeam() : 0); skipped_receiver = skipped; @@ -466,26 +497,27 @@ namespace Game.Maps if (!player.HaveAtClient(i_source)) return; - player.SendPacket(i_message); + player.SendPacket(i_messageCustomizer.Invoke(player)); } - - WorldObject i_source; - ServerPacket i_message; - float i_distSq; - uint team; - Player skipped_receiver; } public class MessageDistDelivererToHostile : Notifier { Unit i_source; - ServerPacket i_message; + MessageDistDelivererCustomizer i_messageCustomizer; float i_distSq; - public MessageDistDelivererToHostile(Unit src, ServerPacket msg, float dist) + public MessageDistDelivererToHostile(Unit src, ServerPacket pkt, float dist) { i_source = src; - i_message = msg; + i_messageCustomizer = new(pkt); + i_distSq = dist * dist; + } + + public MessageDistDelivererToHostile(Unit src, MessageDistDelivererCustomizer packetCustomizer, float dist) + { + i_source = src; + i_messageCustomizer = packetCustomizer; i_distSq = dist * dist; } @@ -562,7 +594,7 @@ namespace Game.Maps if (player == i_source || !player.HaveAtClient(i_source) || player.IsFriendlyTo(i_source)) return; - player.SendPacket(i_message); + player.SendPacket(i_messageCustomizer.Invoke(player)); } } diff --git a/Source/Game/Networking/Packets/CombatLogPackets.cs b/Source/Game/Networking/Packets/CombatLogPackets.cs index 1d167e428..9507d31f9 100644 --- a/Source/Game/Networking/Packets/CombatLogPackets.cs +++ b/Source/Game/Networking/Packets/CombatLogPackets.cs @@ -32,14 +32,14 @@ namespace Game.Networking.Packets public override void Write() { } - public void DisableAdvancedCombatLogging() + public void SetAdvancedCombatLogging(bool value) { - LogData = null; + _includeLogData = value; } public void WriteLogDataBit() { - _worldPacket.WriteBit(LogData != null); + _worldPacket.WriteBit(_includeLogData); } public void FlushBits() @@ -49,11 +49,12 @@ namespace Game.Networking.Packets public void WriteLogData() { - if (LogData != null) + if (_includeLogData) LogData.Write(_worldPacket); } internal SpellCastLogData LogData; + bool _includeLogData; } class SpellNonMeleeDamageLog : CombatLogServerPacket