Добавлен DDarkSniper,
не публикуется
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 версии.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Комментарии пока отсутcтвуют.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.