is_entity как замена pev_valid

Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Является ли is_entity() из ReAPI заменой pev_valid() из FakeMeta или только в каких-то определённых случаях можно использовать?

Пример:
Код:
new iTarget, iBody;
get_user_aiming(id, iTarget, iBody, 30);

if(pev_valid(iTarget))
{
    new szClassName[32];
    get_entvar(iTarget, var_classname, szClassName, charsmax(szClassName));

    if(containi(szClassName, "door") != -1)
        return true;
}
Будет в этом случае работать is_entity() ровно так же как pev_valid()? По сути is_entity() должен работать как pev_valid() который возвращает 2 (что есть приват дата), значит можно уверенно заменять?
 
Последнее редактирование:
Сообщения
90
Реакции
126
Помог
3 раз(а)
Да, is_entity проверяет наличие приватных данных, вот исходник:
C++:
cell AMX_NATIVE_CALL is_entity(AMX *amx, cell *params)
{
    enum args_e { arg_count, arg_index };

    int nIndex = params[arg_index];
    if (nIndex < 0 || nIndex > gpGlobals->maxEntities) {
        return FALSE;
    }

    auto pEntity = getPrivate<CBaseEntity>(nIndex);
    if (!pEntity) {
        return FALSE;
    }

    // if it is the index of the player
    if (pEntity->IsPlayer() && pEntity->has_disconnected) {
        return FALSE;
    }

    return TRUE;
}
ну а так же эта функция вернет false на не подключенного игрока
Но ИМХО fakemet'овский натив выглядит получше, тут все намешано и название не передает смысл полностью, если мне необходимо просто проверить наличие приватных данных, то я б пользовался pev_valid, вот его исходник, не какого лишнего кода:
C++:
static cell AMX_NATIVE_CALL amx_pev_valid(AMX *amx, cell *params)
{
    int idx = static_cast<int>(params[1]);

    edict_t *e = TypeConversion.id_to_edict(idx);

    if (FNullEnt(e))
        return 0;

    if (e->pvPrivateData)
        return 2;

    return 1;
}
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
swank, ну вроде как валидная энтити должна иметь приватдату, а отключенный игрок нет. И проверки вполне оправдны и их меньше, в отличии от намешанного:

inline bool FNullEnt(const edict_t *pent) { return (pent == nullptr || pent->free || FNullEnt(OFFSET(pent))); }
 

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

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