Run time error 4

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
491
Реакции
89
Помог
5 раз(а)
Приветствую всех. Очень стала интересна данная ошибка, заметил, что у многих плагинов, спустя какое-то время начинает лезть Run time error 4. Банальный пример из паблика:
Код:
public CBasePlayer_Killed(pevVictim, pevAttacker) {
    if(IsPlayer(pevVictim) && IsPlayer(pevAttacker) && isUserVip(pevAttacker) && pevVictim != pevAttacker) {
        static Float:attackerHp, Float:addHp;
        attackerHp = Float:get_entvar(pevAttacker, var_health);
        addHp = get_member(pevVictim, m_bHeadshotKilled) ? ADDHP_HS : ADDHP;
        attackerHp += addHp;
        set_entvar(pevAttacker, var_health, attackerHp > MAXHP ? MAXHP : attackerHp);
        if(attackerHp >= MAXHP) {
            return;
        }
        if(addHp > 0.0) {
            set_hudmessage(0, 255, 0, 0.6, 0.4, 2, 1.0, 1.5, 0.1, 0.3, -1);
            ShowSyncHudMsg(pevAttacker, g_iSyncMsgAddHP, "+%.0f hp", addHp);
        }
    }
    return;
}

#if defined DAMAGER
public CBasePlayer_TakeDamage(pevVictim, inflictor, pevAttacker, Float:damage) {
    if(!g_isSwitchDmg[pevAttacker] || !isUserVip(pevAttacker) || pevVictim == pevAttacker || get_member(pevVictim, m_iTeam) == get_member(pevAttacker, m_iTeam)) {
        return HC_CONTINUE;
    }
    if(IsPlayer(pevAttacker) && rg_is_player_can_takedamage(pevVictim, pevAttacker)) {
        static g_iDamage;
        g_iDamage = floatround(damage, floatround_floor);
        if(g_iDamage > 0) {
            static iPos;
            iPos = ++g_iPlayerPos[pevAttacker];
            if(iPos == sizeof(g_fCoords)) {
                iPos = g_iPlayerPos[pevAttacker] = 0;
            }
            set_hudmessage(0, 100, 200, Float:g_fCoords[iPos][0], Float:g_fCoords[iPos][1], 2, 0.5, 1.5, 0.02, 0.02, -1);
            ShowSyncHudMsg(pevAttacker, g_iSyncMsgDmg, "%d^n", g_iDamage);
        }
    }
    return HC_CONTINUE;
}
Хотелось бы поточнее узнать, причину вызывания данной ошибки и ее предотвращение. Заранее, благодарю всех, кто откликнулся
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Добавить проверку на валидность игрока.
P.S. Нужно писать полную ошибку а не только номер её.
 
Сообщения
491
Реакции
89
Помог
5 раз(а)
w0w, CBasePlayer_TakeDamage ошибка там, строку не помню (это же пример)
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
w0w, CBasePlayer_TakeDamage ошибка там, строку не помню (это же пример)
Я понимаю что там, выше пример как валидность игрока можно проверить - IsPlayer(id). Скорее всего там что-то вроде 1 <= %0 <= MaxClients. Если нет, то просто is_user_connected. Смотреть на какой строке ошибка и исходя из этого уже исправлять.
 
Сообщения
491
Реакции
89
Помог
5 раз(а)
И так же знаю, что их несколько, но какая верная для AMX 1.9.0 + Reapi
26 Янв 2019
w0w, если не ошибаюсь, при is_user_connected - IsPlayer не обязателен. Вычитал где-то на просторах
26 Янв 2019
Или же я могу указать: IsPlayer(attacker) && IsPlayer(victim), но не указывать is_user_connected, ибо он тут лишний будет
26 Янв 2019
Код:
    if(!IsPlayer(attacker) || !IsPlayer(victim) || get_member(victim, m_iTeam) == get_member(attacker, m_iTeam) || !rg_is_player_can_takedamage(victim, attacker))
        return HC_CONTINUE;
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
В TakeDamage и Killed атакером может быть как игрок, так и не игрок. При этом игрок так же может быть уже не на сервере. Кинул гранату, вышел, убил. Это тоже надо учитывать.
 
Сообщения
491
Реакции
89
Помог
5 раз(а)
BlackSignature,
Код:
    if(!IsPlayer(victim) || !IsPlayer(attacker) || !is_user_connected(victim) || !is_user_connected(attacker))
        return HC_CONTINUE;
26 Янв 2019
Или же
Код:
 if(!IsPlayer(attacker) || !is_user_connected(victim) || !is_user_connected(attacker))
        return HC_CONTINUE;
26 Янв 2019
Верно ли будет вот так?
Код:
public CBasePlayer_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
    if(!IsPlayer(attacker) || !is_user_connected(attacker) || victim == attacker)
        return HC_CONTINUE;

    if(get_member(victim, m_iTeam) == get_member(attacker, m_iTeam) || !rg_is_player_can_takedamage(victim, attacker))
        return HC_CONTINUE;

    static g_iDamage;
    g_iDamage = floatround(damage, floatround_floor);

    if(g_iDamage > 0)
    {
        set_hudmessage(0, 100, 200, -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1);
        ShowSyncHudMsg(attacker, g_iSyncMsgDamager, "%d", g_iDamage);
    }

    return HC_CONTINUE;
}
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
Сообщения
491
Реакции
89
Помог
5 раз(а)
Оставил так:
Код:
public CBasePlayer_Killed(victim, attacker)
{
    if(!is_user_connected(attacker))
        return HC_CONTINUE;

    if(victim == attacker || get_member(victim, m_iTeam) == get_member(attacker, m_iTeam))
        return HC_CONTINUE;

    static Float:attackerHp, Float:addHp;
    attackerHp = Float:get_entvar(attacker, var_health);
    addHp = get_member(victim, m_bHeadshotKilled) ? ADDHP_HS : ADDHP;
    attackerHp += addHp;
    set_entvar(attacker, var_health, attackerHp > MAXHP ? MAXHP : attackerHp);
    
    if(attackerHp >= MAXHP)
        return HC_CONTINUE;

    if(addHp > 0.0)
    {
        set_hudmessage(0, 255, 0, 0.6, 0.4, 2, 1.0, 1.5, 0.1, 0.3, -1);
        ShowSyncHudMsg(attacker, g_iSyncMsgVampireEffect, "+%.0f hp", addHp);
    }

    return HC_CONTINUE;
}
Всем отозвавшимся, огромное спасибо.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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