Core/Grids: Allow customizing packets sent with MessageDistDeliverer and MessageDistDelivererToHostile depending on receiver
Port From (https://github.com/TrinityCore/TrinityCore/commit/3a37a2e0d7ce79d55c301f4246f08f1fc5c9c6d7)
This commit is contained in:
@@ -1548,7 +1548,8 @@ namespace Game.Entities
|
|||||||
|
|
||||||
internal void SendCombatLogMessage(CombatLogServerPacket combatLog)
|
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());
|
Cell.VisitWorldObjects(this, notifier, GetVisibilityRange());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ using Game.Combat;
|
|||||||
using Game.DataStorage;
|
using Game.DataStorage;
|
||||||
using Game.Maps;
|
using Game.Maps;
|
||||||
using Game.Movement;
|
using Game.Movement;
|
||||||
|
using Game.Networking;
|
||||||
using Game.Networking.Packets;
|
using Game.Networking.Packets;
|
||||||
using Game.Spells;
|
using Game.Spells;
|
||||||
using System;
|
using System;
|
||||||
@@ -577,93 +578,20 @@ namespace Game.Entities
|
|||||||
public StringArray name = new(SharedConst.MaxDeclinedNameCases);
|
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<Player> 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<Creature> 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<DynamicObject> 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;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ using Game.Networking.Packets;
|
|||||||
using Game.Spells;
|
using Game.Spells;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace Game.Maps
|
namespace Game.Maps
|
||||||
{
|
{
|
||||||
@@ -379,12 +378,44 @@ namespace Game.Maps
|
|||||||
bool isCreature;
|
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 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_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;
|
i_distSq = dist * dist;
|
||||||
team = (uint)((own_team_only && src.IsTypeId(TypeId.Player)) ? ((Player)src).GetTeam() : 0);
|
team = (uint)((own_team_only && src.IsTypeId(TypeId.Player)) ? ((Player)src).GetTeam() : 0);
|
||||||
skipped_receiver = skipped;
|
skipped_receiver = skipped;
|
||||||
@@ -466,26 +497,27 @@ namespace Game.Maps
|
|||||||
if (!player.HaveAtClient(i_source))
|
if (!player.HaveAtClient(i_source))
|
||||||
return;
|
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
|
public class MessageDistDelivererToHostile : Notifier
|
||||||
{
|
{
|
||||||
Unit i_source;
|
Unit i_source;
|
||||||
ServerPacket i_message;
|
MessageDistDelivererCustomizer i_messageCustomizer;
|
||||||
float i_distSq;
|
float i_distSq;
|
||||||
|
|
||||||
public MessageDistDelivererToHostile(Unit src, ServerPacket msg, float dist)
|
public MessageDistDelivererToHostile(Unit src, ServerPacket pkt, float dist)
|
||||||
{
|
{
|
||||||
i_source = src;
|
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;
|
i_distSq = dist * dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -562,7 +594,7 @@ namespace Game.Maps
|
|||||||
if (player == i_source || !player.HaveAtClient(i_source) || player.IsFriendlyTo(i_source))
|
if (player == i_source || !player.HaveAtClient(i_source) || player.IsFriendlyTo(i_source))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
player.SendPacket(i_message);
|
player.SendPacket(i_messageCustomizer.Invoke(player));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,14 +32,14 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public override void Write() { }
|
public override void Write() { }
|
||||||
|
|
||||||
public void DisableAdvancedCombatLogging()
|
public void SetAdvancedCombatLogging(bool value)
|
||||||
{
|
{
|
||||||
LogData = null;
|
_includeLogData = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteLogDataBit()
|
public void WriteLogDataBit()
|
||||||
{
|
{
|
||||||
_worldPacket.WriteBit(LogData != null);
|
_worldPacket.WriteBit(_includeLogData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FlushBits()
|
public void FlushBits()
|
||||||
@@ -49,11 +49,12 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public void WriteLogData()
|
public void WriteLogData()
|
||||||
{
|
{
|
||||||
if (LogData != null)
|
if (_includeLogData)
|
||||||
LogData.Write(_worldPacket);
|
LogData.Write(_worldPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal SpellCastLogData LogData;
|
internal SpellCastLogData LogData;
|
||||||
|
bool _includeLogData;
|
||||||
}
|
}
|
||||||
|
|
||||||
class SpellNonMeleeDamageLog : CombatLogServerPacket
|
class SpellNonMeleeDamageLog : CombatLogServerPacket
|
||||||
|
|||||||
Reference in New Issue
Block a user