You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
9.3 KiB
C#

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<Statistics>() != null)
ConsoleInput += hit.transform.gameObject.GetComponent<Statistics>().ActorInstanceID;
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 targetActorInstanceId = "";
var targeted = false;
var validCommand = false;
if (ConsoleInput.IndexOf(subWordDelimiter) != -1 && (ConsoleInput.IndexOf(subWordDelimiter) < ConsoleInput.IndexOf(wordDelimiter) || ConsoleInput.IndexOf(wordDelimiter) == -1))
{
targetActorInstanceId = 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)
{
targetActorInstanceId = 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(targetActorInstanceId);
break;
case "resurrect":
RessurrectActor(targetActorInstanceId);
break;
case "spawn":
SpawnActor(targetActorInstanceId, instanceCount);
break;
case "despawn":
DespawnActor(targetActorInstanceId);
break;
case "respawn":
RespawnActor(targetActorInstanceId);
break;
case "setplayer":
SetActorToPlayer(targetActorInstanceId);
break;
case "drive":
DriveMotor(targetActorInstanceId, parameter);
break;
case "tgm":
ToggleActorGodMode(targetActorInstanceId);
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.GetActorInstanceByID(instaceID).GetComponent<StatisticsManager>();
actor.Stats.Alive = false;
actor.Stats.Health = 0;
}
void RessurrectActor(string instaceID)
{
var actor = InstanceManager.GetActorInstanceByID(instaceID).GetComponent<StatisticsManager>();
actor.Stats.Alive = true;
actor.Stats.Health = 1;
}
void SpawnActor(string instaceID, int? instanceCount = 1)
{
var actor = InstanceManager.GetActorInstanceByID(instaceID).GetComponent<StatisticsManager>();
//for(var i = 0; i < instanceCount; i++)
// actor.ActorLoader.LoadActor();
}
void RespawnActor(string instaceID)
{
var actor = InstanceManager.GetActorInstanceByID(instaceID).GetComponent<StatisticsManager>();
//actor.ActorLoader.LoadActor(true);
}
void DespawnActor(string instaceID)
{
var actor = InstanceManager.GetActorInstanceByID(instaceID).GetComponent<StatisticsManager>();
GameObject.Destroy(actor.gameObject);
}
void SetActorToPlayer(string instaceID)
{
var currentPlayerActor = InstanceManager.GetActorInstanceByID(InstanceManager.CurrentPlayerActorInstanceID);
foreach (Transform childtransform in currentPlayerActor.transform)
{
if (childtransform.gameObject.name == "PlayerAgent")
childtransform.gameObject.active = false;
}
var actor = InstanceManager.GetActorInstanceByID(instaceID);
foreach (Transform childtransform in actor.transform)
if (childtransform.gameObject.name == "PlayerAgent")
childtransform.gameObject.active = true;
RuntimeManager.PlayerActorInstance = actor;
}
void ToggleActorGodMode(string instaceID)
{
var actorStats = InstanceManager.GetActorInstanceByID(instaceID).GetComponent<Statistics>();
}
void DriveMotor(string instaceID, string direction)
{
var actorMotor = InstanceManager.GetActorInstanceByID(instaceID).GetComponent<Motor>();
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;
}
}
}
}