PDA

Просмотр полной версии : [CMD] /agm Бессмертие (GM) для администратора [DC_CMD]



lexjusto
29.03.2014, 22:41
Доброго времени суток, *username*. Сейчас я покажу как создать команду на бессмертие (тобишь GM) для администратора.
Как работает команда:


Вводим /agm - мы бессмертны.
Вводим /agm ещё раз и мы снова можем умереть.


Для начала хочу предупредить, что команда написана на DC_CMD (by Daniel Cortez).

Начнем.

В любое место добавляем саму команду: (лучше добавлять ко всем командам,так будет удобнее)


CMD:agm(playerid, params[])
{
if(GetPVarInt(playerid,"AdminAuth") == 0 || PlayerAdminInfo[playerid][0] < 1) return 1; //Ваша проверка на администратора
if(GetPVarInt(playerid,"agm") == 0)
{
SetPVarInt(playerid,"agm", 1);
SetPlayerHealth(playerid, 0x7F800000);
SendClientMessage(playerid, -1, "AGM ON");
}
else
{
SetPVarInt(playerid,"agm", 0);
SetPlayerHealth(playerid, 100.0);
SendClientMessage(playerid, -1, "AGM OFF");
}
return 1;
}

Также рекомендую "задефайнить" бесконечное значение которое мы использовали для создания бессмертия.
Для этого в начало мода ко всем #DEFINE добавим:


#define INFINITY (Float:0x7F800000)

Ну и теперь можем использовать бесконечное значение там, где хотим.

Надеюсь,что помог кому-либо. (на плюсы не рассчитываю)

Nikoo007
29.03.2014, 23:40
Посмотрю)

Salvacore
30.03.2014, 06:48
Молодец.

Salvacore
27.06.2014, 14:28
Update.

Salik_Davince
01.09.2014, 02:50
зачем пвары если можно на простых переменных.

L0ndl3m
01.09.2014, 16:37
зачем пвары если можно на простых переменных.
Разницы как таковой нет, в случае с пварами не будет потребляться память, работает медленне ( не всегда ), второй вариант противоположность пварам по производительности.

Wesley
11.01.2015, 04:47
Понравилось, взял-бы себе.

BaBuIIIkaDrifteR
12.01.2015, 03:29
Не проще ?


if(strcmp(cmdtext,"/agm",true)==0)
{
if(PlayerInfo[playerid][Admin] >= 1){SetPlayerArmour(playerid, 999999); SendClientMessage(playerid, -1, "AGM ON");}
else{SetPlayerArmour(playerid, 100); SendClientMessage(playerid, -1, "AGM OFF");}
return 1;
}

Mazzilla
12.01.2015, 11:10
Не проще ?


if(strcmp(cmdtext,"/agm",true)==0)
{
if(PlayerInfo[playerid][Admin] >= 1){SetPlayerArmour(playerid, 999999); SendClientMessage(playerid, -1, "AGM ON");}
else{SetPlayerArmour(playerid, 100); SendClientMessage(playerid, -1, "AGM OFF");}
return 1;
}

Если игрок - админ, то установим много брони и напишем AGM ON, если нет, то установим 100 единиц брони и напишем AGM OFF - очень проще.

BaBuIIIkaDrifteR
12.01.2015, 23:43
Если игрок - админ, то установим много брони и напишем AGM ON, если нет, то установим 100 единиц брони и напишем AGM OFF - очень проще.
Ой Сорри ))


if(strcmp(cmdtext,"/agm",true)==0)
{
if(PlayerInfo[playerid][Admin] >= 1){SetPlayerHealth(playerid, 999999); SendClientMessage(playerid, -1, "AGM ON");}
else{SetPlayerHealth(playerid, 100); SendClientMessage(playerid, -1, "AGM OFF");}
return 1;
}

L0ndl3m
13.01.2015, 14:01
Ой Сорри ))


if(strcmp(cmdtext,"/agm",true)==0)
{
if(PlayerInfo[playerid][Admin] >= 1){SetPlayerHealth(playerid, 999999); SendClientMessage(playerid, -1, "AGM ON");}
else{SetPlayerHealth(playerid, 100); SendClientMessage(playerid, -1, "AGM OFF");}
return 1;
}

Разница с вашим предыдущим кодом?

