2025-12-19 17:54:50 +01:00
|
|
|
using System;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Net.Sockets;
|
2026-01-26 09:39:17 +01:00
|
|
|
using FNAF_Clone.GUI;
|
2025-12-19 17:54:50 +01:00
|
|
|
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;
|
2026-01-26 09:39:17 +01:00
|
|
|
UIManager.ChangeMonitorState(e.Args[1] == 1);
|
2025-12-19 17:54:50 +01:00
|
|
|
Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}");
|
|
|
|
|
break;
|
2026-01-25 11:16:54 +01:00
|
|
|
case 4: // toggle door
|
|
|
|
|
Player.state.doorStates[e.Args[1]] = e.Args[2] == 1;
|
2026-01-26 09:39:17 +01:00
|
|
|
UIManager.ChangeDoorState(e.Args[1], e.Args[2] == 1);
|
2026-01-25 11:16:54 +01:00
|
|
|
Console.WriteLine($"E: Player {e.Args[0]} {(e.Args[2] == 1 ? "closed" : "opened")} door {e.Args[1]}");
|
|
|
|
|
break;
|
2025-12-19 17:54:50 +01:00
|
|
|
case -1: // movement
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|