[ReAPI] get_member: invalid or uninitialized entity

Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
Есть такой код
Код:
#include <amxmodx>
#include <reapi>

new TeamName:DropPlayerTeam;

public plugin_init() {
    RegisterHookChain(RH_SV_DropClient, "SV_DropClient_Pre", false);
    RegisterHookChain(RH_SV_DropClient, "SV_DropClient_Post", true);
}

public SV_DropClient_Pre(const id) {
    if (!is_user_hltv(id)) {
        DropPlayerTeam = get_member(id, m_iTeam);
    } else {
        DropPlayerTeam = TEAM_UNASSIGNED;
    }
}

public SV_DropClient_Post(const id) {
    if (!(TEAM_TERRORIST <= DropPlayerTeam <= TEAM_CT)) {
        return;
    }
   
    // ...
}
При локальном запуске никаких ошибок не вылазит, но при запуске на боевом сервере в get_member(id, m_iTeam); появляется ошибка, что ентити уже не валидна. И вылазит она не всегда. Подскажите в чем может быть причина
 
Сообщения
162
Реакции
445
Помог
2 раз(а)
get_member конвертирует индекс игрока в edict. Очевидно, что эдикт при каких-то условиях может быть невалидным (в нативной функции эдикт чекается).
Функция SV_DropClient в движке вызывается во многих местах, и везде указан конкретный ризон. Можно попробовать логировать disconnect reason и когда появится ошибка invalid or uninitialized entity по ризону можно будет понять, из какого конкретного места в движке вызвался SV_DropClient ну и дальше разбираться почему эдикт невалидный.
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
the_hunter, тут именно проблема в том, что это часть мода, который запускать на боевом сервере ради тестов не совсем хорошо. Но спасибо за подсказку. Я почему то думал, что там всегда должен быть валидный едикт. А проблему я походу решу иным способом. Там вся соль в том, что стоит блокировка окончания раунда при отсутсвии игроков в команде с помощью квара mp_round_infinite (Нужно для мода). Но при выходе игрока желательно закончить раунд, дабы произошла перебалансировка команд. Поэтому скорей всего сделаю в пост хуке подсчет живых игроков (rg_initialize_player_counts), и если в одной из команд 0 живых игроков, то форсану конец раунда.
 

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

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