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;
|
||||
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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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)]);
|
||||
}
|
||||
}
|
||||
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 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() {
|
||||
|
|
|
|||
|
|
@ -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]};
|
||||
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue