Вопрос Работа с ентити листом

  • Автор темы Автор темы Blackbro
  • Дата начала Дата начала
Imgui Seller
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2023
Сообщения
610
Реакции
64
хочу написать простенький external который будет каждую секунду просматривать хп всех героев на карте и если хп кого-нибудь с вражеской команды будет меньше 400 то это написало бы в консоль.

не очень разобрался в этой теме, но вроде с помощью этого
Пожалуйста, авторизуйтесь для просмотра ссылки.
закинул client.dll и получил оффсет на ентити лист

"dwEntityList": 0x5092190

могу я попросить вас форумчане сделать простую проверку где писало бы в консоль всех героев, и их значение хп.
остальное я все сделаю сам, мне просто понять как работать с ентити листом на C++
 
То есть сделать за тебя всё, а остальное ты сделаешь сам?

Получай интерфейс GameResourceServiceClientV001 (CGameResourceService) из engine2.dll
У него на оффсете 0x58 лежит CGameEntitySystem.
Ждешь начала игры. Например, бегаешь по энтити листу в поисках энтити с binary_name C_DOTAGamerulesProxy, у него на оффсете 0x510 лежит CDOTAGamerules.

C++:
Expand Collapse Copy
enum class DOTA_GAME_STATE {
    INVALID = -1,
    INIT,
    WAIT_FOR_PLAYERS_TO_LOAD,
    HERO_SELECTION,
    STRATEGY_TIME,
    PRE_GAME,
    GAME_IN_PROGRESS,
    POST_GAME,
    DISCONNECT,
    TEAM_SHOWCASE,
    CUSTOM_GAME_SETUP,
    WAIT_FOR_MAP_TO_LOAD,
    SCENARIO_SETUP,
    PLAYER_DRAFT,
    LAST
};

class CDOTAGamerules {
public:
    DOTA_GAME_STATE game_state() const {
        const auto game_state = Memory::read_memory<int>(this + 0x74);
        return game_state.has_value() ? static_cast<DOTA_GAME_STATE>(game_state.value()) : DOTA_GAME_STATE::INVALID;
    }

    bool in_game() const {
        const auto game_state = this->game_state();
        return game_state >= DOTA_GAME_STATE::HERO_SELECTION && game_state <= DOTA_GAME_STATE::GAME_IN_PROGRESS;
    }
};

Находишь локального игрока (C_DOTAPlayerController), по нему находишь локального героя (CBaseEntity), по нему получаешь свою тиму, чтобы хп союзников не итерировать.
C++:
Expand Collapse Copy
class CBaseEntity {
public:
    int team_num() const {
        const auto ptr = vmt.schema_system->get_netvar(this, "C_BaseEntity", "m_iTeamNum");
        return Memory::read_memory<int>(ptr.value()).value_or(-1);
    }
};

Ну и итерируешь и по нетвару m_iHealth смотришь хп.
 
То есть сделать за тебя всё, а остальное ты сделаешь сам?

Получай интерфейс GameResourceServiceClientV001 (CGameResourceService) из engine2.dll
У него на оффсете 0x58 лежит CGameEntitySystem.
Ждешь начала игры. Например, бегаешь по энтити листу в поисках энтити с binary_name C_DOTAGamerulesProxy, у него на оффсете 0x510 лежит CDOTAGamerules.

C++:
Expand Collapse Copy
enum class DOTA_GAME_STATE {
    INVALID = -1,
    INIT,
    WAIT_FOR_PLAYERS_TO_LOAD,
    HERO_SELECTION,
    STRATEGY_TIME,
    PRE_GAME,
    GAME_IN_PROGRESS,
    POST_GAME,
    DISCONNECT,
    TEAM_SHOWCASE,
    CUSTOM_GAME_SETUP,
    WAIT_FOR_MAP_TO_LOAD,
    SCENARIO_SETUP,
    PLAYER_DRAFT,
    LAST
};

class CDOTAGamerules {
public:
    DOTA_GAME_STATE game_state() const {
        const auto game_state = Memory::read_memory<int>(this + 0x74);
        return game_state.has_value() ? static_cast<DOTA_GAME_STATE>(game_state.value()) : DOTA_GAME_STATE::INVALID;
    }

    bool in_game() const {
        const auto game_state = this->game_state();
        return game_state >= DOTA_GAME_STATE::HERO_SELECTION && game_state <= DOTA_GAME_STATE::GAME_IN_PROGRESS;
    }
};

Находишь локального игрока (C_DOTAPlayerController), по нему находишь локального героя (CBaseEntity), по нему получаешь свою тиму, чтобы хп союзников не итерировать.
C++:
Expand Collapse Copy
class CBaseEntity {
public:
    int team_num() const {
        const auto ptr = vmt.schema_system->get_netvar(this, "C_BaseEntity", "m_iTeamNum");
        return Memory::read_memory<int>(ptr.value()).value_or(-1);
    }
};

Ну и итерируешь и по нетвару m_iHealth смотришь хп.
спасибо
 
Держи подгон :З

Скрытое содержимое
хочу написать простенький external который будет каждую секунду просматривать хп всех героев на карте и если хп кого-нибудь с вражеской команды будет меньше 400 то это написало бы в консоль.

не очень разобрался в этой теме, но вроде с помощью этого
Пожалуйста, авторизуйтесь для просмотра ссылки.
закинул client.dll и получил оффсет на ентити лист

"dwEntityList": 0x5092190

могу я попросить вас форумчане сделать простую проверку где писало бы в консоль всех героев, и их значение хп.
остальное я все сделаю сам, мне просто понять как работать с ентити листом на C++
C++:
Expand Collapse Copy
std::vector<C_BaseEntity*> CGameEntitySystem::GetAllEntities() noexcept {
    std::vector<C_BaseEntity*> entities{};

    if (GetLastIndex() >= 0)
    {
        for (std::size_t index = 0; index <= GetLastIndex(); ++index)
        {
            auto identity = GetIdentityByIndex(index);
            if (identity)
            {
                C_BaseEntity* Entity = identity->m_pEntity();
                if (Entity)
                {
                    entities.push_back(Entity);
                }
            }
        }
    }

    return entities;
}
можешь через эту функу просто всех героев гетнуть (ну естественно перед добавлением в вектор, прочекать на C_DOTA_BaseNPC_Hero)
C++:
Expand Collapse Copy
std::vector<C_DOTA_BaseNPC_Hero*> C_DOTA_BaseNPC_Hero::GetAll() {
    std::vector<C_DOTA_BaseNPC_Hero*> Heroes{};
    std::vector<C_BaseEntity*> Entities = GameData::EntitySystem->GetAllEntities();
    for (auto& Entity : Entities) {
        if (Entity->IsHero()) {
            Heroes.push_back((C_DOTA_BaseNPC_Hero*)Entity);
        }
    }

    return Heroes;
}
что-то по типу такого (lastIndex в листе - 0x1520 офсет от CGameEntitySystem)
 
Назад
Сверху Снизу