Core/Grids: Move packet sending functionality out of MessageDistDeliverer and into separate, customizable class and unify LocalizedPacketDo, LocalizedPacketListDo as generic localizable action

Port From (https://github.com/TrinityCore/TrinityCore/commit/fb66575d38d2ba7ffc24c29824fa75d7019de549)
This commit is contained in:
hondacrx
2021-05-02 13:41:19 -04:00
parent 7c83501ba7
commit aaa3964d49
16 changed files with 188 additions and 198 deletions
+41 -80
View File
@@ -378,44 +378,45 @@ namespace Game.Maps
bool isCreature;
}
public class MessageDistDelivererCustomizer
public class PacketSenderRef : IDoWork<Player>
{
ServerPacket i_message;
ServerPacket Data;
public MessageDistDelivererCustomizer() { }
public PacketSenderRef() { }
public MessageDistDelivererCustomizer(ServerPacket message)
public PacketSenderRef(ServerPacket message)
{
i_message = message;
Data = message;
}
public virtual ServerPacket Invoke(Player player)
public virtual void Invoke(Player player)
{
return i_message;
player.SendPacket(Data);
}
}
public class MessageDistDeliverer : Notifier
public class PacketSenderOwning<T> : IDoWork<Player> where T : ServerPacket
{
public T Data;
public void Invoke(Player player)
{
player.SendPacket(Data);
}
}
public class MessageDistDeliverer<T> : Notifier where T : IDoWork<Player>
{
WorldObject i_source;
MessageDistDelivererCustomizer i_messageCustomizer;
T i_packetSender;
float i_distSq;
uint team;
Player skipped_receiver;
public MessageDistDeliverer(WorldObject src, ServerPacket pkt, float dist, bool own_team_only = false, Player skipped = null)
public MessageDistDeliverer(WorldObject src, T packetSender, float dist, bool own_team_only = false, Player skipped = null)
{
i_source = src;
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_packetSender = packetSender;
i_distSq = dist * dist;
team = (uint)((own_team_only && src.IsTypeId(TypeId.Player)) ? ((Player)src).GetTeam() : 0);
skipped_receiver = skipped;
@@ -497,27 +498,20 @@ namespace Game.Maps
if (!player.HaveAtClient(i_source))
return;
player.SendPacket(i_messageCustomizer.Invoke(player));
i_packetSender.Invoke(player);
}
}
public class MessageDistDelivererToHostile : Notifier
public class MessageDistDelivererToHostile<T> : Notifier where T : IDoWork<Player>
{
Unit i_source;
MessageDistDelivererCustomizer i_messageCustomizer;
T i_packetSender;
float i_distSq;
public MessageDistDelivererToHostile(Unit src, ServerPacket pkt, float dist)
public MessageDistDelivererToHostile(Unit src, T packetSender, float dist)
{
i_source = src;
i_messageCustomizer = new(pkt);
i_distSq = dist * dist;
}
public MessageDistDelivererToHostile(Unit src, MessageDistDelivererCustomizer packetCustomizer, float dist)
{
i_source = src;
i_messageCustomizer = packetCustomizer;
i_packetSender = packetSender;
i_distSq = dist * dist;
}
@@ -594,7 +588,7 @@ namespace Game.Maps
if (player == i_source || !player.HaveAtClient(i_source) || player.IsFriendlyTo(i_source))
return;
player.SendPacket(i_messageCustomizer.Invoke(player));
i_packetSender.Invoke(player);
}
}
@@ -941,69 +935,36 @@ namespace Game.Maps
float i_range;
}
public class LocalizedPacketDo : IDoWork<Player>
public class LocalizedDo : IDoWork<Player>
{
public LocalizedPacketDo(MessageBuilder builder)
public LocalizedDo(MessageBuilder localizer)
{
Builder = builder;
_localizer = localizer;
}
public void Invoke(Player player)
{
Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex();
int cache_idx = (int)loc_idx + 1;
ServerPacket data;
IDoWork<Player> action;
// create if not cached yet
if (i_data_cache.Length < cache_idx + 1 || i_data_cache[cache_idx] == null)
if (_localizedCache.Length < cache_idx + 1 || _localizedCache[cache_idx] == null)
{
if (i_data_cache.Length < cache_idx + 1)
Array.Resize(ref i_data_cache, cache_idx + 1);
if (_localizedCache.Length < cache_idx + 1)
Array.Resize(ref _localizedCache, cache_idx + 1);
data = Builder.Invoke(loc_idx);
i_data_cache[cache_idx] = data;
action = _localizer.Invoke(loc_idx);
_localizedCache[cache_idx] = action;
}
else
data = i_data_cache[cache_idx];
action = _localizedCache[cache_idx];
player.SendPacket(data);
action.Invoke(player);
}
MessageBuilder Builder;
ServerPacket[] i_data_cache = new ServerPacket[(int)Locale.Total]; // 0 = default, i => i-1 locale index
}
public class LocalizedPacketListDo : IDoWork<Player>
{
public LocalizedPacketListDo(MessageBuilder builder)
{
i_builder = builder;
}
public void Invoke(Player p)
{
Locale loc_idx = p.GetSession().GetSessionDbLocaleIndex();
int cache_idx = (int)loc_idx + 1;
List<ServerPacket> data_list = new();
// create if not cached yet
if (i_data_cache.Count < cache_idx + 1 || i_data_cache[cache_idx].Empty())
{
data_list = i_data_cache[cache_idx];
i_builder.Invoke(data_list, loc_idx);
}
else
data_list = i_data_cache[cache_idx];
foreach (var packet in data_list)
p.SendPacket(packet);
}
MessageBuilder i_builder;
MultiMap<int, ServerPacket> i_data_cache = new();
// 0 = default, i => i-1 locale index
MessageBuilder _localizer;
IDoWork<Player>[] _localizedCache = new IDoWork<Player>[(int)Locale.Total]; // 0 = default, i => i-1 locale index
}
public class RespawnDo : IDoWork<WorldObject>