bazz`layter
13.01.2015, 14:28
Там он выдавал броню, а тут ХП.
Ну, если смотреть со стороны автора, то возможно он учёл комментарий от "Mazilla", мол, смысл выдавать броню, если можно дать ХП, вот и изменил функции, лично мое мнение)

L0ndl3m
13.01.2015, 14:38
Одна из самых нормальный идей в первом посте. Количество строк не влияет на качество самого кода. Да и команды не будут работать, где проверка на то, что игрок уже вводил команду?

Mazzilla
13.01.2015, 15:10
Там он выдавал броню, а тут ХП.
Ну, если смотреть со стороны автора, то возможно он учёл комментарий от "Mazilla", мол, смысл выдавать броню, если можно дать ХП, вот и изменил функции, лично мое мнение)
Смысл моего комментария был совсем другим. При вводе данной команды администратором, выдаст бронь/хп и напишет ГМ ОН. При повторном вводе администратором будет то же самое, а как отключить ГМ? При каждом вводе команды обычным игроком, выдаст бронь/хп в 100 единиц и напишет ГМ ОФФ. Где логика?

kaZax
13.01.2015, 15:53
Лучше уж бессмертие с проверкой в авто ли игрок.
Если в авто то циклический восстанавливать HP авто(для защиты от взрывов).

I'm Cobra
22.01.2015, 21:37
Ой Сорри ))


if(strcmp(cmdtext,"/agm",true)==0)
{
if(PlayerInfo[playerid][Admin] >= 1){SetPlayerHealth(playerid, 999999); SendClientMessage(playerid, -1, "AGM ON");}
else{SetPlayerHealth(playerid, 100); SendClientMessage(playerid, -1, "AGM OFF");}
return 1;
}

Ничего что ХП float и пишется вот так 100.0?

L0ndl3m
22.01.2015, 21:48
Ничего что ХП float и пишется вот так 100.0?
Без разницы, число будет приниматься как float.

I'm Cobra
30.01.2015, 09:02
Я бы сделал так:


CMD:agm(playerid, params[]) {
new bool:proverka[MAX_PLAYERS char];
/*Ваша проверка на админку*/
if(proverka{playerid} == false) proverka{playerid} = true, SetPlayerHealth(playerid, 0x7F800000), SendClientMessage(playerid, -1, "AGM ON");
else proverka{playerid} = false, SetPlayerHealth(playerid, 100.0), SendClientMessage(playerid, -1, "AGM OFF");
}

Mazzilla
30.01.2015, 13:10
Я бы сделал так:


CMD:agm(playerid, params[]) {
new bool:proverka[MAX_PLAYERS char];
/*Ваша проверка на админку*/
if(proverka{playerid} == false) proverka{playerid} = true, SetPlayerHealth(playerid, 0x7F800000), SendClientMessage(playerid, -1, "AGM ON");
else proverka{playerid} = false, SetPlayerHealth(playerid, 100.0), SendClientMessage(playerid, -1, "AGM OFF");
}
proverka{playerid} всегда будет равна false при вызове команды -
new bool:proverka[MAX_PLAYERS char]; должна быть глобальной переменной тогда:

new bool:proverka[MAX_PLAYERS char];
CMD:agm(playerid, params[]) {
proverka{playerid} = !proverka{playerid};
if(proverka{playerid}) return SetPlayerHealth(playerid, 0x7F800000), SendClientMessage(playerid, -1, "AGM ON");
else return SetPlayerHealth(playerid, 100.0), SendClientMessage(playerid, -1, "AGM OFF");
}

Desulaid
13.12.2015, 16:18
А так не проще?


CMD:agm(playerid)
{
if (/* не админ и все такое */)
return 1;
if (GetPVarInt(playerid, "agm"))
{
SetPVarInt(playerid, "agm", 1);
SetPlayerHealth(playerid, 0x7F800000);
SendClientMessage(playerid, -1, "AGM ON");
return 1;
}
SetPVarInt(playerid, "agm", 0);
SetPlayerHealth(playerid, 100.0);
SendClientMessage(playerid, -1, "AGM OFF");
return 1;
}

L0ndl3m
13.12.2015, 17:25
Где второй аргумент "params" в основании команды?

Desulaid
13.12.2015, 17:39
Где второй аргумент "params" в основании команды?

Мы же никаких параметров не берем, можно и без "params"

L0ndl3m
13.12.2015, 18:33
Мы же никаких параметров не берем, можно и без "params"
Ещё раз перечитай миф, там не об этом речь шла.

Desulaid
13.12.2015, 18:37
Ещё раз перечитай миф, там не об этом речь шла.

Вот сейчас я действительно запутался. Я просто убрал массив из команды из-за ненадобности его использования.

$continue$
13.12.2015, 18:38
Где второй аргумент "params" в основании команды?

Зачем он нужен? Для эстетики?
Если params не используется - логично его опустить, не?

Это как с функцией - есть параметр, но ты его нигде не используешь - логично его убрать.

Daniel_Cortez
13.12.2015, 18:50
Лично я не вижу причин пропускать массив params, даже если он не используется.
Во-первых, тенически команда на ZCMD/DC_CMD - это public-функция, а у таких функций компилятор не выдаёт предупреждений о неиспользуемых аргументах.
Во-вторых, непривычно читать нестандартный заголовок функции.
В-третьих, даже если убрать из заголовка аргумент params, это никак не отразится на работе команды - в функцию всё так же будут передаваться 2 аргумента: число и адрес строки с параметрами команды.
В-четвёртых, в других языках несовпадение параметров у экспортируемых функций может привести к падению программы. Даже если в Pawn такой проблемы нет, всё равно следует с самого начала привыкать прописывать все параметры, чтобы избежать подобных недоразумений при работе с другими ЯП.

VVWVV
13.12.2015, 20:18
В целом, я с вами согласен, Daniel.
Вот ещё некоторые замечания по предоставленной теме:
1. Если вы будете использовать «ALT» в командном процессоре «dc_cmd», то будет ошибка (точнее, предупреждение: «warning 202: number of arguments does not match definition»), так как аргументы возвращаемой функции передают «params».
2. Плагин/Скрипт командного процессора в любом случае будет передавать массив «params».

Иван Бубнов
28.12.2015, 16:03
Не проще ?


if(strcmp(cmdtext,"/agm",true)==0)
{
if(PlayerInfo[playerid][Admin] >= 1){SetPlayerArmour(playerid, 999999); SendClientMessage(playerid, -1, "AGM ON");}
else{SetPlayerArmour(playerid, 100); SendClientMessage(playerid, -1, "AGM OFF");}
return 1;
}


Логический, 999999 хп когда нибудь закончится.

#enotik
05.01.2016, 23:35
Логический, 999999 хп когда нибудь закончится.

прописал снова кмд и вооля, снова до*** хп

Daniel_Cortez
06.01.2016, 00:16
Не проще ?


if(strcmp(cmdtext,"/agm",true)==0)
{
if(PlayerInfo[playerid][Admin] >= 1){SetPlayerArmour(playerid, 999999); SendClientMessage(playerid, -1, "AGM ON");}
else{SetPlayerArmour(playerid, 100); SendClientMessage(playerid, -1, "AGM OFF");}
return 1;
}


Логический, 999999 хп когда нибудь закончится.
Не просто "когда-нибудь закончатся", а вообще не дадут желаемого эффекта. Любые значения, кроме NaN (0x7F800000 в данном случае, но есть и другие варианты), подгоняются под диапазон от 0 до 255. Таким образом, если установить игроку 256 ХП, полоса здоровья не будет мигать и будет полной, но игрок сдохнет от любого неаккуратного прыжка с небольшой высоты, при этом GetPlayerHealth будет возвращать 0.0 ХП. В свою очередь, от 999 999 будет эффект, как от 999999 % 256 = 63 ХП.
Исключительная ситуация с NaN, скорее всего, связана с тем, что NaN не равно даже самому себе и сравнение с ним других чисел должно производиться особым образом (чего разработчики GTA:SA и не учли). По сути, это очередной баг, который можно использовать в целях скриптера.

Иван Бубнов
08.02.2016, 19:35
CMD:agm(playerid, params[])
{
if(IsPlayerAdmin(playerid) == 0) //Ваша проверка на администратора
return 1;
if(sscanf(params, "d", params[0]))
return SendClientMessage(playerid, -1, "Используйте: /agm [0/1]");
if(params[0] < 0 || params[0] > 1)
return SendClientMessage(playerid, -1, "0 - выкл, 1 - вкл!");
if(params[0] == 0)
{
SetPlayerHealth(playerid, 100.0);
SendClientMessage(playerid, -1, "AGM OFF");
return 1;
}
SetPlayerHealth(playerid, 0x7F800000);
SendClientMessage(playerid, -1, "AGM ON");
return 1;
}

Michele_Orlando
23.05.2016, 15:45
Спасибо выручил, а то все не мог найти :)

Tretyak01
01.01.2019, 03:26
Как мне узнать мою проверку на администратора? помогите прошу вас.