imaginary Опубликовано 4 февраля, 2019 Поделиться Опубликовано 4 февраля, 2019 *Длинное видео к тому же содержит кучу моих ошибок, советую посмотреть полностью, (если будете сразу что то делать) , возможно такой опыт вам пригодится ? В этом видео показано как сделать сбор предметов с области (на сервере тоже) область регулируется (квадрат). Скрипт (поиск персонажа): Спойлер [ENABLE] alloc(newmem,100) label(returnhere) label(originalcode) label(exit) label(PlayerAddr) registersymbol(PlayerAddr) newmem: mov [PlayerAddr],edx originalcode: fild dword ptr [edx+00000340] exit: jmp returnhere PlayerAddr: db 0 Terraria.Main::DrawInterface_Resources_Life+510: jmp newmem nop returnhere: [DISABLE] unregistersymbol(PlayerAddr) dealloc(newmem) Terraria.Main::DrawInterface_Resources_Life+510: fild dword ptr [edx+00000340] Скрипт (сбор) с пояснениями: Спойлер [ENABLE] alloc(newmem,600) label(returnhere) label(originalcode) label(exit) label(GrabSize) registersymbol(GrabSize) label(Control) registersymbol(Control) newmem: cmp byte ptr [Control],1 //Если не включено не делать ничего jne originalcode //Тут сделаем сразу преобразование координат fld dword [eax] //Берем координаты предмета. fistp dword [GrabSize+8] push ecx //Теперь нужно push ebx mov ecx,[PlayerAddr] //Адрес игрока в ecx, нам нужны его координаты! =) fld dword [ecx+20] fistp dword [GrabSize+C] //переводим в 4 байта mov ebx,[GrabSize+C] add ebx,[GrabSize] //Размер зоны поиска(проверяем в право) cmp [GrabSize+8],ebx jg noGrab //Если больше чем зона которую мы задаем вправо, то не собирать. mov ebx,[GrabSize+C] sub ebx,[GrabSize] //Размер зоны поиска проверяем влево. cmp [GrabSize+8],ebx //Если меньше зоны то не собирать. jl noGrab fld dword [ecx+20] //Заносим в стек Х координаты игрока fstp dword [eax] //Записываем в координаты предмета. fld dword [eax+4] //Берем координаты предмета Y. fistp dword [GrabSize+8] fld dword [ecx+24] //Берем координаты игрока по Y fistp dword [GrabSize+C] //переводим в 4 байта mov ebx,[GrabSize+C] add ebx [GrabSize+4] //Это вниз, чем ниже тем больше число cmp [GrabSize+8],ebx //Ниже чем зона то не трогать. jg noGrab mov ebx,[GrabSize+C] sub ebx [GrabSize+4] //Это вверх. cmp [GrabSize+8],ebx //Выше чем зона то не трогать. jl noGrab fld dword [ecx+24] //Заносим в стек Y координаты игрока fstp dword [eax+4] //Записываем в координаты предмета. mov byte ptr [eax+101],1 noGrab: pop ebx pop ecx originalcode: fld dword ptr [eax] mov eax,[ebp-000004E4] exit: jmp returnhere Control: db 0 GrabSize: db 0 0 0 0 //Это будет промежуточное значение Terraria.Main::DrawItem+50: jmp newmem nop nop nop returnhere: [DISABLE] unregistersymbol(Control) unregistersymbol(GrabSize) dealloc(newmem) Terraria.Main::DrawItem+50: fld dword ptr [eax] mov eax,[ebp-000004E4] Видео (2 часа): Спойлер 1 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения