Skip to content

Commit 0845292

Browse files
committed
Separated core LiteNetLib wrapper logic into LiteNetLibTransport.cs. LiteNetLibTransportProvider.cs now exclusively contains the LiteNetLibTransportProvider class to address Unity Editor-related issues.
1 parent 15e96c8 commit 0845292

3 files changed

Lines changed: 195 additions & 173 deletions

File tree

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
using LiteNetLib;
2+
using LiteNetLib.Utils;
3+
using System.Collections.Generic;
4+
using UnityEngine;
5+
using System.Net;
6+
using System.Net.Sockets;
7+
using System;
8+
using Netick.Unity;
9+
10+
namespace Netick.Transport
11+
{
12+
public class LiteNetLibTransport : NetworkTransport, INetEventListener
13+
{
14+
public class LNLConnection : TransportConnection
15+
{
16+
public LiteNetLibTransport Transport;
17+
public NetPeer LNLPeer;
18+
public override IEndPoint EndPoint => LNLPeer.EndPoint.ToNetickEndPoint();
19+
public override int Mtu => LNLPeer.Mtu;
20+
public LNLConnection(LiteNetLibTransport transport)
21+
{
22+
Transport = transport;
23+
}
24+
public unsafe override void Send(IntPtr ptr, int length) => LNLPeer.Send(new ReadOnlySpan<byte>(ptr.ToPointer(), length), DeliveryMethod.Unreliable);
25+
public unsafe override void SendUserData(IntPtr ptr, int length, TransportDeliveryMethod method) => LNLPeer.Send(new ReadOnlySpan<byte>(ptr.ToPointer(), length), method == TransportDeliveryMethod.Unreliable ? DeliveryMethod.Unreliable : DeliveryMethod.ReliableOrdered);
26+
}
27+
28+
private LiteNetLibTransportProvider _provider;
29+
private NetManager _netManager;
30+
private NetDataWriter _writer = new NetDataWriter();
31+
private BitBuffer _buffer;
32+
private byte[] _connectionBytes = new byte[200];
33+
private int _port;
34+
private Dictionary<NetPeer, LNLConnection> _clients;
35+
private Queue<LNLConnection> _freeClients;
36+
37+
public LiteNetLibTransport(LiteNetLibTransportProvider provider)
38+
{
39+
this._provider = provider;
40+
}
41+
42+
public override void Init()
43+
{
44+
_clients = new(Engine.Config.MaxPlayers);
45+
_freeClients = new(Engine.Config.MaxPlayers);
46+
_buffer = new BitBuffer(createChunks: false);
47+
_netManager = new NetManager(this) { AutoRecycle = true };
48+
_netManager.DisconnectTimeout = (int)(_provider.DisconnectTimeout * 1000);
49+
_netManager.ReconnectDelay = (int)(_provider.ReconnectInterval * 1000);
50+
_netManager.MaxConnectAttempts = _provider.MaxConnectAttempts;
51+
_netManager.UpdateTime = (int)(_provider.UpdateInterval * 1000);
52+
53+
for (int i = 0; i < Engine.Config.MaxPlayers; i++)
54+
_freeClients.Enqueue(new LNLConnection(this));
55+
}
56+
57+
public override void PollEvents() => _netManager.PollEvents();
58+
public override void ForceUpdate() => _netManager.TriggerUpdate();
59+
60+
public override void Run(RunMode mode, int port)
61+
{
62+
_port = port;
63+
64+
if (mode == RunMode.Client)
65+
{
66+
_netManager.UnconnectedMessagesEnabled = true;
67+
_netManager.Start();
68+
}
69+
else
70+
{
71+
_netManager.BroadcastReceiveEnabled = true;
72+
_netManager.Start(port);
73+
}
74+
}
75+
76+
public override void Shutdown()
77+
{
78+
_netManager.Stop();
79+
}
80+
81+
public override void Connect(string address, int port, byte[] connectionData, int connectionDataLen)
82+
{
83+
if (!_netManager.IsRunning)
84+
_netManager.Start();
85+
86+
if (connectionData == null)
87+
_netManager.Connect(address, port, "");
88+
else
89+
{
90+
_writer. Reset();
91+
_writer. Put(connectionData, 0, connectionDataLen);
92+
_netManager.Connect(address, port, _writer);
93+
}
94+
}
95+
96+
public override void Disconnect(TransportConnection connection)
97+
{
98+
_netManager.DisconnectPeer(((LNLConnection)connection).LNLPeer);
99+
}
100+
101+
void INetEventListener.OnConnectionRequest(ConnectionRequest request)
102+
{
103+
if (_clients.Count >= Engine.Config.MaxPlayers)
104+
{
105+
request.Reject();
106+
return;
107+
}
108+
109+
int len = request.Data.AvailableBytes;
110+
request.Data.GetBytes(_connectionBytes, 0, len);
111+
bool accepted = NetworkPeer.OnConnectRequest(_connectionBytes, len, request.RemoteEndPoint.ToNetickEndPoint());
112+
113+
if (accepted)
114+
request.Accept();
115+
else
116+
request.Reject();
117+
}
118+
119+
void INetEventListener.OnPeerConnected(NetPeer peer)
120+
{
121+
var connection = _freeClients.Dequeue();
122+
connection.LNLPeer = peer;
123+
_clients. Add(peer, connection);
124+
NetworkPeer. OnConnected(connection);
125+
}
126+
127+
void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
128+
{
129+
if (!Engine.IsServer)
130+
{
131+
if (disconnectInfo.Reason == DisconnectReason.ConnectionRejected)
132+
{
133+
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
134+
return;
135+
}
136+
137+
if (disconnectInfo.Reason == DisconnectReason.ConnectionFailed || disconnectInfo.Reason == DisconnectReason.Timeout)
138+
{
139+
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Timeout);
140+
return;
141+
}
142+
143+
if (peer == null)
144+
{
145+
Debug.Log($"LiteNetLib Network Error: {disconnectInfo.Reason}");
146+
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
147+
return;
148+
}
149+
}
150+
151+
if (peer == null)
152+
return;
153+
154+
if (_clients.ContainsKey(peer))
155+
{
156+
TransportDisconnectReason reason = disconnectInfo.Reason == DisconnectReason.Timeout ? TransportDisconnectReason.Timeout : TransportDisconnectReason.Shutdown;
157+
NetworkPeer. OnDisconnected(_clients[peer], reason);
158+
_freeClients.Enqueue(_clients[peer]);
159+
_clients. Remove(peer);
160+
}
161+
}
162+
163+
unsafe void INetEventListener.OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod)
164+
{
165+
if (!_clients.TryGetValue(peer, out var c))
166+
return;
167+
168+
fixed (byte* ptr = reader.RawData)
169+
{
170+
_buffer. SetFrom(ptr + reader.Position, reader.AvailableBytes, reader.RawData.Length);
171+
NetworkPeer.Receive(c, _buffer);
172+
}
173+
}
174+
175+
void INetEventListener.OnNetworkError(IPEndPoint endPoint, SocketError socketError)
176+
{
177+
Debug.Log("LiteNetLib Network Error: " + socketError);
178+
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
179+
}
180+
181+
void INetEventListener.OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType) { }
182+
void INetEventListener.OnNetworkLatencyUpdate(NetPeer peer, int latency) { }
183+
}
184+
}

