Гайд Продолжение серии. шема(оффсеты)+локал игрок

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
игроков кстати переделали.
движок теперь возвращает PlayerSlot_t(обертка на инт).
PlayerSlot_t это EntityIndex_t(это я просто индекс сущности(инт) завернул красиво) минус один.(перевод слота в индекс = слот + 1. перевод индекса в слот = индекс - 1)
так вот.
бтв забыл сказать убрали CDOTAPlayer, добавили C_DOTAPlayerController вместо него(и еще там есть CDOTAPlayerPawn. в моём дампе выше все есть он актуальный).
берем с движка плеер слот, делаем индекс сущности(прибавляем 1 к слоту), находим сущность по индексу, получаем C_DOTAPlayerController .
у него кстати есть CHandle< C_BaseEntity > m_hAssignedHero это наш герой(его может не быть, например на стадии пика. тогда CHandle будет 0xFFFFFFFF. так что не забывайте чекать)
также у него есть PlayerID_t m_nPlayerID.
PlayerID_t это индекс в массиве плеер ресурсов.
находим C_DOTA_PlayerResource(это глобал g_pDOTAPlayerResource ищите в дилибах)
у него есть m_vecPlayerData.
берем m_vecPlayerData.at(m_nPlayerID) и получаем PlayerResourcePlayerData_t нашего локального игрока.
также можем взять m_vecPlayerTeamData.at(m_nPlayerID) и получаем PlayerResourcePlayerTeamData_t, там хранится голда левел и прочая хуита.
если же мы хотим проитерировать других игроков, то:
берем ресурс.
итерируем каждый m_vecPlayerData. в нем есть PlayerSlot_t m_nPlayerSlot. думаю понятно что с ним делать(переводить в индекс и находить сущность по индексу).
получаем C_DOTAPlayerController.
в нем есть m_hAssignedHero это герой игрока, и еще есть CBasePlayerController::m_iszPlayerName это имя которое показывается в скорборде.
(возможно кстати я в чём-то ошибаюсь, я особо много не тестил, вроде все работает. кр4 пишите если че)
1650150043600.png
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
итерируем каждый m_vecPlayerData. в нем есть PlayerSlot_t m_nPlayerSlot. думаю понятно что с ним делать(переводить в индекс и находить сущность по индексу).
как я понял векплеертимдата это std::vector(ведь там .at есть)
делаю так

C++:
const std::vector<PlayerResourcePlayerTeamData_t>& vec_teamdata{ *reinterpret_cast<std::vector<PlayerResourcePlayerTeamData_t>*>(global::g_pDOTAPlayerResource + global::offsets::m_vecPlayerTeamData) };

for (const PlayerResourcePlayerTeamData_t& teamdata : vec_teamdata) {
    std::cout << "hero: " << teamdata.m_hSelectedHero << ", level: " << teamdata.m_iLevel << std::endl;
}
но vec_teamdata.size всегда 0 почему-то, знаешь в чем проблема?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
как я понял векплеертимдата это std::vector(ведь там .at есть)
делаю так

C++:
const std::vector<PlayerResourcePlayerTeamData_t>& vec_teamdata{ *reinterpret_cast<std::vector<PlayerResourcePlayerTeamData_t>*>(global::g_pDOTAPlayerResource + global::offsets::m_vecPlayerTeamData) };

