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(OnJoinAccept); processor.SubscribeReusable(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 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(); } } } }