Transport/LiteNetLib Transport/LiteNetLibTransport.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Transport/LiteNetLib Transport/LiteNetLibTransportProvider.cs

Lines changed: 0 additions & 173 deletions
Original file line numberDiff line numberDiff line change
@@ -22,177 +22,4 @@ public class LiteNetLibTransportProvider : NetworkTransportProvider
2222
public float UpdateInterval = 0.015f;
2323
public override NetworkTransport MakeTransportInstance() => new LiteNetLibTransport(this);
2424
}
25-
26-
public class LiteNetLibTransport : NetworkTransport, INetEventListener
27-
{
28-
public class LNLConnection : TransportConnection
29-
{
30-
public LiteNetLibTransport Transport;
31-
public NetPeer LNLPeer;
32-
public override IEndPoint EndPoint => LNLPeer.EndPoint.ToNetickEndPoint();
33-
public override int Mtu => LNLPeer.Mtu;
34-
public LNLConnection(LiteNetLibTransport transport)
35-
{
36-
Transport = transport;
37-
}
38-
public unsafe override void Send(IntPtr ptr, int length) => LNLPeer.Send(new ReadOnlySpan<byte>(ptr.ToPointer(), length), DeliveryMethod.Unreliable);
39-
public unsafe override void SendUserData(IntPtr ptr, int length, TransportDeliveryMethod method) => LNLPeer.Send(new ReadOnlySpan<byte>(ptr.ToPointer(), length), method == TransportDeliveryMethod.Unreliable ? DeliveryMethod.Unreliable : DeliveryMethod.ReliableOrdered);
40-
}
41-
42-
private LiteNetLibTransportProvider _provider;
43-
private NetManager _netManager;
44-
private NetDataWriter _writer = new NetDataWriter();
45-
private BitBuffer _buffer;
46-
private byte[] _connectionBytes = new byte[200];
47-
private int _port;
48-
private Dictionary<NetPeer, LNLConnection> _clients;
49-
private Queue<LNLConnection> _freeClients;
50-
51-
public LiteNetLibTransport(LiteNetLibTransportProvider provider)
52-
{
53-
this._provider = provider;
54-
}
55-
56-
public override void Init()
57-
{
58-
_clients = new(Engine.Config.MaxPlayers);
59-
_freeClients = new(Engine.Config.MaxPlayers);
60-
_buffer = new BitBuffer(createChunks: false);
61-
_netManager = new NetManager(this) { AutoRecycle = true };
62-
_netManager.DisconnectTimeout = (int)(_provider.DisconnectTimeout * 1000);
63-
_netManager.ReconnectDelay = (int)(_provider.ReconnectInterval * 1000);
64-
_netManager.MaxConnectAttempts = _provider.MaxConnectAttempts;
65-
_netManager.UpdateTime = (int)(_provider.UpdateInterval * 1000);
66-
67-
for (int i = 0; i < Engine.Config.MaxPlayers; i++)
68-
_freeClients.Enqueue(new LNLConnection(this));
69-
}
70-
71-
public override void PollEvents() => _netManager.PollEvents();
72-
public override void ForceUpdate() => _netManager.TriggerUpdate();
73-
74-
public override void Run(RunMode mode, int port)
75-
{
76-
_port = port;
77-
78-
if (mode == RunMode.Client)
79-
{
80-
_netManager.UnconnectedMessagesEnabled = true;
81-
_netManager.Start();
82-
}
83-
else
84-
{
85-
_netManager.BroadcastReceiveEnabled = true;
86-
_netManager.Start(port);
87-
}
88-
}
89-
90-
public override void Shutdown()
91-
{
92-
_netManager.Stop();
93-
}
94-
95-
public override void Connect(string address, int port, byte[] connectionData, int connectionDataLen)
96-
{
97-
if (!_netManager.IsRunning)
98-
_netManager.Start();
99-
100-
if (connectionData == null)
101-
_netManager.Connect(address, port, "");
102-
else
103-
{
104-
_writer. Reset();
105-
_writer. Put(connectionData, 0, connectionDataLen);
106-
_netManager.Connect(address, port, _writer);
107-
}
108-
}
109-
110-
public override void Disconnect(TransportConnection connection)
111-
{
112-
_netManager.DisconnectPeer(((LNLConnection)connection).LNLPeer);
113-
}
114-
115-
void INetEventListener.OnConnectionRequest(ConnectionRequest request)
116-
{
117-
if (_clients.Count >= Engine.Config.MaxPlayers)
118-
{
119-
request.Reject();
120-
return;
121-
}
122-
123-
int len = request.Data.AvailableBytes;
124-
request.Data.GetBytes(_connectionBytes, 0, len);
125-
bool accepted = NetworkPeer.OnConnectRequest(_connectionBytes, len, request.RemoteEndPoint.ToNetickEndPoint());
126-
127-
if (accepted)
128-
request.Accept();
129-
else
130-
request.Reject();
131-
}
132-
133-
void INetEventListener.OnPeerConnected(NetPeer peer)
134-
{
135-
var connection = _freeClients.Dequeue();
136-
connection.LNLPeer = peer;
137-
_clients. Add(peer, connection);
138-
NetworkPeer. OnConnected(connection);
139-
}
140-
141-
void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
142-
{
143-
if (!Engine.IsServer)
144-
{
145-
if (disconnectInfo.Reason == DisconnectReason.ConnectionRejected)
146-
{
147-
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
148-
return;
149-
}
150-
151-
if (disconnectInfo.Reason == DisconnectReason.ConnectionFailed || disconnectInfo.Reason == DisconnectReason.Timeout)
152-
{
153-
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Timeout);
154-
return;
155-
}
156-
157-
if (peer == null)
158-
{
159-
Debug.Log($"LiteNetLib Network Error: {disconnectInfo.Reason}");
160-
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
161-
return;
162-
}
163-
}
164-
165-
if (peer == null)
166-
return;
167-
168-
if (_clients.ContainsKey(peer))
169-
{
170-
TransportDisconnectReason reason = disconnectInfo.Reason == DisconnectReason.Timeout ? TransportDisconnectReason.Timeout : TransportDisconnectReason.Shutdown;
171-
NetworkPeer. OnDisconnected(_clients[peer], reason);
172-
_freeClients.Enqueue(_clients[peer]);
173-
_clients. Remove(peer);
174-
}
175-
}
176-
177-
unsafe void INetEventListener.OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod)
178-
{
179-
if (!_clients.TryGetValue(peer, out var c))
180-
return;
181-
182-
fixed (byte* ptr = reader.RawData)
183-
{
184-
_buffer. SetFrom(ptr + reader.Position, reader.AvailableBytes, reader.RawData.Length);
185-
NetworkPeer.Receive(c, _buffer);
186-
}
187-
}
188-
189-
void INetEventListener.OnNetworkError(IPEndPoint endPoint, SocketError socketError)
190-
{
191-
Debug.Log("LiteNetLib Network Error: " + socketError);
192-
NetworkPeer.OnConnectFailed(ConnectionFailedReason.Refused);
193-
}
194-
195-
void INetEventListener.OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType) { }
196-
void INetEventListener.OnNetworkLatencyUpdate(NetPeer peer, int latency) { }
197-
}
19825
}

0 commit comments

Comments
 (0)