for (const PlayerResourcePlayerTeamData_t& teamdata : vec_teamdata) {
    std::cout << "hero: " << teamdata.m_hSelectedHero << ", level: " << teamdata.m_iLevel << std::endl;
}
но vec_teamdata.size всегда 0 почему-то, знаешь в чем проблема?
это CUtlVector(габеновская хуита) а не std::vector(стд хуита).
C++:
C_UtlVectorEmbeddedNetworkVar< PlayerResourcePlayerData_t > m_vecPlayerData(offset 0x5e8)
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
это CUtlVector(габеновская хуита) а не std::vector(стд хуита).
C++:
C_UtlVectorEmbeddedNetworkVar< PlayerResourcePlayerData_t > m_vecPlayerData(offset 0x5e8)
C++:
CUtlVector< PlayerResourcePlayerTeamData_t >* teamdata = reinterpret_cast<CUtlVector< PlayerResourcePlayerTeamData_t >*>(global::g_pDOTAPlayerResource + global::offsets::m_vecPlayerTeamData);   
for (int i = 0; i < teamdata->Count(); i++) {
        std::cout << teamdata->operator[](i).m_iLevel << std::endl;
}
взял у mcdota класс, тут тоже nullptr всё
1659855909718.png
мб надо в паблика надо делать это?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
C++:
CUtlVector< PlayerResourcePlayerTeamData_t >* teamdata = reinterpret_cast<CUtlVector< PlayerResourcePlayerTeamData_t >*>(global::g_pDOTAPlayerResource + global::offsets::m_vecPlayerTeamData);  
for (int i = 0; i < teamdata->Count(); i++) {
        std::cout << teamdata->operator[](i).m_iLevel << std::endl;
}
взял у mcdota класс, тут тоже nullptr всё
Посмотреть вложение 215705
мб надо в паблика надо делать это?
нет в демке все работать должно.
в реклассе посмотри че там как
1659857175100.png
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
нет в демке все работать должно.
в реклассе посмотри че там как
Посмотреть вложение 215706
хуета какая-то тут
1659862649036.png
1659862659076.png
мб я как-то не так получаю?
C++:
uintptr_t dota_player_resouce_pattern = util::FindPattern("client.dll", "48 8B 0D ? ? ? ? E8 ? ? ? ? 3D ? ? ? ?");
if (!dota_player_resouce_pattern) {
    MessageBoxA(0, "dota_player_resouce_pattern = nullptr", 0, MB_ICONERROR);
    return;
}
global::g_pDOTAPlayerResource = util::GetAbsoluteAddress(dota_player_resouce_pattern, 3, 7);


CUtlVector< PlayerResourcePlayerTeamData_t >* teamdata = reinterpret_cast<CUtlVector< PlayerResourcePlayerTeamData_t >*>(global::g_pDOTAPlayerResource + global::offsets::m_vecPlayerTeamData);
1659862796938.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
хуета какая-то тут
Посмотреть вложение 215717
Посмотреть вложение 215718
мб я как-то не так получаю?
C++:
uintptr_t dota_player_resouce_pattern = util::FindPattern("client.dll", "48 8B 0D ? ? ? ? E8 ? ? ? ? 3D ? ? ? ?");
if (!dota_player_resouce_pattern) {
    MessageBoxA(0, "dota_player_resouce_pattern = nullptr", 0, MB_ICONERROR);
    return;
}
global::g_pDOTAPlayerResource = util::GetAbsoluteAddress(dota_player_resouce_pattern, 3, 7);


CUtlVector< PlayerResourcePlayerTeamData_t >* teamdata = reinterpret_cast<CUtlVector< PlayerResourcePlayerTeamData_t >*>(global::g_pDOTAPlayerResource + global::offsets::m_vecPlayerTeamData);
Посмотреть вложение 215719
сига правильная(токо можно вопросики с конца убрать(... 3D ? ? ? ?) - они бесполезные)
бля так ты не считываешь нихуя
global::g_pDOTAPlayerResource
это УКАЗАТЕЛЬ НА ПЕРЕМЕННУЮ ГДЕ ХРАНИТСЯ УКАЗАТЕЛЬ НА C_DOTA_PlayerResource.
это C_DOTA_PlayerResource**
сначала с него считай C_DOTA_PlayerResource*, чекни его на ноль, и потом к нему уже прибавляй
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
сига правильная(токо можно вопросики с конца убрать(... 3D ? ? ? ?) - они бесполезные)
бля так ты не считываешь нихуя
global::g_pDOTAPlayerResource
это УКАЗАТЕЛЬ НА ПЕРЕМЕННУЮ ГДЕ ХРАНИТСЯ УКАЗАТЕЛЬ НА C_DOTA_PlayerResource.
это C_DOTA_PlayerResource**
сначала с него считай C_DOTA_PlayerResource*, чекни его на ноль, и потом к нему уже прибавляй
теперь считал

C++:
        uintptr_t resource = *reinterpret_cast<uintptr_t*>(global::g_pDOTAPlayerResource);
        if (resource) {
            CUtlVector< PlayerResourcePlayerTeamData_t >* teamdata = reinterpret_cast<CUtlVector< PlayerResourcePlayerTeamData_t >*>(resource+global::offsets::m_vecPlayerTeamData);

            for (int i = 0; i < teamdata->Count(); i++) {
                std::cout << teamdata->operator[](i).m_iLevel << std::endl;
            }
        }
m_Size = 1 значит там что-то есть
1659954199327.png
но m_iLevel всегда 0 выводит
1659954448065.png
да и примал бист врядли 485 ид будет
в реклассе тимдата вроде нормальная
1659954287564.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
теперь считал

