Вопросы по нативу is_user_connected

d3m37r4

111111
Сообщения
1,428
Реакции
1,168
Помог
10 раз(а)
Собственно вопрос, какие отличия между проверками is_user_connected(id) и 0 < id < 33 ?

Как правильно выполнить проверку - находится ли игрок на сервере, и игрок ли это?
Например, в дамагере:
Код:

public CBasePlayer_TakeDamage(const pevVictim, pevInflictor, pevAttacker, Float:damage, bitsDamageType) {
if (pevAttacker < 1 || pevAttacker > 32)
return;

if (rg_is_player_can_takedamage(pevVictim, pevAttacker))
{
set_hudmessage(0, 100, 200, -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1);
ShowSyncHudMsg(pevAttacker, g_iSyncMsgDamage, "%d", floatround(damage));
}
}


На сервере редко, но появляется ошибка:
Код:
L 03/03/2017 - 11:25:58: [ReAPI] rg_is_player_can_takedamage: player 8 is not connected
L 03/03/2017 - 11:25:58: [AMXX] Displaying debug trace (plugin "menu.amxx", version "1.0")
L 03/03/2017 - 11:25:58: [AMXX] Run time error 10: native error (native "rg_is_player_can_takedamage")
L 03/03/2017 - 11:25:58: [AMXX] [0] menu.sma::CBasePlayer_TakeDamage (line 103)


Если, что, строка 103 это if (rg_is_player_can_takedamage(pevVictim, pevAttacker))

Ниже приложен вариант, правильный ли он?
Код:
public CBasePlayer_TakeDamage(pVictim, pInflictor, pAttacker, Float:damage, bitsDamageType) {
if (is_user_connected(pAttacker) && 0 < pAttacker < 33) {
if (!g_bDamager[pAttacker] || pVictim == pAttacker)
return
if( rg_is_player_can_takedamage(pVictim, pAttacker)) {
set_hudmessage(0, 100, 200, -1.0, 0.6, 0, 0.1, 2.5, 0.02, 0.02)
show_hudmessage(pAttacker, "%.0f", damage)
}
}
}
 
Сообщения
518
Реакции
458
Предупреждения
17
Помог
8 раз(а)
0 < id < 33 проверка "игрок ли". Хотя так неправильно. Тоже самое
if (pevAttacker < 1 || pevAttacker > 32) )


if (is_user_connected(pAttacker) && 0 < pAttacker < 33)
В is_user_connected уже есть amxmodx/amxmodx.cpp at master · alliedmodders/amxmodx · GitHub
проверка "игрок ли". Чекат is_user_connected при каждым дамаге не имеет смысла.

L 03/03/2017 - 11:25:58: [ReAPI] rg_is_player_can_takedamage: player 8 is not connected
Скорее всего игрок наносил урон с гранаты (бросал и ушел) тогда можно и так:

Код:
new g_iMaxPlayers
#define IsPlayer(%1) (1 <= (%1) <= g_iMaxPlayers)

public plugin_init() {
g_iMaxPlayers = get_maxplayers()
}

public CBasePlayer_TakeDamage(pVictim, pInflictor, pAttacker, Float:damage, bitsDamageType)
{
if(!IsPlayer(pAttacker) || !g_bDamager[pAttacker] || pVictim == pAttacker)
return HC_CONTINUE

if( (pInflictor == pAttacker && (bitsDamageType & DMG_BULLET))
|| (pInflictor != pAttacker && (bitsDamageType & DMG_GRENADE) && is_user_connected(pAttacker)) )
{
if(rg_is_player_can_takedamage(pVictim, pAttacker))
{
set_hudmessage(0, 100, 200, -1.0, 0.6, 0, 0.1, 2.5, 0.02, 0.02)
show_hudmessage(pAttacker, "%.0f", damage)
}
}

return HC_CONTINUE
}

26 Мар 2017
или так
Код:
public CBasePlayer_TakeDamage(pVictim, pInflictor, pAttacker, Float:damage, bitsDamageType)
{
if(!IsPlayer(pAttacker) || !g_bDamager[pAttacker] || pVictim == pAttacker)
return HC_CONTINUE

if(GetHookChainReturn(ATYPE_INTEGER))
{
set_hudmessage(0, 100, 200, -1.0, 0.6, 0, 0.1, 2.5, 0.02, 0.02)
show_hudmessage(pAttacker, "%.0f", damage)
}

return HC_CONTINUE
}

PS: Только в пост (TakeDamage)
 
Последнее редактирование:

d3m37r4

111111
Сообщения
1,428
Реакции
1,168
Помог
10 раз(а)
Vaqtincha, воспользовался вторым вариантом, предложенным вами, иногда дамагер показывает нанесенный урон = 0, вроде бы такое, только когда кидаешь гранату. Возможно-ли как-то это решить?
 
Сообщения
518
Реакции
458
Предупреждения
17
Помог
8 раз(а)
d3m37r4, тогда просто добав
Код:
if(damage > 0.0 && GetHookChainReturn(ATYPE_INTEGER))
 
Сообщения
174
Реакции
5
Vaqtincha, а как правильно получить урон по себе?
Так что-ли?
C#:
if(is_user_connected(pevAttacker)
    && get_user_flags(pevAttacker) & ACCESS_FLAG
    && rg_is_player_can_takedamage(pevVictim, pevVictim))
    {
        set_hudmessage(255, 0, 0, -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1);
        ShowSyncHudMsg(pevAttacker, g_iSyncMsgDamage2, "%d", floatround(damage));
    }
или так
C#:
if(is_user_connected(pevVictim)
        && get_user_flags(pevVictim) & ACCESS_FLAG
        && rg_is_player_can_takedamage(pevVictim, pevVictim))
    {
        set_hudmessage(255, 0, 0, -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1);
        ShowSyncHudMsg(pevVictim, g_iSyncMsgDamage2, "%d", floatround(damage));
    }
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
SlovePRO, 1. Хватит некропостить
2. Смотри плагины по типу дамагера, которые выводят полученный урон.
 

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

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