Вопрос Идеи с m_Inventory и m_hAbilities

Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
Я не очень выкупаю как мне пройтись к примеру по инвентарю чтобы получить предметы моего героя таже проблемка с способностями

хотябы просто имена по типу index 0: item_blinkdagger


не работает ну я пытался:
void Inventory() {
        for (int i = 0; i < 10; i++)
        {
            ui item = (*(ui*)entity + m_Inventory + i * 4);
            cout << i << ": " << *(cc*)(item + 0x58) << endl;
        }
    }
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
CHandle< C_BaseEntity >[32] m_hAbilities(offset 0xcd0)
std::array<CHandle<C_BaseEntity>, 32> в помощь.
CGameEntitySystem::GetInstance().GetEntityByHandle(arr.at(0));
...
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
CHandle< C_BaseEntity >[32] m_hAbilities(offset 0xcd0)
std::array<CHandle<C_BaseEntity>, 32> в помощь.
CGameEntitySystem::GetInstance().GetEntityByHandle(arr.at(0));
...
не очень понял но мне нужно это найти в ентити листе я про предмет ?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
что тут не понятного? предметы и абилки это сущности. в нетварах лежат их хендлы.
Пожалуйста, авторизуйтесь для просмотра ссылки.
дает краш:
void Inventory() {
        for (int i = 0; i < 32; i++)
        {
            ui item_addr = (*(ui*)entity + m_Inventory + i * 4);
            Entity item{ item_addr };

            if (item.IsValid()) {
                cout << i << ": " << item.GetName() << endl;
            }
        }
    }
аа не получаеотся(
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
дает краш:
void Inventory() {
        for (int i = 0; i < 32; i++)
        {
            ui item_addr = (*(ui*)entity + m_Inventory + i * 4);
            Entity item{ item_addr };

            if (item.IsValid()) {
                cout << i << ": " << item.GetName() << endl;
            }
        }
    }
аа не получаеотся(
ну возможно стоит начать писать на с++ а не на с для начала
for(const auto& handle : ent.m_Inventory.m_hItems)
if(handle.IsValid()) std::cout << CGameEntitySystem::GetInstance().GetEntityByHandle(handle).GetName() << std::endl;
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
smoking on that #pragma pack
Пользователь
Статус
Оффлайн
Регистрация
10 Янв 2018
Сообщения
324
Реакции[?]
96
Поинты[?]
1K
не забудь про чеки
C++:
    for( auto offset = 0x0020; offset < 0x0064; offset += 0x0004 )
    {
        const auto item_list = entity->m_Inventory( );
        const auto item_idx = memory.Read< std::uint32_t >( inventory_list + offset ) & 0x7FFF;
        const auto item_ent = global::g_entity_system->GetBaseEntity( item_idx );
        const auto item_name = item_ent->GetClassName( );
        // ...
    }
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
ну возможно стоит начать писать на с++ а не на с для начала
for(const auto& handle : ent.m_Inventory.m_hItems)
if(handle.IsValid()) std::cout << CGameEntitySystem::GetInstance().GetEntityByHandle(handle).GetName() << std::endl;
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
спасибо) но я сделал чуть легче
1651490676925.png
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
не забудь про чеки
C++:
    for( auto offset = 0x0020; offset < 0x0064; offset += 0x0004 )
    {
        const auto item_list = entity->m_Inventory( );
        const auto item_idx = memory.Read< std::uint32_t >( inventory_list + offset ) & 0x7FFF;
        const auto item_ent = global::g_entity_system->GetBaseEntity( item_idx );
        const auto item_name = item_ent->GetClassName( );
        // ...
    }
а что за переменная inventory_list ?
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
не забудь про чеки
C++:
    for( auto offset = 0x0020; offset < 0x0064; offset += 0x0004 )
    {
        const auto item_list = entity->m_Inventory( );
        const auto item_idx = memory.Read< std::uint32_t >( inventory_list + offset ) & 0x7FFF;
        const auto item_ent = global::g_entity_system->GetBaseEntity( item_idx );
        const auto item_name = item_ent->GetClassName( );
        // ...
    }
а можешь пожалуйста подсказать как получить ентити у меня нету g_entity_system


code:
void Inventory() {
        const auto inventory_list = *(ui*)(*(ui*)entity + m_Inventory);

        for (auto offset = 0x0020; offset < 0x0064; offset += 0x0004) {
            const auto item_idx = *(ui*)(inventory_list + offset) & 0x7FFF;

            //EList лист с адресами на ентити в формате ui (unsigned long long)
            for (auto E : EList) {
                Entity ent{ E }; //переделываю голый адрес в класс

                if (ent.IsValid()) { //если ентити валид
                    if (ent. //с чем я тут могу сравнить == item_idx) {
                        cout << offset << ") " << ent.GetName() << endl;
                        break;
                    }
                }
            }

        }
    };
просто я не понимаю что такое item_idx если бы знал я бы уже нашел)



