From 952aae10de5d2ceaa2fa402ca94fafebaa5ca924 Mon Sep 17 00:00:00 2001 From: Perry Date: Sun, 25 Jan 2026 11:16:54 +0100 Subject: [PATCH] =?UTF-8?q?P=C5=99idan=C3=BD=20command=20a=20event=20pro?= =?UTF-8?q?=20otev=C3=ADr=C3=A1n=C3=AD=20a=20zav=C3=ADr=C3=A1n=C3=AD=20dve?= =?UTF-8?q?=C5=99=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FNAF_Clone/Client.cs | 4 +++ FNAF_Clone/CommandManager.cs | 14 ++++++++- FNAF_Server/CommandProcessor.cs | 30 ++++++++++++++++++ FNAF_Server/Server.cs | 55 +++++++++++++++++---------------- PacketLib/GameEvent.cs | 3 ++ PacketLib/PlayerCommand.cs | 2 +- PacketLib/PlayerState.cs | 9 ++++-- 7 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 FNAF_Server/CommandProcessor.cs diff --git a/FNAF_Clone/Client.cs b/FNAF_Clone/Client.cs index 84e1796..c759a7d 100644 --- a/FNAF_Clone/Client.cs +++ b/FNAF_Clone/Client.cs @@ -92,6 +92,10 @@ public class Client { Player.state.monitorUp = e.Args[1] == 1; Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}"); break; + case 4: // toggle door + Player.state.doorStates[e.Args[1]] = e.Args[2] == 1; + Console.WriteLine($"E: Player {e.Args[0]} {(e.Args[2] == 1 ? "closed" : "opened")} door {e.Args[1]}"); + break; case -1: // movement throw new NotImplementedException(); diff --git a/FNAF_Clone/CommandManager.cs b/FNAF_Clone/CommandManager.cs index 4f5763f..ee41efb 100644 --- a/FNAF_Clone/CommandManager.cs +++ b/FNAF_Clone/CommandManager.cs @@ -8,7 +8,11 @@ namespace FNAF_Clone; public class CommandManager { private static (string label, Keys key, Action action)[] keybinds = [ - ("Toggle Camera", Keys.S, ToggleCamera) + ("Toggle Camera", Keys.S, ToggleCamera), + ("Toggle left door", Keys.D1, ToggleDoorLeft), + ("Toggle centre door", Keys.D2, ToggleDoorCentre), + ("Toggle right door", Keys.D3, ToggleDoorRight) + ]; private static InputListenerHook toggleCamHook = new(true); @@ -20,4 +24,12 @@ public class CommandManager { private static void ToggleCamera() { Client.SendCommands([PlayerCommand.TOGGLE_MONITOR()]); } + + private static void ToggleDoorLeft() => ToggleDoor(0); + private static void ToggleDoorCentre() => ToggleDoor(1); + private static void ToggleDoorRight() => ToggleDoor(2); + + private static void ToggleDoor(int id) { + Client.SendCommands([PlayerCommand.TOGGLE_DOOR_OFFICE(id)]); + } } \ No newline at end of file diff --git a/FNAF_Server/CommandProcessor.cs b/FNAF_Server/CommandProcessor.cs new file mode 100644 index 0000000..e59ca0e --- /dev/null +++ b/FNAF_Server/CommandProcessor.cs @@ -0,0 +1,30 @@ +using PacketLib; + +namespace FNAF_Server; + +public class CommandProcessor { + public static void Evaluate(PlayerCommand[] commands, int pid) { + ServerPlayer currentPlayer = Server.Players[pid]; + + foreach (var playerCommand in commands){ + switch (playerCommand.ID){ + case 0: + Console.WriteLine($"C: Player {pid} switched to camera {playerCommand.Args[0]}"); + Server.SendUpdateToAll([GameEvent.SWITCH_CAM(pid, playerCommand.Args[0])]); + break; + case 1: + bool monitorState = !currentPlayer.state.monitorUp; + currentPlayer.state.monitorUp = monitorState; + Console.WriteLine($"C: Player {pid} toggled camera {(monitorState ? "on" : "off")}"); + Server.SendUpdateToAll([GameEvent.TOGGLE_MONITOR(pid, monitorState)]); + break; + case 2: + bool doorState = !currentPlayer.state.doorStates[playerCommand.Args[0]]; + currentPlayer.state.doorStates[playerCommand.Args[0]] = doorState; + Console.WriteLine($" Player {pid} {(doorState ? "closed" : "opened")} door {playerCommand.Args[0]}"); + Server.SendUpdateToAll([GameEvent.TOGGLE_DOOR_OFFICE(pid,playerCommand.Args[0] ,doorState)]); + break; + } + } + } +} \ No newline at end of file diff --git a/FNAF_Server/Server.cs b/FNAF_Server/Server.cs index acccff3..39c5b86 100644 --- a/FNAF_Server/Server.cs +++ b/FNAF_Server/Server.cs @@ -11,6 +11,7 @@ namespace FNAF_Server; public class Server { public static ServerPlayer P1; public static ServerPlayer P2; + public static readonly Dictionary Players = new(); private static EventBasedNetListener listener; private static NetManager server; @@ -21,7 +22,6 @@ public class Server { private static NetDataWriter writer; private static NetPacketProcessor processor; - private static Dictionary players = new(); private static bool isRunning; @@ -45,7 +45,7 @@ public class Server { listener.ConnectionRequestEvent += request => { Console.WriteLine($"Connection Request from {request.RemoteEndPoint}"); - if (players.Count >= 2){ + if (Players.Count >= 2){ Console.WriteLine($"{request.RemoteEndPoint} denied, server full"); return; } @@ -72,16 +72,16 @@ public class Server { peer.Send(writer, deliveryMethod); } } - public static void SendPacket(T packet, uint pid, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() { - SendPacket(packet, players[pid].peer, deliveryMethod); + public static void SendPacket(T packet, int pid, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() { + SendPacket(packet, Players[pid].peer, deliveryMethod); } public static void SendPacketToAll(T packet, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() { - foreach (var player in players.Values){ + foreach (var player in Players.Values){ SendPacket(packet, player.peer, deliveryMethod); } } - public static void SendUpdate(GameEvent[] gevents, uint pid) { + public static void SendUpdate(GameEvent[] gevents, int pid) { // SendPacket(new UpdatePlayerPacket{eventQueue = new EventQueue{Events = events}}, pid); SendPacket(new UpdatePlayerPacket{events = gevents}, pid); @@ -97,18 +97,19 @@ public class Server { public static void OnJoinReceived(JoinPacket packet, NetPeer peer) { Console.WriteLine($"Received join from {packet.username} (pid: {(uint)peer.Id})"); - ServerPlayer newPlayer = (players[(uint)peer.Id] = new ServerPlayer { + ServerPlayer newPlayer = (Players[peer.Id] = new ServerPlayer { peer = peer, state = new PlayerState { - pid = (uint)peer.Id, - camera = 0 + pid = peer.Id, + camera = 0, + doorStates = [false, false, false] }, username = packet.username }); SendPacket(new JoinAcceptPacket { state = newPlayer.state }, peer); - if (players.Count == 1){ + if (Players.Count == 1){ P1 = newPlayer; } else{ @@ -122,27 +123,29 @@ public class Server { public static void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) { if (peer.Tag != null) { - players.Remove((uint)peer.Id); + Players.Remove(peer.Id); } } public static void OnCommandReceived(PlayerCommandPacket packet, NetPeer peer) { - PlayerCommand[] commands = packet.commands; + CommandProcessor.Evaluate(packet.commands, peer.Id); + + // PlayerCommand[] commands = packet.commands; - foreach (var playerCommand in commands){ - switch (playerCommand.ID){ - case 0: - Console.WriteLine($"C: Player {peer.Id} switched to camera {playerCommand.Args[0]}"); - SendUpdateToAll([GameEvent.SWITCH_CAM(peer.Id, playerCommand.Args[0])]); - break; - case 1: - bool newState = !players[(uint)peer.Id].state.monitorUp; - players[(uint)peer.Id].state.monitorUp = newState; - Console.WriteLine($"C: Player {peer.Id} toggled camera {(newState ? "on" : "off")}"); - SendUpdateToAll([GameEvent.TOGGLE_MONITOR(peer.Id, newState)]); - break; - } - } + // foreach (var playerCommand in commands){ + // switch (playerCommand.ID){ + // case 0: + // Console.WriteLine($"C: Player {peer.Id} switched to camera {playerCommand.Args[0]}"); + // SendUpdateToAll([GameEvent.SWITCH_CAM(peer.Id, playerCommand.Args[0])]); + // break; + // case 1: + // bool newState = !Players[(uint)peer.Id].state.monitorUp; + // Players[(uint)peer.Id].state.monitorUp = newState; + // Console.WriteLine($"C: Player {peer.Id} toggled camera {(newState ? "on" : "off")}"); + // SendUpdateToAll([GameEvent.TOGGLE_MONITOR(peer.Id, newState)]); + // break; + // } + // } } public static void Update() { diff --git a/PacketLib/GameEvent.cs b/PacketLib/GameEvent.cs index 615894d..55340c9 100644 --- a/PacketLib/GameEvent.cs +++ b/PacketLib/GameEvent.cs @@ -9,6 +9,9 @@ public struct GameEvent : INetSerializable{ public static GameEvent PLAYER_LEAVE(int pid) => new(){ID = 1, Args = [pid] }; public static GameEvent SWITCH_CAM(int pid, int camId) => new(){ID = 2, Args = [pid, camId] }; public static GameEvent TOGGLE_MONITOR(int pid, bool state) => new(){ID = 3, Args = [pid, state ? 1 : 0]}; + public static GameEvent TOGGLE_DOOR_OFFICE(int pid, int doorId, bool state) => new(){ID = 4, Args = [pid, doorId, state ? 1 : 0]}; + + public static GameEvent ENEMY_MOVEMENT(int enemyId, int camId) => new(){ID = -1, Args = [enemyId, camId]}; diff --git a/PacketLib/PlayerCommand.cs b/PacketLib/PlayerCommand.cs index a800f4f..835c051 100644 --- a/PacketLib/PlayerCommand.cs +++ b/PacketLib/PlayerCommand.cs @@ -5,7 +5,7 @@ namespace PacketLib; public struct PlayerCommand : INetSerializable { public static PlayerCommand SWITCH_CAM(int camId) => new(){ID = 0, Args = [camId] }; public static PlayerCommand TOGGLE_MONITOR() => new(){ID = 1, Args = []}; - + public static PlayerCommand TOGGLE_DOOR_OFFICE(int doorId) => new(){ID = 2, Args = [doorId]}; public int ID{ get; set; } public bool Hideable => ID < 0; public int[] Args{ get; private set; } diff --git a/PacketLib/PlayerState.cs b/PacketLib/PlayerState.cs index f8485d8..be66414 100644 --- a/PacketLib/PlayerState.cs +++ b/PacketLib/PlayerState.cs @@ -4,20 +4,25 @@ using LiteNetLib.Utils; namespace PacketLib; public struct PlayerState : INetSerializable { - public uint pid; + public int pid; public int camera; public bool monitorUp; + public bool[] doorStates; + + public void Serialize(NetDataWriter writer) { writer.Put(pid); writer.Put(camera); writer.Put(monitorUp); + writer.PutArray(doorStates); } public void Deserialize(NetDataReader reader) { - pid = reader.GetUInt(); + pid = reader.GetInt(); camera = reader.GetInt(); monitorUp = reader.GetBool(); + doorStates = reader.GetBoolArray(); } }