Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of R2API Networking v1.0.4
plugins/R2API.Networking/R2API.Networking.dll
Decompiled 6 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using R2API.AutoVersionGen; using R2API.Networking.Interfaces; using R2API.Networking.Messages; using R2API.Utils; using RoR2; using RoR2.Networking; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("R2API.Networking")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.4.0")] [assembly: AssemblyInformationalVersion("1.0.4+72fb4acded8caa7a86ab495cc2762c4ae961b47b")] [assembly: AssemblyProduct("R2API.Networking")] [assembly: AssemblyTitle("R2API.Networking")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.4.0")] [assembly: TypeForwardedTo(typeof(CompatibilityLevel))] [assembly: TypeForwardedTo(typeof(NetworkCompatibility))] [assembly: TypeForwardedTo(typeof(VersionStrictness))] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } } namespace R2API.AutoVersionGen { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] internal class AutoVersionAttribute : Attribute { } } namespace R2API.Networking { internal class Header : ISerializableObject { internal int TypeCode { get; private set; } internal NetworkDestination Destination { get; private set; } public Header() { } internal Header(int typeCode, NetworkDestination dest) { TypeCode = typeCode; Destination = dest; } internal void RemoveDestination(NetworkDestination destination) { Destination &= (NetworkDestination)(byte)(~(int)destination); } public void Serialize(NetworkWriter writer) { writer.Write(TypeCode); writer.Write((byte)Destination); } public void Deserialize(NetworkReader reader) { TypeCode = reader.ReadInt32(); Destination = (NetworkDestination)reader.ReadByte(); } } [Flags] public enum NetworkDestination : byte { Clients = 1, Server = 2 } internal static class NetworkDestinationExtensions { internal static bool ShouldSend(this NetworkDestination dest) { if (NetworkServer.active) { return dest != NetworkDestination.Server; } return true; } internal static bool ShouldRun(this NetworkDestination dest) { bool active = NetworkServer.active; bool active2 = NetworkClient.active; if (!active || (dest & NetworkDestination.Server) == 0) { if (active2) { return (dest & NetworkDestination.Clients) != 0; } return false; } return true; } internal static Header GetHeader(this NetworkDestination dest, int typeCode) { return new Header(typeCode, dest); } } [AutoVersion] public static class NetworkingAPI { [CompilerGenerated] private static class <>O { public static Action <0>__RegisterServerHandlers; public static Action<NetworkClient> <1>__RegisterClientHandlers; public static Action <2>__UnRegisterServerHandlers; public static Action <3>__UnRegisterClientHandlers; public static NetworkMessageDelegate <4>__HandleMessageServer; public static NetworkMessageDelegate <5>__HandleCommandServer; public static NetworkMessageDelegate <6>__HandleRequestServer; public static NetworkMessageDelegate <7>__HandleReplyServer; public static NetworkMessageDelegate <8>__HandleMessageClient; public static NetworkMessageDelegate <9>__HandleCommandClient; public static NetworkMessageDelegate <10>__HandleRequestClient; public static NetworkMessageDelegate <11>__HandleReplyClient; } public const string PluginGUID = "com.bepis.r2api.networking"; public const string PluginName = "R2API.Networking"; private static readonly Dictionary<int, INetMessage> NetMessages = new Dictionary<int, INetMessage>(); private static readonly Dictionary<int, INetCommand> NetCommands = new Dictionary<int, INetCommand>(); private static readonly Dictionary<int, RequestPerformerBase> NetRequests = new Dictionary<int, RequestPerformerBase>(); private static bool _hooksEnabled = false; public const string PluginVersion = "1.0.4"; [Obsolete("All submodules are automatically loaded and this property is now unused")] public static bool Loaded => true; internal static short MessageIndex => 2048; internal static short CommandIndex => 4096; internal static short RequestIndex => 6144; internal static short ReplyIndex => 8192; private static NetworkWriter UniversalWriter { get; } = new NetworkWriter(); public static bool RegisterMessageType<TMessage>() where TMessage : INetMessage, new() { SetHooks(); return RegisterMessageTypeInternal<TMessage>(); } internal static bool RegisterMessageTypeInternal<TMessage>() where TMessage : INetMessage, new() { TMessage val = new TMessage(); int networkHash = GetNetworkHash(val.GetType()); if (NetMessages.ContainsKey(networkHash)) { NetworkingPlugin.Logger.LogError((object)"Tried to register a message type with a duplicate hash"); return false; } NetMessages[networkHash] = val; return true; } public static bool RegisterCommandType<TCommand>() where TCommand : INetCommand, new() { SetHooks(); return RegisterCommandTypeInternal<TCommand>(); } internal static bool RegisterCommandTypeInternal<TCommand>() where TCommand : INetCommand, new() { TCommand val = new TCommand(); int networkHash = GetNetworkHash(val.GetType()); if (NetCommands.ContainsKey(networkHash)) { NetworkingPlugin.Logger.LogError((object)"Tried to register a command type with a duplicate hash"); return false; } NetCommands[networkHash] = val; return true; } public static bool RegisterRequestTypes<TRequest, TReply>() where TRequest : INetRequest<TRequest, TReply>, new() where TReply : INetRequestReply<TRequest, TReply>, new() { SetHooks(); return RegisterRequestTypesInternal<TRequest, TReply>(); } internal static bool RegisterRequestTypesInternal<TRequest, TReply>() where TRequest : INetRequest<TRequest, TReply>, new() where TReply : INetRequestReply<TRequest, TReply>, new() { TRequest request = new TRequest(); TReply reply = new TReply(); int networkHash = GetNetworkHash(request.GetType()); if (NetRequests.ContainsKey(networkHash)) { NetworkingPlugin.Logger.LogError((object)"Tried to register a request type with a duplicate hash"); return false; } NetRequests[networkHash] = new RequestPerformer<TRequest, TReply>(request, reply); return true; } internal static void SetHooks() { if (!_hooksEnabled) { RegisterMessageTypeInternal<DamageMessage>(); RegisterMessageTypeInternal<BuffMessage>(); RegisterMessageTypeInternal<DotMessage>(); RegisterMessageTypeInternal<ExampleMessage>(); RegisterRequestTypesInternal<ExamplePing, ExamplePingReply>(); NetworkManagerSystem.onStartServerGlobal += RegisterServerHandlers; NetworkManagerSystem.onStartClientGlobal += RegisterClientHandlers; NetworkManagerSystem.onStopServerGlobal -= UnRegisterServerHandlers; NetworkManagerSystem.onStopClientGlobal -= UnRegisterClientHandlers; _hooksEnabled = true; } } internal static void UnsetHooks() { NetworkManagerSystem.onStartServerGlobal -= RegisterServerHandlers; NetworkManagerSystem.onStartClientGlobal -= RegisterClientHandlers; NetworkManagerSystem.onStopServerGlobal += UnRegisterServerHandlers; NetworkManagerSystem.onStopClientGlobal += UnRegisterClientHandlers; _hooksEnabled = false; } private static void RegisterServerHandlers() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown NetworkingPlugin.Logger.LogInfo((object)"Server Handlers registered"); short messageIndex = MessageIndex; object obj = <>O.<4>__HandleMessageServer; if (obj == null) { NetworkMessageDelegate val = HandleMessageServer; <>O.<4>__HandleMessageServer = val; obj = (object)val; } NetworkServer.RegisterHandler(messageIndex, (NetworkMessageDelegate)obj); short commandIndex = CommandIndex; object obj2 = <>O.<5>__HandleCommandServer; if (obj2 == null) { NetworkMessageDelegate val2 = HandleCommandServer; <>O.<5>__HandleCommandServer = val2; obj2 = (object)val2; } NetworkServer.RegisterHandler(commandIndex, (NetworkMessageDelegate)obj2); short requestIndex = RequestIndex; object obj3 = <>O.<6>__HandleRequestServer; if (obj3 == null) { NetworkMessageDelegate val3 = HandleRequestServer; <>O.<6>__HandleRequestServer = val3; obj3 = (object)val3; } NetworkServer.RegisterHandler(requestIndex, (NetworkMessageDelegate)obj3); short replyIndex = ReplyIndex; object obj4 = <>O.<7>__HandleReplyServer; if (obj4 == null) { NetworkMessageDelegate val4 = HandleReplyServer; <>O.<7>__HandleReplyServer = val4; obj4 = (object)val4; } NetworkServer.RegisterHandler(replyIndex, (NetworkMessageDelegate)obj4); } private static void RegisterClientHandlers(NetworkClient client) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown NetworkingPlugin.Logger.LogInfo((object)"Client Handlers registered"); short messageIndex = MessageIndex; object obj = <>O.<8>__HandleMessageClient; if (obj == null) { NetworkMessageDelegate val = HandleMessageClient; <>O.<8>__HandleMessageClient = val; obj = (object)val; } client.RegisterHandler(messageIndex, (NetworkMessageDelegate)obj); short commandIndex = CommandIndex; object obj2 = <>O.<9>__HandleCommandClient; if (obj2 == null) { NetworkMessageDelegate val2 = HandleCommandClient; <>O.<9>__HandleCommandClient = val2; obj2 = (object)val2; } client.RegisterHandler(commandIndex, (NetworkMessageDelegate)obj2); short requestIndex = RequestIndex; object obj3 = <>O.<10>__HandleRequestClient; if (obj3 == null) { NetworkMessageDelegate val3 = HandleRequestClient; <>O.<10>__HandleRequestClient = val3; obj3 = (object)val3; } client.RegisterHandler(requestIndex, (NetworkMessageDelegate)obj3); short replyIndex = ReplyIndex; object obj4 = <>O.<11>__HandleReplyClient; if (obj4 == null) { NetworkMessageDelegate val4 = HandleReplyClient; <>O.<11>__HandleReplyClient = val4; obj4 = (object)val4; } client.RegisterHandler(replyIndex, (NetworkMessageDelegate)obj4); } private static void UnRegisterServerHandlers() { NetworkingPlugin.Logger.LogInfo((object)"Server Handlers unregistered"); NetworkServer.UnregisterHandler(MessageIndex); NetworkServer.UnregisterHandler(CommandIndex); NetworkServer.UnregisterHandler(RequestIndex); NetworkServer.UnregisterHandler(ReplyIndex); } private static void UnRegisterClientHandlers() { NetworkingPlugin.Logger.LogInfo((object)"Client Handlers unregistered"); foreach (NetworkClient allClient in NetworkClient.allClients) { allClient.UnregisterHandler(MessageIndex); allClient.UnregisterHandler(CommandIndex); allClient.UnregisterHandler(RequestIndex); allClient.UnregisterHandler(ReplyIndex); } } internal static int GetNetworkHash(Type type) { return (type.Assembly.FullName + type.FullName).GetHashCode(); } internal static Writer GetWriter(short messageIndex, NetworkConnection target, QosType qos) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return new Writer(UniversalWriter, messageIndex, target, qos); } private static void HandleCommandServer(NetworkMessage msg) { Header header = msg.reader.Read<Header>(); if (header.Destination.ShouldRun()) { header.RemoveDestination(NetworkDestination.Server); if (NetCommands.TryGetValue(header.TypeCode, out INetCommand value)) { value.OnReceived(); } else { NetworkingPlugin.Logger.LogError((object)"Unhandled command received, you may be missing mods"); } } if (!header.Destination.ShouldSend()) { return; } int connectionId = msg.conn.connectionId; for (int i = 0; i < NetworkServer.connections.Count; i++) { if (i == connectionId) { continue; } NetworkConnection val = NetworkServer.connections[i]; if (val != null && (!NetworkServer.localClientActive || !NetworkServer.localConnections.Contains(val))) { using Writer writer = GetWriter(CommandIndex, val, (QosType)3); SerializableObjectExtensions.Write(writer, header); } } } private static void HandleMessageServer(NetworkMessage msg) { NetworkReader reader = msg.reader; Header header = reader.Read<Header>(); if (header.Destination.ShouldRun()) { header.RemoveDestination(NetworkDestination.Server); if (NetMessages.TryGetValue(header.TypeCode, out INetMessage value)) { value.Deserialize(reader); value.OnReceived(); } else { NetworkingPlugin.Logger.LogError((object)"Unhandled message received, you may be missing mods"); } } if (!header.Destination.ShouldSend()) { return; } int connectionId = msg.conn.connectionId; byte[] array = reader.ReadBytes((int)(reader.Length - reader.Position)); for (int i = 0; i < NetworkServer.connections.Count; i++) { if (i == connectionId) { continue; } NetworkConnection val = NetworkServer.connections[i]; if (val != null && (!NetworkServer.localClientActive || !NetworkServer.localConnections.Contains(val))) { using Writer writer = GetWriter(MessageIndex, val, (QosType)3); NetworkWriter obj = writer; obj.Write(header); obj.WriteBytesFull(array); } } } private static void HandleRequestServer(NetworkMessage msg) { NetworkReader reader = msg.reader; Header header = reader.Read<Header>(); if (header.Destination.ShouldRun()) { header.RemoveDestination(NetworkDestination.Server); if (NetRequests.TryGetValue(header.TypeCode, out RequestPerformerBase value)) { ISerializableObject target = value.PerformRequest(reader); Header target2 = new Header(header.TypeCode, NetworkDestination.Clients); using Writer writer = GetWriter(ReplyIndex, msg.conn, (QosType)3); NetworkWriter writer2 = writer; writer2.Write(target2); writer2.Write(target); } else { NetworkingPlugin.Logger.LogError((object)"Unhandled request message received, you may be missing mods"); } } if (!header.Destination.ShouldSend()) { return; } int connectionId = msg.conn.connectionId; byte[] array = reader.ReadBytes((int)(reader.Length - reader.Position)); for (int i = 0; i < NetworkServer.connections.Count; i++) { if (i == connectionId) { continue; } NetworkConnection val = NetworkServer.connections[i]; if (val != null && (!NetworkServer.localClientActive || !NetworkServer.localConnections.Contains(val))) { using Writer writer3 = GetWriter(RequestIndex, val, (QosType)3); NetworkWriter obj = writer3; obj.Write(header); obj.WriteBytesFull(array); } } } private static void HandleReplyServer(NetworkMessage msg) { NetworkReader reader = msg.reader; Header header = reader.Read<Header>(); if (header.Destination.ShouldRun()) { header.RemoveDestination(NetworkDestination.Server); if (NetRequests.TryGetValue(header.TypeCode, out RequestPerformerBase value)) { value.PerformReply(reader); } else { NetworkingPlugin.Logger.LogError((object)"Unhandled reply received, you may be missing mods"); } } if (!header.Destination.ShouldSend()) { return; } int connectionId = msg.conn.connectionId; for (int i = 0; i < NetworkServer.connections.Count; i++) { if (i == connectionId) { continue; } NetworkConnection val = NetworkServer.connections[i]; if (val != null && (!NetworkServer.localClientActive || !NetworkServer.localConnections.Contains(val))) { using Writer writer = GetWriter(RequestIndex, val, (QosType)3); SerializableObjectExtensions.Write(writer, header); } } } private static void HandleCommandClient(NetworkMessage msg) { Header header = msg.reader.Read<Header>(); if (header.Destination.ShouldRun()) { header.RemoveDestination(NetworkDestination.Clients); if (NetCommands.TryGetValue(header.TypeCode, out INetCommand value)) { value.OnReceived(); } else { NetworkingPlugin.Logger.LogError((object)"Unhandled command received, you may be missing mods"); } } } private static void HandleMessageClient(NetworkMessage msg) { NetworkReader reader = msg.reader; Header header = reader.Read<Header>(); if (header.Destination.ShouldRun()) { header.RemoveDestination(NetworkDestination.Clients); if (NetMessages.TryGetValue(header.TypeCode, out INetMessage value)) { value.Deserialize(reader); value.OnReceived(); } else { NetworkingPlugin.Logger.LogError((object)"Unhandled message received, you may be missing mods"); } } } private static void HandleRequestClient(NetworkMessage msg) { NetworkReader reader = msg.reader; Header header = reader.Read<Header>(); if (!header.Destination.ShouldRun()) { return; } header.RemoveDestination(NetworkDestination.Clients); if (NetRequests.TryGetValue(header.TypeCode, out RequestPerformerBase value)) { ISerializableObject target = value.PerformRequest(reader); Header target2 = new Header(header.TypeCode, NetworkDestination.Clients); using Writer writer = GetWriter(ReplyIndex, msg.conn, (QosType)3); NetworkWriter writer2 = writer; writer2.Write(target2); writer2.Write(target); return; } NetworkingPlugin.Logger.LogError((object)"Unhandled request message received, you may be missing mods"); } private static void HandleReplyClient(NetworkMessage msg) { NetworkReader reader = msg.reader; Header header = reader.Read<Header>(); if (header.Destination.ShouldRun()) { header.RemoveDestination(NetworkDestination.Clients); if (NetRequests.TryGetValue(header.TypeCode, out RequestPerformerBase value)) { value.PerformReply(reader); } else { NetworkingPlugin.Logger.LogError((object)"Unhandled reply received, you may be missing mods"); } } } } public static class NetworkingHelpers { public static void DealDamage(this DamageInfo? damage, HurtBox? target, bool callDamage, bool callHitEnemy, bool callHitWorld) { if (NetworkServer.active) { if (callDamage && (Object)(object)target != (Object)null && (Object)(object)target.healthComponent != (Object)null) { target.healthComponent.TakeDamage(damage); } if (callHitEnemy && (Object)(object)target != (Object)null && (Object)(object)target.healthComponent != (Object)null) { GlobalEventManager.instance.OnHitEnemy(damage, ((Component)target.healthComponent).gameObject); } if (callHitWorld) { GlobalEventManager.instance.OnHitAll(damage, (Object.op_Implicit((Object)(object)target) && Object.op_Implicit((Object)(object)target.healthComponent)) ? ((Component)target.healthComponent).gameObject : null); } } else { new DamageMessage(damage, target, callDamage, callHitEnemy, callHitWorld).Send(NetworkDestination.Server); } } public static void ApplyBuff(this CharacterBody? body, BuffIndex buff, int stacks = 1, float duration = -1f) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { if (duration < 0f) { body.SetBuffCount(buff, stacks); return; } if (stacks < 0) { NetworkingPlugin.Logger.LogError((object)"Cannot remove duration from a buff"); return; } for (int i = 0; i < stacks; i++) { body.AddTimedBuff(buff, duration); } } else { new BuffMessage(body, buff, stacks, duration).Send(NetworkDestination.Server); } } public static void ApplyDot(this HealthComponent victim, GameObject attacker, DotIndex dotIndex, float duration = 8f, float damageMultiplier = 1f) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) victim.ApplyDot(new InflictDotInfo { victimObject = ((Component)victim).gameObject, attackerObject = attacker, dotIndex = dotIndex, duration = duration, damageMultiplier = damageMultiplier }); } public static void ApplyDot(this HealthComponent victim, InflictDotInfo inflictDotInfo) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { DotController.InflictDot(ref inflictDotInfo); } else { new DotMessage(inflictDotInfo).Send(NetworkDestination.Server); } } } [BepInPlugin("com.bepis.r2api.networking", "R2API.Networking", "1.0.4")] public sealed class NetworkingPlugin : BaseUnityPlugin { internal static ManualLogSource Logger { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; NetworkingAPI.SetHooks(); } private void OnDestroy() { NetworkingAPI.UnsetHooks(); } } internal abstract class RequestPerformerBase { internal abstract ISerializableObject PerformRequest(NetworkReader reader); internal abstract void PerformReply(NetworkReader reader); } internal sealed class RequestPerformer<TRequest, TReply> : RequestPerformerBase where TRequest : INetRequest<TRequest, TReply> where TReply : INetRequestReply<TRequest, TReply> { private readonly TRequest _request; private readonly TReply _reply; internal RequestPerformer(TRequest request, TReply reply) { _request = request; _reply = reply; } internal override ISerializableObject PerformRequest(NetworkReader reader) { _request.Deserialize(reader); return _request.OnRequestReceived(); } internal override void PerformReply(NetworkReader reader) { _reply.Deserialize(reader); _reply.OnReplyReceived(); } } internal class Writer : IDisposable { private readonly NetworkWriter _netWriter; private readonly NetworkConnection _target; private readonly QosType _qos; internal Writer(NetworkWriter writer, short messageIndex, NetworkConnection target, QosType qos) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) _netWriter = writer; _target = target; _qos = qos; writer.StartMessage(messageIndex); } public static implicit operator NetworkWriter(Writer writer) { return writer._netWriter; } public void Dispose() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected I4, but got Unknown _netWriter.FinishMessage(); _target.SendWriter(_netWriter, (int)_qos); } } } namespace R2API.Networking.Messages { internal struct BuffMessage : INetMessage, ISerializableObject { private CharacterBody _body; private BuffIndex _buff; private int _stacks; private float _duration; public void Serialize(NetworkWriter writer) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) writer.Write(((Component)_body).gameObject); NetworkExtensions.WriteBuffIndex(writer, _buff); writer.Write(_stacks); writer.Write(_duration); } public void Deserialize(NetworkReader reader) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) _body = reader.ReadGameObject().GetComponent<CharacterBody>(); _buff = NetworkExtensions.ReadBuffIndex(reader); _stacks = reader.ReadInt32(); _duration = reader.ReadSingle(); } public void OnReceived() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) _body.ApplyBuff(_buff, _stacks, _duration); } internal BuffMessage(CharacterBody body, BuffIndex buff, int stacks, float duration) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) _body = body; _buff = buff; _stacks = stacks; _duration = duration; } } internal struct DamageMessage : INetMessage, ISerializableObject { private DamageInfo _damage; private HurtBox _target; private bool _callDamage; private bool _callHitEnemy; private bool _callHitWorld; public void Serialize(NetworkWriter writer) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) NetworkExtensions.Write(writer, _damage); NetworkExtensions.Write(writer, HurtBoxReference.FromHurtBox(_target)); byte b = 0; b = (byte)((uint)b | (_callHitWorld ? 1u : 0u)); b <<= 1; b = (byte)((uint)b | (_callHitEnemy ? 1u : 0u)); b <<= 1; b = (byte)((uint)b | (_callDamage ? 1u : 0u)); writer.Write(b); } public void Deserialize(NetworkReader reader) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) _damage = NetworkExtensions.ReadDamageInfo(reader); HurtBoxReference val = NetworkExtensions.ReadHurtBoxReference(reader); _target = ((HurtBoxReference)(ref val)).ResolveHurtBox(); byte b = reader.ReadByte(); _callDamage = (b & 1) > 0; b >>= 1; _callHitEnemy = (b & 1) > 0; b >>= 1; _callHitWorld = (b & 1) > 0; } public void OnReceived() { _damage.DealDamage(_target, _callDamage, _callHitEnemy, _callHitWorld); } internal DamageMessage(DamageInfo damage, HurtBox target, bool callDamage, bool callHitEnemy, bool callHitWorld) { _damage = damage; _target = target; _callDamage = callDamage; _callHitEnemy = callHitEnemy; _callHitWorld = callHitWorld; } } internal struct DotMessage : INetMessage, ISerializableObject { private static readonly bool[] _nullableFieldsSharedHasValueArray = new bool[3]; private GameObject _victim; private GameObject _attacker; private DotIndex _dotIndex; private float _duration; private float _damageMultiplier; private uint? _maxStacksFromAttacker; private float? _totalDamage; private DotIndex? _preUpgradeDotIndex; private HurtBoxReference _hitHurtBox; public void Serialize(NetworkWriter writer) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected I4, but got Unknown //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected I4, but got Unknown writer.Write(_victim); writer.Write(_attacker); NetworkExtensions.WritePackedIndex32(writer, (int)_dotIndex); writer.Write(_duration); writer.Write(_damageMultiplier); int num = 0; _nullableFieldsSharedHasValueArray[num++] = _maxStacksFromAttacker.HasValue; _nullableFieldsSharedHasValueArray[num++] = _totalDamage.HasValue; _nullableFieldsSharedHasValueArray[num++] = _preUpgradeDotIndex.HasValue; NetworkExtensions.WriteBitArray(writer, _nullableFieldsSharedHasValueArray); if (_maxStacksFromAttacker.HasValue) { writer.WritePackedUInt32(_maxStacksFromAttacker.Value); } if (_totalDamage.HasValue) { writer.Write(_totalDamage.Value); } if (_preUpgradeDotIndex.HasValue) { NetworkExtensions.WritePackedIndex32(writer, (int)_preUpgradeDotIndex.Value); } NetworkExtensions.Write(writer, _hitHurtBox); } public void Deserialize(NetworkReader reader) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) _victim = reader.ReadGameObject(); _attacker = reader.ReadGameObject(); _dotIndex = (DotIndex)NetworkExtensions.ReadPackedIndex32(reader); _duration = reader.ReadSingle(); _damageMultiplier = reader.ReadSingle(); NetworkExtensions.ReadBitArray(reader, _nullableFieldsSharedHasValueArray); int num = 0; bool num2 = _nullableFieldsSharedHasValueArray[num++]; bool flag = _nullableFieldsSharedHasValueArray[num++]; bool flag2 = _nullableFieldsSharedHasValueArray[num++]; if (num2) { _maxStacksFromAttacker = reader.ReadPackedUInt32(); } if (flag) { _totalDamage = reader.ReadSingle(); } if (flag2) { _preUpgradeDotIndex = (DotIndex)NetworkExtensions.ReadPackedIndex32(reader); } _hitHurtBox = NetworkExtensions.ReadHurtBoxReference(reader); } public void OnReceived() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) InflictDotInfo val = default(InflictDotInfo); val.victimObject = _victim; val.attackerObject = _attacker; val.dotIndex = _dotIndex; val.duration = _duration; val.damageMultiplier = _damageMultiplier; val.maxStacksFromAttacker = _maxStacksFromAttacker; val.totalDamage = _totalDamage; val.preUpgradeDotIndex = _preUpgradeDotIndex; val.hitHurtBox = ((HurtBoxReference)(ref _hitHurtBox)).ResolveHurtBox(); InflictDotInfo val2 = val; DotController.InflictDot(ref val2); } internal DotMessage(InflictDotInfo inflictDotInfo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) _victim = inflictDotInfo.victimObject; _attacker = inflictDotInfo.attackerObject; _dotIndex = inflictDotInfo.dotIndex; _duration = inflictDotInfo.duration; _damageMultiplier = inflictDotInfo.damageMultiplier; _maxStacksFromAttacker = inflictDotInfo.maxStacksFromAttacker; _totalDamage = inflictDotInfo.totalDamage; _preUpgradeDotIndex = inflictDotInfo.preUpgradeDotIndex; _hitHurtBox = HurtBoxReference.FromHurtBox(inflictDotInfo.hitHurtBox); } } internal struct ExampleMessage : INetMessage, ISerializableObject { internal int Integer; internal string Str; public void Serialize(NetworkWriter writer) { writer.Write(Integer); writer.Write(Str); } public void Deserialize(NetworkReader reader) { Integer = reader.ReadInt32(); Str = reader.ReadString(); } public void OnReceived() { NetworkingPlugin.Logger.LogWarning((object)("int : " + Integer + " str : " + Str)); } } internal struct ExamplePing : INetRequest<ExamplePing, ExamplePingReply>, ISerializableObject { internal int Integer; public void Serialize(NetworkWriter writer) { writer.Write(Integer); } public void Deserialize(NetworkReader reader) { Integer = reader.ReadInt32(); } public ExamplePingReply OnRequestReceived() { NetworkingPlugin.Logger.LogWarning((object)("ExamplePing - Received this request : " + Integer)); ExamplePingReply result = default(ExamplePingReply); result.Str = "I'm answering you back this string"; return result; } } internal struct ExamplePingReply : INetRequestReply<ExamplePing, ExamplePingReply>, ISerializableObject { internal string Str; public void Serialize(NetworkWriter writer) { writer.Write(Str); } public void Deserialize(NetworkReader reader) { Str = reader.ReadString(); } public void OnReplyReceived() { NetworkingPlugin.Logger.LogWarning((object)("ExamplePingReply - Received this Reply : " + Str)); } } } namespace R2API.Networking.Interfaces { public interface INetCommand { void OnReceived(); } public static class NetCommandExtensions { private static void SendCommand(Header header, NetworkConnection conn) { using Writer writer = NetworkingAPI.GetWriter(NetworkingAPI.CommandIndex, conn, (QosType)3); SerializableObjectExtensions.Write(writer, header); } public static void Send(this INetCommand? command, NetworkDestination destination) { if (destination.ShouldRun()) { command.OnReceived(); } if (!destination.ShouldSend()) { return; } Header header = destination.GetHeader(NetworkingAPI.GetNetworkHash(command.GetType())); if (NetworkServer.active) { for (int i = 0; i < NetworkServer.connections.Count; i++) { NetworkConnection val = NetworkServer.connections[i]; if (val != null && (!NetworkServer.localClientActive || !NetworkServer.localConnections.Contains(val))) { SendCommand(header, val); } } } else if (NetworkClient.active) { SendCommand(header, ClientScene.readyConnection); } } public static void Send(this INetCommand? command, NetworkConnection target) { if (target == null) { throw new ArgumentNullException("target"); } if (!NetworkServer.active) { throw new InvalidOperationException("NetworkServer is not active."); } if (NetworkClient.active) { foreach (NetworkClient allClient in NetworkClient.allClients) { if (allClient.connection != null && allClient.connection.connectionId == target.connectionId) { command.OnReceived(); return; } } } SendCommand(NetworkDestination.Clients.GetHeader(NetworkingAPI.GetNetworkHash(command.GetType())), target); } } public interface INetMessage : ISerializableObject { void OnReceived(); } public static class NetMessageExtensions { private static void SendMessage(INetMessage? message, Header header, NetworkConnection conn) { using Writer writer = NetworkingAPI.GetWriter(NetworkingAPI.MessageIndex, conn, (QosType)3); NetworkWriter writer2 = writer; writer2.Write(header); writer2.Write(message); } public static void Send(this INetMessage? message, NetworkDestination destination) { if (destination.ShouldRun()) { message.OnReceived(); } if (!destination.ShouldSend()) { return; } Header header = destination.GetHeader(NetworkingAPI.GetNetworkHash(message.GetType())); if (NetworkServer.active) { for (int i = 0; i < NetworkServer.connections.Count; i++) { NetworkConnection val = NetworkServer.connections[i]; if (val != null && (!NetworkServer.localClientActive || !NetworkServer.localConnections.Contains(val))) { SendMessage(message, header, val); } } } else if (NetworkClient.active) { SendMessage(message, header, ClientScene.readyConnection); } } public static void Send(this INetMessage? message, NetworkConnection target) { if (target == null) { throw new ArgumentNullException("target"); } if (!NetworkServer.active) { throw new InvalidOperationException("NetworkServer is not active."); } if (NetworkClient.active) { foreach (NetworkClient allClient in NetworkClient.allClients) { if (allClient.connection != null && allClient.connection.connectionId == target.connectionId) { message.OnReceived(); return; } } } Header header = NetworkDestination.Clients.GetHeader(NetworkingAPI.GetNetworkHash(message.GetType())); SendMessage(message, header, target); } } public interface INetRequest<TRequest, TReply> : ISerializableObject where TRequest : INetRequest<TRequest, TReply> where TReply : INetRequestReply<TRequest, TReply> { TReply OnRequestReceived(); } public interface INetRequestReply<TRequest, TReply> : ISerializableObject where TRequest : INetRequest<TRequest, TReply> where TReply : INetRequestReply<TRequest, TReply> { void OnReplyReceived(); } public static class NetRequestExtensions { private static void SendRequest<TRequest, TReply>(TRequest request, Header header, NetworkConnection conn) where TRequest : INetRequest<TRequest, TReply> where TReply : INetRequestReply<TRequest, TReply> { using Writer writer = NetworkingAPI.GetWriter(NetworkingAPI.RequestIndex, conn, (QosType)3); NetworkWriter writer2 = writer; writer2.Write(header); writer2.Write(request); } public static void Send<TRequest, TReply>(this TRequest request, NetworkDestination destination) where TRequest : INetRequest<TRequest, TReply> where TReply : INetRequestReply<TRequest, TReply> { if (destination.ShouldRun()) { request.OnRequestReceived().OnReplyReceived(); } if (!destination.ShouldSend()) { return; } Header header = destination.GetHeader(NetworkingAPI.GetNetworkHash(request.GetType())); if (NetworkServer.active) { for (int i = 0; i < NetworkServer.connections.Count; i++) { NetworkConnection val = NetworkServer.connections[i]; if (val != null && (!NetworkServer.localClientActive || !NetworkServer.localConnections.Contains(val))) { SendRequest<TRequest, TReply>(request, header, val); } } } else if (NetworkClient.active) { SendRequest<TRequest, TReply>(request, header, ClientScene.readyConnection); } } public static void Send<TRequest, TReply>(this TRequest request, NetworkConnection target) where TRequest : INetRequest<TRequest, TReply> where TReply : INetRequestReply<TRequest, TReply> { if (target == null) { throw new ArgumentNullException("target"); } if (!NetworkServer.active) { throw new InvalidOperationException("NetworkServer is not active."); } if (NetworkClient.active) { foreach (NetworkClient allClient in NetworkClient.allClients) { if (allClient.connection != null && allClient.connection.connectionId == target.connectionId) { request.OnRequestReceived().OnReplyReceived(); return; } } } Header header = NetworkDestination.Clients.GetHeader(NetworkingAPI.GetNetworkHash(request.GetType())); SendRequest<TRequest, TReply>(request, header, target); } } public interface ISerializableObject { void Serialize(NetworkWriter writer); void Deserialize(NetworkReader reader); } public static class SerializableObjectExtensions { public static void Write<TObject>(this NetworkWriter? writer, TObject target) where TObject : ISerializableObject { target.Serialize(writer); } public static TObject Read<TObject>(this NetworkReader? reader, TObject destination) where TObject : ISerializableObject { destination.Deserialize(reader); return destination; } public static TObject Read<TObject>(this NetworkReader? reader) where TObject : ISerializableObject, new() { TObject result = new TObject(); result.Deserialize(reader); return result; } } public interface ISerializer<TObject> { void Serialize(NetworkWriter writer, TObject target); void Deserialize(NetworkReader reader, TObject target); } public static class SerializerExtensions { public static void Write<TObject>(this NetworkWriter? writer, TObject target, ISerializer<TObject>? serializer) { serializer.Serialize(writer, target); } public static TObject Read<TObject>(this NetworkReader? reader, ref TObject destination, ISerializer<TObject>? serializer) { serializer.Deserialize(reader, destination); return destination; } } }