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:
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -3804,6 +3804,7 @@ namespace Game.Spells
|
||||
|
||||
packet.LogData.Initialize(this);
|
||||
|
||||
|
||||
m_caster.SendCombatLogMessage(packet);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user