PDA

Просмотр полной версии : [Вопрос] SetPlayerTeam и Стандартный урон



qwezert
21.06.2016, 14:49
В общем суть проблемы: Делаю для оружия немного другой урон и столкнулся с проблемой что стандартный урон все равно остается и работает(или переодически или постоянно). Ставить return 0 в пабликах GiveDamage и TakeDamage - не дает никакого результата - все также стандартный урон присутствует.
Попробовал использовать SetPlayerTeam - да, урон стандартный отключается и можно без проблем использовать свою функцию с нанесением урона, но появляются некоторые неприятные последствия - Игрок в машине не получает урон, вообще, так как WeaponShot при выстреле в любую часть машины возвращает id машины, но это все таки можно обойти и присваивать игроку в машине определенный урон, но остается острая проблема - урон в ближнем бою. Паблик weaponshot отвечает только за огнестрельное оружие, и проверить там биту или кулаки - нельзя.
Как все же можно нормально отключить стандартный урон?

m1n1vv
21.06.2016, 15:41
Это должно быть в OnPlayerTakeDamage и в конце паблика должен быть return 1;

new
Float:HP;

GetPlayerHealth(playerid, HP);

if (issuerid != INVALID_PLAYER_ID)
{
if (weaponid == 24)
SetPlayerHealth(playerid, HP-50);
}

qwezert
22.06.2016, 11:03
Таким кодом ты только добавишь к уже стандартному урону еще 50 урона. И этот паблик не есть хороший вариант использования - он рассинхронен с GiveDamage + некоторыми читами вызывается. Единственное что можно попробовать в него поставить проверку на ближнее оружие, но тогда как обнулять стандартный урон? С любым ретурном - стандартный урон все равно будет.

ziggi
25.06.2016, 12:01
Стандартный урон очень легко обнулить установкой всех людей в одну команду с помощью SetPlayerTeam.
Вот, очень простой вариант. Но в идеале нужно ещё добавить свою систему команд, но это делается довольно просто.


public OnPlayerSpawn(playerid)
{
if (GetPlayerTeam(playerid) != 0) {
SetPlayerTeam(playerid, 0);
}

#if defined PTeam_OnPlayerSpawn
return PTeam_OnPlayerSpawn(playerid);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerSpawn
#undef OnPlayerSpawn
#else
#define _ALS_OnPlayerSpawn
#endif

#define OnPlayerSpawn PTeam_OnPlayerSpawn
#if defined PTeam_OnPlayerSpawn
forward PTeam_OnPlayerSpawn(playerid);
#endif

public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
{
if (damagedid == INVALID_PLAYER_ID) {
return 1;
}

new
Float:health,
Float:armour,
Float:difference;

GetPlayerHealth(damagedid, health);
GetPlayerArmour(damagedid, armour);

difference = armour - amount;

if (difference > 0.0) {
SetPlayerArmour(damagedid, difference);
} else {
SetPlayerArmour(damagedid, 0.0);
SetPlayerHealth(damagedid, health + difference);
}
return 1;
}