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
@@ -659,7 +659,7 @@ namespace Game.Achievements
if (guild) if (guild)
{ {
BroadcastTextBuilder say_builder = new(_owner, ChatMsg.GuildAchievement, (uint)BroadcastTextIds.AchivementEarned, _owner.GetGender(), _owner, achievement.Id); BroadcastTextBuilder say_builder = new(_owner, ChatMsg.GuildAchievement, (uint)BroadcastTextIds.AchivementEarned, _owner.GetGender(), _owner, achievement.Id);
var say_do = new LocalizedPacketDo(say_builder); var say_do = new LocalizedDo(say_builder);
guild.BroadcastWorker(say_do, _owner); guild.BroadcastWorker(say_do, _owner);
} }
@@ -676,7 +676,7 @@ namespace Game.Achievements
else if (_owner.IsInWorld) else if (_owner.IsInWorld)
{ {
BroadcastTextBuilder _builder = new(_owner, ChatMsg.Achievement, (uint)BroadcastTextIds.AchivementEarned, _owner.GetGender(), _owner, achievement.Id); BroadcastTextBuilder _builder = new(_owner, ChatMsg.Achievement, (uint)BroadcastTextIds.AchivementEarned, _owner.GetGender(), _owner, achievement.Id);
var _localizer = new LocalizedPacketDo(_builder); var _localizer = new LocalizedDo(_builder);
var _worker = new PlayerDistWorker(_owner, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay), _localizer); var _worker = new PlayerDistWorker(_owner, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay), _localizer);
Cell.VisitWorldObjects(_owner, _worker, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay)); Cell.VisitWorldObjects(_owner, _worker, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay));
} }
+3 -3
View File
@@ -569,7 +569,7 @@ namespace Game.BattleGrounds
} }
BroadcastTextBuilder builder = new(null, msgType, id, Gender.Male, target); BroadcastTextBuilder builder = new(null, msgType, id, Gender.Male, target);
LocalizedPacketDo localizer = new(builder); LocalizedDo localizer = new(builder);
BroadcastWorker(localizer); BroadcastWorker(localizer);
} }
@@ -1582,7 +1582,7 @@ namespace Game.BattleGrounds
return; return;
CypherStringChatBuilder builder = new(null, msgType, entry, source); CypherStringChatBuilder builder = new(null, msgType, entry, source);
LocalizedPacketDo localizer = new(builder); LocalizedDo localizer = new(builder);
BroadcastWorker(localizer); BroadcastWorker(localizer);
} }
@@ -1592,7 +1592,7 @@ namespace Game.BattleGrounds
return; return;
CypherStringChatBuilder builder = new(null, msgType, entry, source, args); CypherStringChatBuilder builder = new(null, msgType, entry, source, args);
LocalizedPacketDo localizer = new(builder); LocalizedDo localizer = new(builder);
BroadcastWorker(localizer); BroadcastWorker(localizer);
} }
+5 -4
View File
@@ -21,6 +21,7 @@ using Framework.Database;
using Game.DataStorage; using Game.DataStorage;
using Game.Entities; using Game.Entities;
using Game.Maps; using Game.Maps;
using Game.Networking;
using Game.Networking.Packets; using Game.Networking.Packets;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -834,7 +835,7 @@ namespace Game.Chat
void SendToAll(MessageBuilder builder, ObjectGuid guid = default) void SendToAll(MessageBuilder builder, ObjectGuid guid = default)
{ {
LocalizedPacketDo localizer = new(builder); LocalizedDo localizer = new(builder);
foreach (var pair in _playersStore) foreach (var pair in _playersStore)
{ {
@@ -847,7 +848,7 @@ namespace Game.Chat
void SendToAllButOne(MessageBuilder builder, ObjectGuid who) void SendToAllButOne(MessageBuilder builder, ObjectGuid who)
{ {
LocalizedPacketDo localizer = new(builder); LocalizedDo localizer = new(builder);
foreach (var pair in _playersStore) foreach (var pair in _playersStore)
{ {
@@ -862,7 +863,7 @@ namespace Game.Chat
void SendToOne(MessageBuilder builder, ObjectGuid who) void SendToOne(MessageBuilder builder, ObjectGuid who)
{ {
LocalizedPacketDo localizer = new(builder); LocalizedDo localizer = new(builder);
Player player = Global.ObjAccessor.FindConnectedPlayer(who); Player player = Global.ObjAccessor.FindConnectedPlayer(who);
if (player) if (player)
@@ -871,7 +872,7 @@ namespace Game.Chat
void SendToAllWithAddon(MessageBuilder builder, string addonPrefix, ObjectGuid guid = default) void SendToAllWithAddon(MessageBuilder builder, string addonPrefix, ObjectGuid guid = default)
{ {
LocalizedPacketDo localizer = new(builder); LocalizedDo localizer = new(builder);
foreach (var pair in _playersStore) foreach (var pair in _playersStore)
{ {
+52 -50
View File
@@ -16,10 +16,11 @@
*/ */
using Framework.Constants; using Framework.Constants;
using Game.Cache;
using Game.Entities; using Game.Entities;
using Game.Maps;
using Game.Networking; using Game.Networking;
using Game.Networking.Packets; using Game.Networking.Packets;
using Game.Cache;
namespace Game.Chat namespace Game.Chat
{ {
@@ -38,16 +39,17 @@ namespace Game.Chat
_modifier = modifier; _modifier = modifier;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<ChannelNotify> Invoke(Locale locale = Locale.enUS)
{ {
// LocalizedPacketDo sends client DBC locale, we need to get available to server locale // LocalizedPacketDo sends client DBC locale, we need to get available to server locale
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
ChannelNotify data = new(); PacketSenderOwning<ChannelNotify> sender = new();
data.Type = _modifier.GetNotificationType(); sender.Data.Type = _modifier.GetNotificationType();
data.Channel = _source.GetName(localeIdx); sender.Data.Channel = _source.GetName(localeIdx);
_modifier.Append(data); _modifier.Append(sender.Data);
return data; sender.Data.Write();
return sender;
} }
Channel _source; Channel _source;
@@ -61,17 +63,17 @@ namespace Game.Chat
_source = source; _source = source;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<ChannelNotifyJoined> Invoke(Locale locale = Locale.enUS)
{ {
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
ChannelNotifyJoined notify = new(); PacketSenderOwning<ChannelNotifyJoined> notify = new();
//notify.ChannelWelcomeMsg = ""; //notify.ChannelWelcomeMsg = "";
notify.ChatChannelID = (int)_source.GetChannelId(); notify.Data.ChatChannelID = (int)_source.GetChannelId();
//notify.InstanceID = 0; //notify.InstanceID = 0;
notify.ChannelFlags = _source.GetFlags(); notify.Data.ChannelFlags = _source.GetFlags();
notify.Channel = _source.GetName(localeIdx); notify.Data.Channel = _source.GetName(localeIdx);
notify.ChannelGUID = _source.GetChannelGuid(); notify.Data.ChannelGUID = _source.GetChannelGuid();
return notify; return notify;
} }
@@ -86,14 +88,14 @@ namespace Game.Chat
_suspended = suspend; _suspended = suspend;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<ChannelNotifyLeft> Invoke(Locale locale = Locale.enUS)
{ {
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
ChannelNotifyLeft notify = new(); PacketSenderOwning<ChannelNotifyLeft> notify = new();
notify.Channel = _source.GetName(localeIdx); notify.Data.Channel = _source.GetName(localeIdx);
notify.ChatChannelID = _source.GetChannelId(); notify.Data.ChatChannelID = _source.GetChannelId();
notify.Suspended = _suspended; notify.Data.Suspended = _suspended;
return notify; return notify;
} }
@@ -111,19 +113,19 @@ namespace Game.Chat
_guid = guid; _guid = guid;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS)
{ {
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
ChatPkt packet = new(); PacketSenderOwning<ChatPkt> packet = new();
Player player = Global.ObjAccessor.FindConnectedPlayer(_guid); Player player = Global.ObjAccessor.FindConnectedPlayer(_guid);
if (player) if (player)
packet.Initialize(ChatMsg.Channel, _lang, player, player, _what, 0, _source.GetName(localeIdx)); packet.Data.Initialize(ChatMsg.Channel, _lang, player, player, _what, 0, _source.GetName(localeIdx));
else else
{ {
packet.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx)); packet.Data.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx));
packet.SenderGUID = _guid; packet.Data.SenderGUID = _guid;
packet.TargetGUID = _guid; packet.Data.TargetGUID = _guid;
} }
return packet; return packet;
@@ -146,19 +148,19 @@ namespace Game.Chat
_guid = guid; _guid = guid;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS)
{ {
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
ChatPkt packet = new(); PacketSenderOwning<ChatPkt> packet = new();
Player player = Global.ObjAccessor.FindConnectedPlayer(_guid); Player player = Global.ObjAccessor.FindConnectedPlayer(_guid);
if (player) if (player)
packet.Initialize(ChatMsg.Channel, _lang, player, player, _what, 0, _source.GetName(localeIdx), Locale.enUS, _prefix); packet.Data.Initialize(ChatMsg.Channel, _lang, player, player, _what, 0, _source.GetName(localeIdx), Locale.enUS, _prefix);
else else
{ {
packet.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx), Locale.enUS, _prefix); packet.Data.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx), Locale.enUS, _prefix);
packet.SenderGUID = _guid; packet.Data.SenderGUID = _guid;
packet.TargetGUID = _guid; packet.Data.TargetGUID = _guid;
} }
return packet; return packet;
@@ -179,16 +181,16 @@ namespace Game.Chat
_guid = guid; _guid = guid;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<UserlistAdd> Invoke(Locale locale = Locale.enUS)
{ {
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
UserlistAdd userlistAdd = new(); PacketSenderOwning<UserlistAdd> userlistAdd = new();
userlistAdd.AddedUserGUID = _guid; userlistAdd.Data.AddedUserGUID = _guid;
userlistAdd.ChannelFlags = _source.GetFlags(); userlistAdd.Data.ChannelFlags = _source.GetFlags();
userlistAdd.UserFlags = _source.GetPlayerFlags(_guid); userlistAdd.Data.UserFlags = _source.GetPlayerFlags(_guid);
userlistAdd.ChannelID = _source.GetChannelId(); userlistAdd.Data.ChannelID = _source.GetChannelId();
userlistAdd.ChannelName = _source.GetName(localeIdx); userlistAdd.Data.ChannelName = _source.GetName(localeIdx);
return userlistAdd; return userlistAdd;
} }
@@ -204,16 +206,16 @@ namespace Game.Chat
_guid = guid; _guid = guid;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<UserlistUpdate> Invoke(Locale locale = Locale.enUS)
{ {
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
UserlistUpdate userlistUpdate = new(); PacketSenderOwning<UserlistUpdate> userlistUpdate = new();
userlistUpdate.UpdatedUserGUID = _guid; userlistUpdate.Data.UpdatedUserGUID = _guid;
userlistUpdate.ChannelFlags = _source.GetFlags(); userlistUpdate.Data.ChannelFlags = _source.GetFlags();
userlistUpdate.UserFlags = _source.GetPlayerFlags(_guid); userlistUpdate.Data.UserFlags = _source.GetPlayerFlags(_guid);
userlistUpdate.ChannelID = _source.GetChannelId(); userlistUpdate.Data.ChannelID = _source.GetChannelId();
userlistUpdate.ChannelName = _source.GetName(localeIdx); userlistUpdate.Data.ChannelName = _source.GetName(localeIdx);
return userlistUpdate; return userlistUpdate;
} }
@@ -229,15 +231,15 @@ namespace Game.Chat
_guid = guid; _guid = guid;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<UserlistRemove> Invoke(Locale locale = Locale.enUS)
{ {
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
UserlistRemove userlistRemove = new(); PacketSenderOwning<UserlistRemove> userlistRemove = new();
userlistRemove.RemovedUserGUID = _guid; userlistRemove.Data.RemovedUserGUID = _guid;
userlistRemove.ChannelFlags = _source.GetFlags(); userlistRemove.Data.ChannelFlags = _source.GetFlags();
userlistRemove.ChannelID = _source.GetChannelId(); userlistRemove.Data.ChannelID = _source.GetChannelId();
userlistRemove.ChannelName = _source.GetName(localeIdx); userlistRemove.Data.ChannelName = _source.GetName(localeIdx);
return userlistRemove; return userlistRemove;
} }
+4 -2
View File
@@ -1355,13 +1355,15 @@ namespace Game.Entities
public virtual void SendMessageToSetInRange(ServerPacket data, float dist, bool self) public virtual void SendMessageToSetInRange(ServerPacket data, float dist, bool self)
{ {
MessageDistDeliverer notifier = new(this, data, dist); PacketSenderRef sender = new(data);
MessageDistDeliverer<PacketSenderRef> notifier = new(this, sender, dist);
Cell.VisitWorldObjects(this, notifier, dist); Cell.VisitWorldObjects(this, notifier, dist);
} }
public virtual void SendMessageToSet(ServerPacket data, Player skip) public virtual void SendMessageToSet(ServerPacket data, Player skip)
{ {
var notifier = new MessageDistDeliverer(this, data, GetVisibilityRange(), false, skip); PacketSenderRef sender = new(data);
var notifier = new MessageDistDeliverer<PacketSenderRef>(this, sender, GetVisibilityRange(), false, skip);
Cell.VisitWorldObjects(this, notifier, GetVisibilityRange()); Cell.VisitWorldObjects(this, notifier, GetVisibilityRange());
} }
+6 -3
View File
@@ -5970,7 +5970,8 @@ namespace Game.Entities
if (self) if (self)
SendPacket(data); SendPacket(data);
MessageDistDeliverer notifier = new(this, data, dist); PacketSenderRef sender = new(data);
var notifier = new MessageDistDeliverer<PacketSenderRef>(this, sender, dist);
Cell.VisitWorldObjects(this, notifier, dist); Cell.VisitWorldObjects(this, notifier, dist);
} }
@@ -5979,7 +5980,8 @@ namespace Game.Entities
if (self) if (self)
SendPacket(data); SendPacket(data);
MessageDistDeliverer notifier = new(this, data, dist, own_team_only); PacketSenderRef sender = new(data);
var notifier = new MessageDistDeliverer<PacketSenderRef>(this, sender, dist, own_team_only);
Cell.VisitWorldObjects(this, notifier, dist); Cell.VisitWorldObjects(this, notifier, dist);
} }
@@ -5990,7 +5992,8 @@ namespace Game.Entities
// we use World.GetMaxVisibleDistance() because i cannot see why not use a distance // we use World.GetMaxVisibleDistance() because i cannot see why not use a distance
// update: replaced by GetMap().GetVisibilityDistance() // update: replaced by GetMap().GetVisibilityDistance()
MessageDistDeliverer notifier = new(this, data, GetVisibilityRange(), false, skipped_rcvr); PacketSenderRef sender = new(data);
var notifier = new MessageDistDeliverer<PacketSenderRef>(this, sender, GetVisibilityRange(), false, skipped_rcvr);
Cell.VisitWorldObjects(this, notifier, GetVisibilityRange()); Cell.VisitWorldObjects(this, notifier, GetVisibilityRange());
} }
public override void SendMessageToSet(ServerPacket data, bool self) public override void SendMessageToSet(ServerPacket data, bool self)
+1 -1
View File
@@ -1549,7 +1549,7 @@ namespace Game.Entities
internal void SendCombatLogMessage(CombatLogServerPacket combatLog) internal void SendCombatLogMessage(CombatLogServerPacket combatLog)
{ {
CombatLogSender combatLogCustomizer = new(combatLog); CombatLogSender combatLogCustomizer = new(combatLog);
MessageDistDeliverer notifier = new(this, combatLogCustomizer, GetVisibilityRange()); var notifier = new MessageDistDeliverer<CombatLogSender>(this, combatLogCustomizer, GetVisibilityRange());
Cell.VisitWorldObjects(this, notifier, GetVisibilityRange()); Cell.VisitWorldObjects(this, notifier, GetVisibilityRange());
} }
+4 -3
View File
@@ -578,7 +578,7 @@ namespace Game.Entities
public StringArray name = new(SharedConst.MaxDeclinedNameCases); public StringArray name = new(SharedConst.MaxDeclinedNameCases);
} }
class CombatLogSender : MessageDistDelivererCustomizer class CombatLogSender : IDoWork<Player>
{ {
CombatLogServerPacket i_message; CombatLogServerPacket i_message;
@@ -587,11 +587,12 @@ namespace Game.Entities
i_message = msg; i_message = msg;
} }
public override ServerPacket Invoke(Player player) public void Invoke(Player player)
{ {
i_message.Clear();
i_message.SetAdvancedCombatLogging(player.IsAdvancedCombatLoggingEnabled()); i_message.SetAdvancedCombatLogging(player.IsAdvancedCombatLoggingEnabled());
return i_message; player.SendPacket(i_message);
} }
} }
} }
+2 -2
View File
@@ -351,7 +351,7 @@ namespace Game.Entities
public virtual void Talk(string text, ChatMsg msgType, Language language, float textRange, WorldObject target) public virtual void Talk(string text, ChatMsg msgType, Language language, float textRange, WorldObject target)
{ {
var builder = new CustomChatTextBuilder(this, msgType, text, language, target); var builder = new CustomChatTextBuilder(this, msgType, text, language, target);
var localizer = new LocalizedPacketDo(builder); var localizer = new LocalizedDo(builder);
var worker = new PlayerDistWorker(this, textRange, localizer); var worker = new PlayerDistWorker(this, textRange, localizer);
Cell.VisitWorldObjects(this, worker, textRange); Cell.VisitWorldObjects(this, worker, textRange);
} }
@@ -391,7 +391,7 @@ namespace Game.Entities
} }
var builder = new BroadcastTextBuilder(this, msgType, textId, GetGender(), target); var builder = new BroadcastTextBuilder(this, msgType, textId, GetGender(), target);
var localizer = new LocalizedPacketDo(builder); var localizer = new LocalizedDo(builder);
var worker = new PlayerDistWorker(this, textRange, localizer); var worker = new PlayerDistWorker(this, textRange, localizer);
Cell.VisitWorldObjects(this, worker, textRange); Cell.VisitWorldObjects(this, worker, textRange);
} }
+41 -80
View File
@@ -378,44 +378,45 @@ namespace Game.Maps
bool isCreature; 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; WorldObject i_source;
MessageDistDelivererCustomizer i_messageCustomizer; T i_packetSender;
float i_distSq; float i_distSq;
uint team; uint team;
Player skipped_receiver; 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_source = src;
i_messageCustomizer = new(pkt); i_packetSender = packetSender;
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;
@@ -497,27 +498,20 @@ namespace Game.Maps
if (!player.HaveAtClient(i_source)) if (!player.HaveAtClient(i_source))
return; 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; Unit i_source;
MessageDistDelivererCustomizer i_messageCustomizer; T i_packetSender;
float i_distSq; float i_distSq;
public MessageDistDelivererToHostile(Unit src, ServerPacket pkt, float dist) public MessageDistDelivererToHostile(Unit src, T packetSender, float dist)
{ {
i_source = src; i_source = src;
i_messageCustomizer = new(pkt); i_packetSender = packetSender;
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;
} }
@@ -594,7 +588,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_messageCustomizer.Invoke(player)); i_packetSender.Invoke(player);
} }
} }
@@ -941,69 +935,36 @@ namespace Game.Maps
float i_range; 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) public void Invoke(Player player)
{ {
Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex(); Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex();
int cache_idx = (int)loc_idx + 1; int cache_idx = (int)loc_idx + 1;
ServerPacket data; IDoWork<Player> action;
// create if not cached yet // 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) if (_localizedCache.Length < cache_idx + 1)
Array.Resize(ref i_data_cache, cache_idx + 1); Array.Resize(ref _localizedCache, cache_idx + 1);
data = Builder.Invoke(loc_idx); action = _localizer.Invoke(loc_idx);
_localizedCache[cache_idx] = action;
i_data_cache[cache_idx] = data;
} }
else else
data = i_data_cache[cache_idx]; action = _localizedCache[cache_idx];
player.SendPacket(data); action.Invoke(player);
} }
MessageBuilder Builder; MessageBuilder _localizer;
ServerPacket[] i_data_cache = new ServerPacket[(int)Locale.Total]; // 0 = default, i => i-1 locale index IDoWork<Player>[] _localizedCache = new IDoWork<Player>[(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
} }
public class RespawnDo : IDoWork<WorldObject> public class RespawnDo : IDoWork<WorldObject>
+5 -5
View File
@@ -246,7 +246,7 @@ namespace Game.PvP
public void SendDefenseMessage(uint zoneId, uint id) public void SendDefenseMessage(uint zoneId, uint id)
{ {
DefenseMessageBuilder builder = new(zoneId, id); DefenseMessageBuilder builder = new(zoneId, id);
var localizer = new LocalizedPacketDo(builder); var localizer = new LocalizedDo(builder);
BroadcastWorker(localizer, zoneId); BroadcastWorker(localizer, zoneId);
} }
@@ -736,13 +736,13 @@ namespace Game.PvP
_id = id; _id = id;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<DefenseMessage> Invoke(Locale locale = Locale.enUS)
{ {
string text = Global.OutdoorPvPMgr.GetDefenseMessage(_zoneId, _id, locale); string text = Global.OutdoorPvPMgr.GetDefenseMessage(_zoneId, _id, locale);
DefenseMessage defenseMessage = new(); PacketSenderOwning<DefenseMessage> defenseMessage = new();
defenseMessage.ZoneID = _zoneId; defenseMessage.Data.ZoneID = _zoneId;
defenseMessage.MessageText = text; defenseMessage.Data.MessageText = text;
return defenseMessage; return defenseMessage;
} }
+22 -7
View File
@@ -1472,7 +1472,7 @@ namespace Game
public void SendWorldText(CypherStrings string_id, params object[] args) public void SendWorldText(CypherStrings string_id, params object[] args)
{ {
WorldWorldTextBuilder wt_builder = new((uint)string_id, args); WorldWorldTextBuilder wt_builder = new((uint)string_id, args);
var wt_do = new LocalizedPacketListDo(wt_builder); var wt_do = new LocalizedDo(wt_builder);
foreach (var session in m_sessions.Values) foreach (var session in m_sessions.Values)
{ {
if (session == null || !session.GetPlayer() || !session.GetPlayer().IsInWorld) if (session == null || !session.GetPlayer() || !session.GetPlayer().IsInWorld)
@@ -1486,7 +1486,7 @@ namespace Game
public void SendGMText(CypherStrings string_id, params object[] args) public void SendGMText(CypherStrings string_id, params object[] args)
{ {
var wt_builder = new WorldWorldTextBuilder((uint)string_id, args); var wt_builder = new WorldWorldTextBuilder((uint)string_id, args);
var wt_do = new LocalizedPacketListDo(wt_builder); var wt_do = new LocalizedDo(wt_builder);
foreach (var session in m_sessions.Values) foreach (var session in m_sessions.Values)
{ {
// Session should have permissions to receive global gm messages // Session should have permissions to receive global gm messages
@@ -2512,32 +2512,47 @@ namespace Game
} }
public class WorldWorldTextBuilder : MessageBuilder public class WorldWorldTextBuilder : MessageBuilder
{ {
public WorldWorldTextBuilder(uint textId, params object[] args) public WorldWorldTextBuilder(uint textId, params object[] args)
{ {
i_textId = textId; i_textId = textId;
i_args = args; i_args = args;
} }
public override void Invoke(List<ServerPacket> data_list, Locale loc_idx) public override MultiplePacketSender Invoke(Locale locale)
{ {
string text = Global.ObjectMgr.GetCypherString(i_textId, loc_idx); string text = Global.ObjectMgr.GetCypherString(i_textId, locale);
if (i_args != null) if (i_args != null)
text = string.Format(text, i_args); text = string.Format(text, i_args);
ChatPkt messageChat = new(); MultiplePacketSender sender = new MultiplePacketSender();
var lines = new StringArray(text, "\n"); var lines = new StringArray(text, "\n");
for (var i = 0; i < lines.Length; ++i) for (var i = 0; i < lines.Length; ++i)
{ {
ChatPkt messageChat = new();
messageChat.Initialize(ChatMsg.System, Language.Universal, null, null, lines[i]); messageChat.Initialize(ChatMsg.System, Language.Universal, null, null, lines[i]);
data_list.Add(messageChat); messageChat.Write();
sender.Packets.Add(messageChat);
} }
return sender;
} }
uint i_textId; uint i_textId;
object[] i_args; object[] i_args;
public class MultiplePacketSender : IDoWork<Player>
{
public void Invoke(Player receiver)
{
foreach (var packet in Packets)
receiver.SendPacket(packet);
}
public List<ServerPacket> Packets = new();
}
} }
struct Autobroadcast struct Autobroadcast
+1
View File
@@ -3804,6 +3804,7 @@ namespace Game.Spells
packet.LogData.Initialize(this); packet.LogData.Initialize(this);
m_caster.SendCombatLogMessage(packet); m_caster.SendCombatLogMessage(packet);
} }
+9 -6
View File
@@ -3801,15 +3801,18 @@ namespace Game.Spells
float dist = m_caster.GetVisibilityRange(); float dist = m_caster.GetVisibilityRange();
// clear focus // clear focus
BreakTarget breakTarget = new(); PacketSenderOwning<BreakTarget> breakTarget = new();
breakTarget.UnitGUID = m_caster.GetGUID(); breakTarget.Data.UnitGUID = m_caster.GetGUID();
MessageDistDelivererToHostile notifierBreak = new(m_caster, breakTarget, dist); breakTarget.Data.Write();
var notifierBreak = new MessageDistDelivererToHostile<PacketSenderOwning<BreakTarget>>(m_caster, breakTarget, dist);
Cell.VisitWorldObjects(m_caster, notifierBreak, dist); Cell.VisitWorldObjects(m_caster, notifierBreak, dist);
// and selection // and selection
ClearTarget clearTarget = new(); PacketSenderOwning<ClearTarget> clearTarget = new();
clearTarget.Guid = m_caster.GetGUID(); clearTarget.Data.Guid = m_caster.GetGUID();
MessageDistDelivererToHostile notifierClear = new(m_caster, clearTarget, dist); clearTarget.Data.Write();
var notifierClear = new MessageDistDelivererToHostile<PacketSenderOwning<ClearTarget>>(m_caster, clearTarget, dist);
Cell.VisitWorldObjects(m_caster, notifierClear, dist); Cell.VisitWorldObjects(m_caster, notifierClear, dist);
// we should also force pets to remove us from current target // we should also force pets to remove us from current target
+15 -15
View File
@@ -18,6 +18,7 @@
using Framework.Constants; using Framework.Constants;
using Game.DataStorage; using Game.DataStorage;
using Game.Entities; using Game.Entities;
using Game.Maps;
using Game.Networking; using Game.Networking;
using Game.Networking.Packets; using Game.Networking.Packets;
using System.Collections.Generic; using System.Collections.Generic;
@@ -26,8 +27,7 @@ namespace Game.Chat
{ {
public class MessageBuilder public class MessageBuilder
{ {
public virtual ServerPacket Invoke(Locale locale = Locale.enUS) { return null; } public virtual dynamic Invoke(Locale locale = Locale.enUS) { return default; }
public virtual void Invoke(List<ServerPacket> data, Locale locale = Locale.enUS) { }
} }
public class BroadcastTextBuilder : MessageBuilder public class BroadcastTextBuilder : MessageBuilder
@@ -42,12 +42,12 @@ namespace Game.Chat
_achievementId = achievementId; _achievementId = achievementId;
} }
public override ServerPacket Invoke(Locale locale) public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS)
{ {
BroadcastTextRecord bct = CliDB.BroadcastTextStorage.LookupByKey(_textId); BroadcastTextRecord bct = CliDB.BroadcastTextStorage.LookupByKey(_textId);
var packet = new ChatPkt(); var chat = new PacketSenderOwning<ChatPkt>();
packet.Initialize(_msgType, bct != null ? (Language)bct.LanguageID : Language.Universal, _source, _target, bct != null ? Global.DB2Mgr.GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale); chat.Data.Initialize(_msgType, bct != null ? (Language)bct.LanguageID : Language.Universal, _source, _target, bct != null ? Global.DB2Mgr.GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale);
return packet; return chat;
} }
WorldObject _source; WorldObject _source;
@@ -69,11 +69,11 @@ namespace Game.Chat
_target = target; _target = target;
} }
public override ServerPacket Invoke(Locale locale) public override PacketSenderOwning<ChatPkt> Invoke(Locale locale)
{ {
var packet = new ChatPkt(); var chat = new PacketSenderOwning<ChatPkt>();
packet.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); chat.Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
return packet; return chat;
} }
WorldObject _source; WorldObject _source;
@@ -94,18 +94,18 @@ namespace Game.Chat
_args = args; _args = args;
} }
public override ServerPacket Invoke(Locale locale) public override PacketSenderOwning<ChatPkt> Invoke(Locale locale)
{ {
ChatPkt packet = new(); PacketSenderOwning<ChatPkt> chat = new();
string text = Global.ObjectMgr.GetCypherString(_textId, locale); string text = Global.ObjectMgr.GetCypherString(_textId, locale);
if (_args != null) if (_args != null)
packet.Initialize(_msgType, Language.Universal, _source, _target, string.Format(text, _args), 0, "", locale); chat.Data.Initialize(_msgType, Language.Universal, _source, _target, string.Format(text, _args), 0, "", locale);
else else
packet.Initialize(_msgType, Language.Universal, _source, _target, text, 0, "", locale); chat.Data.Initialize(_msgType, Language.Universal, _source, _target, text, 0, "", locale);
return packet; return chat;
} }
WorldObject _source; WorldObject _source;
+16 -15
View File
@@ -596,32 +596,33 @@ namespace Game
public void Invoke(Player player) public void Invoke(Player player)
{ {
Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex(); Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex();
ServerPacket messageTemplate; PacketSenderOwning<ChatPkt> sender;
// create if not cached yet // create if not cached yet
if (!_packetCache.ContainsKey(loc_idx)) if (!_packetCache.ContainsKey(loc_idx))
{ {
messageTemplate = _builder.Invoke(loc_idx); sender = _builder.Invoke(loc_idx);
_packetCache[loc_idx] = messageTemplate; _packetCache[loc_idx] = sender;
} }
else else
messageTemplate = _packetCache[loc_idx]; sender = _packetCache[loc_idx];
ChatPkt message = (ChatPkt)messageTemplate;
switch (_msgType) switch (_msgType)
{ {
case ChatMsg.MonsterWhisper: case ChatMsg.MonsterWhisper:
case ChatMsg.RaidBossWhisper: case ChatMsg.RaidBossWhisper:
ChatPkt message = sender.Data;
message.SetReceiver(player, loc_idx); message.SetReceiver(player, loc_idx);
player.SendPacket(message);
break; break;
default: default:
break; break;
} }
player.SendPacket(message); sender.Invoke(player);
} }
Dictionary<Locale, ServerPacket> _packetCache = new(); Dictionary<Locale, PacketSenderOwning<ChatPkt>> _packetCache = new();
MessageBuilder _builder; MessageBuilder _builder;
ChatMsg _msgType; ChatMsg _msgType;
} }
@@ -639,12 +640,12 @@ namespace Game
_target = target; _target = target;
} }
public override ServerPacket Invoke(Locale locale = Locale.enUS) public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS)
{ {
string text = Global.CreatureTextMgr.GetLocalizedChatString(_source.GetEntry(), _gender, _textGroup, _textId, locale); string text = Global.CreatureTextMgr.GetLocalizedChatString(_source.GetEntry(), _gender, _textGroup, _textId, locale);
var packet = new ChatPkt(); PacketSenderOwning<ChatPkt> chat = new();
packet.Initialize(_msgType, _language, _source, _target, text, 0, "", locale); chat.Data.Initialize(_msgType, _language, _source, _target, text, 0, "", locale);
return packet; return chat;
} }
WorldObject _source; WorldObject _source;
@@ -670,12 +671,12 @@ namespace Game
_target = target; _target = target;
} }
public override ServerPacket Invoke(Locale loc_idx = Locale.enUS) public override PacketSenderOwning<ChatPkt> Invoke(Locale loc_idx = Locale.enUS)
{ {
string text = Global.CreatureTextMgr.GetLocalizedChatString(_source.GetEntry(), _gender, _textGroup, _textId, loc_idx); string text = Global.CreatureTextMgr.GetLocalizedChatString(_source.GetEntry(), _gender, _textGroup, _textId, loc_idx);
var packet = new ChatPkt(); PacketSenderOwning<ChatPkt> chat = new();
packet.Initialize(_msgType, _language, _talker, _target, text, 0, "", loc_idx); chat.Data.Initialize(_msgType, _language, _talker, _target, text, 0, "", loc_idx);
return packet; return chat;
} }
WorldObject _source; WorldObject _source;