diff --git a/Source/Game/Achievements/AchievementManager.cs b/Source/Game/Achievements/AchievementManager.cs index 995057c13..24856d492 100644 --- a/Source/Game/Achievements/AchievementManager.cs +++ b/Source/Game/Achievements/AchievementManager.cs @@ -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)); } diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index 04f13eba3..f78e917e8 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -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); } diff --git a/Source/Game/Chat/Channels/Channel.cs b/Source/Game/Chat/Channels/Channel.cs index 25faaec8c..3fe1bec98 100644 --- a/Source/Game/Chat/Channels/Channel.cs +++ b/Source/Game/Chat/Channels/Channel.cs @@ -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) { diff --git a/Source/Game/Chat/Channels/ChannelAppenders.cs b/Source/Game/Chat/Channels/ChannelAppenders.cs index 818ce04cc..7889638ee 100644 --- a/Source/Game/Chat/Channels/ChannelAppenders.cs +++ b/Source/Game/Chat/Channels/ChannelAppenders.cs @@ -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 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 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 Invoke(Locale locale = Locale.enUS) { Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); - ChannelNotifyJoined notify = new(); + PacketSenderOwning 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 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 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 Invoke(Locale locale = Locale.enUS) { Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); - ChatPkt packet = new(); + PacketSenderOwning 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 Invoke(Locale locale = Locale.enUS) { Locale localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); - ChatPkt packet = new(); + PacketSenderOwning 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 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 = 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 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 = 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 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 = new(); + userlistRemove.Data.RemovedUserGUID = _guid; + userlistRemove.Data.ChannelFlags = _source.GetFlags(); + userlistRemove.Data.ChannelID = _source.GetChannelId(); + userlistRemove.Data.ChannelName = _source.GetName(localeIdx); return userlistRemove; } diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 92305e920..bbc94ba80 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -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 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(this, sender, GetVisibilityRange(), false, skip); Cell.VisitWorldObjects(this, notifier, GetVisibilityRange()); } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 5d586e047..87921b775 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -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(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(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(this, sender, GetVisibilityRange(), false, skipped_rcvr); Cell.VisitWorldObjects(this, notifier, GetVisibilityRange()); } public override void SendMessageToSet(ServerPacket data, bool self) diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index 0e334d45e..7177f96cb 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -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(this, combatLogCustomizer, GetVisibilityRange()); Cell.VisitWorldObjects(this, notifier, GetVisibilityRange()); } diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index 651446ccd..a1335d7a2 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -578,7 +578,7 @@ namespace Game.Entities public StringArray name = new(SharedConst.MaxDeclinedNameCases); } - class CombatLogSender : MessageDistDelivererCustomizer + class CombatLogSender : IDoWork { 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); } } } diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 30c747a57..02e789e48 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -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); } diff --git a/Source/Game/Maps/GridNotifiers.cs b/Source/Game/Maps/GridNotifiers.cs index 3ba048231..78fff8716 100644 --- a/Source/Game/Maps/GridNotifiers.cs +++ b/Source/Game/Maps/GridNotifiers.cs @@ -378,44 +378,45 @@ namespace Game.Maps bool isCreature; } - public class MessageDistDelivererCustomizer + public class PacketSenderRef : IDoWork { - 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 : IDoWork where T : ServerPacket + { + public T Data; + + public void Invoke(Player player) + { + player.SendPacket(Data); + } + } + + public class MessageDistDeliverer : Notifier where T : IDoWork { 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 : Notifier where T : IDoWork { 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 + public class LocalizedDo : IDoWork { - 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 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 - { - 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 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 i_data_cache = new(); - // 0 = default, i => i-1 locale index + MessageBuilder _localizer; + IDoWork[] _localizedCache = new IDoWork[(int)Locale.Total]; // 0 = default, i => i-1 locale index } public class RespawnDo : IDoWork diff --git a/Source/Game/OutdoorPVP/OutdoorPvP.cs b/Source/Game/OutdoorPVP/OutdoorPvP.cs index 87527bd45..01e9df911 100644 --- a/Source/Game/OutdoorPVP/OutdoorPvP.cs +++ b/Source/Game/OutdoorPVP/OutdoorPvP.cs @@ -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 Invoke(Locale locale = Locale.enUS) { string text = Global.OutdoorPvPMgr.GetDefenseMessage(_zoneId, _id, locale); - DefenseMessage defenseMessage = new(); - defenseMessage.ZoneID = _zoneId; - defenseMessage.MessageText = text; + PacketSenderOwning defenseMessage = new(); + defenseMessage.Data.ZoneID = _zoneId; + defenseMessage.Data.MessageText = text; return defenseMessage; } diff --git a/Source/Game/Server/WorldManager.cs b/Source/Game/Server/WorldManager.cs index 38d86cf24..fba237abd 100644 --- a/Source/Game/Server/WorldManager.cs +++ b/Source/Game/Server/WorldManager.cs @@ -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 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 + { + public void Invoke(Player receiver) + { + foreach (var packet in Packets) + receiver.SendPacket(packet); + } + + public List Packets = new(); + } } struct Autobroadcast diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index ae92efea1..4faa19f38 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -3804,6 +3804,7 @@ namespace Game.Spells packet.LogData.Initialize(this); + m_caster.SendCombatLogMessage(packet); } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 38639a5aa..6987afe9a 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -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 = new(); + breakTarget.Data.UnitGUID = m_caster.GetGUID(); + breakTarget.Data.Write(); + + var notifierBreak = new MessageDistDelivererToHostile>(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 = new(); + clearTarget.Data.Guid = m_caster.GetGUID(); + clearTarget.Data.Write(); + var notifierClear = new MessageDistDelivererToHostile>(m_caster, clearTarget, dist); Cell.VisitWorldObjects(m_caster, notifierClear, dist); // we should also force pets to remove us from current target diff --git a/Source/Game/Text/ChatTextBuilder.cs b/Source/Game/Text/ChatTextBuilder.cs index 4f06c36ca..42957f9bd 100644 --- a/Source/Game/Text/ChatTextBuilder.cs +++ b/Source/Game/Text/ChatTextBuilder.cs @@ -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 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 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(); + 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 Invoke(Locale locale) { - var packet = new ChatPkt(); - packet.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); - return packet; + var chat = new PacketSenderOwning(); + 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 Invoke(Locale locale) { - ChatPkt packet = new(); + PacketSenderOwning 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; diff --git a/Source/Game/Text/CreatureTextManager.cs b/Source/Game/Text/CreatureTextManager.cs index 7c6f88d73..dd1318f23 100644 --- a/Source/Game/Text/CreatureTextManager.cs +++ b/Source/Game/Text/CreatureTextManager.cs @@ -596,32 +596,33 @@ namespace Game public void Invoke(Player player) { Locale loc_idx = player.GetSession().GetSessionDbLocaleIndex(); - ServerPacket messageTemplate; + PacketSenderOwning 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 _packetCache = new(); + Dictionary> _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 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 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 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 chat = new(); + chat.Data.Initialize(_msgType, _language, _talker, _target, text, 0, "", loc_idx); + return chat; } WorldObject _source;