моя система ентити:
DWORD EntitySystem(LPVOID lpReserved) {
    while (true) {
        if (inMatch) {
            ui ent = *(ui*)(CGameEntSystem + 0x210);

            if (ent) {
                if (*(ui*)(ent)) {
                    Entity entity{ ent };
                    EListTemp.push_back(ent);
                    EntListTemp.push_back(entity);
                }
                else {
                    continue;
                }
            }
            else {
                continue;
            }

            while (ent) {
                ent = *(ui*)(ent + 0x58);

                if (ent) {
                    if (*(ui*)(ent)) {
                        Entity entity{ ent };

                        EListTemp.push_back(ent);
                        EntListTemp.push_back(entity);
                    }
                }
            }

            EList = EListTemp;
            EntList = EntListTemp;
            EListTemp.clear();
            EntListTemp.clear();
        }
        else {
            EListTemp.clear();
            EntListTemp.clear();
            LocalEntity = Entity{ 0 };
            EntList = EntListTemp;
            EList = EListTemp;
            this_thread::sleep_for(chrono::milliseconds(1000));
        }
        
        this_thread::sleep_for(chrono::milliseconds(100));
    }
}
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
а можешь пожалуйста подсказать как получить ентити у меня нету g_entity_system


code:
void Inventory() {
        const auto inventory_list = *(ui*)(*(ui*)entity + m_Inventory);

        for (auto offset = 0x0020; offset < 0x0064; offset += 0x0004) {
            const auto item_idx = *(ui*)(inventory_list + offset) & 0x7FFF;

            //EList лист с адресами на ентити в формате ui (unsigned long long)
            for (auto E : EList) {
                Entity ent{ E }; //переделываю голый адрес в класс

                if (ent.IsValid()) { //если ентити валид
                    if (ent. //с чем я тут могу сравнить == item_idx) {
                        cout << offset << ") " << ent.GetName() << endl;
                        break;
                    }
                }
            }

        }
    };
энтитисистема содержит в себе 64 листа с айдентитями по 512 записей каждый лист.(32768 всего)(листы на +0x10 лежат)
это значит что индексы идут от 0 до (64*512) - 1. минус один потому что ноль это тоже индекс. то есть от 0 до 32767(aka 0x7fff). поэтому хендл и умножают битово на 0x7fff чтобы получить индекс( & 0x7fff).
я тебе уже говорил - не насилуй ни габена ни себя, юзай std::array<CHandle<C_BaseEntity>, 19> не надо какихто оффсетов хуетов индексов i < 32 и тд
Код:
CHandle< C_BaseEntity >[19] m_hItems(offset 0x20)
        + MNetworkEnable
C++:
export constexpr auto MAX_ENTITIES_PER_LIST = 512;
export constexpr auto MAX_ENTITY_LISTS = 64;
export constexpr auto ENTITYSYSTEM_CAPACITY = MAX_ENTITY_LISTS * MAX_ENTITIES_PER_LIST;
...
export
template<class T>
class CHandle
{
    std::uint32_t data{};
    static inline constexpr auto ENTITYHANDLE_MASK = ENTITYSYSTEM_CAPACITY - 1;
public:
    EntityIndex_t GetIndex() const noexcept
    {
        return { data & ENTITYHANDLE_MASK };
    }
    bool IsValid() const noexcept
    {
        return data != std::numeric_limits<std::uint32_t>::max();
    }
};
...
    template<class T = C_BaseEntity>
    T& GetEntityByIndex(EntityIndex_t idx) const
    {
        if (const auto hi_idx = GetHighestIndex(); hi_idx.IsValid())
        {
            if (idx.IsValid() && idx <= hi_idx && idx < ENTITYSYSTEM_CAPACITY)
            {
                const auto list_index = idx.Get() / MAX_ENTITIES_PER_LIST;
                const auto index_in_list = idx.Get() % MAX_ENTITIES_PER_LIST;
                if (auto list = GetEntityLists().at(list_index); list != nullptr)
                {
                    if (auto entity = list->at(index_in_list).entity; entity != nullptr)
                        return static_cast<T&>(*entity);
                }
            }
        }
        throw std::runtime_error
        {
            std::format("CGameEntitySystem::GetEntityByIndex -> no entity found by idx({})", idx.Get())
        };
    }
...
    const auto& GetInventory() const
    {
        return SchemaMember<C_DOTA_UnitInventory>
            ("client.dll/C_DOTA_BaseNPC/m_Inventory");
    }
...
export
class C_DOTA_UnitInventory : public SchematicClass
{
public:
    const auto& GetItems() const
    {
        return SchemaMember<std::array<CHandle<C_BaseEntity>, 19>>
            ("client.dll/C_DOTA_UnitInventory/m_hItems");
    }
};
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
энтитисистема содержит в себе 64 листа с айдентитями по 512 записей каждый лист.(32768 всего)(листы на +0x10 лежат)
это значит что индексы идут от 0 до (64*512) - 1. минус один потому что ноль это тоже индекс. то есть от 0 до 32767(aka 0x7fff). поэтому хендл и умножают битово на 0x7fff чтобы получить индекс( & 0x7fff).
я тебе уже говорил - не насилуй ни габена ни себя, юзай std::array<CHandle<C_BaseEntity>, 19> не надо какихто оффсетов хуетов индексов i < 32 и тд
Код:
CHandle< C_BaseEntity >[19] m_hItems(offset 0x20)
        + MNetworkEnable
C++:
export constexpr auto MAX_ENTITIES_PER_LIST = 512;
export constexpr auto MAX_ENTITY_LISTS = 64;
export constexpr auto ENTITYSYSTEM_CAPACITY = MAX_ENTITY_LISTS * MAX_ENTITIES_PER_LIST;
...
export
template<class T>
class CHandle
{
    std::uint32_t data{};
    static inline constexpr auto ENTITYHANDLE_MASK = ENTITYSYSTEM_CAPACITY - 1;
public:
    EntityIndex_t GetIndex() const noexcept
    {
        return { data & ENTITYHANDLE_MASK };
    }
    bool IsValid() const noexcept
    {
        return data != std::numeric_limits<std::uint32_t>::max();
    }
};
...
    template<class T = C_BaseEntity>
    T& GetEntityByIndex(EntityIndex_t idx) const
    {
        if (const auto hi_idx = GetHighestIndex(); hi_idx.IsValid())
        {
            if (idx.IsValid() && idx <= hi_idx && idx < ENTITYSYSTEM_CAPACITY)
            {
                const auto list_index = idx.Get() / MAX_ENTITIES_PER_LIST;
                const auto index_in_list = idx.Get() % MAX_ENTITIES_PER_LIST;
                if (auto list = GetEntityLists().at(list_index); list != nullptr)
                {
                    if (auto entity = list->at(index_in_list).entity; entity != nullptr)
                        return static_cast<T&>(*entity);
                }
            }
        }
        throw std::runtime_error
        {
            std::format("CGameEntitySystem::GetEntityByIndex -> no entity found by idx({})", idx.Get())
        };
    }
...
    const auto& GetInventory() const
    {
        return SchemaMember<C_DOTA_UnitInventory>
            ("client.dll/C_DOTA_BaseNPC/m_Inventory");
    }
...
export
class C_DOTA_UnitInventory : public SchematicClass
{
public:
    const auto& GetItems() const
    {
        return SchemaMember<std::array<CHandle<C_BaseEntity>, 19>>
            ("client.dll/C_DOTA_UnitInventory/m_hItems");
    }
};
у меня своя сисьема ентити но насколько я понял это позиция в листе item_idx

Entities[item_idx] = моя ентити будет?
item_list, забыл переименовать :)
ХЕЕлп
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
у меня своя сисьема ентити но насколько я понял это позиция в листе item_idx

Entities[item_idx] = моя ентити будет?

ХЕЕлп
в нетваре лежат 19 штук CHandle. CHandle это индекс+сериал запакованные. получение индекса из CHandle тебе только что скинули. получение сущности по индексу тебе только что скинули. что тебе еще надо?
у лвсс точно такой же код. и у всех других людей он тоже точно такой же.
Пожалуйста, авторизуйтесь для просмотра ссылки.
я так и не понимаю в чем проблема? что конкретно ты не можешь понять?
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
{ const auto item_list = entity->m_Inventory( ); const auto item_idx = memory.Read< std::uint32_t >( inventory_list + offset ) & 0x7FFF; const auto item_ent = global::g_entity_system->GetBaseEntity( item_idx ); const auto item_name = item_ent->GetClassName( ); // ..
в нетваре лежат 19 штук CHandle. CHandle это индекс+сериал запакованные. получение индекса из CHandle тебе только что скинули. получение сущности по индексу тебе только что скинули. что тебе еще надо?
у лвсс точно такой же код. и у всех других людей он тоже точно такой же.
Пожалуйста, авторизуйтесь для просмотра ссылки.
я так и не понимаю в чем проблема? что конкретно ты не можешь понять?
ладно похуй, спасибо за помощь!
ладно похуй (я слишком тупой для этого всего), спасибо за помощь!
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
я сделал наконец таки не один конечно но сделал
example:
void GetInventory(vector<Entity> &out) {
        for (int i = 0; i < 32; i++)
        {   
            if (this->IsValid()) { //without this crash 90%
                if (*(ui*)entity + m_Inventory) {
                    uint64_t item_handle = *(uint64_t*)(*(ui*)entity + m_Inventory + i * 4) & 0x7FFF;

                    if (item_handle) {
                        for (const auto& ent : Entities) {
                            if (*(uint64_t*)(ent)) {
                                uint64_t handle = *(uint64_t*)(ent + 0x10) & 0x7FFF;

                                if (item_handle == handle) {
                                    Entity entobj{ ent };
                                    out.push_back(entobj);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
допустим CHandle это не просто uint64_t а класс(да и даже размер не 8 байт. считывтать uint64_t - ошибка).
и вместо 0x7FFF замени на ENTITYHANDLE_MASK для ясности(пока ты не ошибся и не написал где-нибудь 7ff или 7ffff + чтобы ты понимал откуда это число берется) да и ваще все это в CHandle::GetIndex заверни вместо того чтобы в каждом месте побитово умножать. и в инвентаре не 32 шмотки я не знаю откуда ты это взял.
m_Inventory это не итемы. это инвентарь. m_Inventory.m_hItems вот это уже итемы.
ну и конечно
void GetInventory(vector<Entity> &out)
можно спокойно заменить для ясности на
vector<Entity> GetInventory()
тебе энивей просто мувнет этот вектор или даже полный RVO будет.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
допустим CHandle это не просто uint64_t а класс(да и даже размер не 8 байт. считывтать uint64_t - ошибка).
и вместо 0x7FFF замени на ENTITYHANDLE_MASK для ясности(пока ты не ошибся и не написал где-нибудь 7ff или 7ffff + чтобы ты понимал откуда это число берется) да и ваще все это в CHandle::GetIndex заверни вместо того чтобы в каждом месте побитово умножать. и в инвентаре не 32 шмотки я не знаю откуда ты это взял.
m_Inventory это не итемы. это инвентарь. m_Inventory.m_hItems вот это уже итемы.
ну и конечно
void GetInventory(vector<Entity> &out)
можно спокойно заменить для ясности на
vector<Entity> GetInventory()
тебе энивей просто мувнет этот вектор или даже полный RVO будет.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
вроде де бы

6 шмотко главный инветарь 9 шмоток стеш слот для тп + слот для нейтралки
получается 17 ( ну 32 взял чтобы точно попало) я один хуй там везде проверку влепил на валидность чтобы не крашнуло

про 0x7FFF уже запомнил наизусть не вижу смысла отводить отдельный вар для него

про итемс чутка не понял все и так работает и про uint64_t я просто взял хендл итема и сравнил с хендлами в моем ентити листе

ну и про функу мне удобнее передавать в нее ссылку на вектор чем создавать новый вектор )

работает и не крашит ну впринцепе и похуй а CHandle тоже впадлу делать у меня такой гавно код стайл как ты понял потому что впервый я узнал что такое плюсы 20 февраля и я далеко в них не гений а до этого только джс и питон где вприцепе типизации не было
 

Вложения

Последнее редактирование:
Сверху Снизу