diff --git a/Torch/Managers/ChatManager/ChatManagerClient.cs b/Torch/Managers/ChatManager/ChatManagerClient.cs index 832f927..5dfe6d8 100644 --- a/Torch/Managers/ChatManager/ChatManagerClient.cs +++ b/Torch/Managers/ChatManager/ChatManagerClient.cs @@ -130,7 +130,7 @@ namespace Torch.Managers.ChatManager var torchMsg = new TorchChatMessage(steamUserId, messageText, (steamUserId == MyGameService.UserId) ? MyFontEnum.DarkBlue : MyFontEnum.Blue); if (!RaiseMessageRecieved(torchMsg) && HasHud) - _hudChatMessageReceived.Invoke(MyHud.Chat, steamUserId, messageText); + _hudChatMessageReceived.Invoke(MyHud.Chat, steamUserId, messageText, channel, targetId, customAuthorName); } private void Multiplayer_ScriptedChatMessageReceived(string message, string author, string font) @@ -153,7 +153,7 @@ namespace Torch.Managers.ChatManager protected static bool HasHud => !Sandbox.Engine.Platform.Game.IsDedicated; [ReflectedMethod(Name = _hudChatMessageReceivedName)] - private static Action _hudChatMessageReceived; + private static Action _hudChatMessageReceived; [ReflectedMethod(Name = _hudChatScriptedMessageReceivedName)] private static Action _hudChatScriptedMessageReceived; diff --git a/Torch/Managers/ChatManager/ChatManagerServer.cs b/Torch/Managers/ChatManager/ChatManagerServer.cs index efc31c4..66ca9af 100644 --- a/Torch/Managers/ChatManager/ChatManagerServer.cs +++ b/Torch/Managers/ChatManager/ChatManagerServer.cs @@ -13,6 +13,7 @@ using Sandbox.Game.Multiplayer; using Sandbox.Game.World; using Torch.API; using Torch.API.Managers; +using Torch.Managers.PatchManager; using Torch.Utils; using VRage; using VRage.Library.Collections; @@ -20,6 +21,26 @@ using VRage.Network; namespace Torch.Managers.ChatManager { + [PatchShim] + internal static class ChatInterceptPatch + { + private static ChatManagerServer _chatManager; + private static ChatManagerServer ChatManager => _chatManager ?? (_chatManager = TorchBase.Instance.Managers.GetManager()); + + internal static void Patch(PatchContext context) + { + var target = typeof(MyMultiplayerBase).GetMethod("OnChatMessageRecieved_Server", BindingFlags.Static | BindingFlags.NonPublic); + var patchMethod = typeof(ChatInterceptPatch).GetMethod(nameof(PrefixMessageProcessing), BindingFlags.Static | BindingFlags.NonPublic); + context.GetPattern(target).Prefixes.Add(patchMethod); + } + + private static void PrefixMessageProcessing(ref ChatMsg msg) + { + var consumed = false; + ChatManager?.RaiseMessageRecieved(msg, ref consumed); + } + } + public class ChatManagerServer : ChatManagerClient, IChatManagerServer { [Dependency(Optional = true)] @@ -28,12 +49,10 @@ namespace Torch.Managers.ChatManager private static readonly Logger _log = LogManager.GetCurrentClassLogger(); private static readonly Logger _chatLog = LogManager.GetLogger("Chat"); - private readonly ChatIntercept _chatIntercept; - /// public ChatManagerServer(ITorchBase torchInstance) : base(torchInstance) { - _chatIntercept = new ChatIntercept(this); + } /// @@ -103,17 +122,6 @@ namespace Torch.Managers.ChatManager public override void Attach() { base.Attach(); - if (_networkManager != null) - try - { - _networkManager.RegisterNetworkHandler(_chatIntercept); - _log.Debug("Initialized network intercept for chat messages"); - return; - } - catch - { - // Discard exception and use second method - } if (MyMultiplayer.Static != null) { @@ -152,7 +160,6 @@ namespace Torch.Managers.ChatManager { if (MyMultiplayer.Static != null) MyMultiplayer.Static.ChatMessageReceived -= MpStaticChatMessageReceived; - _networkManager?.UnregisterNetworkHandler(_chatIntercept); base.Detach(); } @@ -169,52 +176,5 @@ namespace Torch.Managers.ChatManager { return MySession.Static.Players.TryGetPlayerName(steamId); } - - internal class ChatIntercept : NetworkHandlerBase, INetworkHandler - { - private readonly ChatManagerServer _chatManager; - private bool? _unitTestResult; - - public ChatIntercept(ChatManagerServer chatManager) - { - _chatManager = chatManager; - } - - /// - public override bool CanHandle(CallSite site) - { - if (site.MethodInfo.Name != "OnChatMessageRecieved") - return false; - - if (_unitTestResult.HasValue) - return _unitTestResult.Value; - - ParameterInfo[] parameters = site.MethodInfo.GetParameters(); - if (parameters.Length != 1) - { - _unitTestResult = false; - return false; - } - - if (parameters[0].ParameterType != typeof(ChatMsg)) - _unitTestResult = false; - - _unitTestResult = true; - - return _unitTestResult.Value; - } - - /// - public override bool Handle(ulong remoteUserId, CallSite site, BitStream stream, object obj, MyPacket packet) - { - var msg = new ChatMsg(); - Serialize(site.MethodInfo, stream, ref msg); - - var consumed = false; - _chatManager.RaiseMessageRecieved(msg, ref consumed); - - return consumed; - } - } } }