Lite версия CommandSystem
Полную версию данной системы, а также описание и примеры ее использования вы можете найти здесь
Для чего нужна lite версия
Если разработчику не нужен полный функционал системы команд, то ему будет выгоднее использовать облегченную версию с базовыми возможностями управления командами.
Для облегченной версии соблюдаются все правила, что и для полной, поэтому перед использованием прочитайте статью о полной версии.
Код cJass (с комментариями)
#include "cj_types.j"

/* === Система игровых команд ===
        ~ Автор: DDarkSniper
        ~ Дата: 8.05.2013
        ~ Дополнение: 3.01.2014
   Описание:
        Система игровых команд позволяет с удобством управлять 
        вводимыми с клавиатуры командами 
*/
    
library CommandSystem initializer init {

    define {
        CheckString(s) = (s != null and s != "")
    
        MaxParamCount   = 5    // макс. кол-во параметров для одной команды
        MaxCommandCount = 100  // макс. кол-во команд, хранимых в словаре системы
        MinInputLength  = 3    // мин. длина сообщения, в котором может содержаться команда (+1 для добавляемого пробела)

        CommandException    = "Wrong command."
        CommandPrefix       = "-"  // префикс команды (знак ее начала)   
        
        ShowListeningMessage = true
        
        ListeningEnabled   = "Now you can type commands in your chat window"
        ListeningDisabled  = "You can not type any chat commands anymore"
        
        CommandKey = StringHash("Commands") // Ключ хранения обработчиков в хеш-таблице
    }

    // ==== свойства ====
    public string Command;                  // название команды, обрабатываемой в данный момент
    public player Source;                   // источник (игрок, вызывавший команду)
        
    public bool   HasParams;                // были ли при вызове команды указаны параметры 
    public int    ParamCount;               // кол-во указанных параметров (0, если нет)

    public string Params[MaxParamCount];    // параметры вызова команды (отделяются пробелами)    
    
    // === доп.свйоства ===
    public force   RegistredPlayers;        // игроки, которые могут вводить команды
    public trigger CommandDetector;         // триггер, отвечающий на команды (возможно переопределение)
    public int     CommandCount;            // кол-во зарегистрированных команд в системе
    
    // === поля (внутренние переменные) ===
    private hashtable database;
    private string command;
    
    // ==== методы ====
    // определение вывода сообщения игроку (можно переопределить для создания эффектов)
    private void DisplayMessage(player p, string text) {
        DisplayTextToPlayer(p, 0, 0, text);
    }
    
    /* [GetCommand] returns string
       | Описание: возвращает обработчик команды по ее имени
       | Параметры:
       |     ~ name [string] - имя команды (без префикса)
       | Пример вызова:
       |    string hide = CommandSystem_GetCommand("hide");
    */
    public string GetCommand(string name) {
        if (CheckString(name) and database != null) {
            return LoadStr(database, CommandKey, StringHash(name));
        } return null;
    }
    
    /* [ContainsCommand] returns boolean
       | Описание: показыавет, содержится ли команда с указанным именем в системе
       | Параметры:
       |     ~ name [string] - имя команды (без префикса)
       | Пример вызова:
       |    if (CommandSystem_ContainsCommand("shot")) { ... }
    */
    public bool HasCommand(string name) {
        return CheckString(GetCommand(name));
    }
        
    /* [RegisterCommand] returns nothing
       | Описание: регистрирует команду в системе
       | Параметры:
       |     ~ name [string] - имя команды (без префикса)
       |     ~ handler [string] - название функции обработки команды 
       | Пример вызова:
       |    CommandSystem_RegisterCommand("jump", "JumpHandler");
    */
    public void RegisterCommand(string name, string handler) {
        // строки должны быть значимыми
        if (CheckString(name) or CheckString(handler)) { 
            if (not HasCommand(name)) { 
                SaveStr(database, CommandKey, StringHash(name), handler);
                CommandCount++; 
            }
        }
    }
    
    /* [RemoveCommand] returns nothing
       | Описание: удаляет указанную команду из системы
       | Параметры:
       |     ~ name [string] - имя команды (без префикса)
       | Пример вызова:
       |    CommandSystem_RemoveCommand("useless");
    */
    public void RemoveCommand(string name) {
        if (HasCommand(name)) {
            SaveStr(database, CommandKey, StringHash(name), null);
            CommandCount--;
        }
    }
    
    /* [ExecuteCommand] returns nothing
       | Описание: запускает указанную команду (при выполнении ее требований)
       | Параметры:
       |     ~ name [string] - имя команды для запуска
       |     ~ source [player] - игрок, вызвавший команду
       | Пример вызова:
       |    CommandSystem_ExecuteCommand("run", Player(2));
    */
    public void ExecuteCommand(string name, player source) {
        command = GetCommand(name);
        if (CheckString(command)) {
            ExecuteFunc(command);
        } else {
            DisplayMessage(source, CommandException);
        }
    }
    
    /* [SetListeningTo] returns nothing
       | Описание: устанавливает состояние наблюдения за сообщениями игрока
       | Параметры:
       |     ~ p [player] - игрок, вызвавший команду
       |     ~ enabled [boolean] - true для включения, false для отключения
       | Пример вызова:
       |    CommandSystem_SetListeningTo(Player(5), true);
    */
    public void SetListeningTo(player p, bool enabled) {
        if (p != null and GetPlayerId(p) < 12) { 
            if (enabled and not IsPlayerInForce(p, RegistredPlayers)) {
                ForceAddPlayer(RegistredPlayers, p);
                TriggerRegisterPlayerChatEvent(CommandDetector, p, CommandPrefix, false);
                
                if (ShowListeningMessage) { DisplayMessage(p, ListeningEnabled); }
            }
            if (not enabled and IsPlayerInForce(p, RegistredPlayers)) {
                ForceRemovePlayer(RegistredPlayers, p);
            
                if (ShowListeningMessage) { DisplayMessage(p, ListeningDisabled); }
            }
        }
    }
    
    
    private void ProcessMessage() {
        if (not IsPlayerInForce(GetTriggerPlayer(), RegistredPlayers)) { return; }
        // пробел добавляется для корректного отделения параметров
        string input = GetEventPlayerChatString() + " ";
        int length = StringLength(input);
    
        if (length < MinInputLength) { return; }
        // проверка на префикс
        if (SubString(input, 0, StringLength(CommandPrefix)) == CommandPrefix) {
            set Source = GetTriggerPlayer();
            set ParamCount = 0;
            bool found = false; // была ли команда отделена от параметров
            int pos = 1; int whitespace = 0; 
            
            loop { exitwhen (pos==length) or (ParamCount==MaxParamCount);
                // поиск пробелов
                if (SubString(input, pos, pos+1) == " ") {
                    if (whitespace != (pos-1)) {
                        if (found) {
                            Params[ParamCount] = SubString(input, whitespace + 1, pos);
                            ParamCount++;
                        } else {
                            Command = SubString(input, 1, pos); 
                            found   = true;
                        }
                    }
                    whitespace = pos;
                } pos++;
            }
            // если за этот проход не удалось отделить команду, то выделяем все символы, кроме последнего пробела
            if (!found) { Command = SubString(input, 1, length-1); }
            if (ParamCount > 0) { HasParams = true; } else { HasParams = false; }
            
            ExecuteCommand(Command, Source);
            
            Source = null; Command = null;
        }
    }
   
    private void init() {
        set database = InitHashtable();
        set CommandCount = 0;
        
        set CommandDetector = CreateTrigger();
        int index = 0;
        TriggerAddAction(CommandDetector, function ProcessMessage);
        // если требуется обработка команд только от определенных игроков, то 
        // замените следующий участок кода на свой
        RegistredPlayers = bj_FORCE_ALL_PLAYERS;
        // Пример:
        // RegistredPlayers = CreateForce();
        // ForceAddPlayer(RegistredPlayers, Player(0));
        // ForceAddPlayer(RegistredPlayers, Player(1));
        // ForceAddPlayer(RegistredPlayers, Player(2));
        ForForce(RegistredPlayers, lambda void function() {
            TriggerRegisterPlayerChatEvent(CommandDetector, GetEnumPlayer(), CommandPrefix, false);
        });
    }
    
    // очистка используемых ресурсов 
    public void Dispose() {
        FlushParentHashtable(database);
        
        DestroyTrigger(CommandDetector);
        DestroyForce(RegistredPlayers);
        
        database = null; CommandDetector = null; RegistredPlayers = null;
    }
}
Код cJass (без комментариев)
#include "cj_types.j"

/* === Система игровых команд ===
        ~ Автор: DDarkSniper
        ~ Дата: 8.05.2013
        ~ Дополнение: 3.01.2014
   Описание:
        Система игровых команд позволяет с удобством управлять 
        вводимыми с клавиатуры командами 
*/
    
library CommandSystem initializer init {

    define {
        CheckString(s) = (s != null and s != "")
    
        MaxParamCount   = 5    // макс. кол-во параметров для одной команды
        MaxCommandCount = 100  // макс. кол-во команд, хранимых в словаре системы
        MinInputLength  = 3    // мин. длина сообщения, в котором может содержаться команда (+1 для добавляемого пробела)

        CommandException    = "Wrong command."
        CommandPrefix       = "-"  // префикс команды (знак ее начала)   
        
        ShowListeningMessage = true
        
        ListeningEnabled   = "Now you can type commands in your chat window"
        ListeningDisabled  = "You can not type any chat commands anymore"
        
        CommandKey = StringHash("Commands") // Ключ хранения обработчиков в хеш-таблице
    }

    // ==== свойства ====
    public string Command;                  // название команды, обрабатываемой в данный момент
    public player Source;                   // источник (игрок, вызывавший команду)
        
    public bool   HasParams;                // были ли при вызове команды указаны параметры 
    public int    ParamCount;               // кол-во указанных параметров (0, если нет)

    public string Params[MaxParamCount];    // параметры вызова команды (отделяются пробелами)    
    
    // === доп.свйоства ===
    public force   RegistredPlayers;        // игроки, которые могут вводить команды
    public trigger CommandDetector;         // триггер, отвечающий на команды (возможно переопределение)
    public int     CommandCount;            // кол-во зарегистрированных команд в системе
    
    // === поля (внутренние переменные) ===
    private hashtable database;
    private string command;
    
    // ==== методы ====
    // определение вывода сообщения игроку (можно переопределить для создания эффектов)
    private void DisplayMessage(player p, string text) {
        DisplayTextToPlayer(p, 0, 0, text);
    }
    
    public string GetCommand(string name) {
        if (CheckString(name) and database != null) {
            return LoadStr(database, CommandKey, StringHash(name));
        } return null;
    }
    
    public bool HasCommand(string name) {
        return CheckString(GetCommand(name));
    }
        
    public void RegisterCommand(string name, string handler) {
        // строки должны быть значимыми
        if (CheckString(name) or CheckString(handler)) { 
            if (not HasCommand(name)) { 
                SaveStr(database, CommandKey, StringHash(name), handler);
                CommandCount++; 
            }
        }
    }
    
    public void RemoveCommand(string name) {
        if (HasCommand(name)) {
            SaveStr(database, CommandKey, StringHash(name), null);
            CommandCount--;
        }
    }
    
    public void ExecuteCommand(string name, player source) {
        command = GetCommand(name);
        if (CheckString(command)) {
            ExecuteFunc(command);
        } else {
            DisplayMessage(source, CommandException);
        }
    }
    
    public void SetListeningTo(player p, bool enabled) {
        if (p != null and GetPlayerId(p) < 12) { 
            if (enabled and not IsPlayerInForce(p, RegistredPlayers)) {
                ForceAddPlayer(RegistredPlayers, p);
                TriggerRegisterPlayerChatEvent(CommandDetector, p, CommandPrefix, false);
                
                if (ShowListeningMessage) { DisplayMessage(p, ListeningEnabled); }
            }
            if (not enabled and IsPlayerInForce(p, RegistredPlayers)) {
                ForceRemovePlayer(RegistredPlayers, p);
            
                if (ShowListeningMessage) { DisplayMessage(p, ListeningDisabled); }
            }
        }
    }
    
    private void ProcessMessage() {
        if (not IsPlayerInForce(GetTriggerPlayer(), RegistredPlayers)) { return; }
        // пробел добавляется для корректного отделения параметров
        string input = GetEventPlayerChatString() + " ";
        int length = StringLength(input);
    
        if (length < MinInputLength) { return; }
        // проверка на префикс
        if (SubString(input, 0, StringLength(CommandPrefix)) == CommandPrefix) {
            set Source = GetTriggerPlayer();
            set ParamCount = 0;
            bool found = false; // была ли команда отделена от параметров
            int pos = 1; int whitespace = 0; 
            
            loop { exitwhen (pos==length) or (ParamCount==MaxParamCount);
                // поиск пробелов
                if (SubString(input, pos, pos+1) == " ") {
                    if (whitespace != (pos-1)) {
                        if (found) {
                            Params[ParamCount] = SubString(input, whitespace + 1, pos);
                            ParamCount++;
                        } else {
                            Command = SubString(input, 1, pos); 
                            found   = true;
                        }
                    }
                    whitespace = pos;
                } pos++;
            }
            // если за этот проход не удалось отделить команду, то выделяем все символы, кроме последнего пробела
            if (!found) { Command = SubString(input, 1, length-1); }
            if (ParamCount > 0) { HasParams = true; } else { HasParams = false; }
            
            ExecuteCommand(Command, Source);
            
            Source = null; Command = null;
        }
    }
   
    private void init() {
        set database = InitHashtable();
        set CommandCount = 0;
        
        set CommandDetector = CreateTrigger();
        int index = 0;
        TriggerAddAction(CommandDetector, function ProcessMessage);
        // если требуется обработка команд только от определенных игроков, то 
        // замените следующий участок кода на свой
        RegistredPlayers = bj_FORCE_ALL_PLAYERS;
        // Пример:
        // RegistredPlayers = CreateForce();
        // ForceAddPlayer(RegistredPlayers, Player(0));
        // ForceAddPlayer(RegistredPlayers, Player(1));
        // ForceAddPlayer(RegistredPlayers, Player(2));
        ForForce(RegistredPlayers, lambda void function() {
            TriggerRegisterPlayerChatEvent(CommandDetector, GetEnumPlayer(), CommandPrefix, false);
        });
    }
    
    // очистка используемых ресурсов 
    public void Dispose() {
        FlushParentHashtable(database);
        
        DestroyTrigger(CommandDetector);
        DestroyForce(RegistredPlayers);
        
        database = null; CommandDetector = null; RegistredPlayers = null;
    }
}
Почему не публикуется
Это ответвление от основной линии. Я не хотел бы, чтобы обе ветви были показаны в списке ресурсов, поэтому не заявлял этот пост на публикацию. На него есть ссылка в основной теме - поэтому каждый, кому будет нужна облегченная версия все равно сможет найти ее через список опубликованных ресурсов
Просьба: пожалуйста, здесь оставляйте комментарии только по lite версии.
`
ОЖИДАНИЕ РЕКЛАМЫ...