PDA

Просмотр полной версии : [Include] multiple groups for y_command



Пельмень
05.01.2017, 22:52
Введение
Этот Include доработка того, что хотел реализовать Y_Less в своих командах, а именно при объявлении самой команды указывать какая группа (созданная с помощью y_groups) сможет использовать эту команду.
В одной псевдо-библиотеке под названием QWERTYUIOP (http://ysi.wikia.com/wiki/Library:QWERTYUIOP) начата реализация этой возможности, однако по дефолту такая команда не может быть глобальной, и эту команду сможет использовать только одна группа.
Я просто доработал этот момент довольно банальным способом.

Использование

#include <не знаю как вы его назовете>

//Создание глобальной команды, доступной для всех игроков
_@Y<>:command(playerid, params[], help)
{
#pragma unused params, help
SendClientMessage (playerid, 0xFFFFFF, "Приветик");
return 1;
}

//Создание команды, доступной ОДНОЙ определенной группе
_@Y<admins>:command(playerid, params[], help) //Где admins это название группы (НЕ ПЕРЕМЕННОЙ СОДЕРЖАЩЕЙ ГРУППУ, А ИМЕННО НАЗВАНИЕ)
{
#pragma unused params, help
SendClientMessage (playerid, 0xFFFFFF, "Приветик");
return 1;
}

//Создание команды, доступной НЕСКОЛЬКИМ группам
_@Y<admins|helpers>:command(playerid, params[], help) // Где | это делиметр между группами
{
#pragma unused params, help
SendClientMessage (playerid, 0xFFFFFF, "Приветик");
return 1;
}

Настройка
Возможно изменить делиметр, которым вы будете отделять названия групп в команде
Изначально имеет | для разделения названий групп

#define GROUP_DELIMETR "|"
И также возможно изменить максимальное количество групп, которые вы указываете в команде
Изначально имеет 5 допустимых групп для каждой команды

#define MAX_CMD_GROUPS 5
Также, чтобы не было различных вопросов, объясню кое что
В y_groups максимальное количество созданных групп это 127
Максимальное название для группы это 24 символа, поэтому не стоит задавать вопрос, откуда в коде взялось число 24 для названия группы

Требования
sscanf2
y_groups & y_commands

Исходный код

#define GROUP_DELIMETR "|"
#define MAX_CMD_GROUPS 5

#if !defined sscanf
#error U need sscanf for that $hitttt
#endif

#if !defined _INC_y_groups
#error U need use y_groups for that $hitttt
#endif

#if !defined _INC_y_commands
#error U need use y_commands for that $hitttt
#endif

// YCMD. Either:
//
// _@Y<group>:cmd(playerid, params[], help)
//
// Or:
//
// _@Y:cmd(playerid, params[], help)
//
#define _@Y%9:%0(%1) forward QWERTY@Y0:@yQ_%0();QWERTY@Y1:@yQ_%0(){return QWERTY@Y(#%0,#%9);}RC:%0(%1)

/*----------------------------------------------------------------------------*-
| |
| And now come the support functions and macros to make the above code work. |
| |
-*----------------------------------------------------------------------------*/
// Strip any "<>" from around the group name.
#define QWERTY@Y0:%0();QWERTY@Y1:%1(){%3(#%2,#<%9>);} QWERTY@Y0:%0();QWERTY@Y0:%1(){%3(#%2,#%9);}

// Remove the group set function if there is no group set (leave the forward).
#define QWERTY@Y1:%1(){%3(#%2,#%9);}

stock QWERTY@Y0:QWERTY@Y(cmd[], group[])
{
//printf("QWERTY@Y called: %s %s", cmd, group);
new id = Command_GetID(cmd);

if (!isnull(group))
{
new _@dP = strfind (group, GROUP_DELIMETR, true);
new Group:_@gI = INVALID_GROUP;
if (_@dP == -1)
{
if (!(Group_IsValid (_@gI = Group_GetID(group))))
{
printf ("!!Error: invalid group(%s) from command %s[%i]...", group, cmd, id);
return QWERTY@Y0:1;
}
Group_SetCommand (_@gI, id, true);
return QWERTY@Y0:1;
}
if (group[_@dP + 1] == EOS)
{
printf ("!Warning: incorrect group name(%s) from command %s[%i]. renamed.", group, cmd, id);
group[_@dP] = EOS;
if (!(Group_IsValid (_@gI = Group_GetID(group))))
{
printf ("!!Error: invalid group(%s) from command %s[%i].", group, cmd, id);
return QWERTY@Y0:1;
}
Group_SetCommand (_@gI, id, true);
return QWERTY@Y0:1;
}
static _@DGN[MAX_CMD_GROUPS][24];
sscanf (group, "p<"GROUP_DELIMETR">a<s[24]>["#MAX_CMD_GROUPS"]", _@DGN);
for (new _@it = 0; _@it < MAX_CMD_GROUPS; _@it++)
{
if (!_@DGN[_@it][0])
break;

if (!(Group_IsValid (_@gI = Group_GetID(_@DGN[_@it]))))
{
printf ("!!Error: invalid group(%s) from command %s[%i]...", _@DGN[_@it], cmd, id);
return QWERTY@Y0:1;
}
Group_SetCommand (_@gI, id, true);
}
}
else
{
Group_SetGlobalCommand(id, true);
}
return QWERTY@Y0:1;
}

stock QWERTY_TouchGroupCommands()
{
new
idx,
buffer;
while ((idx = AMX_GetPublicPointerPrefix(idx, buffer, _A<@yQ_>)))
{
#emit PUSH.C 0
#emit LCTRL 6
#emit ADD.C 28
#emit PUSH.pri
#emit LOAD.S.pri buffer
#emit SCTRL 6
}
}

/*----------------------------------------------------------------------------*\
Code VERY internal to y_groups!
\*----------------------------------------------------------------------------*/

static stock
bool:QWERTY_gInit = false;

public OnFilterScriptInit()
{
if (!QWERTY_gInit)
{
CallLocalFunction("QWERTY_OnFilterScriptInit", "");
QWERTY_TouchGroupCommands();
QWERTY_gInit = true;
}
return QWERTY_gInit;
}
#if defined _ALS_OnFilterScriptInit
#undef OnFilterScriptInit
#else
#define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit QWERTY_OnFilterScriptInit
forward QWERTY_OnFilterScriptInit();

public OnGameModeInit()
{
if (!QWERTY_gInit)
{
CallLocalFunction("QWERTY_OnGameModeInit", "");
QWERTY_TouchGroupCommands();
QWERTY_gInit = true;
}
return QWERTY_gInit;
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit QWERTY_OnGameModeInit
forward QWERTY_OnGameModeInit();

// Hook group initialisation so we know when a new group that might own a
// command is created. Of course, make sure this comes last always, so that we
// know the command groups have been initialised. TODO: This.

Авторы
Изначально самой библиотеки QWERTYUIOP - Y_Less
Доработал - Пельмень

VVWVV
05.01.2017, 23:39
Работа хорошая.

Однако в этом уже нет смысла, ведь есть библиотека SmartCMD (http://forum.sa-mp.com/showthread.php?p=3786819), которая более функциональнее, а также имеет почти такой же синтаксис. Кроме того, нет зависимости от других библиотек, что делает библиотеку более лучше.

Пельмень
05.01.2017, 23:45
Работа хорошая.

Однако в этом уже нет смысла, ведь есть библиотека SmartCMD (http://forum.sa-mp.com/showthread.php?p=3786819), которая более функциональнее, а также имеет почти такой же синтаксис. Кроме того, нет зависимости от других библиотек, что делает библиотеку более лучше.

Конечно, но если использовать YSI в общем, а не парочку инклюдов из него, тогда в этом будет смысл) Хотя в России никто не использует даже y_commands, что уже говорить про остальное...

VVWVV
05.01.2017, 23:50
Конечно, но если использовать YSI в общем, а не парочку инклюдов из него, тогда в этом будет смысл) Хотя в России никто не использует даже y_commands, что уже говорить про остальное...

Да. Однако это имеет место быть и тут. Кстати, лучше бы опубликовал это на официальном форуме.

vovandolg
06.01.2017, 00:44
походу с JIT плагином будут проблемы у такого кмд движка, не так ли?

Пельмень
06.01.2017, 00:47
походу с JIT плагином будут проблемы у такого кмд движка, не так ли?

Это не командный движок, это если можно так назвать "дополнение" для работы с y_cmd и y_groups, про JIT ничего не скажу, просто попробуй запустить мод с YSI вместе с JIT

vovandolg
06.01.2017, 00:52
Я YSI не юзаю только потому что там рекурсия, тем более что вполне хватает оптимизации или удобного функционала который сейчас пишут на плагинах.

VVWVV
06.01.2017, 01:15
походу с JIT плагином будут проблемы у такого кмд движка, не так ли?

Да, вы действительно правы. Проблема происходит из-за динамического вызова (хака), который несовместим с плагином. Однако не так давно Y_less рапортовал (https://github.com/Zeex/samp-plugin-jit/issues/51) об этом в баг-трекере плагина. Более того, он исправил (https://github.com/Zeex/samp-plugin-jit/pull/52) данную проблему.

В библиотеке YSI данная проблема уже исправлена (https://github.com/Misiur/YSI-Includes/issues/141).