C++:
        uintptr_t resource = *reinterpret_cast<uintptr_t*>(global::g_pDOTAPlayerResource);
        if (resource) {
            CUtlVector< PlayerResourcePlayerTeamData_t >* teamdata = reinterpret_cast<CUtlVector< PlayerResourcePlayerTeamData_t >*>(resource+global::offsets::m_vecPlayerTeamData);

            for (int i = 0; i < teamdata->Count(); i++) {
                std::cout << teamdata->operator[](i).m_iLevel << std::endl;
            }
        }
m_Size = 1 значит там что-то есть
Посмотреть вложение 215932
но m_iLevel всегда 0 выводит
Посмотреть вложение 215935
да и примал бист врядли 485 ид будет
в реклассе тимдата вроде нормальная
Посмотреть вложение 215933
у меня все норм
1659929525600.png
могу тебе только посоветовать научиться логать и дебажить. возьми логни адрес &m_iLevel и сравни его с реальным адресом в реклассе, убедись что совпадают
ну и прекрати оператор[] вызывать таким образом)) вместо указателя сделай референс и просто пиши teamdata [ i ] (югейм не любит [ i ] без пробелов поэтому так пишу)
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
у меня все норм
Посмотреть вложение 215936
могу тебе только посоветовать научиться логать и дебажить. возьми логни адрес &m_iLevel и сравни его с реальным адресом в реклассе, убедись что совпадают
ну и прекрати оператор[] вызывать таким образом)) вместо указателя сделай референс и просто пиши teamdata [ i ] (югейм не любит [ i ] без пробелов поэтому так пишу)
а как можно получить оттуда(или не оттуда) DataTeamPlayer_t? хочу нетворс и кол-во добитых крипов получить
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
а как можно получить оттуда(или не оттуда) DataTeamPlayer_t? хочу нетворс и кол-во добитых крипов получить
CScriptBindingPR_Players::Players.GetLastHits( integer nPlayerID ) чекай
есть некий std::array<C_DOTA_DataNonSpectator*, DOTATeam_t::DOTA_TEAM_COUNT> TeamList (хреф на него можно найти как раз в этом GetLastHits. либо над строчным хрефом "Shapes key is not valid in ward placement file\n" почти в самом начале функи(+0x40) lea r12, [TeamList])
из него берешь
TeamList[entity->m_iTeamNum] получаешь C_DOTA_DataNonSpectator, там есть m_vecDataTeam, там DataTeamPlayer_t
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
CScriptBindingPR_Players::Players.GetLastHits( integer nPlayerID ) чекай
есть некий std::array<C_DOTA_DataNonSpectator*, DOTATeam_t::DOTA_TEAM_COUNT> TeamList (хреф на него можно найти как раз в этом GetLastHits. либо над строчным хрефом "Shapes key is not valid in ward placement file\n" почти в самом начале функи(+0x40) lea r12, [TeamList])
из него берешь
TeamList[entity->m_iTeamNum] получаешь C_DOTA_DataNonSpectator, там есть m_vecDataTeam, там DataTeamPlayer_t
из тимлиста вроде только нетворс команды получить можно, вроде как у меня получилось а вот фукнция гетластхитс почему-то всегда 0 возвращает
находил вот так:
1661698413747.png
1661698432782.png
ну и вот она:
1661698451883.pngкод:

C++:
            const auto pid = reinterpret_cast<CBaseEntity*>(global::g_LocalEntity)->GetPlayerOwnerID();
            const auto res = (((uintptr_t(__fastcall*)(uintptr_t, int))
                util::FindPattern("client.dll", "4C 8B C9 85 D2 0F 88 ? ? ? ? 3B 91 A0 05 00 00 0F 8D ? ? ? ? 48 8B 81 F0 05 00 00 4C 63 D2 4F 8D 04 52 49 C1 E0 ? 41 80 7C 00 20 ? 0F 84 ? ? ? ? 45 8B 44 00 30 41 8D 40 FE 83 F8 ? 76 ? 41 8D 40 FA 83 F8 ? 77 ? 48 8B 05 ? ? ? ? 83 78 58 ? 74 ? 48 8B 05 ? ? ? ? 8B 48 58 0F A3 D1 73 ? 41 83 F8 ? 77 ? 41 8B C0 4C 8D 05 ? ? ? ? 4D 8B 04 C0 4D 85 C0 74 ? 49 8B 81 A8 05 00 00 49 69 CA ? ? ? ? 48 63 94 01 DC 00 00 00 85 D2 78 ? 41 3B 90 88 05 00 00 7D ? 48 69 CA ? ? ? ? 49 03 88 90 05 00 00 74 ? 8B 81 84 00 00 00"))
                (global::g_pDOTAPlayerResource, pid));
            std::cout << res << std::endl;

