-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathClient.cs
More file actions
101 lines (85 loc) · 2.68 KB
/
Copy pathClient.cs
File metadata and controls
101 lines (85 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Threading;
using LiteNetLib;
using LiteNetLib.Utils;
using MultiplayerTest.Packets;
namespace MultiplayerTest
{
public class Client
{
private NetManager manager;
private Thread thread;
private NetPeer server;
private NetDataWriter writer;
public event Action<int> GameStarted;
public event Action<Order> OrderReceived;
public void Connect(string endpoint, int port)
{
if (manager != null)
{
throw new InvalidOperationException();
}
var listener = new EventBasedNetListener();
manager = new NetManager(listener);
manager.Start();
manager.Connect(endpoint, port, nameof(MultiplayerTest));
listener.PeerConnectedEvent += peer => server = peer;
var processor = new NetPacketProcessor();
processor.RegisterNestedType<Order>(() => new Order());
processor.SubscribeReusable<OrderPacket>(packet =>
{
foreach (var order in packet.Orders)
{
OrderReceived?.Invoke(order);
}
});
listener.NetworkReceiveEvent += (fromPeer, dataReader, deliveryMethod) =>
{
var type = (PacketType)dataReader.GetByte();
switch (type)
{
case PacketType.StartGame:
var players = dataReader.GetInt();
GameStarted?.Invoke(players);
break;
case PacketType.Orders:
processor.ReadAllPackets(dataReader);
break;
}
dataReader.Recycle();
};
writer = new NetDataWriter();
thread = new Thread(Run)
{
IsBackground = true
};
thread.Start();
}
public void SendOrder(double targetX, double targetY)
{
writer.Reset();
writer.Put(targetX);
writer.Put(targetY);
server.Send(writer, DeliveryMethod.ReliableOrdered);
}
public void Disconnect()
{
if (manager == null)
{
throw new InvalidOperationException();
}
manager.Stop();
manager = null;
thread.Join();
thread = null;
}
private void Run()
{
while (true)
{
manager.PollEvents();
Thread.Sleep(100);
}
}
}
}