Přidaný command a event pro otevírání a zavírání dveří
This commit is contained in:
parent
b968b12090
commit
952aae10de
7 changed files with 87 additions and 30 deletions
|
|
@ -92,6 +92,10 @@ public class Client {
|
||||||
Player.state.monitorUp = e.Args[1] == 1;
|
Player.state.monitorUp = e.Args[1] == 1;
|
||||||
Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}");
|
Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}");
|
||||||
break;
|
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
|
case -1: // movement
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,11 @@ namespace FNAF_Clone;
|
||||||
|
|
||||||
public class CommandManager {
|
public class CommandManager {
|
||||||
private static (string label, Keys key, Action action)[] keybinds = [
|
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);
|
private static InputListenerHook toggleCamHook = new(true);
|
||||||
|
|
@ -20,4 +24,12 @@ public class CommandManager {
|
||||||
private static void ToggleCamera() {
|
private static void ToggleCamera() {
|
||||||
Client.SendCommands([PlayerCommand.TOGGLE_MONITOR()]);
|
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)]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
30
FNAF_Server/CommandProcessor.cs
Normal file
30
FNAF_Server/CommandProcessor.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -11,6 +11,7 @@ namespace FNAF_Server;
|
||||||
public class Server {
|
public class Server {
|
||||||
public static ServerPlayer P1;
|
public static ServerPlayer P1;
|
||||||
public static ServerPlayer P2;
|
public static ServerPlayer P2;
|
||||||
|
public static readonly Dictionary<int, ServerPlayer> Players = new();
|
||||||
|
|
||||||
private static EventBasedNetListener listener;
|
private static EventBasedNetListener listener;
|
||||||
private static NetManager server;
|
private static NetManager server;
|
||||||
|
|
@ -21,7 +22,6 @@ public class Server {
|
||||||
|
|
||||||
private static NetDataWriter writer;
|
private static NetDataWriter writer;
|
||||||
private static NetPacketProcessor processor;
|
private static NetPacketProcessor processor;
|
||||||
private static Dictionary<uint, ServerPlayer> players = new();
|
|
||||||
|
|
||||||
private static bool isRunning;
|
private static bool isRunning;
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@ public class Server {
|
||||||
|
|
||||||
listener.ConnectionRequestEvent += request => {
|
listener.ConnectionRequestEvent += request => {
|
||||||
Console.WriteLine($"Connection Request from {request.RemoteEndPoint}");
|
Console.WriteLine($"Connection Request from {request.RemoteEndPoint}");
|
||||||
if (players.Count >= 2){
|
if (Players.Count >= 2){
|
||||||
Console.WriteLine($"{request.RemoteEndPoint} denied, server full");
|
Console.WriteLine($"{request.RemoteEndPoint} denied, server full");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -72,16 +72,16 @@ public class Server {
|
||||||
peer.Send(writer, deliveryMethod);
|
peer.Send(writer, deliveryMethod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void SendPacket<T>(T packet, uint pid, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() {
|
public static void SendPacket<T>(T packet, int pid, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() {
|
||||||
SendPacket(packet, players[pid].peer, deliveryMethod);
|
SendPacket(packet, Players[pid].peer, deliveryMethod);
|
||||||
}
|
}
|
||||||
public static void SendPacketToAll<T>(T packet, DeliveryMethod deliveryMethod = DeliveryMethod.ReliableOrdered) where T : class, new() {
|
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);
|
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{eventQueue = new EventQueue{Events = events}}, pid);
|
||||||
SendPacket(new UpdatePlayerPacket{events = gevents}, pid);
|
SendPacket(new UpdatePlayerPacket{events = gevents}, pid);
|
||||||
|
|
||||||
|
|
@ -97,18 +97,19 @@ public class Server {
|
||||||
public static void OnJoinReceived(JoinPacket packet, NetPeer peer) {
|
public static void OnJoinReceived(JoinPacket packet, NetPeer peer) {
|
||||||
Console.WriteLine($"Received join from {packet.username} (pid: {(uint)peer.Id})");
|
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,
|
peer = peer,
|
||||||
state = new PlayerState {
|
state = new PlayerState {
|
||||||
pid = (uint)peer.Id,
|
pid = peer.Id,
|
||||||
camera = 0
|
camera = 0,
|
||||||
|
doorStates = [false, false, false]
|
||||||
},
|
},
|
||||||
username = packet.username
|
username = packet.username
|
||||||
});
|
});
|
||||||
|
|
||||||
SendPacket(new JoinAcceptPacket { state = newPlayer.state }, peer);
|
SendPacket(new JoinAcceptPacket { state = newPlayer.state }, peer);
|
||||||
|
|
||||||
if (players.Count == 1){
|
if (Players.Count == 1){
|
||||||
P1 = newPlayer;
|
P1 = newPlayer;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|
@ -122,27 +123,29 @@ public class Server {
|
||||||
|
|
||||||
public static void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) {
|
public static void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) {
|
||||||
if (peer.Tag != null) {
|
if (peer.Tag != null) {
|
||||||
players.Remove((uint)peer.Id);
|
Players.Remove(peer.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void OnCommandReceived(PlayerCommandPacket packet, NetPeer peer) {
|
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){
|
// foreach (var playerCommand in commands){
|
||||||
switch (playerCommand.ID){
|
// switch (playerCommand.ID){
|
||||||
case 0:
|
// case 0:
|
||||||
Console.WriteLine($"C: Player {peer.Id} switched to camera {playerCommand.Args[0]}");
|
// Console.WriteLine($"C: Player {peer.Id} switched to camera {playerCommand.Args[0]}");
|
||||||
SendUpdateToAll([GameEvent.SWITCH_CAM(peer.Id, playerCommand.Args[0])]);
|
// SendUpdateToAll([GameEvent.SWITCH_CAM(peer.Id, playerCommand.Args[0])]);
|
||||||
break;
|
// break;
|
||||||
case 1:
|
// case 1:
|
||||||
bool newState = !players[(uint)peer.Id].state.monitorUp;
|
// bool newState = !Players[(uint)peer.Id].state.monitorUp;
|
||||||
players[(uint)peer.Id].state.monitorUp = newState;
|
// Players[(uint)peer.Id].state.monitorUp = newState;
|
||||||
Console.WriteLine($"C: Player {peer.Id} toggled camera {(newState ? "on" : "off")}");
|
// Console.WriteLine($"C: Player {peer.Id} toggled camera {(newState ? "on" : "off")}");
|
||||||
SendUpdateToAll([GameEvent.TOGGLE_MONITOR(peer.Id, newState)]);
|
// SendUpdateToAll([GameEvent.TOGGLE_MONITOR(peer.Id, newState)]);
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Update() {
|
public static void Update() {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,9 @@ public struct GameEvent : INetSerializable{
|
||||||
public static GameEvent PLAYER_LEAVE(int pid) => new(){ID = 1, Args = [pid] };
|
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 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_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]};
|
public static GameEvent ENEMY_MOVEMENT(int enemyId, int camId) => new(){ID = -1, Args = [enemyId, camId]};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ namespace PacketLib;
|
||||||
public struct PlayerCommand : INetSerializable {
|
public struct PlayerCommand : INetSerializable {
|
||||||
public static PlayerCommand SWITCH_CAM(int camId) => new(){ID = 0, Args = [camId] };
|
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_MONITOR() => new(){ID = 1, Args = []};
|
||||||
|
public static PlayerCommand TOGGLE_DOOR_OFFICE(int doorId) => new(){ID = 2, Args = [doorId]};
|
||||||
public int ID{ get; set; }
|
public int ID{ get; set; }
|
||||||
public bool Hideable => ID < 0;
|
public bool Hideable => ID < 0;
|
||||||
public int[] Args{ get; private set; }
|
public int[] Args{ get; private set; }
|
||||||
|
|
|
||||||
|
|
@ -4,20 +4,25 @@ using LiteNetLib.Utils;
|
||||||
namespace PacketLib;
|
namespace PacketLib;
|
||||||
|
|
||||||
public struct PlayerState : INetSerializable {
|
public struct PlayerState : INetSerializable {
|
||||||
public uint pid;
|
public int pid;
|
||||||
public int camera;
|
public int camera;
|
||||||
public bool monitorUp;
|
public bool monitorUp;
|
||||||
|
|
||||||
|
public bool[] doorStates;
|
||||||
|
|
||||||
|
|
||||||
public void Serialize(NetDataWriter writer) {
|
public void Serialize(NetDataWriter writer) {
|
||||||
writer.Put(pid);
|
writer.Put(pid);
|
||||||
writer.Put(camera);
|
writer.Put(camera);
|
||||||
writer.Put(monitorUp);
|
writer.Put(monitorUp);
|
||||||
|
writer.PutArray(doorStates);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Deserialize(NetDataReader reader) {
|
public void Deserialize(NetDataReader reader) {
|
||||||
pid = reader.GetUInt();
|
pid = reader.GetInt();
|
||||||
camera = reader.GetInt();
|
camera = reader.GetInt();
|
||||||
monitorUp = reader.GetBool();
|
monitorUp = reader.GetBool();
|
||||||
|
doorStates = reader.GetBoolArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue