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

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

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


не работает ну я пытался:
Expand Collapse Copy
void Inventory() {
        for (int i = 0; i < 10; i++)
        {
            ui item = (*(ui*)entity + m_Inventory + i * 4);
            cout << i << ": " << *(cc*)(item + 0x58) << endl;
        }
    }
 
CHandle< C_BaseEntity >[32] m_hAbilities(offset 0xcd0)
std::array<CHandle<C_BaseEntity>, 32> в помощь.
CGameEntitySystem::GetInstance().GetEntityByHandle(arr.at(0));
...
не очень понял но мне нужно это найти в ентити листе я про предмет ?
 
что тут не понятного? предметы и абилки это сущности. в нетварах лежат их хендлы.
Пожалуйста, авторизуйтесь для просмотра ссылки.
дает краш:
Expand Collapse Copy
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;
            }
        }
    }

аа не получаеотся(
 
Последнее редактирование:
дает краш:
Expand Collapse Copy
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;
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
не забудь про чеки
C++:
Expand Collapse Copy
    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( );
        // ...
    }
 
ну возможно стоит начать писать на с++ а не на с для начала
for(const auto& handle : ent.m_Inventory.m_hItems)
if(handle.IsValid()) std::cout << CGameEntitySystem::GetInstance().GetEntityByHandle(handle).GetName() << std::endl;
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
спасибо) но я сделал чуть легче
1651490676925.png
 
не забудь про чеки
C++:
Expand Collapse Copy
    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 ?
 
не забудь про чеки
C++:
Expand Collapse Copy
    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:
Expand Collapse Copy
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 если бы знал я бы уже нашел)



моя система ентити:
Expand Collapse Copy
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));
    }
}
 
Последнее редактирование:
а можешь пожалуйста подсказать как получить ентити у меня нету g_entity_system


code:
Expand Collapse Copy
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 и тд
Код:
Expand Collapse Copy
CHandle< C_BaseEntity >[19] m_hItems(offset 0x20)
        + MNetworkEnable
C++:
Expand Collapse Copy
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");
    }
};
 
энтитисистема содержит в себе 64 листа с айдентитями по 512 записей каждый лист.(32768 всего)(листы на +0x10 лежат)
это значит что индексы идут от 0 до (64*512) - 1. минус один потому что ноль это тоже индекс. то есть от 0 до 32767(aka 0x7fff). поэтому хендл и умножают битово на 0x7fff чтобы получить индекс( & 0x7fff).
я тебе уже говорил - не насилуй ни габена ни себя, юзай std::array<CHandle<C_BaseEntity>, 19> не надо какихто оффсетов хуетов индексов i < 32 и тд
Код:
Expand Collapse Copy
CHandle< C_BaseEntity >[19] m_hItems(offset 0x20)
        + MNetworkEnable
C++:
Expand Collapse Copy
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, забыл переименовать :)
ХЕЕлп
 
у меня своя сисьема ентити но насколько я понял это позиция в листе item_idx

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

ХЕЕлп
в нетваре лежат 19 штук CHandle. CHandle это индекс+сериал запакованные. получение индекса из CHandle тебе только что скинули. получение сущности по индексу тебе только что скинули. что тебе еще надо?
у лвсс точно такой же код. и у всех других людей он тоже точно такой же.
Пожалуйста, авторизуйтесь для просмотра ссылки.
я так и не понимаю в чем проблема? что конкретно ты не можешь понять?
 
{ 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 тебе только что скинули. получение сущности по индексу тебе только что скинули. что тебе еще надо?
у лвсс точно такой же код. и у всех других людей он тоже точно такой же.
Пожалуйста, авторизуйтесь для просмотра ссылки.
я так и не понимаю в чем проблема? что конкретно ты не можешь понять?
ладно похуй, спасибо за помощь!
ладно похуй (я слишком тупой для этого всего), спасибо за помощь!
 
я сделал наконец таки не один конечно но сделал
 

Вложения

  • E4CF60D6-0E08-4F8E-8440-4EB47BF4FF88.png
    E4CF60D6-0E08-4F8E-8440-4EB47BF4FF88.png
    1.3 MB · Просмотры: 71
я сделал наконец таки не один конечно но сделал
example:
Expand Collapse Copy
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);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
 
допустим 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 будет.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
допустим 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 февраля и я далеко в них не гений а до этого только джс и питон где вприцепе типизации не было
 

Вложения

  • 6F96809F-85E4-4389-BE00-AF1BCE6617DB.png
    6F96809F-85E4-4389-BE00-AF1BCE6617DB.png
    718.3 KB · Просмотры: 62
Последнее редактирование:
Назад
Сверху Снизу