using System; using System.Diagnostics; using System.IO; using System.Net; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BombRushMP.Common.Networking; using LiteNetLib; using LiteNetLib.Layers; using LiteNetLib.Utils; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("BombRushMP.LiteNetLibInterface")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("BombRushMP.LiteNetLibInterface")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("12cf70a5-535b-4ce2-be8f-c0f34cab3614")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace BombRushMP.LiteNetLibInterface; public class LiteNetLibClient : INetClient { private EventBasedNetListener _netListener; private NetManager _netManager; public bool IsConnected { get { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Invalid comparison between Unknown and I4 if (_netManager != null && _netManager.FirstPeer != null) { return (int)_netManager.FirstPeer.ConnectionState == 4; } return false; } } public EventHandler Connected { get; set; } public EventHandler MessageReceived { get; set; } public EventHandler Disconnected { get; set; } public EventHandler ConnectionFailed { get; set; } public LiteNetLibClient() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown _netListener = new EventBasedNetListener(); _netListener.PeerConnectedEvent += new OnPeerConnected(_netListener_PeerConnectedEvent); _netListener.NetworkReceiveEvent += new OnNetworkReceive(_netListener_NetworkReceiveEvent); _netListener.PeerDisconnectedEvent += new OnPeerDisconnected(_netListener_PeerDisconnectedEvent); } private void _netListener_PeerDisconnectedEvent(NetPeer peer, DisconnectInfo disconnectInfo) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown if ((int)disconnectInfo.Reason == 0) { EventHandler connectionFailed = ConnectionFailed; if (connectionFailed != null) { DisconnectReason val = (DisconnectReason)0; connectionFailed(this, new ConnectionFailedEventArgs(((object)(DisconnectReason)(ref val)).ToString())); } } else { Disconnected?.Invoke(this, new DisconnectedEventArgs(((object)(DisconnectReason)(ref disconnectInfo.Reason)).ToString())); } } private void _netListener_NetworkReceiveEvent(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod) { //IL_001e: 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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown if (((NetDataReader)reader).GetByte() != 0) { ushort uShort = ((NetDataReader)reader).GetUShort(); byte[] remainingBytes = ((NetDataReader)reader).GetRemainingBytes(); LiteNetLibConnection liteNetLibConnection = new LiteNetLibConnection(peer); LiteNetLibMessage liteNetLibMessage = new LiteNetLibMessage(LiteNetLibUtils.DeliveryMethodToSendMode(deliveryMethod), (NetChannels)channel, uShort); liteNetLibMessage.Add(remainingBytes); MessageReceived?.Invoke(this, new MessageReceivedEventArgs(uShort, (IMessage)(object)liteNetLibMessage, (INetConnection)(object)liteNetLibConnection)); reader.Recycle(); } } private void _netListener_PeerConnectedEvent(NetPeer peer) { Connected?.Invoke(this, null); } public bool Connect(string address, int port) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if (_netManager != null) { _netManager.Stop(); } _netManager = new NetManager((INetEventListener)(object)_netListener, (PacketLayerBase)null); _netManager.ChannelsCount = 7; if (NetworkingEnvironment.UseNativeSocketsIfAvailable) { NetworkingEnvironment.Log("LiteNetLib: Using native sockets if supported."); _netManager.UseNativeSockets = true; } if (_netManager.Start()) { IPAddress[] hostAddresses = Dns.GetHostAddresses(address); if (hostAddresses.Length != 0) { address = hostAddresses[0].ToString(); } IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(address), port); _netManager.Connect(iPEndPoint, LiteNetLibInterface.Key); return true; } return false; } public void Disconnect() { _netManager.DisconnectAll(); } public void Send(IMessage message) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) _netManager.SendToAll((message as LiteNetLibMessage).GetBytesForSend(), (message as LiteNetLibMessage).DeliveryMethod); } public void Update() { _netManager.TriggerUpdate(); _netManager.PollEvents(0); } public override string ToString() { return ((object)_netManager).ToString(); } } public class LiteNetLibConnection : INetConnection { public NetPeer Peer; public bool CanQualityDisconnect { get { return false; } set { } } public ushort Id => LiteNetLibUtils.PeerIdToGameId(Peer.Id); public string Address => ((object)Peer).ToString().Split(new char[1] { ':' })[0]; public LiteNetLibConnection(NetPeer peer) { Peer = peer; } public void Send(IMessage message) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected I4, but got Unknown LiteNetLibMessage liteNetLibMessage = message as LiteNetLibMessage; byte[] bytesForSend = liteNetLibMessage.GetBytesForSend(); Peer.Send(bytesForSend, (byte)(int)liteNetLibMessage.Channel, liteNetLibMessage.DeliveryMethod); } public override string ToString() { return ((object)Peer).ToString(); } } public class LiteNetLibInterface : INetworkingInterface { public static string Key = $"ACN-{24u}"; public int MaxPayloadSize { get { return 1400; } set { } } public INetClient CreateClient() { return (INetClient)(object)new LiteNetLibClient(); } public IMessage CreateMessage(SendModes sendMode, NetChannels channel, Enum packetId) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) return (IMessage)(object)new LiteNetLibMessage(sendMode, channel, Convert.ToUInt16(packetId)); } public INetServer CreateServer() { return (INetServer)(object)new LiteNetLibServer(); } public override string ToString() { return "LiteNetLib"; } } public class LiteNetLibMessage : IMessage { public DeliveryMethod DeliveryMethod; public NetChannels Channel; private ushort _packetId; private NetDataWriter _writer; public LiteNetLibMessage(SendModes sendMode, NetChannels channel, ushort packetId) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0024: Expected O, but got Unknown DeliveryMethod = LiteNetLibUtils.SendModeToDeliveryMethod(sendMode); Channel = channel; _writer = new NetDataWriter(); _packetId = packetId; } public IMessage Add(byte[] data) { _writer.Put(data); return (IMessage)(object)this; } public byte[] GetBytes() { return _writer.CopyData(); } public byte[] GetBytesForSend() { using MemoryStream memoryStream = new MemoryStream(); using BinaryWriter binaryWriter = new BinaryWriter(memoryStream); binaryWriter.Write((byte)1); binaryWriter.Write(_packetId); binaryWriter.Write(GetBytes()); return memoryStream.ToArray(); } } public class LiteNetLibServer : INetServer { private int _disconnectTimeout = 10000; private EventBasedNetListener _netListener; private NetManager _netManager; private ushort _maxPlayers; public EventHandler MessageReceived { get; set; } public EventHandler ClientDisconnected { get; set; } public EventHandler ClientConnected { get; set; } public int TimeoutTime { set { _disconnectTimeout = value; } } public LiteNetLibServer() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown _netListener = new EventBasedNetListener(); _netListener.ConnectionRequestEvent += new OnConnectionRequest(_netListener_ConnectionRequestEvent); _netListener.PeerConnectedEvent += new OnPeerConnected(_netListener_PeerConnectedEvent); _netListener.PeerDisconnectedEvent += new OnPeerDisconnected(_netListener_PeerDisconnectedEvent); _netListener.NetworkReceiveEvent += new OnNetworkReceive(_netListener_NetworkReceiveEvent); } private void _netListener_NetworkReceiveEvent(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod) { //IL_001e: 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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown if (((NetDataReader)reader).GetByte() != 0) { ushort uShort = ((NetDataReader)reader).GetUShort(); byte[] remainingBytes = ((NetDataReader)reader).GetRemainingBytes(); LiteNetLibConnection liteNetLibConnection = new LiteNetLibConnection(peer); LiteNetLibMessage liteNetLibMessage = new LiteNetLibMessage(LiteNetLibUtils.DeliveryMethodToSendMode(deliveryMethod), (NetChannels)channel, uShort); liteNetLibMessage.Add(remainingBytes); MessageReceived?.Invoke(this, new MessageReceivedEventArgs(uShort, (IMessage)(object)liteNetLibMessage, (INetConnection)(object)liteNetLibConnection)); reader.Recycle(); } } private void _netListener_PeerDisconnectedEvent(NetPeer peer, DisconnectInfo disconnectInfo) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown ClientDisconnected?.Invoke(this, new ServerDisconnectedEventArgs((INetConnection)(object)new LiteNetLibConnection(peer), ((object)(DisconnectReason)(ref disconnectInfo.Reason)).ToString())); using MemoryStream memoryStream = new MemoryStream(); using BinaryWriter binaryWriter = new BinaryWriter(memoryStream); binaryWriter.Write((byte)0); binaryWriter.Write(LiteNetLibUtils.PeerIdToGameId(peer.Id)); byte[] array = memoryStream.ToArray(); _netManager.SendToAll(array, (DeliveryMethod)2); } private void _netListener_PeerConnectedEvent(NetPeer peer) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ClientConnected?.Invoke(this, new ServerConnectedEventArgs((INetConnection)(object)new LiteNetLibConnection(peer))); } private void _netListener_ConnectionRequestEvent(ConnectionRequest request) { if (_netManager.ConnectedPeersCount < _maxPlayers) { request.AcceptIfKey(LiteNetLibInterface.Key); } else { request.Reject(); } } public void DisconnectClient(ushort id) { NetPeer peerById = _netManager.GetPeerById(LiteNetLibUtils.GameIdToPeerId(id)); _netManager.DisconnectPeer(peerById); } public void DisconnectClient(INetConnection client) { LiteNetLibConnection liteNetLibConnection = client as LiteNetLibConnection; _netManager.DisconnectPeer(liteNetLibConnection.Peer); } public void Start(ushort port, ushort maxPlayers) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if (_netManager != null) { _netManager.Stop(); } _netManager = new NetManager((INetEventListener)(object)_netListener, (PacketLayerBase)null); _netManager.ChannelsCount = 7; if (NetworkingEnvironment.UseNativeSocketsIfAvailable) { NetworkingEnvironment.Log("LiteNetLib: Using native sockets if supported."); _netManager.UseNativeSockets = true; } _netManager.DisconnectTimeout = _disconnectTimeout; _netManager.Start((int)port); _maxPlayers = maxPlayers; } public void Stop() { _netManager.Stop(); } public void Update() { _netManager.TriggerUpdate(); _netManager.PollEvents(0); } public override string ToString() { return ((object)_netManager).ToString(); } } public static class LiteNetLibUtils { public static ushort PeerIdToGameId(int peerId) { return (ushort)(peerId + 1); } public static int GameIdToPeerId(ushort gameId) { return gameId - 1; } public static DeliveryMethod SendModeToDeliveryMethod(SendModes sendMode) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected I4, but got Unknown return (DeliveryMethod)((int)sendMode switch { 0 => 4, 1 => 2, 2 => 0, _ => 2, }); } public static SendModes DeliveryMethodToSendMode(DeliveryMethod deliveryMethod) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected I4, but got Unknown return (SendModes)((int)deliveryMethod switch { 4 => 0, 2 => 1, 0 => 2, _ => 1, }); } }