PDA

Просмотр полной версии : [Мануал] [0.3z] Стрельба по частям тела



Salvacore
14.02.2014, 22:50
В самое начало мода:


#if !defined BODY_PART_TORSO
enum
{
BODY_PART_TORSO = 3,
BODY_PART_GROIN,
BODY_PART_LEFT_ARM,
BODY_PART_RIGHT_ARM,
BODY_PART_LEFT_LEG,
BODY_PART_RIGHT_LEG,
BODY_PART_HEAD
};
#endif


В OnPlayerTakeDamage:


if(issuerid != INVALID_PLAYER_ID) // если игрок не ударился сам
{
new weaponid = GetPlayerWeapon(issuerid);
if(19 <= weaponid <= 34 || weaponid == 38) // если урон от огнестрельного оружия
{
switch(bodypart)
{
case BODY_PART_TORSO: // туловище
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-50.0); // вместо 50.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Тебе выстрелили в живот."); // отправим сообщение раненому
}
case BODY_PART_GROIN: // пах
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-35.0); // вместо 35.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Увы,но тебе прострелили яйки :("); // отправим сообщение раненому
}
case BODY_PART_LEFT_ARM, BODY_PART_RIGHT_ARM, BODY_PART_LEFT_LEG, BODY_PART_RIGHT_LEG: // руки, ноги
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-20.0); // вместо 20.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "В тебя попали! Беги!"); // отправим сообщение раненому
}
case BODY_PART_HEAD: // голова
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-90.0); // вместо 90.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Тебе засадили в голову!"); // отправим сообщение убитому
GameTextForPlayer(playerid, "~y~HEADSHOOOOOOOOT", 5000, 2); // вылезает надпись на экран убитому (как "потрачено")
GameTextForPlayer(issuerid, "~r~HEADSHOOOOOOOOT", 5000, 2); // вылезает надпись на экран стрелявшему (как "потрачено")
}
}
}
}


Нужный материал:
SetPlayerHealth (http://wiki.sa-mp.com/wiki/SetPlayerHealth)
SendClientMessage (http://wiki.sa-mp.com/wiki/SendClientMessage)
OnPlayerTakeDamage (http://wiki.sa-mp.com/wiki/OnPlayerTakeDamage)
ID Частей тела (http://wiki.sa-mp.com/wiki/Body_Parts)
GameTextForPlayer (http://wiki.sa-mp.com/wiki/GameTextForPlayer)


Автор: Daniel_Cortez и немного идеи и кода Salvador

#Vito
14.02.2014, 23:00
Пригодится, +++ :spiteful:

Salvacore
14.02.2014, 23:02
Обновил(немного,даже не надо было постить -_-)

#Vito
14.02.2014, 23:06
Убившему игроку тоже сделай))

case 9: // Голова
{
SetPlayerHealth(playerid, -150); // ставим своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Тебе засадили в голову");//Отправим сообщение убитому
GameTextForPlayer(playerid, "~y~HEADSHOOOOOOOOT", 5000, 2);//Вылезает надпись на экран (Как потрачено)
GameTextForPlayer(issuerid, "~y~HEADSHOOOOOOOOT", 5000, 2);//Вылезает надпись на экран (Как потрачено)
}

Salvacore
14.02.2014, 23:13
Убившему игроку тоже сделай))

case 9: // Голова
{
SetPlayerHealth(playerid, -150); // ставим своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Тебе засадили в голову");//Отправим сообщение убитому
GameTextForPlayer(playerid, "~y~HEADSHOOOOOOOOT", 5000, 2);//Вылезает надпись на экран (Как потрачено)
GameTextForPlayer(issuerid, "~y~HEADSHOOOOOOOOT", 5000, 2);//Вылезает надпись на экран (Как потрачено)
}
Обновил.

Daniel_Cortez
15.02.2014, 09:58
Урок обновлён.
Оттабулирован код, исправлен баг с неправильным определением оружия (оружие проверялось у игрока playerid, когда нужно было проверять у атакующего - issuerid). Добавлены константы для большей наглядности кода.

Edwin
15.02.2014, 11:48
error 017: undefined symbol "bodypart"

Seregamil
15.02.2014, 14:38
new Float:health;
GetPlayerHealth(playerid, health);
можно вынести из тела switch

health -= 20.0; // вместо 20.0 ставьте своё значение
SetPlayerHealth(playerid, health); // ставим своё значение

SetPlayerHealth(playerid, health - 20.0)
не?

Daniel_Cortez
15.02.2014, 15:18
new Float:health;
GetPlayerHealth(playerid, health);
можно вынести из тела switch
Допустим, но если попадёшь в голову не из огнестрельного оружия, у игрока будет взято ХП, но оно никак не будет использоваться. Итог - лишнее действие.



SetPlayerHealth(playerid, health - 20.0)
не?
Можно, но вариант с отниманием значения из переменной в отдельном действии проще для восприятия. Не забывай, этот раздел предназначен в первую очередь для новичков.

Salvacore
15.02.2014, 15:44
error 017: undefined symbol "bodypart"

Обнови инклуды до 0.3z

Edwin
15.02.2014, 17:33
Обнови инклуды до 0.3z

Это не спасло

L0ndl3m
15.02.2014, 17:39
error 017: undefined symbol "bodypart"


Новые параметры в паблик добавили?

Seregamil
15.02.2014, 19:20
Допустим, но если попадёшь в голову не из огнестрельного оружия, у игрока будет взято ХП, но оно никак не будет использоваться. Итог - лишнее действие.


Можно, но вариант с отниманием значения из переменной в отдельном действии проще для восприятия. Не забывай, этот раздел предназначен в первую очередь для новичков.

Однако во всех остальных случаях будет создаваться новая переменная и получаться хр.

И что что для новичков, разве нынешнее племя настолько глупо, что не может понять использование моего варианта?

DeimoS
15.02.2014, 20:55
Можно, но вариант с отниманием значения из переменной в отдельном действии проще для восприятия. Не забывай, этот раздел предназначен в первую очередь для новичков.

Как раз для понимания лучше вариант его, ибо после подобных "примеров" люди пишут подобное

new level = PlayerInfo[playerid][pLevel];
format(blabla, sizeof(blabla), "%d", level);
SendClientMessageToAll(0xFF0000FF, blabla);
Надеюсь сам поймёшь что тут является, мягко говоря, не к месту :)
Пытаться объяснять понятно - дело хорошее, но надо же видеть меру. Показанный способ в уроке не используется в скриптах, а показанный Seregamil'ом пример не так уж и сложен в понимании и он уже используется везде. В общем, велосипед изобретаете.
А система требует доработки, как я вижу. По крайней мере в плане красоты и логичности кода

