diff --git a/Torch/Managers/NetworkManager/NetworkHandlerBase.cs b/Torch/Managers/NetworkManager/NetworkHandlerBase.cs index dc3ce19..3add688 100644 --- a/Torch/Managers/NetworkManager/NetworkHandlerBase.cs +++ b/Torch/Managers/NetworkManager/NetworkHandlerBase.cs @@ -11,6 +11,7 @@ using VRage.Serialization; namespace Torch.Managers { + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public abstract class NetworkHandlerBase { /// @@ -18,6 +19,7 @@ namespace Torch.Managers /// /// /// + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public abstract bool CanHandle(CallSite site); /// @@ -29,8 +31,9 @@ namespace Torch.Managers /// /// /// + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public abstract bool Handle(ulong remoteUserId, CallSite site, BitStream stream, object obj, MyPacket packet); - + /// /// Extracts method arguments from the bitstream or packs them back in, depending on stream read mode. /// @@ -38,6 +41,7 @@ namespace Torch.Managers /// /// /// + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public void Serialize(MethodInfo info, BitStream stream, ref T1 arg1) { var s1 = MyFactory.GetSerializer(); @@ -55,6 +59,7 @@ namespace Torch.Managers } } + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public void Serialize(MethodInfo info, BitStream stream, ref T1 arg1, ref T2 arg2) { var s1 = MyFactory.GetSerializer(); @@ -76,6 +81,7 @@ namespace Torch.Managers } } + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public void Serialize(MethodInfo info, BitStream stream, ref T1 arg1, ref T2 arg2, ref T3 arg3) { var s1 = MyFactory.GetSerializer(); @@ -101,6 +107,7 @@ namespace Torch.Managers } } + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public void Serialize(MethodInfo info, BitStream stream, ref T1 arg1, ref T2 arg2, ref T3 arg3, ref T4 arg4) { var s1 = MyFactory.GetSerializer(); @@ -130,6 +137,7 @@ namespace Torch.Managers } } + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public void Serialize(MethodInfo info, BitStream stream, ref T1 arg1, ref T2 arg2, ref T3 arg3, ref T4 arg4, ref T5 arg5) { var s1 = MyFactory.GetSerializer(); @@ -163,6 +171,7 @@ namespace Torch.Managers } } + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public void Serialize(MethodInfo info, BitStream stream, ref T1 arg1, ref T2 arg2, ref T3 arg3, ref T4 arg4, ref T5 arg5, ref T6 arg6) { var s1 = MyFactory.GetSerializer(); @@ -200,6 +209,7 @@ namespace Torch.Managers } } + [Obsolete("The entire network intercept system is deprecated. Please use method patches instead.")] public void Serialize(MethodInfo info, BitStream stream, ref T1 arg1, ref T2 arg2, ref T3 arg3, ref T4 arg4, ref T5 arg5, ref T6 arg6, ref T7 arg7) { var s1 = MyFactory.GetSerializer(); diff --git a/Torch/Managers/NetworkManager/NetworkManager.cs b/Torch/Managers/NetworkManager/NetworkManager.cs index fc2b5c8..a054835 100644 --- a/Torch/Managers/NetworkManager/NetworkManager.cs +++ b/Torch/Managers/NetworkManager/NetworkManager.cs @@ -1,110 +1,24 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.Linq; using System.Reflection; -using System.Threading.Tasks; using NLog; using Sandbox.Engine.Multiplayer; -using Sandbox.Game.Multiplayer; using Torch.API; using Torch.API.Managers; -using Torch.Utils; -using VRage; -using VRage.Library.Collections; using VRage.Network; using VRageMath; namespace Torch.Managers { + //TOOD: Make this not a manager, and instead just a static class? public partial class NetworkManager : Manager, INetworkManager { private static Logger _log = LogManager.GetCurrentClassLogger(); - private const string _myTransportLayerField = "TransportLayer"; - private const string _transportHandlersField = "m_handlers"; - private readonly HashSet _networkHandlers = new HashSet(); - private bool _init; - - [ReflectedGetter(Name = "m_typeTable")] - private static Func _typeTableGetter; - [ReflectedMethod(Type = typeof(MyReplicationLayer), Name = "GetObjectByNetworkId")] - private static Func _getObjectByNetworkId; - public NetworkManager(ITorchBase torchInstance) : base(torchInstance) { } - - private static bool ReflectionUnitTest(bool suppress = false) - { - try - { - var syncLayerType = typeof(MySyncLayer); - var transportLayerField = syncLayerType.GetField(_myTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance); - - if (transportLayerField == null) - throw new TypeLoadException("Could not find internal type for TransportLayer"); - - var transportLayerType = transportLayerField.FieldType; - - if (!Reflection.HasField(transportLayerType, _transportHandlersField)) - throw new TypeLoadException("Could not find Handlers field"); - - return true; - } - catch (TypeLoadException ex) - { - _log.Error(ex); - if (suppress) - return false; - throw; - } - } - - /// - public override void Attach() - { - if (_init) - return; - - _init = true; - - if (!ReflectionUnitTest()) - throw new InvalidOperationException("Reflection unit test failed."); - - //don't bother with nullchecks here, it was all handled in ReflectionUnitTest - var transportType = typeof(MySyncLayer).GetField(_myTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance).FieldType; - var transportInstance = typeof(MySyncLayer).GetField(_myTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.Static.SyncLayer); - var handlers = (IDictionary)transportType.GetField(_transportHandlersField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(transportInstance); - var handlerTypeField = handlers.GetType().GenericTypeArguments[0].GetField("messageId"); //Should be MyTransportLayer.HandlerId - object id = null; - foreach (var key in handlers.Keys) - { - if ((MyMessageId)handlerTypeField.GetValue(key) != MyMessageId.RPC) - continue; - - id = key; - break; - } - if (id == null) - throw new InvalidOperationException("RPC handler not found."); - - //remove Keen's network listener - handlers.Remove(id); - //replace it with our own - handlers.Add(id, new Action(OnEvent)); - - //PrintDebug(); - - _log.Debug("Initialized network intercept"); - } - - /// - public override void Detach() - { - // TODO reverse what was done in Attach - } #region Network Injection diff --git a/Torch/Managers/NetworkManager/NetworkManager_Deprecated.cs b/Torch/Managers/NetworkManager/NetworkManager_Deprecated.cs index 1e25769..5bfa3cc 100644 --- a/Torch/Managers/NetworkManager/NetworkManager_Deprecated.cs +++ b/Torch/Managers/NetworkManager/NetworkManager_Deprecated.cs @@ -1,10 +1,12 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using Sandbox.Engine.Multiplayer; +using Sandbox.Game.Multiplayer; using Torch.API.Managers; using Torch.Utils; using VRage; @@ -26,6 +28,86 @@ namespace Torch.Managers private static MethodInfo _dispatchInfo; private static MethodInfo DispatchEventInfo => _dispatchInfo ?? (_dispatchInfo = typeof(MyReplicationLayerBase).GetMethod("DispatchEvent", BindingFlags.NonPublic | BindingFlags.Instance)); + + private const string _myTransportLayerField = "TransportLayer"; + private const string _transportHandlersField = "m_handlers"; + private readonly HashSet _networkHandlers = new HashSet(); + private bool _init; + + [ReflectedGetter(Name = "m_typeTable")] + private static Func _typeTableGetter; + [ReflectedMethod(Type = typeof(MyReplicationLayer), Name = "GetObjectByNetworkId")] + private static Func _getObjectByNetworkId; + + private static bool ReflectionUnitTest(bool suppress = false) + { + try + { + var syncLayerType = typeof(MySyncLayer); + var transportLayerField = syncLayerType.GetField(_myTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance); + + if (transportLayerField == null) + throw new TypeLoadException("Could not find internal type for TransportLayer"); + + var transportLayerType = transportLayerField.FieldType; + + if (!Reflection.HasField(transportLayerType, _transportHandlersField)) + throw new TypeLoadException("Could not find Handlers field"); + + return true; + } + catch (TypeLoadException ex) + { + _log.Error(ex); + if (suppress) + return false; + throw; + } + } + + /// + public override void Attach() + { + if (_init) + return; + + _init = true; + + if (!ReflectionUnitTest()) + throw new InvalidOperationException("Reflection unit test failed."); + + //don't bother with nullchecks here, it was all handled in ReflectionUnitTest + var transportType = typeof(MySyncLayer).GetField(_myTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance).FieldType; + var transportInstance = typeof(MySyncLayer).GetField(_myTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.Static.SyncLayer); + var handlers = (IDictionary)transportType.GetField(_transportHandlersField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(transportInstance); + var handlerTypeField = handlers.GetType().GenericTypeArguments[0].GetField("messageId"); //Should be MyTransportLayer.HandlerId + object id = null; + foreach (var key in handlers.Keys) + { + if ((MyMessageId)handlerTypeField.GetValue(key) != MyMessageId.RPC) + continue; + + id = key; + break; + } + if (id == null) + throw new InvalidOperationException("RPC handler not found."); + + //remove Keen's network listener + handlers.Remove(id); + //replace it with our own + handlers.Add(id, new Action(OnEvent)); + + //PrintDebug(); + + _log.Debug("Initialized network intercept"); + } + + /// + public override void Detach() + { + // TODO reverse what was done in Attach + } #region Network Injection