Přidaný command a event pro otevírání a zavírání dveří

This commit is contained in:
Perry 2026-01-25 11:16:54 +01:00
parent b968b12090
commit 952aae10de
7 changed files with 87 additions and 30 deletions

View file

@ -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();

View file

@ -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)]);
}
}

View file

@ -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;
}
}
}
}

View file

@ -11,6 +11,7 @@ namespace FNAF_Server;
public class Server {
public static ServerPlayer P1;
public static ServerPlayer P2;
public static readonly Dictionary<int, ServerPlayer> 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<uint, ServerPlayer> 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>(T packet, uint pid, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() {
SendPacket(packet, players[pid].peer, deliveryMethod);
public static void SendPacket<T>(T packet, int pid, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() {
SendPacket(packet, Players[pid].peer, deliveryMethod);
}
public static void SendPacketToAll<T>(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);
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;
}
}
// 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;
// }
// }
}
public static void Update() {

View file

@ -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]};

View file

@ -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; }

View file

@ -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();
}
}