X86Jumps Опубликовано 11 апреля, 2018 Поделиться Опубликовано 11 апреля, 2018 (изменено) В видео про спавн врагов в ре6, во второй его части пользователь спросил: могу ли я сделать подобное для ре4, версия 1.1 Еще в феврале в 10-х числах начал искать. Как-то несколько дней что-то проверял, потом нашел зацепку, потом затянулось и только в марте снова взялся. Только сейчас дошли руки записать видео, скрипт пробный уже недели 2 готов был. Версия игры 1.1., это не Ultra HD Remaster или как он там в стим называется, но кажется в нем все так же работает, разве что указатели в других местах. Сделал пробный скрипт спавна врагов. Спавнит в упрощенном варианте, рядом с игроком. Если на уровне не предусмотрены враги, то возможен вылет при попытке спавна (возможно файл не загружен в памяти, а при создании объекта не проверяется, что не загружен). Как обычно работает на Tab. Сначала инициализирует массив со всеми структурами npc/enemy, прописано изначально только на врагов (0x12). При смене уровня обновляет массив заново. Можно убрать инициализацию цикла и создавать, заполняя данные вручную. По крайне мене когда я пытался, если спавнить не врагов а все иное, то вылет происходит, не сильно проверял почему, т.к. главной целью было спавнить врагов. видео Скрипт Спойлер [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat alloc(newmem,2048) alloc(enemies,2048) label(returnhere) label(originalcode) label(exit) label(skip) label(tick) label(data) label(loop) //label(initdata) label(exitloop) registerSymbol(data) registerSymbol(enemies) newmem: //this is allocated memory, you have read,write,execute access //place your code here test eax, eax je originalcode pushad pushf //cmp [enemies], 0 //jne exitloop mov ecx, [033F6EC4+8] //current object count on level mov edi, [leveldata] cmp ecx, edi je exitloop mov [enemies], 0 xor ebp,ebp mov edi,[00A3A280] mov ecx, [033F6EC4+8] mov [leveldata], ecx //save it mov ecx, enemies+4 loop: lea esi,[edi+ebp+000063F8] cmp byte [esi+1], 12 jne @f inc [enemies] mov [ecx], esi add ecx, 4 skiploop: add ebp, 20 cmp ebp, 2000 jb loop exitloop: push 9 call GetAsyncKeyState test eax,eax je @f call GetTickCount sub eax, [tick] cmp eax, 200 jb @f //get random index between 0..enemies count call rand xor edx, edx div [enemies] mov ecx, enemies+4 mov esi, [ecx+edx*4] movzx eax, [esi+1] push eax mov ecx, 033F6EC4 call 00409F93 test eax, eax je @f mov ecx, [data] mov [ecx*4+data+4], eax inc [data] mov esi, [033F6EAC] mov ecx, [esi+c0] mov [eax+c0], ecx mov ecx, [esi+c4] fld [floats] //mov [eax+c4], ecx fstp [eax+c4] mov ecx, [esi+c8] mov [eax+c8], ecx /* mov byte ptr [eax+11d], 4 //mov [eax+478], 0404 mov [eax+47a], 0404 //mov [eax+00000464], 5A0E1BCA mov [eax+474], 08012420 */ //mov ecx, eax //mov edx, [eax] //call [edx+10] mov ebp, eax //get random index between 0..enemies count call rand xor edx, edx div [enemies] mov ecx, enemies+4 mov esi, [ecx+edx*4] mov eax, ebp //initdata sub esp, 100 //relocated code 005A943A mov dl,[esi+02] mov [eax+0000011D],dl mov cl,[esi+03] mov [eax+00000485],cl mov edx,[esi+04] mov [eax+00000474],edx mov cl,[esi+0B] mov [eax+00000492],cl //movsx edx,word ptr [esi+1A] //mov [esp+14],edx //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CEC80] { [1000.00] } //fstp dword ptr [eax+0000046C] mov cx,[esi+08] //fld dword ptr [game.exe+634D00] { [6.28] } mov [eax+00000478],cx //fmul dword ptr [game.exe+5D6BA8] { [0.00] } mov [eax+0000047A],cx //movsx ecx,word ptr [esi+12] //mov [esp+14],ecx //fild dword ptr [esp+14] //fmul st(0),st(1) //fstp dword ptr [eax+000000D0] //movsx edx,word ptr [esi+14] //mov [esp+14],edx lea edx,[eax+000000C0] //mov edi,edx //fild dword ptr [esp+14] //fmul st(0),st(1) //fstp dword ptr [eax+000000D4] //movsx ecx,word ptr [esi+16] //mov [esp+14],ecx //fild dword ptr [esp+14] //fmul st(0),st(1) //fstp dword ptr [eax+000000D8] //movsx ecx,word ptr [esi+0C] //mov [esp+14],ecx //fstp st(0) //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CE9E0] { [10.00] } //fstp dword ptr [edx] //movsx ecx,word ptr [esi+0E] //mov [esp+14],ecx //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CE9E0] { [10.00] } //fstp dword ptr [eax+000000C4] //movsx ecx,word ptr [esi+10] //mov [esp+14],ecx //lea ecx,[eax+00000130] //mov [eax+00000488],bl //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CE9E0] { [10.00] } //fstp dword ptr [eax+000000C8] //////////////////////////////////////////////// //.................... mov ecx,[game.exe+2FF6EAC] { [172A07A0] } fld dword ptr [ecx+000000C8] fsub dword ptr [eax+000000C8] fld dword ptr [ecx+000000C0] mov ecx,eax {ptr as this} fsub dword ptr [edx] mov edx,[eax] mov [eax+00000464],5A0E1BCA { 1510874058 } fld st(0) fmul st(0),st(1) fld st(2) fmul st(0),st(3) faddp fstp dword ptr [eax+00000460] fstp st(0) fstp st(0) call dword ptr [edx+10] add esp, 100 call kernel32.GetTickCount mov [tick], eax skip: popf popad originalcode: add eax, 000000C0 exit: jmp returnhere tick: dd 0 floats: dd (float)100.00 leveldata: dd 0 data: dd 0 //size //list enemies: dd 0 //size //list "game.exe"+31E4DE: jmp newmem returnhere: [DISABLE] //code from here till the end of the code will be used to disable the cheat unregisterSymbol(data) unregisterSymbol(enemies) dealloc(newmem) dealloc(enemies) "game.exe"+31E4DE: add eax, 000000C0 //Alt: db 05 C0 00 00 00 ссылка на файл http://s000.tinyupload.com/?file_id=08064413723196487564 Указатель на объект, который используется для спавна npc/врагов (и игрока единожды) 0x033F6EC4 +4 указатель на игрока +8 максимально возможно количество объектов +14 - последний созданный объект в каждом объекте +8 - предыдущий объект таким образом происходит полный обход всех объектов 0x009D3558 класс врага 0x009EF690 класс игрока если кому интересно, допишу подробнее информацию из заметок, что вел *оказалось записывал с отключенной функцией подавления шума, она сильно делала тише запись, но шумов не было. Когда усилил сигнал тут, то шумы очень сильно слышны были, подавил как мог в Audacity. Громкость не повышал аудиозаписи сильно, чтобы шумы не были уж слишком слышны. Изменено 11 апреля, 2018 пользователем X86Jumps 3 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения