Страница 1 из 1

продолжаем писать консоль. пользовательские команды

СообщениеДобавлено: 10 ноя 2018, 15:07
DimaJoke
Кчау Изображение
Продолжаем писать консоль, лол
Сегодня:
Сделал скрипт Commands в нём указал дефолтные команды, для всех проектов.
Что бы туда больше не залезать написал скрипт UserCommands, будут полезны и для других пользователей(собираюсь поделиться с друзьями)
в скрипте UserComands у меня есть массив с командами(что бы не агрилась консоль) но он только за это и отвечает(массив)
в скрипте Commands я пытаюсь писать ф-цию, что если введённая команда не совпадает ни с одной из дефолтных, то программа пробегается по тому массиву и в случае несоответствия выдаёт Error
Синтаксис:
Используется csharp
        if(UserCommands.UC.UserAllowedComand.Length != 0)
        {
                Debug.Log("Err2");
                for(int i = 0; i < UserCommands.UC.UserAllowedComand.Length; i++)
                {
                        if(Command[0] != UserCommands.UC.UserAllowedComand[i])
                        {
                                Debug.Log("Err3");
                                CheckingErrors = CheckingErrors + 1;
                        }
                               
                }

                if(CheckingErrors == 0)
                {
                        Debug.Log("Go");
                        UserCommands.UC.Commands = Commands;
                }

                else if(CheckingErrors >= 1)
                {
                        Debug.Log("Stop");
                        GameConsole.Error("Uncorrect Command");
                }
        }

        else if(UserCommands.UC.UserAllowedComand.Length == 0)
        {
                GameConsole.Error("Uncknown Command");
        }
 

Дебаг.Логи я расставил для контролирования, на первое время.

что происходит:
Error не выдаётся только если вся строка совпадает с разрешёнными командами
(я введенную строку по пробелам разбиваю на отдельные команды)
Вот и всё, что я хотел вам поведать \0/
А теперь вопрос: что не так? Как мне сделать так, что бы Еррор выдавался только если первое слово не соответствует разрешённым?

Re: продолжаем писать консоль. пользовательские команды

СообщениеДобавлено: 10 ноя 2018, 19:10
DimaJoke
Немного переписал код
Синтаксис:
Используется csharp

        if(UserCommands.UC.UserAllowedComand.Length != 0)
        {
                for(int i = 0; i <= UserCommands.UC.UserAllowedComand.Length; ++i)
                {
                        Debug.Log(i.ToString());
                        if(Command[0] == UserCommands.UC.UserAllowedComand[i] && !End)
                        {
                                Debug.Log("OK!!!!");
                                break;
                                CheckingErrors = 0;
                                Commands = null;
                                OK = true;
                                End = true;
                        }

                        if(i == UserCommands.UC.UserAllowedComand.Length)
                        {
                                End = true;
                        }
               
                }

                if(End && !OK)
                {
                        GameConsole.Error("Uncorrect Command");
                        Commands = null;
                }
 


АХАХА
Немного
(чуть не весь день над ним сижу)
Чего я добился? ну.. если первое введённое слово = 1-ой разрешённой команде.. то работает...........
ХЕЛП!! плиз

Re: продолжаем писать консоль. пользовательские команды

СообщениеДобавлено: 10 ноя 2018, 19:30
DimaJoke
Ай ладно..
Забейте я отказался от скрипт UserCommands.. теперь всё будет добавляться в Commands

Re: продолжаем писать консоль. пользовательские команды

СообщениеДобавлено: 10 ноя 2018, 19:48
Anonymyx
Обычно делают кастомный атрибут с командой для методов которые будут привязаны к командам, к нужным методам добавляют этот атрибут с командой и через рефлексию собирают в словарь команда\метод. Когда в консоль поступает команда просто передаешь ее как ключ в словарь. Если такой команды нет - выводишь что такой нету.
Такая реализация обычно присутствует в разных дискорд или других чат-ботах. Это очень удобно, ибо написали 1 раз основу, а дальше можно клепать команды просто добавляя атрибут к методу.

Как-то так...:
Синтаксис:
Используется csharp
namespace Test_Commands
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().Start();
        }

        public void Start()
        {
            Dictionary<string, Action<string[]>> actions = new Dictionary<string, Action<string[]>>();

            MethodInfo[] methodInfos = this.GetType().GetMethods().Where(x => x.GetCustomAttribute<Command>() != null).ToArray();

            for (int i = 0; i < methodInfos.Length; i++)
                actions.Add(methodInfos[i].GetCustomAttribute<Command>().command, (Action<string[]>)Delegate.CreateDelegate(typeof(Action<string[]>), this, methodInfos[i]));

            while (true)
            {
                string[] command = Console.ReadLine().Split(' ');

                try
                {
                    actions[command[0]](command.Skip(1).ToArray());
                }
                catch (IndexOutOfRangeException)
                {
                    Console.WriteLine("Ошибка аргумента!");
                }
                catch (KeyNotFoundException)
                {
                    Console.WriteLine("Такой команды нет!");
                }
            }
        }


        [Command("test")]
        public void TestMethod1(string[] args)
        {
            Console.WriteLine(args[0]);
        }

        [Command("test2")]
        public void TestMethod2(string[] args)
        {
            Console.WriteLine("1ый аргумент {0}. 2ой аргумент {1}", args[0], args[1]);
        }
    }
}

[AttributeUsage(AttributeTargets.Method)]
public class Command : Attribute
{
    public string command;

    public Command(string command)
    {
        this.command = command;
    }
}


[Command("test")] - "test" - команда, при которой вызывается метод этого атрибута.

PS. после break ничего не выполняется дальше в теле цикла, т.е. сразу выход из цикла, так что у вас там недостижимый код.