Funkční komunikace mezi jedním clientem a serverem
This commit is contained in:
commit
3f235f6e04
44 changed files with 1030 additions and 0 deletions
103
FNAF_Clone/Client.cs
Normal file
103
FNAF_Clone/Client.cs
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using LiteNetLib;
|
||||
using LiteNetLib.Utils;
|
||||
using PacketLib;
|
||||
|
||||
namespace FNAF_Clone;
|
||||
|
||||
public class Client {
|
||||
private static EventBasedNetListener listener = new();
|
||||
private static NetManager client;
|
||||
private static NetPeer server;
|
||||
|
||||
private static NetDataWriter writer;
|
||||
private static NetPacketProcessor processor;
|
||||
public static ClientPlayer Player { get; } = new();
|
||||
|
||||
|
||||
public static void Connect(string endPoint, int port) {
|
||||
writer = new NetDataWriter();
|
||||
processor = new NetPacketProcessor();
|
||||
|
||||
NestedTypeManager.AutoRegister(processor);
|
||||
|
||||
processor.SubscribeReusable<JoinAcceptPacket>(OnJoinAccept);
|
||||
processor.SubscribeReusable<UpdatePlayerPacket>(OnPlayerUpdate);
|
||||
|
||||
|
||||
client = new NetManager(listener){
|
||||
AutoRecycle = true
|
||||
};
|
||||
|
||||
client.Start();
|
||||
Console.WriteLine($"Connecting to server @ {endPoint}:{port}");
|
||||
|
||||
listener.NetworkReceiveEvent += (peer, reader, channel, method) => {
|
||||
OnNetworkReceive(peer, reader, method);
|
||||
};
|
||||
|
||||
listener.PeerConnectedEvent += peer => {
|
||||
Console.WriteLine("Connected to Server");
|
||||
server = peer;
|
||||
SendPacket(new JoinPacket {username = "Player1"}, DeliveryMethod.ReliableOrdered);
|
||||
};
|
||||
|
||||
client.Connect(endPoint, port, ""); // TODO: figure out how keys work
|
||||
}
|
||||
|
||||
public static void SendPacket<T>(T packet, DeliveryMethod deliveryMethod) where T : class, new() {
|
||||
if (server != null) {
|
||||
writer.Reset();
|
||||
processor.Write(writer, packet);
|
||||
server.Send(writer, deliveryMethod);
|
||||
}
|
||||
}
|
||||
public static void SendCommands(PlayerCommand[] pCommands) {
|
||||
SendPacket(new PlayerCommandPacket{commands = pCommands}, DeliveryMethod.ReliableOrdered);
|
||||
}
|
||||
|
||||
public static void OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMethod deliveryMethod) {
|
||||
processor.ReadAllPackets(reader, peer);
|
||||
}
|
||||
|
||||
public static void OnJoinAccept(JoinAcceptPacket packet) {
|
||||
Console.WriteLine($"Accepted by server, pid: {packet.state.pid}");
|
||||
Player.state = packet.state;
|
||||
}
|
||||
|
||||
public static void Update() {
|
||||
client.PollEvents();
|
||||
}
|
||||
|
||||
public static void OnPlayerUpdate(UpdatePlayerPacket packet) {
|
||||
//Player.state = Player.state.pid == 0 ? packet.stateP1 : packet.stateP2;
|
||||
|
||||
foreach (var e in packet.events){
|
||||
switch (e.ID){
|
||||
case 0: // join
|
||||
Console.WriteLine("E: Player joined");
|
||||
break;
|
||||
case 1: // leave
|
||||
Console.WriteLine("E: Player left");
|
||||
break;
|
||||
case 2: // switch cam
|
||||
if (Player.state.pid == e.Args[0]){
|
||||
Player.state.camera = e.Args[1];
|
||||
}
|
||||
Console.WriteLine($"E: player {e.Args[0]} switched to camera {e.Args[1]}");
|
||||
break;
|
||||
case 3: // toggle cam
|
||||
Player.state.monitorUp = e.Args[1] == 1;
|
||||
Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}");
|
||||
break;
|
||||
case -1: // movement
|
||||
throw new NotImplementedException();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue