You are not logged in.
1. не sizeof (4), а просто 4 - иначе это может быть значение от 1 до 8, в зависимости от того, какой тип для 4 предложит компилятор
2. насколько я понимаю, читается g_pPlayerVehicle->m_pHandling->m_dwIndex. формально - все правильно
1) p1 нужно проверять на NULL (находится ли игрок в машине - иначе получим GPF, если он идет пешком)
2) за давностью лет, я не помню, что там с индексами. Если я вспомнил правильно, 188 - это hotdog.
Offline
рабочий код (может кому пригодится), очень помогла функция вычисления указателей
int* ReadPointer (DWORD base, int offsets [], int level) { int* pointer = (int*)base; for (int i = 0; i < level; i++) { pointer = (int*)(*pointer + offsets[i]); printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer); } return pointer; }
осталось только рабочее шасси доделать
#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> #include <tlhelp32.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); } int* ReadPointer (DWORD base, int offsets [], int level) { int* pointer = (int*)base; for (int i = 0; i < level; i++) { pointer = (int*)(*pointer + offsets[i]); printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer); } return pointer; } void MEMwrite(void *adr, void *ptr, int size) { DWORD OldProtection; VirtualProtect(adr,size,PAGE_EXECUTE_READWRITE, &OldProtection); memcpy(adr,ptr,size); VirtualProtect(adr,size,OldProtection, &OldProtection); } DWORD WINAPI GtaSA_thread (LPVOID) { int* pointer0 = 0; DWORD base = 0xBA18FC; int offsets[1] = { 0x00 }; pointer0 = ReadPointer (base, offsets, 0); DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); DWORD*var3 = (DWORD*)(0x406AF3); DWORD*var4 = (DWORD*)(0x6c9690); DWORD*var5 = (DWORD*)(0x6C9F1C); DWORD*var6 = (DWORD*)(0x6C8F10); CreateConsole (); for (;;Sleep (100)) { if (*pointer0) { int offsets[2] = { 0x384, 0x00 }; int* pointer = 0; pointer = ReadPointer (base, offsets, 2); if (*pointer == 188) { *var = 0x01DCF981; *var2 = 0x01DC227E; *var3 = 0x01DC227E; *var4 = 0x01DC227E; *var5 = 0x01DC3D66; *var6 = 0x01DCFF81; // MEMwrite ((void*)(adr), (void*)"1", 1); // MEMwrite ((void*)(adr2), (void*)"1", 1); }else { *var = 0x0208F981; *var2 = 0x0208227E; *var3 = 0x0208227E; *var4 = 0x0208227E; *var5 = 0x02083D66; *var6 = 0x0208FF81; } } } }
работает так: когда сел в rustler в нем появляются функции hydra (вертикальный взлет/посадка), когда сел в hydra ее функции возвращаются
Offline
Какую функцию вызвать, что бы рисовался мир? Хочу сделать прозрачное меню. Пол ночи парился и все чего добился - это смог отключить стандартный задний фон меню занопив вызов по адресу gta_sa.exe+327BB1
Offline
Обращайся к ThirteenAG(он же - Sergey81 на этом форуме) - он уже реализовал эту функцию в своём Widescreen fix.
Offline
Важный вопрос(здесь я вроде уже спрашивал, но продублирую ввиду важности вопроса и объяснения деталей): как вернуть игроку управление во время катсцены?
Это точно возможно, но мне пока это не удалось(все скриптовые методы перепробовал), хотя есть зацепка: вот тут чувака(я связался с ним, и он рассказал) арестовали во время катсцены, он зареспавнился, и управление к нему вернулось!
Короче, если во время катсцены вернуть игроку камеру, т.е.
Camera.SetBehindPlayer Camera.Restore_WithJumpCut
, или вообще как-нибудь поставить камеру скриптовым методом, то "появится" исчезающий во время катсцены игрок, однако управление не вернется.
Попытки возвращения управления игроку, вроде
01B4: set_player $PLAYER_CHAR can_move 1
- не работают, однако у чувака, о котором я написал выше - управление вернулось.
Т.е., ключ к полному возвращению управления игроку лежит в респауне игрока после ареста(и возможно - смерти), но я за несколько лет так и не смог разобрать это.
Если получится вернуть управление игроку, то открываются просто безграничные возможности в визуализации миссий/фриплея.
Пока удаётся сделать лишь уныленькую "эмуляцию" управления, а хотелось бы полноценный контроль над игроком.
P.S. Только представьте сцены с подобными чудищами, но с возможностью управлять игроком!
P.P.S. Катсценовые анимации можно зацикливать, у катсценовых персонажей - создавать скелеты с новой иерархией и большим кол-вом костей, чем в оригинале, можно создавать огромные анимированные сцены, как в новом Quantum Break и вообще кучу всего!
Необходимо лишь расковырять этот проклятый респаун игрока и понять, как в этом случае возвращается управление игроку, но я тут бессилен...
Last edited by Shag (27-04-2016 16:09)
Offline
Важный вопрос(здесь я вроде уже спрашивал, но продублирую ввиду важности вопроса и объяснения деталей): как вернуть игроку управление во время катсцены?
Это точно возможно, но мне пока это не удалось(все скриптовые методы перепробовал), хотя есть зацепка: вот тут чувака(я связался с ним, и он рассказал) арестовали во время катсцены, он зареспавнился, и управление к нему вернулось!
Короче, если во время катсцены вернуть игроку камеру, т.е.Camera.SetBehindPlayer Camera.Restore_WithJumpCut, или вообще как-нибудь поставить камеру скриптовым методом, то "появится" исчезающий во время катсцены игрок, однако управление не вернется.
Попытки возвращения управления игроку, вроде01B4: set_player $PLAYER_CHAR can_move 1- не работают, однако у чувака, о котором я написал выше - управление вернулось.
Т.е., ключ к полному возвращению управления игроку лежит в респауне игрока после ареста(и возможно - смерти), но я за несколько лет так и не смог разобрать это.
Если получится вернуть управление игроку, то открываются просто безграничные возможности в визуализации миссий/фриплея.
Пока удаётся сделать лишь уныленькую "эмуляцию" управления, а хотелось бы полноценный контроль над игроком.P.S. Только представьте сцены с подобными чудищами, но с возможностью управлять игроком!
P.P.S. Катсценовые анимации можно зацикливать, у катсценовых персонажей - создавать скелеты с новой иерархией и большим кол-вом костей, чем в оригинале, можно создавать огромные анимированные сцены, как в новом Quantum Break и вообще кучу всего!
Необходимо лишь расковырять этот проклятый респаун игрока и понять, как в этом случае возвращается управление игроку, но я тут бессилен...
Прочитал я это и ржал, особенно над выражением "открываются просто безграничные возможности". Какие ещё возможности??? Каким же образом Вы думаете делать "огромные анимированные сцены"? При всём уважении, но мне кажется, что это просто лёгкий способ водить себя за нос.
Offline
wmysterio > Я же видео примеры привел: раз и два.
В первом, показан интегрированный прямо в катсцену геймплей: половина зомбов, а также ржавые автомобили - катсценовые, т.е. катсцена позволяет нестандартно анимировать персонажей и объекты. Управление игроком там скриптовое, т.е. из-за невозможности управлять игроком(как я и писал выше, никак не получается "расфризить" игрока скриптовыми методами) мне пришлось писать скрипт "управления игроком", т.е. "сэмулировать" управление. А как было бы прекрасно управлять игроком полноценно...
Второе видео показывает, что в катсценах можно использовать персонажей с новой скелетной иерархией и с большим кол-вом костей, чем в оригинальной игре. Если будет запилено возвращение управление игроку, можно сделать всевозможных монстров с 10 ногами и кучей щупалец. Это просто пример, если что. Возможности действительно безграничны. Я знаю как и могу сделать сцену, как в предложенном видео по Quantum Break . Не 1в1(естественно), но с кучей анимированных деталей с возможностью бегать по ним и прочее. Вот только будет очень уныло, если управление игроком так и не удастся вернуть и мне придется писать скрипт-надстройку для этого.
Надеюсь, всё разъяснил.
Last edited by Shag (30-04-2016 07:30)
Offline
Вот запилил еще пример интеграции геймплея в катсцену(или наоборот): пример "анимированных сцен", о которых писалось ранее.
Управление, как и в предыдущем случае - искусственное, скриптовое, "деревянное".
Если кто-нибудь поможет с возвращением управления к игроку, подобные вещи станут в 1000 раз эффектнее...
Last edited by Shag (11-05-2016 15:51)
Offline
как вернуть игроку управление во время катсцены?
Вопрос для Vice City решен(спасибо DK!) - нужно занопить 16 байт по адресу 0x40703E, т.е.
0A8C: write_memory 0x40703E size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x407042 size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x407046 size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x40704A size 4 value 0x90909090 virtual_protect 0
Offline
Shag wrote:как вернуть игроку управление во время катсцены?
Вопрос для Vice City решен(спасибо DK!) - нужно занопить 16 байт по адресу 0x40703E, т.е.
0A8C: write_memory 0x40703E size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x407042 size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x407046 size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x40704A size 4 value 0x90909090 virtual_protect 0
А для саньки те же адреса?
Offline
А для саньки те же адреса?
Я не смог найти. Дело в том, что в Вайсе игрок блочится в опкоде
02E4: load_cutscene_data 'ololo'
да блочится так, что не помогает даже
01B4: set_player $PLAYER_CHAR can_move 1
Поэтому-то и пришлось ковырять память. А в СА в структуре опкода я блок игрока не нашел, поэтому хз... Я мало знаю о СА - там действительно, как в Вайсе, разблочить управление не помогает опкод 01B4? Т.е. после запуска катсцены, минимум через 0 мс запустить код:
02A3: enable_widescreen 0 Camera.SetBehindPlayer 015A: restore_camera 01B4: set_player $PLAYER_CHAR can_move 1
Т.к. блокировки управления в опкоде 02E4 в СА я не нашел - это должно работать...
Offline
Mr.GeniusZ wrote:А для саньки те же адреса?
Я не смог найти. Дело в том, что в Вайсе игрок блочится в опкоде
02E4: load_cutscene_data 'ololo'да блочится так, что не помогает даже
01B4: set_player $PLAYER_CHAR can_move 1Поэтому-то и пришлось ковырять память. А в СА в структуре опкода я блок игрока не нашел, поэтому хз... Я мало знаю о СА - там действительно, как в Вайсе, разблочить управление не помогает опкод 01B4? Т.е. после запуска катсцены, минимум через 0 мс запустить код:
02A3: enable_widescreen 0 Camera.SetBehindPlayer 015A: restore_camera 01B4: set_player $PLAYER_CHAR can_move 1Т.к. блокировки управления в опкоде 02E4 в СА я не нашел - это должно работать...
Прочекал, блокировка все-таки есть, и адреса с вайса не подходят...
Last edited by Mr.GeniusZ (09-06-2016 11:54)
Offline
Shag wrote:как вернуть игроку управление во время катсцены?
Вопрос для Vice City решен(спасибо DK!) - нужно занопить 16 байт по адресу 0x40703E, т.е.
0A8C: write_memory 0x40703E size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x407042 size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x407046 size 4 value 0x90909090 virtual_protect 0 0A8C: write_memory 0x40704A size 4 value 0x90909090 virtual_protect 0
Молодцы! Только virtual_protect наверно должен быть равен 1, ведь это область памяти read-only.
Offline
Молодцы! Только virtual_protect наверно должен быть равен 1, ведь это область памяти read-only.
Спс за инфу, но как это вообще узнается(на будущее)? Я просто ставлю virtual_protect 1 только если не работает virtual_protect 0, а в этом случае 0 работает
Last edited by Shag (10-06-2016 11:17)
Offline
Апдейт(чтобы добить тему возвращения управления в катсценах): чтобы вернуть возможность заходить в меню во время катсцены(когда мы уже вернули управление методом, описанным выше), нужно выставить 0 по адресу 0xA10B63, т.е.
0A8C: write_memory 0xA10B63 size 1 value 0 virtual_protect 1
Применять ПОСЛЕ запуска катсцены, МИНИМУМ через 0ms после оного. После каждого отключения катсцены(а вернее - при каждом новом запуске) значение нужно выставлять заного.
Почему бы не заблочить адрес в этом значении навсегда(или занопить его изменение)?
Ответ: в этом случае катсцены будут некорректно запускаться, так что лучше этого не делать, и менять значение каждый раз после запуска катсцены.
Таким образом, можно спокойно лазить по меню во время проигрывания катсцены(если разморозить(0) мир по адресу 0xA10B36). Скоро это появится в Main Menu Scene
Last edited by Shag (11-06-2016 08:50)
Offline
Есть ли возможность заставить игру загрузить файл внешних скриптов в процессе выполнение самого .scm файла? Надо для мпака. Я точно помню, что есть какая-то функция для загрузки .img файла. Вроде, в базе для иды видел.
Я знаю, что есть патч от Seemann, но всё-таки предпочтительнее было бы загрузить прямо из скм, а не менять экзешник.
Offline
По какому адресу можно узнать активно ли меню настроек звука в GTA III?
Offline
По какому адресу можно узнать активно ли меню настроек звука в GTA III?
Поищи тут.
Даже если конкретно этого нет - возможно, найдешь что-то похожее или сможешь спросить в той теме(тебе нужен адрес Menu ID).
Last edited by Shag (16-10-2016 18:40)
Offline
Всем привет. Помогите решить проблему.
+1300 = [dword] Alternate siren (honking): 0 = off 1 = on Note: Automatically gets reset back to 0. To prevent this just NOP 0x6E0A3B (6 bytes).
(адрес активирует на машине клаксон)
Собственно всё работает, но, чтобы сигнал не прерывался код нужно зацикливать, а мне это не желательно. Объясните как использовать последнюю строчку, чтобы не зацикливать скрипт.
Offline