Snoop_Dog
15.02.2014, 22:24
Круто! +

Salvacore
16.02.2014, 05:50
Круто! +
Спасибо.

Johny
16.02.2014, 10:59
Полезная штука +ик дам.

TWIX
16.02.2014, 11:13
Круто сделал полезно 0.3z =D

Edwin
16.02.2014, 23:14
Новые параметры в паблик добавили?

Неет, какие?)

- - - Добавлено - - -

Разобрался.

Salvacore
16.02.2014, 23:34
Неет, какие?)

- - - Добавлено - - -

Разобрался.

Слава богу :)
Если будут вопросы,задайте в разделе "Вопросы по скриптингу",будем рады ответить.

Salvacore
10.06.2014, 02:59
UP!
Кстати, очень даже работает как АНТИ-ГМ.

Hidden
13.07.2014, 17:13
Если я ударю кулаком в туловище и выстрелю в туловище, то урон будет одинаковый, верно?
Неправильно как-то.

- Спасибо, исправил //DC

Salvacore
22.07.2014, 20:14
Ап, обновил автора.

Godakov
01.08.2014, 08:45
Помогите если не сложно:
warning 219: local variable "weaponid" shadows a variable at a preceding level

Salvacore
01.08.2014, 11:02
Помогите если не сложно:
warning 219: local variable "weaponid" shadows a variable at a preceding level
У тебя уже есть переменная weaponid.

Делаем так...
Замени на это.

if(issuerid != INVALID_PLAYER_ID) // если игрок не ударился сам
{
new idgun = GetPlayerWeapon(issuerid);
if(19 <= idgun <= 34 || idgun == 38) // если урон от огнестрельного оружия
{
switch(bodypart)
{
case BODY_PART_TORSO: // туловище
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-50.0); // вместо 50.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Тебе выстрелили в живот."); // отправим сообщение раненому
}
case BODY_PART_GROIN: // пах
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-35.0); // вместо 35.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Увы,но тебе прострелили яйки :("); // отправим сообщение раненому
}
case BODY_PART_LEFT_ARM, BODY_PART_RIGHT_ARM, BODY_PART_LEFT_LEG, BODY_PART_RIGHT_LEG: // руки, ноги
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-20.0); // вместо 20.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "В тебя попали! Беги!"); // отправим сообщение раненому
}
case BODY_PART_HEAD: // голова
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health-90.0); // вместо 90.0 ставьте своё значение
SendClientMessage(playerid, 0x33AAFFFF, "Тебе засадили в голову!"); // отправим сообщение убитому
GameTextForPlayer(playerid, "~y~HEADSHOOOOOOOOT", 5000, 2); // вылезает надпись на экран убитому (как "потрачено")
GameTextForPlayer(issuerid, "~r~HEADSHOOOOOOOOT", 5000, 2); // вылезает надпись на экран стрелявшему (как "потрачено")
}
}
}
}

Godakov
01.08.2014, 11:05
Спасибо, помогло.

pastral
20.04.2015, 13:04
Было бы не плохо к этой системке еще прикрутить различный урон с различных оружий. Было бы вообще секс.

Salvacore
27.04.2015, 12:30
Было бы не плохо к этой системке еще прикрутить различный урон с различных оружий. Было бы вообще секс.
Я сделаю, если тебя будет возбуждать :3

pastral
28.04.2015, 15:54
Я сделаю, если тебя будет возбуждать :3
Ну если воспринимать это все так буквально, то я уже подрочил =)

underground
29.10.2016, 19:16
Как к примеру реализовать такое: у игрока есть бронежилет, и когда ему стреляют не в туловище, чтобы он не отнимался?

DeimoS
29.10.2016, 19:31
if(issuerid != INVALID_PLAYER_ID)
{
new weaponid = GetPlayerWeapon(issuerid);
if(19 <= weaponid <= 34 || weaponid == 38)
{
switch(bodypart)
{
case BODY_PART_TORSO:
{
new Float:armour;
GetPlayerArmour(playerid, armour);
if(floatcmp(armour, 0) == 1)
{
return 0;
}
}
}
}
}
Как-то так