Вопрос Worldtoscreen

Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
Где сейчас можно найти g_WorldToScreen?
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пытался найти функцию OnRenderStart в client.dll из дилиба, но похожих не нашёл, может как-то ещё можно?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
CDOTAViewRender
четвертый индекс(OnRenderStart)
внутри вызов. это и есть функа с матрицами. правда там не хреф а RVA. но сути это не меняет.
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Где сейчас можно найти g_WorldToScreen?
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пытался найти функцию OnRenderStart в client.dll из дилиба, но похожих не нашёл, может как-то ещё можно?
Ну привет 2000 полигонов.

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

Там буквально рассматривают как найти WorldToScreen.
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
CDOTAViewRender
четвертый индекс(OnRenderStart)
внутри вызов. это и есть функа с матрицами. правда там не хреф а RVA. но сути это не меняет.
это не похоже на функу из дилиба(хотя мб её поменяли так сильно)
1657028844276.png

Ну привет 2000 полигонов.

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

Там буквально рассматривают как найти WorldToScreen.
так я видел этот гайд, но подумал что уже устрело всё
сделал вот так:
typedef char(__fastcall* funcWorldToScreen)(float*, int*, int*, float*);
funcWorldToScreen World2Screen = (funcWorldToScreen)scan_pattern("client.dll", "40 56 41 56 48 83 EC ? 48 89 9C 24 80 00 00 00");


float pos[6];
pos[0] = current_entity.GetPosition().x;
pos[1] = current_entity.GetPosition().y;
pos[2] = current_entity.GetPosition().z;
int screenX, screenY;
__int64 pOffset = 0;
World2Screen(pos, &screenX, &screenY, (float*)&pOffset);
но у всех энтити выводит это почему-то
1657030504041.png
а обычная позиция нормальная
1657030753223.png


помимо надежды на пасты.
и кстати я не надеюсь на это))
 
Последнее редактирование:
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
так я видел этот гайд, но подумал что уже устрело всё
сделал вот так:
typedef char(__fastcall* funcWorldToScreen)(float*, int*, int*, float*);
funcWorldToScreen World2Screen = (funcWorldToScreen)scan_pattern("client.dll", "40 56 41 56 48 83 EC ? 48 89 9C 24 80 00 00 00");


float pos[6];
pos[0] = current_entity.GetPosition().x;
pos[1] = current_entity.GetPosition().y;
pos[2] = current_entity.GetPosition().z;
int screenX, screenY;
__int64 pOffset = 0;
World2Screen(pos, &screenX, &screenY, (float*)&pOffset);
но у всех энтити выводит это почему-то
Посмотреть вложение 210871
а обычная позиция нормальная
Посмотреть вложение 210872



и кстати я не надеюсь на это))
Заведи себе Vector\Vector2D класс, спиздить его можно если лень самому писать.


Мне лень открывать иду и смотреть куда твоя сигна ведет.
C++:
const std::uintptr_t world_to_screen = g_tools->FindPatternInModule("client.dll",
                                                                        "E8 ? ? ? ? 8B 55 ? 85 D2 0F 8E",
                                                                        "WorldToScreen")
                                                                        .self_jmp();

Vector2D WorldToScreen(Vector world)
    {
        auto x = 0, y = 0;

        if (g_worldtoscreen == nullptr)
            return Vector2D(0, 0);

        g_worldtoscreen(&world, &x, &y, nullptr);

        return Vector2D(x, y);
    }

    int WorldToScreen(Vector world, Vector2D* out)
    {
        auto x = 0, y = 0, result = 0;

        if (g_worldtoscreen == nullptr)
            return result;

        result = g_worldtoscreen(&world, &x, &y, nullptr);

        out->x = x;
        out->y = y;

        return result;
    }
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
это не похоже на функу из дилиба(хотя мб её поменяли так сильно)
Посмотреть вложение 210866


так я видел этот гайд, но подумал что уже устрело всё
сделал вот так:
typedef char(__fastcall* funcWorldToScreen)(float*, int*, int*, float*);
funcWorldToScreen World2Screen = (funcWorldToScreen)scan_pattern("client.dll", "40 56 41 56 48 83 EC ? 48 89 9C 24 80 00 00 00");


