using System; using System.Collections.Generic; using System.Linq; using FNAF_Clone.GUI; using FNAF_Clone.Map; using GlobalClassLib; using Microsoft.Xna.Framework.Input; using MonoGameLibrary.Input; using PacketLib; namespace FNAF_Clone; public class CommandManager { private static (string label, Keys key, Action action)[] keybinds = [ ("Toggle camera", Keys.Space, SendToggleCamera), ("Toggle left door", Keys.A, ToggleDoorLeft), ("Toggle centre door", Keys.W, ToggleDoorCentre), ("Toggle right door", Keys.D, ToggleDoorRight), ("Toggle back door", Keys.S, ToggleDoorBack) ]; private static InputListenerHook toggleCamHook = new(true); public static void InitInputListeners() { Array.ForEach(keybinds, tuple => InputManager.AddListener(tuple.label, tuple.key, () => tuple.action(), InputTiming.PRESS, toggleCamHook)); } private static void SendToggleCamera() { Client.Player.state.monitorUp = !Client.Player.state.monitorUp; UIManager.ChangeMonitorState(Client.Player.state.monitorUp); Client.SendCommands([PlayerCommand.SET_MONITOR(Client.Player.state.monitorUp)]); } private static void ToggleDoorLeft() => SendToggleDoor(Direction.EAST); private static void ToggleDoorCentre() => SendToggleDoor(Direction.NORTH); private static void ToggleDoorRight() => SendToggleDoor(Direction.WEST); private static void ToggleDoorBack() => SendToggleDoor(Direction.SOUTH); private static Dictionary currentDoorBinds = new(); private static void SendToggleDoor(Direction direction) { if (Screen.CurrentScreen.Label == UIManager.ScreenTypes.CAMERAS){ SendToggleRemoteDoor(direction); return; } Client.Player.state.doorStates[(int)direction] = !Client.Player.state.doorStates[(int)direction]; UIManager.ChangeDoorState(direction, Client.Player.state.doorStates[(int)direction]); Client.SendCommands([PlayerCommand.SET_DOOR_OFFICE(direction, Client.Player.state.doorStates[(int)direction])]); } private static void SendToggleRemoteDoor(Direction direction) { if (!currentDoorBinds.TryGetValue(direction, out var val)) return; TileConnectorProjection connector = val; connector.Blocked = !connector.Blocked; Client.SendCommands([PlayerCommand.SET_DOOR_REMOTE(connector.Id, connector.Blocked)]); UIManager.ChangeRemoteDoorState(connector.Id, connector.Blocked); // Console.WriteLine("Changed door state to: " + (connector.Blocked ? "blocked" : "open") + " for door " + connector); // add UIManager toggle door } public static void SendChangeCamera(int id) { Client.Player.state.camera = id; Client.SendCommands([PlayerCommand.SWITCH_CAM(id)]); MapTileProjection tile = ClientMapManager.Get(id); // add UIManager switch camera currentDoorBinds.Clear(); foreach (var c in tile.GetAllConnectors().Where(c => c.Type == ConnectorType.DOOR_REMOTE)){ Direction dir = c.GetDirection(tile); if (dir == Direction.NONE) return; currentDoorBinds.Add(dir, c); } } }