int GetPlayerOwnerID() {
        if (!this->DoesExists()) return 0;
        return *reinterpret_cast<int*>(this + global::offsets::m_nPlayerOwnerID);
    }
чекнул в дебагере, вторым аргом передается либо 0либо 3. пробовал передать 0, 1, 2 ,3. всегда 0 возвращает также и с функцией C_DOTA_PlayerResource::GetNetWorthOfPlayer. Тоже всегда 0, не пойму в чем проблема
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
из тимлиста вроде только нетворс команды получить можно, вроде как у меня получилось а вот фукнция гетластхитс почему-то всегда 0 возвращает
находил вот так:
Посмотреть вложение 218705
Посмотреть вложение 218706
ну и вот она:
Посмотреть вложение 218707код:

C++:
            const auto pid = reinterpret_cast<CBaseEntity*>(global::g_LocalEntity)->GetPlayerOwnerID();
            const auto res = (((uintptr_t(__fastcall*)(uintptr_t, int))
                util::FindPattern("client.dll", "4C 8B C9 85 D2 0F 88 ? ? ? ? 3B 91 A0 05 00 00 0F 8D ? ? ? ? 48 8B 81 F0 05 00 00 4C 63 D2 4F 8D 04 52 49 C1 E0 ? 41 80 7C 00 20 ? 0F 84 ? ? ? ? 45 8B 44 00 30 41 8D 40 FE 83 F8 ? 76 ? 41 8D 40 FA 83 F8 ? 77 ? 48 8B 05 ? ? ? ? 83 78 58 ? 74 ? 48 8B 05 ? ? ? ? 8B 48 58 0F A3 D1 73 ? 41 83 F8 ? 77 ? 41 8B C0 4C 8D 05 ? ? ? ? 4D 8B 04 C0 4D 85 C0 74 ? 49 8B 81 A8 05 00 00 49 69 CA ? ? ? ? 48 63 94 01 DC 00 00 00 85 D2 78 ? 41 3B 90 88 05 00 00 7D ? 48 69 CA ? ? ? ? 49 03 88 90 05 00 00 74 ? 8B 81 84 00 00 00"))
                (global::g_pDOTAPlayerResource, pid));
            std::cout << res << std::endl;

int GetPlayerOwnerID() {
        if (!this->DoesExists()) return 0;
        return *reinterpret_cast<int*>(this + global::offsets::m_nPlayerOwnerID);
    }
чекнул в дебагере, вторым аргом передается либо 0либо 3. пробовал передать 0, 1, 2 ,3. всегда 0 возвращает также и с функцией C_DOTA_PlayerResource::GetNetWorthOfPlayer. Тоже всегда 0, не пойму в чем проблема
бля че ты мне тут заливаешь
1661707528600.png
1661707501300.png

1661707513100.png
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
так это для всей команды, разве нет? а почему функции то 0 возвращают?
ты мб в игру зайдешь и проверишь или дамп шемы откроешь? не пробовал?
зачем тебе функции когда у тебя есть нетвары халявные
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
ты мб в игру зайдешь и проверишь или дамп шемы откроешь? не пробовал?
зачем тебе функции когда у тебя есть нетвары халявные
потому что как я думал по функциям(если функции бы не 0 всегда возвращали) можно было бы с энтити (героя) получать ластхиты

окей я нашёл для 1 игрока команды его нетворс и его кол-во поднятых рун
1661738287702.png
1661738296738.png
но я не пойму как мне для остальных получить
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
потому что как я думал по функциям(если функции бы не 0 всегда возвращали) можно было бы с энтити (героя) получать ластхиты

окей я нашёл для 1 игрока команды его нетворс и его кол-во поднятых рун
Посмотреть вложение 218812
Посмотреть вложение 218813
но я не пойму как мне для остальных получить
:fpalm:
ты дамп шемы открывал? че ты тупишь
C++:
C_DOTA_DataNonSpectator vvv
    C_UtlVectorEmbeddedNetworkVar< DataTeamPlayer_t > m_vecDataTeam(offset 0x588)
        + MNetworkEnable
 
Сверху Снизу