Пельмень
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
Доработал - Пельмень
Этот 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
Доработал - Пельмень