PDA

Просмотр полной версии : [Мануал] Электрошокер



I'm Cobra
23.12.2014, 21:31
Здравствуйте, ув. пользователи Pro-Pawn! Я искал электрошокер, но везде был только пистолет-электрошокер. В связи с этим, я решил сделать электрошокер объектом.

В начало мода:

new tazer_status[MAX_PLAYERS char];

Добавим команду:


CMD:tazer(playerid, params[])
{
if(!<ваша проверка на то, авторизовался ли игрок>)
return true;
if(tazer_status{playerid} == 0)
{
SetPlayerAttachedObject(playerid, 0, 18642, 6, 0.06, 0.01, 0.08, 180.0, 0.0, 0.0);
tazer_status{playerid} = 1;
}
else
{
RemovePlayerAttachedObject(playerid, 0);
tazer_status{playerid} = 0;
}
return 1;
}


У кого стоит стандартный командный процессор, изменяем шапку команды на:

if(strcmp(cmdtext, "/tazer", true))

Теперь сделаем так, чтобы игрок мог ударять тазером используя сочетания клавиш ПКМ+ЛКМ.

Нажимаем ПКМ и наводим на игрока, и если над головой у него загорается зеленый маркер, жмем ЛКМ.


Добавляем в OnPlayerKeyStateChange:


if(newkeys & KEY_FIRE)
{
if(tazer_status{playerid} == 1)
{
new targetplayer = GetPlayerTargetPlayer(playerid);
if(targetplayer != INVALID_PLAYER_ID)
{
TogglePlayerControllable(targetplayer, 0);
SetTimerEx("Unfreeze", 10000, 0, "%d", targetplayer);
}
}
}


Добавим в конец мода:



forward Unfreeze(playerid);
public Unfreeze(playerid)
return TogglePlayerControllable(playerid, 1);


Если я что-то не понятно написал, пишите в комментарии, я все объясню :)
Также можно добавить проверку на то, состоит ли игрок в законе, чтобы электрошокер был доступен только им. Или можно добавить покупку электрошокера в магазин 24/7.

Спасибо пользователю [ForD] за то, что подсказал название проверки, отвечающую за зеленый маркер над головой игрока.

wAx
26.12.2014, 17:14
Зачем использовать OnPlayerUpdate? Если можно все удобно уместить в OnPlayerKeyStateChange?

I'm Cobra
26.12.2014, 17:20
Зачем использовать OnPlayerUpdate? Если можно все удобно уместить в OnPlayerKeyStateChange?

Хмм, не подумал об этом. Приду домой поправлю.

James_Cruise
30.12.2014, 23:46
Зачем использовать OnPlayerUpdate? Если можно все удобно уместить в OnPlayerKeyStateChange?

OnPlayerKeyStateChange не меньше вызывается.

wAx
01.01.2015, 19:28
OnPlayerKeyStateChange не меньше вызывается.

По крайней мере не 25 раз за секунду...

+ В нем логично проверять нажатие клавиши? Нет? Так не думаешь?

Salvacore
01.01.2015, 19:32
http://i.imgur.com/hDEcrka.png
Ничего страшного, но чтозанах?

InViZzeR
01.01.2015, 19:45
Ничего страшного, но чтозанах?
А что тут?

James_Cruise
02.01.2015, 09:59
По крайней мере не 25 раз за секунду...

+ В нем логично проверять нажатие клавиши? Нет? Так не думаешь?

Ну во первых,Update не всегда проверяется 25 раз в секунду,да и зависит от настройки конфига,но стандартный подход это обновление каждые 40 ms в случае отправки пакета.

Если проверять в Update мы сэкономим пару тиков. В том случае,что если проверять на нажатие ПКМ+ЛКМ в OnPlayerKeyStateChange.
Я как то выводил логирование кнопок из под паблика OnPlayerKeyStateChange,так вот,флуд был не меренный. Точно в 100% не могу сказать,что меньше вызывается,нужно смотреть проверять. Знаю одно,что в среднем выйдет почти одинаково.
Возможно как когда нибудь проверю.

I'm Cobra
17.01.2015, 15:36
Обновил код

Daniel_Cortez
18.01.2015, 15:15
Определитесь уже, что Вы хотите использовать: PVar'ы ("tazer") или переменные (массив tazer_status).
P.S.: 2-й вариант желательнее, т.к. кол-во PVar'ов у каждого игрока ограничено.

I'm Cobra
18.01.2015, 16:55
Определитесь уже, что Вы хотите использовать: PVar'ы ("tazer") или переменные (массив tazer_status).
P.S.: 2-й вариант желательнее, т.к. кол-во PVar'ов у каждого игрока ограничено.

Переменные :don-t_mention:

heralt
27.01.2015, 12:34
пасиба):blum3:

I'm Cobra
28.01.2015, 11:24
пасиба):blum3:

Не за что :)

heralt
28.01.2015, 21:40
Пригодилось, давно искал на ПКМ)

I'm Cobra
29.01.2015, 22:46
Пригодилось, давно искал на ПКМ)

Спасибо за отзыв! :)

L0ndl3m
29.01.2015, 22:50
В принципе нормально. Но почему два раза вызываете GetPlayerTargetPlayer, если можно было вызвать один раз, создав переменную чуть раньше за другой скобкой?

I'm Cobra
30.01.2015, 08:43
В принципе нормально. Но почему два раза вызываете GetPlayerTargetPlayer, если можно было вызвать один раз, создав переменную чуть раньше за другой скобкой?

Спасибо, исправил!

VeRyNaYa
24.04.2015, 15:12
Жалуется на это:
if(tazer_status{playerid} == 1)
Что делать?

Simlish
02.05.2015, 11:20
Жалуется на это:
if(tazer_status{playerid} == 1)
Что делать?

Что в ошибках пишет?

L0ndl3m
02.05.2015, 13:33
Исправлено.

Daniel_Cortez
22.05.2015, 11:17
Немного подредактировал 1-й пост. Думаю, можно переность тему в раздел "Прочее", раз она соответствует всем правилам.

Unreal
21.10.2015, 22:23
Почему бы и не public OnPlayerGiveDamage ?
Пример:

if(damagedid != INVALID_PLAYER_ID)
{
if(IsACop(playerid) || (PlayerInfo[playerid][pMember] == 19/*F_ARMY*/ && PlayerInfo[playerid][pRank] >= 5)){
if(GetPVarInt(playerid,"_tazerS") && GetPlayerWeapon(playerid) == 3){
//if(AFK[damagedid][AFK_Time] > 3) return SendClientMessage(playerid,COLOR_ADM,"["ErrorMes"] Человек Спит(AFK).");
//format(GDamage,sizeof(GDamage),"оглушил(а) %s",PN(damagedid));
//MeAction(playerid,GDamage);
TogglePlayerControllable(damagedid,false);
SetPlayerSpecialAction(damagedid,SPECIAL_ACTION_HANDSUP);
//ReFreeze(damagedid,15000);
SetTimerEx("Timer_TazerUnfreeze",15000,false,"i",damagedid);
}
}
}

и кто нибудь кроме меня заметил это?
SetTimerEx("Unfreeze", 10000, 0, "%d", targetplayer);