using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Svelto.ECS; using GamecraftModdingAPI.Utility; namespace GamecraftModdingAPI.Commands { /// /// A simple implementation of ICustomCommandEngine sufficient for most commands. /// This version is for commands which take 3 argument(s) /// public class SimpleCustomCommandEngine : ICustomCommandEngine { public string Name { get; } public string Description { get; } private Action runCommand; public EntitiesDB entitiesDB { set; private get; } public bool isRemovable => true; public void Dispose() { GamecraftModdingAPI.Utility.Logging.MetaDebugLog($"Unregistering SimpleCustomCommandEngine {this.Name}"); CommandRegistrationHelper.Unregister(this.Name); } public void Ready() { GamecraftModdingAPI.Utility.Logging.MetaDebugLog($"Registering SimpleCustomCommandEngine {this.Name}"); CommandRegistrationHelper.Register(this.Name, this.InvokeCatchError, this.Description); } /// /// Construct the engine /// /// The command's operation /// The name of the command /// The command's description, shown in command help messages public SimpleCustomCommandEngine(Action command, string name, string description) { this.runCommand = command; this.Name = name; this.Description = description; } public void Invoke(A a, B b, C c) { runCommand(a, b, c); } private void InvokeCatchError(A a, B b, C c) { try { runCommand(a, b, c); } catch (Exception e) { CommandRuntimeException wrappedException = new CommandRuntimeException($"Command {Name} threw an exception when executed", e); Logging.LogWarning(wrappedException.ToString()); Logging.CommandLogError(wrappedException.ToString()); } } } }