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)
{
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);
}
@@ -676,7 +676,7 @@ namespace Game.Achievements
else if (_owner.IsInWorld)
{
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);
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);
LocalizedPacketDo localizer = new(builder);
LocalizedDo localizer = new(builder);
BroadcastWorker(localizer);
}
@@ -1582,7 +1582,7 @@ namespace Game.BattleGrounds
return;
CypherStringChatBuilder builder = new(null, msgType, entry, source);
LocalizedPacketDo localizer = new(builder);
LocalizedDo localizer = new(builder);
BroadcastWorker(localizer);
}
@@ -1592,7 +1592,7 @@ namespace Game.BattleGrounds
return;
CypherStringChatBuilder builder = new(null, msgType, entry, source, args);
LocalizedPacketDo localizer = new(builder);
LocalizedDo localizer = new(builder);
BroadcastWorker(localizer);
}
+5 -4
View File
@@ -21,6 +21,7 @@ using Framework.Database;
using Game.DataStorage;
using Game.Entities;
using Game.Maps;
using Game.Networking;
using Game.Networking.Packets;
using System;
using System.Collections.Generic;
@@ -834,7 +835,7 @@ namespace Game.Chat
void SendToAll(MessageBuilder builder, ObjectGuid guid = default)
{
LocalizedPacketDo localizer = new(builder);
LocalizedDo localizer = new(builder);
foreach (var pair in _playersStore)
{
@@ -847,7 +848,7 @@ namespace Game.Chat
void SendToAllButOne(MessageBuilder builder, ObjectGuid who)
{
LocalizedPacketDo localizer = new(builder);
LocalizedDo localizer = new(builder);
foreach (var pair in _playersStore)
{
@@ -862,7 +863,7 @@ namespace Game.Chat
void SendToOne(MessageBuilder builder, ObjectGuid who)
{
LocalizedPacketDo localizer = new(builder);
LocalizedDo localizer = new(builder);
Player player = Global.ObjAccessor.FindConnectedPlayer(who);
if (player)
@@ -871,7 +872,7 @@ namespace Game.Chat
void SendToAllWithAddon(MessageBuilder builder, string addonPrefix, ObjectGuid guid = default)
{
LocalizedPacketDo localizer = new(builder);
LocalizedDo localizer = new(builder);
foreach (var pair in _playersStore)
{
+52 -50
View File
@@ -16,10 +16,11 @@
*/
using Framework.Constants;
using Game.Cache;
using Game.Entities;
using Game.Maps;
using Game.Networking;
using Game.Networking.Packets;
using Game.Cache;
namespace Game.Chat
{
@@ -38,16 +39,17 @@ namespace Game.Chat
_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
Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
ChannelNotify data = new();
data.Type = _modifier.GetNotificationType();
data.Channel = _source.GetName(localeIdx);
_modifier.Append(data);
return data;
PacketSenderOwning<ChannelNotify> sender = new();
sender.Data.Type = _modifier.GetNotificationType();
sender.Data.Channel = _source.GetName(localeIdx);
_modifier.Append(sender.Data);
sender.Data.Write();
return sender;
}
Channel _source;
@@ -61,17 +63,17 @@ namespace Game.Chat
_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);
ChannelNotifyJoined notify = new();
PacketSenderOwning<ChannelNotifyJoined> notify = new();
//notify.ChannelWelcomeMsg = "";
notify.ChatChannelID = (int)_source.GetChannelId();
notify.Data.ChatChannelID = (int)_source.GetChannelId();
//notify.InstanceID = 0;
notify.ChannelFlags = _source.GetFlags();
notify.Channel = _source.GetName(localeIdx);
notify.ChannelGUID = _source.GetChannelGuid();
notify.Data.ChannelFlags = _source.GetFlags();
notify.Data.Channel = _source.GetName(localeIdx);
notify.Data.ChannelGUID = _source.GetChannelGuid();
return notify;
}
@@ -86,14 +88,14 @@ namespace Game.Chat
_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);
ChannelNotifyLeft notify = new();
notify.Channel = _source.GetName(localeIdx);
notify.ChatChannelID = _source.GetChannelId();
notify.Suspended = _suspended;
PacketSenderOwning<ChannelNotifyLeft> notify = new();
notify.Data.Channel = _source.GetName(localeIdx);
notify.Data.ChatChannelID = _source.GetChannelId();
notify.Data.Suspended = _suspended;
return notify;
}
@@ -111,19 +113,19 @@ namespace Game.Chat
_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);
ChatPkt packet = new();
PacketSenderOwning<ChatPkt> packet = new();
Player player = Global.ObjAccessor.FindConnectedPlayer(_guid);
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
{
packet.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx));
packet.SenderGUID = _guid;
packet.TargetGUID = _guid;
packet.Data.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx));
packet.Data.SenderGUID = _guid;
packet.Data.TargetGUID = _guid;
}
return packet;
@@ -146,19 +148,19 @@ namespace Game.Chat
_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);
ChatPkt packet = new();
PacketSenderOwning<ChatPkt> packet = new();
Player player = Global.ObjAccessor.FindConnectedPlayer(_guid);
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
{
packet.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx), Locale.enUS, _prefix);
packet.SenderGUID = _guid;
packet.TargetGUID = _guid;
packet.Data.Initialize(ChatMsg.Channel, _lang, null, null, _what, 0, _source.GetName(localeIdx), Locale.enUS, _prefix);
packet.Data.SenderGUID = _guid;
packet.Data.TargetGUID = _guid;
}
return packet;
@@ -179,16 +181,16 @@ namespace Game.Chat
_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);
UserlistAdd userlistAdd = new();
userlistAdd.AddedUserGUID = _guid;
userlistAdd.ChannelFlags = _source.GetFlags();
userlistAdd.UserFlags = _source.GetPlayerFlags(_guid);
userlistAdd.ChannelID = _source.GetChannelId();
userlistAdd.ChannelName = _source.GetName(localeIdx);
PacketSenderOwning<UserlistAdd> userlistAdd = new();
userlistAdd.Data.AddedUserGUID = _guid;
userlistAdd.Data.ChannelFlags = _source.GetFlags();
userlistAdd.Data.UserFlags = _source.GetPlayerFlags(_guid);
userlistAdd.Data.ChannelID = _source.GetChannelId();
userlistAdd.Data.ChannelName = _source.GetName(localeIdx);
return userlistAdd;
}
@@ -204,16 +206,16 @@ namespace Game.Chat
_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);
UserlistUpdate userlistUpdate = new();
userlistUpdate.UpdatedUserGUID = _guid;
userlistUpdate.ChannelFlags = _source.GetFlags();
userlistUpdate.UserFlags = _source.GetPlayerFlags(_guid);
userlistUpdate.ChannelID = _source.GetChannelId();
userlistUpdate.ChannelName = _source.GetName(localeIdx);
PacketSenderOwning<UserlistUpdate> userlistUpdate = new();
userlistUpdate.Data.UpdatedUserGUID = _guid;
userlistUpdate.Data.ChannelFlags = _source.GetFlags();
userlistUpdate.Data.UserFlags = _source.GetPlayerFlags(_guid);
userlistUpdate.Data.ChannelID = _source.GetChannelId();
userlistUpdate.Data.ChannelName = _source.GetName(localeIdx);
return userlistUpdate;
}
@@ -229,15 +231,15 @@ namespace Game.Chat
_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);
UserlistRemove userlistRemove = new();
userlistRemove.RemovedUserGUID = _guid;
userlistRemove.ChannelFlags = _source.GetFlags();
userlistRemove.ChannelID = _source.GetChannelId();
userlistRemove.ChannelName = _source.GetName(localeIdx);
PacketSenderOwning<UserlistRemove> userlistRemove = new();
userlistRemove.Data.RemovedUserGUID = _guid;
userlistRemove.Data.ChannelFlags = _source.GetFlags();
userlistRemove.Data.ChannelID = _source.GetChannelId();
userlistRemove.Data.ChannelName = _source.GetName(localeIdx);
return userlistRemove;
}
+4 -2
View File
@@ -1355,13 +1355,15 @@ namespace Game.Entities
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);
}
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());
}
+6 -3
View File
@@ -5970,7 +5970,8 @@ namespace Game.Entities
if (self)
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);
}
@@ -5979,7 +5980,8 @@ namespace Game.Entities
if (self)
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);
}
@@ -5990,7 +5992,8 @@ namespace Game.Entities
// we use World.GetMaxVisibleDistance() because i cannot see why not use a distance
// 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());
}
public override void SendMessageToSet(ServerPacket data, bool self)
+1 -1
View File
@@ -1549,7 +1549,7 @@ namespace Game.Entities
internal void SendCombatLogMessage(CombatLogServerPacket combatLog)
{
CombatLogSender combatLogCustomizer = new(combatLog);
MessageDistDeliverer notifier = new(this, combatLogCustomizer, GetVisibilityRange());
var notifier = new MessageDistDeliverer<CombatLogSender>(this, combatLogCustomizer, GetVisibilityRange());
Cell.VisitWorldObjects(this, notifier, GetVisibilityRange());
}
+4 -3
View File
@@ -578,7 +578,7 @@ namespace Game.Entities
public StringArray name = new(SharedConst.MaxDeclinedNameCases);
}
class CombatLogSender : MessageDistDelivererCustomizer
class CombatLogSender : IDoWork<Player>
{
CombatLogServerPacket i_message;
@@ -587,11 +587,12 @@ namespace Game.Entities
i_message = msg;
}
public override ServerPacket Invoke(Player player)
public void Invoke(Player player)
{
i_message.Clear();
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)
{
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);
Cell.VisitWorldObjects(this, worker, textRange);
}
@@ -391,7 +391,7 @@ namespace Game.Entities
}
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);
Cell.VisitWorldObjects(this, worker, textRange);
}
+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>
+5 -5
View File
@@ -246,7 +246,7 @@ namespace Game.PvP
public void SendDefenseMessage(uint zoneId, uint id)
{
DefenseMessageBuilder builder = new(zoneId, id);
var localizer = new LocalizedPacketDo(builder);
var localizer = new LocalizedDo(builder);
BroadcastWorker(localizer, zoneId);
}
@@ -736,13 +736,13 @@ namespace Game.PvP
_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);
DefenseMessage defenseMessage = new();
defenseMessage.ZoneID = _zoneId;
defenseMessage.MessageText = text;
PacketSenderOwning<DefenseMessage> defenseMessage = new();
defenseMessage.Data.ZoneID = _zoneId;
defenseMessage.Data.MessageText = text;
return defenseMessage;
}
+22 -7
View File
@@ -1472,7 +1472,7 @@ namespace Game
public void SendWorldText(CypherStrings string_id, params object[] 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)
{
if (session == null || !session.GetPlayer() || !session.GetPlayer().IsInWorld)
@@ -1486,7 +1486,7 @@ namespace Game
public void SendGMText(CypherStrings string_id, params object[] 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)
{
// Session should have permissions to receive global gm messages
@@ -2512,32 +2512,47 @@ namespace Game
}
public class WorldWorldTextBuilder : MessageBuilder
{
{
public WorldWorldTextBuilder(uint textId, params object[] args)
{
i_textId = textId;
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)
text = string.Format(text, i_args);
ChatPkt messageChat = new();
MultiplePacketSender sender = new MultiplePacketSender();
var lines = new StringArray(text, "\n");
for (var i = 0; i < lines.Length; ++i)
{
ChatPkt messageChat = new();
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;
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
+1
View File
@@ -3804,6 +3804,7 @@ namespace Game.Spells
packet.LogData.Initialize(this);
m_caster.SendCombatLogMessage(packet);
}
+9 -6
View File
@@ -3801,15 +3801,18 @@ namespace Game.Spells
float dist = m_caster.GetVisibilityRange();
// clear focus
BreakTarget breakTarget = new();
breakTarget.UnitGUID = m_caster.GetGUID();
MessageDistDelivererToHostile notifierBreak = new(m_caster, breakTarget, dist);
PacketSenderOwning<BreakTarget> breakTarget = new();
breakTarget.Data.UnitGUID = m_caster.GetGUID();
breakTarget.Data.Write();
var notifierBreak = new MessageDistDelivererToHostile<PacketSenderOwning<BreakTarget>>(m_caster, breakTarget, dist);
Cell.VisitWorldObjects(m_caster, notifierBreak, dist);
// and selection
ClearTarget clearTarget = new();
clearTarget.Guid = m_caster.GetGUID();
MessageDistDelivererToHostile notifierClear = new(m_caster, clearTarget, dist);
PacketSenderOwning<ClearTarget> clearTarget = new();
clearTarget.Data.Guid = m_caster.GetGUID();
clearTarget.Data.Write();
var notifierClear = new MessageDistDelivererToHostile<PacketSenderOwning<ClearTarget>>(m_caster, clearTarget, dist);
Cell.VisitWorldObjects(m_caster, notifierClear, dist);
// we should also force pets to remove us from current target
+15 -15
View File
@@ -18,6 +18,7 @@
using Framework.Constants;
using Game.DataStorage;
using Game.Entities;
using Game.Maps;
using Game.Networking;
using Game.Networking.Packets;
using System.Collections.Generic;
@@ -26,8 +27,7 @@ namespace Game.Chat
{
public class MessageBuilder
{
public virtual ServerPacket Invoke(Locale locale = Locale.enUS) { return null; }
public virtual void Invoke(List<ServerPacket> data, Locale locale = Locale.enUS) { }
public virtual dynamic Invoke(Locale locale = Locale.enUS) { return default; }
}
public class BroadcastTextBuilder : MessageBuilder
@@ -42,12 +42,12 @@ namespace Game.Chat
_achievementId = achievementId;
}
public override ServerPacket Invoke(Locale locale)
public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS)
{
BroadcastTextRecord bct = CliDB.BroadcastTextStorage.LookupByKey(_textId);
var packet = new ChatPkt();
packet.Initialize(_msgType, bct != null ? (Language)bct.LanguageID : Language.Universal, _source, _target, bct != null ? Global.DB2Mgr.GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale);
return packet;
var chat = new PacketSenderOwning<ChatPkt>();
chat.Data.Initialize(_msgType, bct != null ? (Language)bct.LanguageID : Language.Universal, _source, _target, bct != null ? Global.DB2Mgr.GetBroadcastTextValue(bct, locale, _gender) : "", _achievementId, "", locale);
return chat;
}
WorldObject _source;
@@ -69,11 +69,11 @@ namespace Game.Chat
_target = target;
}
public override ServerPacket Invoke(Locale locale)
public override PacketSenderOwning<ChatPkt> Invoke(Locale locale)
{
var packet = new ChatPkt();
packet.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
return packet;
var chat = new PacketSenderOwning<ChatPkt>();
chat.Data.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
return chat;
}
WorldObject _source;
@@ -94,18 +94,18 @@ namespace Game.Chat
_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);
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
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;
+16 -15
View File
@@ -596,32 +596,33 @@ namespace Game
public void Invoke(Player player)
{
Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex();
ServerPacket messageTemplate;
PacketSenderOwning<ChatPkt> sender;
// create if not cached yet
if (!_packetCache.ContainsKey(loc_idx))
{
messageTemplate = _builder.Invoke(loc_idx);
_packetCache[loc_idx] = messageTemplate;
sender = _builder.Invoke(loc_idx);
_packetCache[loc_idx] = sender;
}
else
messageTemplate = _packetCache[loc_idx];
sender = _packetCache[loc_idx];
ChatPkt message = (ChatPkt)messageTemplate;
switch (_msgType)
{
case ChatMsg.MonsterWhisper:
case ChatMsg.RaidBossWhisper:
ChatPkt message = sender.Data;
message.SetReceiver(player, loc_idx);
player.SendPacket(message);
break;
default:
break;
}
player.SendPacket(message);
sender.Invoke(player);
}
Dictionary<Locale, ServerPacket> _packetCache = new();
Dictionary<Locale, PacketSenderOwning<ChatPkt>> _packetCache = new();
MessageBuilder _builder;
ChatMsg _msgType;
}
@@ -639,12 +640,12 @@ namespace Game
_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);
var packet = new ChatPkt();
packet.Initialize(_msgType, _language, _source, _target, text, 0, "", locale);
return packet;
PacketSenderOwning<ChatPkt> chat = new();
chat.Data.Initialize(_msgType, _language, _source, _target, text, 0, "", locale);
return chat;
}
WorldObject _source;
@@ -670,12 +671,12 @@ namespace Game
_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);
var packet = new ChatPkt();
packet.Initialize(_msgType, _language, _talker, _target, text, 0, "", loc_idx);
return packet;
PacketSenderOwning<ChatPkt> chat = new();
chat.Data.Initialize(_msgType, _language, _talker, _target, text, 0, "", loc_idx);
return chat;
}
WorldObject _source;