Проверка валидности игрока

Сообщения
95
Реакции
21
Вечер добрый уважаемые форумчане, хотел попросить помощи подсказать, что из ниже приведенного кода будет правильным и оптимизированным в плане проверки валидности игрока:

Код:
// Вариант через сток
public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
    if(!IsValidPlayer(pevAttacker) || pevAttacker != pevInflictor)
        return HC_CONTINUE;

    SetHookChainArg(4, ATYPE_FLOAT, flDamage * 1.1);
   
    return HC_CONTINUE;
}

stock bool:IsValidPlayer(const pPlayer)
    return bool:(1 <= pPlayer <= MaxClients);


Код:
// Вариант через is_entity от reapi
public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
    if(!is_entity(pevAttacker) || pevAttacker != pevInflictor)
        return HC_CONTINUE;

    SetHookChainArg(4, ATYPE_FLOAT, flDamage * 1.1);
   
    return HC_CONTINUE;
}
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
kucklovod, is_user_connected лучше использовать. Аттакер не обьязательно омжет быть живым (граната например)
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
fantom, он спросил про валидность игрока. окей, пусть is_user_connected
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
В данном куске кода вообще не нужны никакие проверки:smile3:
Всё зависит от ситуации. Например если у вас есть массив переменных для каждого игрока(размером в MaxClients, то достаточно проверить
(1 <= pPlayer <= MaxClients), чтоб индекс не выходил за границы массива. Если нужно получить приватдату игрока(get_pdata_*/get_member), то тут уже обязательно нужно is_user_connected, иначе возможны краши сервера. Для проверки на возможность нанесения урона можно использовать нативы, которые указал d3m37r4
В целом, не стоит заморачиваться и просто использовать везде is_user_connected. Исключения - Client_Pre/PostThink, AddToFullPack и еще пару экзотических форвардов, которые вызываются с большой частотой.
 
Сообщения
95
Реакции
21
shadow, у меня исключено повышение урона от гранаты pevAttacker != pevInflictor.

по этому мне подходит (1 <= pPlayer <= MaxClients) не выходит ли индекс за границы массива MaxClients.

Остался вопрос только как правильно через

дефайн

#define IsValidPlayer (%0) (1 <= (%0) <= MaxClients)

или сток
stock bool:IsValidPlayer(const pPlayer)
return bool:(1 <= pPlayer <= MaxClients);
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Остался вопрос только как правильно через

дефайн

#define IsValidPlayer (%0) (1 <= (%0) <= MaxClients)

или сток
stock bool:IsValidPlayer(const pPlayer)
return bool:(1 <= pPlayer <= MaxClients);
Как тебе удобно. Имхо, макросом удобнее будет.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу