using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine.Events; using SiegeSong; namespace SiegeSong { public class CommandConsole : MonoBehaviour { public InstanceManager InstanceManager; public RuntimeManager RuntimeManager; public GameObject ConsoleWrapper; public Text ConsoleText; public string ConsoleInput; public bool CommandConsoleOpen; private int MaxConsoleLines = 10; private string UpArrowKey = "up"; private string EnterKey = "return"; private string BackspaceKey = "backspace"; private string SpaceKey = "space"; private string consoleViableKeys = "abcdefghijklmnopqrstuvwxyz.0987654321"; private string subWordDelimiter = "."; private string wordDelimiter = " "; private bool oldSpaceKeyState; string[] commandWords = { "kill", "drive", "resurrect", "spawn", "respawn", "despawn", "setplayer", "tgm", }; public string[] consoleLines; void Start() { consoleLines = new string[MaxConsoleLines]; } void Update() { if (CommandConsoleOpen) { ConsoleWrapper.active = true; for (var i = 0; i < consoleViableKeys.Length; i++) if (Input.GetKeyDown(consoleViableKeys[i].ToString())) ConsoleInput += consoleViableKeys[i]; else if (Input.GetKeyDown(SpaceKey) && !oldSpaceKeyState) ConsoleInput = ConsoleInput.TrimEnd() + " "; oldSpaceKeyState = Input.GetKeyDown(SpaceKey); if (Input.GetKeyDown(UpArrowKey)) ConsoleInput = consoleLines[consoleLines.Length - 1]; RaycastHit hit; if (Input.GetMouseButtonDown(0)) if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 25) && hit.transform.gameObject.GetComponent() != null) ConsoleInput += hit.transform.gameObject.GetComponent().InstanceID; if (Input.GetKeyDown(EnterKey)) SubmitCurrentInput(); if (Input.GetKeyDown(BackspaceKey)) ConsoleInput = ConsoleInput.Substring(0, ConsoleInput.Length - 1); var consoleLinesText = ""; for (var i = consoleLines.Length - 1; i >= 0; i--) if (i < MaxConsoleLines) consoleLinesText += $"{consoleLines[i]}\n"; ConsoleText.text = $"{ConsoleInput}\n{consoleLinesText}"; } else { ConsoleWrapper.active = false; } } void SubmitCurrentInput() { var targetInstanceId = ""; var targeted = false; var validCommand = false; if (ConsoleInput.IndexOf(subWordDelimiter) != -1 && (ConsoleInput.IndexOf(subWordDelimiter) < ConsoleInput.IndexOf(wordDelimiter) || ConsoleInput.IndexOf(wordDelimiter) == -1)) { targetInstanceId = ConsoleInput.Split(wordDelimiter)[0].Split(subWordDelimiter)[0]; targeted = true; } var words = ConsoleInput.Split(wordDelimiter); var instanceCount = 1; var commandWord = targeted ? words[0].Substring(words[0].IndexOf(".") + 1) : words[0]; if (words.Length > 1) { if (!targeted) { targetInstanceId = words[1].ToLower(); if (words.Length == 3 && int.TryParse(words[2], out instanceCount)) instanceCount = int.Parse(words[2]); } else { if (words.Length == 2 && int.TryParse(words[1], out instanceCount)) instanceCount = int.Parse(words[1]); } } var parameter = ""; if (words.Length == 2) parameter = words[1]; else if (words.Length == 3) parameter = words[2]; foreach (var command in commandWords) { if (commandWord.ToLower() == command) { switch (commandWord) { case "kill": KillActor(targetInstanceId); break; case "resurrect": RessurrectActor(targetInstanceId); break; case "spawn": SpawnActor(targetInstanceId, instanceCount); break; case "despawn": DespawnActor(targetInstanceId); break; case "respawn": RespawnActor(targetInstanceId); break; case "setplayer": SetActorToPlayer(targetInstanceId); break; case "drive": DriveMotor(targetInstanceId, parameter); break; case "tgm": ToggleActorGodMode(targetInstanceId); break; } validCommand = true; } } var newConsoleLines = new string[MaxConsoleLines]; for (var i = 0; i < MaxConsoleLines - 1; i++) newConsoleLines[i] = consoleLines[i + 1]; newConsoleLines[MaxConsoleLines - 1] = validCommand ? ConsoleInput : $"ERROR - '{commandWord}' IS NOT A VALID COMMAND - ( {ConsoleInput} )"; ConsoleInput = ""; consoleLines = newConsoleLines; } void KillActor(string instaceID) { var actor = InstanceManager.GetInstanceByID(instaceID).GetComponent(); actor.Stats.Alive = false; actor.Stats.Health = 0; } void RessurrectActor(string instaceID) { var actor = InstanceManager.GetInstanceByID(instaceID).GetComponent(); actor.Stats.Alive = true; actor.Stats.Health = 1; } void SpawnActor(string instaceID, int? instanceCount = 1) { var actor = InstanceManager.GetInstanceByID(instaceID).GetComponent(); //for(var i = 0; i < instanceCount; i++) // actor.ActorLoader.LoadActor(); } void RespawnActor(string instaceID) { var actor = InstanceManager.GetInstanceByID(instaceID).GetComponent(); //actor.ActorLoader.LoadActor(true); } void DespawnActor(string instaceID) { var actor = InstanceManager.GetInstanceByID(instaceID).GetComponent(); GameObject.Destroy(actor.gameObject); } void SetActorToPlayer(string instaceID) { var currentPlayerActor = InstanceManager.GetInstanceByID(InstanceManager.CurrentPlayerInstanceID); foreach (Transform childtransform in currentPlayerActor.transform) { if (childtransform.gameObject.name == "PlayerAgent") childtransform.gameObject.active = false; } var actor = InstanceManager.GetInstanceByID(instaceID); foreach (Transform childtransform in actor.transform) if (childtransform.gameObject.name == "PlayerAgent") childtransform.gameObject.active = true; RuntimeManager.PlayerInstance = actor; } void ToggleActorGodMode(string instaceID) { var actorStats = InstanceManager.GetInstanceByID(instaceID).GetComponent(); } void DriveMotor(string instaceID, string direction) { var actorMotor = InstanceManager.GetInstanceByID(instaceID).GetComponent(); switch (direction) { case "forward": actorMotor.DriveForward = !actorMotor.DriveForward; break; case "backward": actorMotor.DriveBackward = !actorMotor.DriveBackward; break; case "left": actorMotor.DriveLeft = !actorMotor.DriveLeft; break; case "rotateleft": actorMotor.DriveRotateLeft = !actorMotor.DriveRotateLeft; break; case "right": actorMotor.DriveRight = !actorMotor.DriveRight; break; case "rotateright": actorMotor.DriveRotateRight = !actorMotor.DriveRotateRight; break; } } } }