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:
hondacrx
2021-04-30 11:08:49 -04:00
parent 88d833945b
commit 7c83501ba7
4 changed files with 67 additions and 105 deletions
+2 -1
View File
@@ -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());
} }
+14 -86
View File
@@ -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;
}
} }
} }
+46 -14
View File
@@ -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