float pos[6];
pos[0] = current_entity.GetPosition().x;
pos[1] = current_entity.GetPosition().y;
pos[2] = current_entity.GetPosition().z;
int screenX, screenY;
__int64 pOffset = 0;
World2Screen(pos, &screenX, &screenY, (float*)&pOffset);
но у всех энтити выводит это почему-то
Посмотреть вложение 210871
ты чето неправильно ищешь.
1657031069400.png
1657031091700.png
1657031130600.png
ну и в любом случае можно сделать еще проще
берешь в2с с ксго(например отсюда: (не ручаюсь за корректность чуть чуть потестил вроде работает
Пожалуйста, авторизуйтесь для просмотра ссылки.
берешь матрицу с CRenderGameSystem::WorldToProjectionMatrix(int) (47 индекс)
и кайфуешь.
(super duper proof-of-concept-shitcode
C++:
Vector3 shit{};
bool result = WorldToScreenX((float*)&origin, (float*)&shit,
    GameSystemManager::GetSystem_Client<VClass>("RenderGameSystem")->CallVFunc<47, float*>(0));
Logger::LogInfo("Local hero screen pos %d %s\n", static_cast<int>(result),
                std::format("({})", shit).data());
[Dota2Test] Local hero pos (206.21875 -1115.6875 128)
[Dota2Test] Local hero screen pos 1 (1604.7626 209.83826 0)
камеру сдвинул
[Dota2Test] Local hero pos (206.21875 -1115.6875 128)
[Dota2Test] Local hero screen pos 1 (1300.2046 388.41248 0)
альтернативно бпшишь эту функцию WorldToProjectionMatrix идёшь по коллстеку и получаешь готовый вальве в2с(вальве в2с вызывает WorldToProjectionMatrix)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
это не похоже на функу из дилиба(хотя мб её поменяли так сильно)
Посмотреть вложение 210866


так я видел этот гайд, но подумал что уже устрело всё
сделал вот так:
typedef char(__fastcall* funcWorldToScreen)(float*, int*, int*, float*);
funcWorldToScreen World2Screen = (funcWorldToScreen)scan_pattern("client.dll", "40 56 41 56 48 83 EC ? 48 89 9C 24 80 00 00 00");


float pos[6];
pos[0] = current_entity.GetPosition().x;
pos[1] = current_entity.GetPosition().y;
pos[2] = current_entity.GetPosition().z;
int screenX, screenY;
__int64 pOffset = 0;
World2Screen(pos, &screenX, &screenY, (float*)&pOffset);
но у всех энтити выводит это почему-то
Посмотреть вложение 210871
а обычная позиция нормальная
Посмотреть вложение 210872



и кстати я не надеюсь на это))
а как это должно работать не совсем понимаю?
__int64 pOffset = 0;
World2Screen(pos, &screenX, &screenY, (float*)&pOffset); //четвертый аргумент это Vector3*(12 байт данных, 3 флоата по 4 байта)
ты передаешь указатель на массив из 3 флоатов(12 байт. aka Vector3). но при этом на этом указателе лежит инт64(8 байт). у тебя 4 байта мусора считываются. последствия непредсказуемы(если бы у тебя регион стека кончался бы ровно прямо на вот этой переменной(например регион стека кончается на 0x2000 а переменная лежит на 0x1FF8), был бы краш(будет считывать x с 1ff8, потом y с 1ffc, потом z с 0x2000. и БАЦ нахуй а на 2000 уже конец региона(то есть там нету ничего)).)
как ты себе ваще такое позволяешь?
как ты из __int64* кастуешь во float*? как ты догадался?
и "позиция нормальная"
1657032810300.png
ты уверен что это нормальная?)
будь добр Vector3 помечай как Vector3 а не как флоат.(я в коде постом выше нахуярил тоже float* но это был просто тестовый говнокод который был намеренно написан в таком говнянном виде и ни в коем случае нигде не должен использоваться в реальных условиях)
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
672
Реакции[?]
106
Поинты[?]
69K
а как это должно работать не совсем понимаю?
__int64 pOffset = 0;
World2Screen(pos, &screenX, &screenY, (float*)&pOffset); //четвертый аргумент это Vector3*(12 байт данных, 3 флоата по 4 байта)
ты передаешь указатель на массив из 3 флоатов(12 байт. aka Vector3). но при этом на этом указателе лежит инт64(8 байт). у тебя 4 байта мусора считываются. последствия непредсказуемы(если бы у тебя регион стека кончался бы ровно прямо на вот этой переменной(например регион стека кончается на 0x2000 а переменная лежит на 0x1FF8), был бы краш(будет считывать x с 1ff8, потом y с 1ffc, потом z с 0x2000. и БАЦ нахуй а на 2000 уже конец региона(то есть там нету ничего)).)
как ты себе ваще такое позволяешь?
как ты из __int64* кастуешь во float*? как ты догадался?
и "позиция нормальная"
Посмотреть вложение 210877
ты уверен что это нормальная?)
будь добр Vector3 помечай как Vector3 а не как флоат.(я в коде постом выше нахуярил тоже float* но это был просто тестовый говнокод который был намеренно написан в таком говнянном виде и ни в коем случае нигде не должен использоваться в реальных условиях)
нихуя, проблема реально была в этом, щас вроде всё ок, спасибо
1657036551826.png
 
Сверху Снизу