You are not logged in.
Начнем с того, как ты узнаешь "есть ли в модели компонент chassis и прочитать координаты этого компонента" для уже созданной машины?
Offline
для уже созданной машины вот так:
... 0A97: 1@ = car 0@ struct 0A8E: 2@ = 1@ + 0x64C // chassis 0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0 if 2@ > 0 then 2@ += 64 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 2@ += 4 0A8D: 4@ = read_memory 2@ size 4 virtual_protect 0 2@ += 4 0A8D: 5@ = read_memory 2@ size 4 virtual_protect 0 end ...
Offline
По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.
CVehicleModelInfo это то, о чем я написал тут?
Offline
По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.
Это я понял из предыдущего сообщения Seemann'а
Как это правильно использовать, что-то торможу
Вот такая запись приводит к вылету игры. Просьба поправить код:
0A90: 0@ = #CEMENT * 4 0@ += 0xA9B0C8 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 0@ += 0x1C 0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0 0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "chassis" _rwObject 1@ _store_to 2@
Offline
kenking
я тоже пока не разобрался до конца. Указатель 0x1C изначально равен 0, поэтому происходит вылет. Но если перед этим создать машину с такой моделью (#CEMENT), то код должен работать.
Естественно это не то, что требовалось, будем думать дальше.
Offline
По смещению +0x1C в структуре CVehicleModelInfo хранится указатель на RpClump.
CVehicleModelInfo это то, о чем я написал тут?
В принципе, да. Это наследуемый от CBaseModelInfo класс (который у тебя CModelBase).
Seemann, а если просто перед этим загрузить модель (без создания машины)?
kenking, не забывай проверять <> 0.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
kenking, не забывай проверять <> 0.
Проверял, конечно (после 0AA7:), в посте код сокращённый просто написал
а если просто перед этим загрузить модель (без создания машины)?
Да такой вариант работает.
Seemann, DK22Pac, спасибо.
Кстати, про выгрузку моделей (Model.Destroy(#CEMENT)) - кто-то выгружает модели после использования в коде, кто-то нет. Я, например, всегда выгружаю. Так ли необходимо на самом деле?
Last edited by kenking (05-07-2014 16:33)
Offline
Модель надо выгружать, если ты её загружал. Так правильно.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
В структуре транспорта есть такое смещение: +0x3A6 = [word] ID следующей точки пути.
А можно ли найти id (или координаты) нескольких последующих точек пути?
Offline
Игра планирует движение машины только на одну точку вперёд.
Но если машина едет по прямой, а не находится на перекрёстке, то можно просто определить координаты нескольких ближайших точек того пути, на котором она находится в данный момент.
Для этого можно применить опкод:
04D3: get_nearest_car_path_coords_from $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD type 2 store_to 88@ 89@ 90@
Здесь "direction" - это степень удаленности точки пути от указанных координат (если указать 1, то найдётся ближайшая к координатам точка, 2 - вторая по близости точка, 3 - третья по близости точка и т.д.)
Offline
Вроде есть такое во флагах.
http://gtamodding.ru/wiki/Пути_(GTA_SA) … ionInfo.29
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Игра планирует движение машины только на одну точку вперёд.
Но если машина едет по прямой, а не находится на перекрёстке, то можно просто определить координаты нескольких ближайших точек того пути, на котором она находится в данный момент.
Для этого можно применить опкод:
04D3: get_nearest_car_path_coords_from $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD type 2 store_to 88@ 89@ 90@
Здесь "direction" - это степень удаленности точки пути от указанных координат (если указать 1, то найдётся ближайшая к координатам точка, 2 - вторая по близости точка, 3 - третья по близости точка и т.д.)
Но здесь нет direction. Возможно, Вы имели в виду 06F8: get_nearest_route_for 62@ 63@ 64@ in_direction 1 store_to 342@ 343@ 344@ Z_angle_to 345@ ?
Offline
Да, опечатался:
06F8: get_nearest_route_for 62@ 63@ 64@ in_direction 1 store_to 342@ 343@ 344@ Z_angle_to 345@
Вот, нашёл у себя в запасах простой экспериментальный скрипт, подсвечивающий 10 ближайших к игроку точек путей машин:
{$CLEO} wait 2000 while true wait 0 if not player.Defined($player_char) then continue end actor.StorePos($player_actor 0@ 1@ 2@) 31@ = 0 for 30@ = 1 to 10 06F8: get_nearest_route_for 0@ 1@ 2@ in_direction 30@ store_to 6@ 7@ 8@ Z_angle_to 3@ 8@ += 1.0 016F: create_particle 3 rotation_factor 0.0 size 2.0 intensity 255 flags 31@ 0 255 at 6@ 7@ 8@ 0656: get_angle 3@ absolute_degrees_to 3@ 02F6: 4@ = sine 3@ // (float) 02F7: 5@ = cosine 3@ // (float) 4@ *= 2.0 5@ *= 2.0 005B: 7@ += 5@ // (float) 0063: 6@ -= 4@ // (float) 016F: create_particle 3 rotation_factor 0.0 size 1.0 intensity 255 flags 0 0 255 at 6@ 7@ 8@ 0092: 3@ = float 3@ to_integer 31@ += 25 end end
Last edited by Den_spb (29-11-2014 12:47)
Offline
Существует ли т.н. лимит "видеопамяти" по аналогии с лимитом "Streaming memory" в Vice City?
Дело в том, что работаю над несколькими глобалками(двумя своими и двум чужим помогаю), и во всех так или иначе начала появляться проблема "перегруженности сцены": когда рендерится слишком много высокополигональных/HQ-текстурных объектов, часть текстур начинает пропадать(становятся белыми), либо начинают глючить текстуры с альфой.
Никакие limit adjuster-ы не помогают, даже если повышать все возможные и не возможные лимиты. Также дело не в компьютерах, т.к. проблема одинакого проявляется и на мощных, и на слабых компах, с видюхами разных производителей и т.д.
Отсюда и появилось подозрение на "внутренний" лимит видеопамяти.
Если кто знает адресок - он буквально спасет 4 проекта
P.S. Вопрос именно по Vice City, т.к. такие проблемы проявляются только в нем.
Last edited by Shag (09-08-2015 13:04)
Offline
Существует ли т.н. лимит "видеопамяти" по аналогии с лимитом "Streaming memory" в Vice City?
Дело в том, что работаю над несколькими глобалками(двумя своими и двум чужим помогаю), и во всех так или иначе начала появляться проблема "перегруженности сцены": когда рендерится слишком много высокополигональных/HQ-текстурных объектов, часть текстур начинает пропадать(становятся белыми), либо начинают глючить текстуры с альфой.
Никакие limit adjuster-ы не помогают, даже если повышать все возможные и не возможные лимиты. Также дело не в компьютерах, т.к. проблема одинакого проявляется и на мощных, и на слабых компах, с видюхами разных производителей и т.д.
Отсюда и появилось подозрение на "внутренний" лимит видеопамяти.Если кто знает адресок - он буквально спасет 4 проекта
P.S. Вопрос именно по Vice City, т.к. такие проблемы проявляются только в нем.
А ещё может есть опкод, который увеличивает размер оперативной памяти или чтобы объём винчестера увеличился на 1.5 гига? Простите, не удержался
Ну не знаю, любая программа берёт ровно столько ресурсов, сколько нужно и этот общий "лимит" варьируется в зависимости от уже нанятых ресурсов. Мне кажется, проблема здесь не в лимитах а как раз в железе или самой программе.
Offline
Повторюсь, проблема одна и та же на совершенно разном по мощностям железе(от компов, тянущих гта са с тормозами, до тех, что жрут гта4 на максималках): просто на медленных компах к тому же еще и тормозит(ну это понятно, почему).
wmysterio, я может и некорректно задал вопрос, но тебя же не удивляет наличие лимитов "Streaming memory" в гта-шках - почему же удивляет то, что я спросил?
"Streaming memory" - это по сути лимит возможной загрузки оперативки, а я ищу аналог для видеокарты.
Last edited by Shag (10-08-2015 20:47)
Offline
помогите пожалуйста, вопрос такой
в IDA базе есть такой участок
.text:006CB4F3 .text:006CB4F3 loc_6CB4F3: ; CODE XREF: CPlane__processControlInput+611j .text:006CB4F3 ; CPlane__processControlInput+636j .text:006CB4F3 ; CPlane__processControlInput+64Dj .text:006CB4F3 ; CPlane__processControlInput+688j ... .text:006CB4F3 024 cmp word ptr [esi+22h], 208h
во вкладке HEX он выглядит так
006CB4F3 66 81 7E 22 08 02 0F 85 EB 00 00 00 57 E8 6B 46
меня интересует конкретно строка
.text:006CB4F3 024 cmp word ptr [esi+22h], 208h //здесь происходит сравнение с id 520 (гидра)
так вот, в exe (если открыть в hex-редакторе) или открыть запущенный процесс этот участок выглядит совсем не так
F7 FF FF 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57
наглядно
https://yadi.sk/d/1UKc1vIpjybDr
мне нужно выполнить сравнение не с 208h, а с другим числом, как его вычислить?
Last edited by zorin_chel (26-10-2015 20:04)
Offline
У вас стоит какой-то плагин или клео скрипт, который записывает по этому адресу свой код. там появились новые команды nop и jmp Т.е. оригинальной проверки номера модели там уже нет.
По поводу 208h - это число 520 в шестнадцатиричной системе счисления, вычислить можно в обычном калькуляторе Windows: режим программист, выбираем Dec, пишем число, выбираем Hex.
http://www.cavestory.org/guides/csasm/guide/hex2.html
Offline
я их специально красным подсветил, чтобы указать что это одно и тоже, тогда такой вопрос, как найти адрес, который управляет шасси id520
пытаюсь написать плагин, который делает из другого самолета гидру,
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } void CreateConsole () { int hConHandle = 0; HANDLE lStdHandle = 0; FILE *fp = 0; AllocConsole (); SetConsoleTitle ("ID "); lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT); fp = _fdopen (hConHandle, "w"); *stdout = *fp; setvbuf (stdout, NULL, _IONBF, 0); } DWORD WINAPI GtaSA_thread (LPVOID) { DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); // DWORD*var3 = (DWORD*)(0x6C9103); *var -= 0x2c0000; *var2 -= 0x2c0000; WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL); { for (;;Sleep (1000)) return 0; } }
пока получилось только это
https://www.youtube.com/watch?v=cMMd7vroo9A
в каком направлении дальше двигаться?
Last edited by zorin_chel (25-10-2015 12:23)
Offline
установил чистую gta, там значение адресов такое же
006CB4F3 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57 E8 6B 46
а не
006CB4F3 66 81 7E 22 08 02 0F 85 EB 00 00 00 57 E8 6B 46
как в базе IDA
Last edited by zorin_chel (25-10-2015 12:27)
Offline
у меня получилось поменять в HEX редакторе + asi плагин вот что
https://youtu.be/K-7xkpbY_t0
пришлось в exe менять вот этот участок
https://yadi.sk/i/NZ7bFTcgk2kE7
как мне в запущенном процессе найти этот участок памяти, адрес
Last edited by zorin_chel (26-10-2015 20:04)
Offline
получилось вот что
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } DWORD WINAPI GtaSA_thread (LPVOID) { DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); DWORD*var3 = (DWORD*)(0x406AF3); DWORD*var4 = (DWORD*)(0x6c9690); DWORD*var5 = (DWORD*)(0x6C9F1C); DWORD*var6 = (DWORD*)(0x6C8F10); *var -= 0x2c0000; *var2 -= 0x2c0000; *var3 -= 0x2c0000; *var4 -= 0x2c0000; *var5 -= 0x2c0000; *var6 -= 0x2c0000; WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var3, var3, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var4, var4, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var5, var5, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var6, var6, sizeof(4), NULL); { for (;;Sleep (1000)) return 0; } }
вопрос с шасси пока не решен
https://www.youtube.com/watch?v=NRbNcmd-e9s
Offline
есть адрес в процессе 0xBA18FC, значение в этом адресе = 0xAAA6480(динамический) - это опять же адрес, значение в котором, является адресом = 0x00C35E5C в этом адресе записана переменная, которую мне нужно сравнить, использую конструкцию:
DWORD p1; DWORD p2; DWORD p3; ReadProcessMemory(GtaSA_thread, (LPCVOID)(0xBA18FC), &p1, sizeof(4), NULL);//прочитали адрес 0xBA18FC, записали значение в p1 p1 = p1 + 0x384; // прибавили смещение ReadProcessMemory(GtaSA_thread, (LPCVOID)p1, &p2, sizeof(4), NULL);//прочитали адрес р1(со смещением), записали значение в р2 ReadProcessMemory(GtaSA_thread, (LPCVOID)p2, &p3, sizeof(4), NULL);//прочитали адрес р2, записали значение в р3 if (p3 == 188) { // если равно, то ... }
но не получается почему-то
Offline