-
Автор темы
- #1
Где сейчас можно найти g_WorldToScreen?
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пытался найти функцию OnRenderStart в client.dll из дилиба, но похожих не нашёл, может как-то ещё можно?Ну привет 2000 полигонов.Где сейчас можно найти g_WorldToScreen?
Пожалуйста, авторизуйтесь для просмотра ссылки.Пытался найти функцию OnRenderStart в client.dll из дилиба, но похожих не нашёл, может как-то ещё можно?
это не похоже на функу из дилиба(хотя мб её поменяли так сильно)CDOTAViewRender
четвертый индекс(OnRenderStart)
внутри вызов. это и есть функа с матрицами. правда там не хреф а RVA. но сути это не меняет.
так я видел этот гайд, но подумал что уже устрело всёНу привет 2000 полигонов.
Все таки иногда надо пробовать искать информацию помимо надежды на пасты.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Там буквально рассматривают как найти WorldToScreen.
и кстати я не надеюсь на это))помимо надежды на пасты.
Заведи себе Vector\Vector2D класс, спиздить его можно если лень самому писать.так я видел этот гайд, но подумал что уже устрело всё
сделал вот так:
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
и кстати я не надеюсь на это))
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;
}
ты чето неправильно ищешь.это не похоже на функу из дилиба(хотя мб её поменяли так сильно)
Посмотреть вложение 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
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());
а как это должно работать не совсем понимаю?это не похоже на функу из дилиба(хотя мб её поменяли так сильно)
Посмотреть вложение 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*? как ты догадался?
и "позиция нормальная"
Посмотреть вложение 210877
ты уверен что это нормальная?)
будь добр Vector3 помечай как Vector3 а не как флоат.(я в коде постом выше нахуярил тоже float* но это был просто тестовый говнокод который был намеренно написан в таком говнянном виде и ни в коем случае нигде не должен использоваться в реальных условиях)
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz