Вопрос C_BaseEntity (IsNPC)

Начинающий
Статус
Оффлайн
Регистрация
27 Авг 2021
Сообщения
31
Реакции[?]
1
Поинты[?]
0
Как реализовать функцию IsNPC у класса C_BaseEntity? Я искал в нетварах, но не нашел ничего похожего
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Как реализовать функцию IsNPC у класса C_BaseEntity? Я искал в нетварах, но не нашел ничего похожего
через ентитикласс. либо по ентитиклассу смотришь, либо из него шема биндинг достаешь и по нему смотришь.
класс в айдентити если что
Код:
-----members of class CEntityIdentity-----
    C_BaseEntity* m_pEntity(offset 0x0, size 0x8, align 0x8)
    CEntityClass* m_pClass(offset 0x8, size 0x8, align 0x8)
    ...
(айдентити в ентити есть тоже если что
Код:
    -----members of class CEntityInstance-----
        uint8_t[8] unaccounted(offset 0x0)
        CUtlSymbolLarge m_iszPrivateVScripts(offset 0x8, size 0x8, align 0x8)
            ^MNetworkDisable
        CEntityIdentity* m_pEntity(offset 0x10, size 0x8, align 0x8)
            ^MNetworkEnable
            ^MNetworkPriority "56"
        ...
)
альтернативно шема биндинг можно достать из самой C_BaseEntity вызовом 0 виртуальной функции
(шемаструктурки тут есть https://yougame.biz/threads/139802/page-7#post-3090326 смотри неймспейс schema_2019 ток а не schema_2015)
C++:
bool helper_check_hierarchy_for_name(const CSchemaClassBinding& binding, const std::string_view& name) noexcept
{
    for (const auto& parent_node : binding.GetParents())
    {
        if (const auto* parent = parent_node.GetParent(); parent)
        {
            if (parent->GetName() == name || helper_check_hierarchy_for_name(*parent, name))
                return true;
        }
    }
    return false;
}

const CSchemaClassBinding& C_BaseEntity::GetBinding() const
{
    const auto* result = CallVFunc<0, CSchemaClassBinding*>();
    if (!result)
        throw std::runtime_error{ "C_BaseEntity::GetBinding returned nullptr!" };
    return *result;
}

bool C_BaseEntity::IsInstanceOfClass(const std::string_view& cls) const
{
    const auto& binding = GetBinding();
    if (binding.GetName() == cls)
        return true;
    else
        return helper_check_hierarchy_for_name(binding, cls);
    return false;
}
 
Сверху Снизу