PDA

Просмотр полной версии : [Вопрос] Урон, стрельба и все что с ней связано.



Skyline
16.07.2018, 08:53
Добрый день. Ни для кого ни секрет, что в сампе, такая стрельба, при которой с первого раза игроку может не снести хп(может и не пробиться и 2 и 3 раза).

Есть такая функция:


public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid)
{
if(IsAiming[playerid] == true && pl_afk_time[damagedid] == -1)
{
new string[8];

format(string, sizeof string, "-%d hp", floatround ( Float:amount, floatround_ceil ));
SetPlayerChatBubble(damagedid, string, 0xFFDEADFF, 30.0, 5000 );
}
if(pl_afk_time[damagedid] > 1)
{
static Float: Health;
GetPlayerHealth(damagedid, Health);
SetPlayerHealth(damagedid, Health);
return 1;
}
return 1;
}

Которая пишет, сколько снеслось игроку ХП. Сделал, когда игрок в АФК, ХП не сносилось и не показывало.
Вопрос 1 : Заключается в следующем, как сделать, чтобы не показывало хп, если оно действительно не снеслось.
Вопрос 2: После смерти, игрок еще может какие то секунды стрелять, и тем самым нанести урон игроку или же убить его. Как убрать и эту фичу.

В голову приходило только одно, проверить игрока на ХП, если у него < 0 ХП, то урон от него не сносился, но как это реализовать, не знаю.

X!X
16.07.2018, 15:33
В голову приходило только одно, проверить игрока на ХП, если у него < 0 ХП, то урон от него не сносился, но как это реализовать, не знаю.
В паблик OnPlayerWeaponShot (вызов паблика при выстреле), наверное.

Пример:

public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
new Float:hp;
if(GetPlayerHealth(playerid, hp) < 0) return 1;
return 1;
}

Skyline
16.07.2018, 23:39
В паблик OnPlayerWeaponShot (вызов паблика при выстреле), наверное.

Пример:

public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
new Float:hp;
if(GetPlayerHealth(playerid, hp) < 0) return 1;
return 1;
}

Не работает.

Geebrox
17.07.2018, 02:46
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{
if(_:amount > 0 && pl_afk_time[damagedid] == -1 && IsAiming[playerid] == true)
{
new string[8];

format(string, sizeof string, "-%0.0f hp", amount);
SetPlayerChatBubble(damagedid, string, 0xFFDEADFF, 30.0, 5000);
}

return 1;
}


public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
static
Float:_hp;

GetPlayerHealth(playerid, _hp);

if(_:_hp <= 0)
{
return 0;
}

return 1;
}

DeimoS
17.07.2018, 08:02
Ответ на первый вопрос: не использовать коллбэки, которые срабатывают сразу после того, как на сервер приходит пакет от игрока, а не когда действие действительно совершилось. Это я про OnPlayerGiveDamage сейчас, если что. У тебя не получится написать то, что ты хочешь, прописав всего пару строк.

Хотя и самостоятельно писать подобное нет смысла, ибо уже есть тот же weapon-config, который делает как раз то, что тебе нужно. Нужно лишь либо настроить и его, и сам мод соответствующе, если ты вшиваешь его в уже написанный мод, либо писать код в соответствии с теми особенностями, что вносит контроль урона на стороне сервера, если ты вшиваешь его в ещё не написанный мод.

Skyline
18.07.2018, 00:09
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{
if(_:amount > 0 && pl_afk_time[damagedid] == -1 && IsAiming[playerid] == true)
{
new string[8];

format(string, sizeof string, "-%0.0f hp", amount);
SetPlayerChatBubble(damagedid, string, 0xFFDEADFF, 30.0, 5000);
}

return 1;
}


public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
static
Float:_hp;

GetPlayerHealth(playerid, _hp);

if(_:_hp <= 0)
{
return 0;
}

return 1;
}

Не работает.

Skyline
18.07.2018, 23:07
Ответ на первый вопрос: не использовать коллбэки, которые срабатывают сразу после того, как на сервер приходит пакет от игрока, а не когда действие действительно совершилось. Это я про OnPlayerGiveDamage сейчас, если что. У тебя не получится написать то, что ты хочешь, прописав всего пару строк.

Хотя и самостоятельно писать подобное нет смысла, ибо уже есть тот же weapon-config, который делает как раз то, что тебе нужно. Нужно лишь либо настроить и его, и сам мод соответствующе, если ты вшиваешь его в уже написанный мод, либо писать код в соответствии с теми особенностями, что вносит контроль урона на стороне сервера, если ты вшиваешь его в ещё не написанный мод.

Касательно данного includa, его нужно как либо настраивать для такой реализации?

DeimoS
19.07.2018, 13:45
Ну естественно. И весь мод придётся под него настраивать, так как, дабы контролировать урон, пришлось пойти на многие хитрости, по типу симуляции смерти и т.п. Но взамен ты получишь полный контроль урона со стороны сервера => полный фикс GM всех видов (единственный возможный GM в такой ситуации - NOP SetPlayerHealth. Но такой NOP отловить проще простого, банально, раз в минуту сверяя хп игрока с хп, которое хранится на сервере).