Foxhound Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 Игра The Guild 2 Renaissance. Пробую сделать телепорт персонажа в точку курсора по нажатию горячей клавиши. Помогите новичку. Координаты курсора нашёл, сделал такой скрипт: Spoiler [ENABLE] aobscanmodule(INJECT6,GuildII.exe+44D20,8bxxxx83xxxx3bxx74xx68xxxxxxxx8d) alloc(newmem,$1000) label(code) label(return) label(_Cursor) registersymbol(_Cursor) registersymbol(INJECT6) newmem: _Cursor: dd 0 code: mov [_Cursor],ebp mov eax,[ebp+70] or edi,-01 jmp return INJECT6: jmp code nop return: [DISABLE] INJECT6: mov eax,[ebp+70] or edi,-01 unregistersymbol(_Cursor) unregistersymbol(INJECT6) dealloc(newmem) Вывел в таблицу показ координат курсора по адресам: [_Cursor]+78 [_Cursor]+80 Потом нашёл координаты персонажа, сделал скрипт: Spoiler [ENABLE] aobscanmodule(INJECT7,GuildII.exe+146668,8bxxxx8bxxxxxx6axx8dxxxxxxxxxxxxxx8bxxxx8d) alloc(newmem,$1000) label(code) label(return) label(_Hero) registersymbol(_Hero) registersymbol(INJECT7) newmem: _Hero: dd 0 code: mov [_Hero],esi mov eax,[esi+54] mov ebp,[esp+14] jmp return INJECT7: jmp code nop nop return: [DISABLE] INJECT7: mov eax,[esi+54] mov ebp,[esp+14] unregistersymbol(_Hero) unregistersymbol(INJECT7) dealloc(newmem) Вывел в таблицу показ текущих координат персонажа по адресам: [_Hero]+5C [_Hero]+64 Теперь если в таблице взять значение из адреса [_Cursor]+78 и вручную вставить в [_Hero]+5C, а из [_Cursor]+80 в [_Hero]+64, то персонаж телепортируется в точку курсора. Как сделать это действие автоматически, по нажатию клавиши? Видеоуроки по телепорту посмотрел, попробовал "подружить" оба скрипта, ничего не получилось, то не работает, то виснет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 2 часа назад, Foxhound сказал: Как сделать это действие автоматически, по нажатию клавиши? Писал на коленке (без теста). попробуй Блинк-телепорт по щелчку мыши (ПКМ). Скрытый текст [ENABLE] aobscanmodule(INJECT6,GuildII.exe+44D20,8bxxxx83xxxx3bxx74xx68xxxxxxxx8d) aobscanmodule(INJECT7,GuildII.exe+146668,8bxxxx8bxxxxxx6axx8dxxxxxxxxxxxxxx8bxxxx8d) alloc(newmem,$1000) label(newmem1) label(code) label(return) label(code1) label(return1) label(CoordX) label(CoordY) label(LoadCoord) registersymbol(INJECT6) registersymbol(INJECT7) newmem: pushad push 2 // 2 - нажата правая клавиша мыши. Вместо мыши можно использовать любую клавишу call GetAsyncKeyState // Блок проверки - какая клавиша нажата? shr ax,#15 cmp ax,1 popad jne code mov eax,[ebp+78] mov [CoordX],eax mov eax,[ebp+80] mov [CoordY],eax mov [LoadCoord],1 code: mov eax,[ebp+70] or edi,-01 jmp return newmem1: cmp [CoordX],0 je code1 cmp [LoadCoord],1 jne code1 mov eax,[CoordX] mov [esi+5c],eax mov eax,[CoordY] mov [esi+64],eax mov [LoadCoord],0 code1: mov eax,[esi+54] mov ebp,[esp+14] jmp return1 CoordX: dd 0 CoordY: dd 0 LoadCoord: dd 0 INJECT6: jmp newmem db 90 return: INJECT7: jmp newmem1 db 90 90 return1: [DISABLE] INJECT6: mov eax,[ebp+70] or edi,-01 INJECT7: mov eax,[esi+54] mov ebp,[esp+14] unregistersymbol(INJECT6) unregistersymbol(INJECT7) dealloc(newmem) 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 (изменено) Твой персонаж если он выделен будет всегда следовать за курсором Скрытый текст [ENABLE] aobscanmodule(sl_Cursor,GuildII.exe,8B 45 70 83 CF FF) alloc(Cursor,$1000) label(ccode) label(creturn) label(CurX) label(CurY) label(CurZ) label(brnch_saver) registersymbol(CurX) registersymbol(CurY) registersymbol(CurZ) Cursor: CurX: dd 0 CurY: dd 0 CurZ: dd 0 brnch_saver: fld dword ptr [ebp+78] fstp dword ptr [CurX] fld dword ptr [ebp+7C] fstp dword ptr [CurY] fld dword ptr [ebp+80] fstp dword ptr [CurZ] jmp ccode ccode: mov eax,[ebp+70] or edi,-01 jmp creturn sl_Cursor: jmp brnch_saver nop creturn: registersymbol(sl_Cursor) ////////////////////////////////////////////////////////// aobscanmodule(sl_Player,GuildII.exe,8B 46 54 8B 6C 24 14) alloc(Player,$1000) label(pcode) label(preturn) label(brnch_loader) Player: brnch_loader: fld dword ptr [CurX] fstp dword ptr [esi+5C] fld dword ptr [CurY] fstp dword ptr [esi+60] fld dword ptr [CurZ] fstp dword ptr [esi+64] jmp pcode pcode: mov eax,[esi+54] mov ebp,[esp+14] jmp preturn sl_Player: jmp Player nop nop preturn: registersymbol(sl_Player) [DISABLE] sl_Cursor: db 8B 45 70 83 CF FF sl_Player: db 8B 46 54 8B 6C 24 14 unregistersymbol(sl_Cursor) unregistersymbol(sl_Player) /////////////////////////////////////////////////////////////////// unregistersymbol(CurX) unregistersymbol(CurY) unregistersymbol(CurZ) /////////////////////////////////////////////////////////////////// dealloc(Cursor) dealloc(Player) { // ORIGINAL CODE - INJECTION POINT: "GuildII.exe"+444A0 "GuildII.exe"+44476: 8D 4C 24 18 - lea ecx,[esp+18] "GuildII.exe"+4447A: E8 41 92 2B 00 - call GuildII.exe+2FD6C0 "GuildII.exe"+4447F: E9 AC 00 00 00 - jmp GuildII.exe+44530 "GuildII.exe"+44484: 8B 11 - mov edx,[ecx] "GuildII.exe"+44486: FF 92 AC 00 00 00 - call dword ptr [edx+000000AC] "GuildII.exe"+4448C: E9 9F 00 00 00 - jmp GuildII.exe+44530 "GuildII.exe"+44491: 8B 84 24 DC 03 00 00 - mov eax,[esp+000003DC] "GuildII.exe"+44498: 50 - push eax "GuildII.exe"+44499: 6A 00 - push 00 "GuildII.exe"+4449B: E8 40 65 FF FF - call GuildII.exe+3A9E0 // ---------- INJECTING HERE ---------- "GuildII.exe"+444A0: 8B 45 70 - mov eax,[ebp+70] "GuildII.exe"+444A3: 83 CF FF - or edi,-01 // ---------- DONE INJECTING ---------- "GuildII.exe"+444A6: 3B C7 - cmp eax,edi "GuildII.exe"+444A8: 74 74 - je GuildII.exe+4451E "GuildII.exe"+444AA: 68 FF 6C 9A 00 - push GuildII.exe+5A6CFF "GuildII.exe"+444AF: 8D 4C 24 34 - lea ecx,[esp+34] "GuildII.exe"+444B3: E8 68 CC FB FF - call GuildII.exe+1120 "GuildII.exe"+444B8: 8B 45 70 - mov eax,[ebp+70] "GuildII.exe"+444BB: 8D 0C C0 - lea ecx,[eax+eax*8] "GuildII.exe"+444BE: 8D B4 8D FC 07 00 00 - lea esi,[ebp+ecx*4+000007FC] "GuildII.exe"+444C5: 8B 0E - mov ecx,[esi] "GuildII.exe"+444C7: 8B 11 - mov edx,[ecx] } { // ORIGINAL CODE - INJECTION POINT: "GuildII.exe"+144258 "GuildII.exe"+14422F: D9 1C 24 - fstp dword ptr [esp] "GuildII.exe"+144232: 68 F0 F1 9A 00 - push GuildII.exe+5AF1F0 "GuildII.exe"+144237: E8 64 3D 00 00 - call GuildII.exe+147FA0 "GuildII.exe"+14423C: 8D 4C 24 1C - lea ecx,[esp+1C] "GuildII.exe"+144240: E8 2B 6B 1B 00 - call GuildII.exe+2FAD70 "GuildII.exe"+144245: 8D 4C 24 60 - lea ecx,[esp+60] "GuildII.exe"+144249: E8 22 6B 1B 00 - call GuildII.exe+2FAD70 "GuildII.exe"+14424E: 56 - push esi "GuildII.exe"+14424F: 8D 4C 24 20 - lea ecx,[esp+20] "GuildII.exe"+144253: E8 28 6F 1B 00 - call GuildII.exe+2FB180 // ---------- INJECTING HERE ---------- "GuildII.exe"+144258: 8B 46 54 - mov eax,[esi+54] "GuildII.exe"+14425B: 8B 6C 24 14 - mov ebp,[esp+14] // ---------- DONE INJECTING ---------- "GuildII.exe"+14425F: 6A FF - push -01 "GuildII.exe"+144261: 8D 8C 24 A8 00 00 00 - lea ecx,[esp+000000A8] "GuildII.exe"+144268: 51 - push ecx "GuildII.exe"+144269: 8B 4F 04 - mov ecx,[edi+04] "GuildII.exe"+14426C: 8D 54 24 68 - lea edx,[esp+68] "GuildII.exe"+144270: 52 - push edx "GuildII.exe"+144271: 51 - push ecx "GuildII.exe"+144272: 8D 54 24 2C - lea edx,[esp+2C] "GuildII.exe"+144276: 52 - push edx "GuildII.exe"+144277: 50 - push eax } Ну а вот так только по нажатию правой клавиши мыши ( ПКМ ) Скрытый текст [ENABLE] aobscanmodule(sl_Cursor,GuildII.exe,8B 45 70 83 CF FF) alloc(Cursor,$1000) label(ccode) label(creturn) label(CurX) label(CurY) label(CurZ) label(brnch_saver) registersymbol(CurX) registersymbol(CurY) registersymbol(CurZ) Cursor: CurX: dd 0 CurY: dd 0 CurZ: dd 0 brnch_saver: fld dword ptr [ebp+78] fstp dword ptr [CurX] fld dword ptr [ebp+7C] fstp dword ptr [CurY] fld dword ptr [ebp+80] fstp dword ptr [CurZ] jmp ccode ccode: mov eax,[ebp+70] or edi,-01 jmp creturn sl_Cursor: jmp brnch_saver nop creturn: registersymbol(sl_Cursor) ////////////////////////////////////////////////////////// aobscanmodule(sl_Player,GuildII.exe,8B 46 54 8B 6C 24 14) alloc(Player,$1000) label(pcode) label(preturn) label(brnch_loader) Player: brnch_loader: pushad push 2 // 2 - нажата правая клавиша мыши. Вместо мыши можно использовать любую клавишу call GetAsyncKeyState // Блок проверки - какая клавиша нажата? shr ax,#15 cmp ax,1 popad jne pcode fld dword ptr [CurX] fstp dword ptr [esi+5C] fld dword ptr [CurY] fstp dword ptr [esi+60] fld dword ptr [CurZ] fstp dword ptr [esi+64] jmp pcode pcode: mov eax,[esi+54] mov ebp,[esp+14] jmp preturn sl_Player: jmp Player nop nop preturn: registersymbol(sl_Player) [DISABLE] sl_Cursor: db 8B 45 70 83 CF FF sl_Player: db 8B 46 54 8B 6C 24 14 unregistersymbol(sl_Cursor) unregistersymbol(sl_Player) /////////////////////////////////////////////////////////////////// unregistersymbol(CurX) unregistersymbol(CurY) unregistersymbol(CurZ) /////////////////////////////////////////////////////////////////// dealloc(Cursor) dealloc(Player) { // ORIGINAL CODE - INJECTION POINT: "GuildII.exe"+444A0 "GuildII.exe"+44476: 8D 4C 24 18 - lea ecx,[esp+18] "GuildII.exe"+4447A: E8 41 92 2B 00 - call GuildII.exe+2FD6C0 "GuildII.exe"+4447F: E9 AC 00 00 00 - jmp GuildII.exe+44530 "GuildII.exe"+44484: 8B 11 - mov edx,[ecx] "GuildII.exe"+44486: FF 92 AC 00 00 00 - call dword ptr [edx+000000AC] "GuildII.exe"+4448C: E9 9F 00 00 00 - jmp GuildII.exe+44530 "GuildII.exe"+44491: 8B 84 24 DC 03 00 00 - mov eax,[esp+000003DC] "GuildII.exe"+44498: 50 - push eax "GuildII.exe"+44499: 6A 00 - push 00 "GuildII.exe"+4449B: E8 40 65 FF FF - call GuildII.exe+3A9E0 // ---------- INJECTING HERE ---------- "GuildII.exe"+444A0: 8B 45 70 - mov eax,[ebp+70] "GuildII.exe"+444A3: 83 CF FF - or edi,-01 // ---------- DONE INJECTING ---------- "GuildII.exe"+444A6: 3B C7 - cmp eax,edi "GuildII.exe"+444A8: 74 74 - je GuildII.exe+4451E "GuildII.exe"+444AA: 68 FF 6C 9A 00 - push GuildII.exe+5A6CFF "GuildII.exe"+444AF: 8D 4C 24 34 - lea ecx,[esp+34] "GuildII.exe"+444B3: E8 68 CC FB FF - call GuildII.exe+1120 "GuildII.exe"+444B8: 8B 45 70 - mov eax,[ebp+70] "GuildII.exe"+444BB: 8D 0C C0 - lea ecx,[eax+eax*8] "GuildII.exe"+444BE: 8D B4 8D FC 07 00 00 - lea esi,[ebp+ecx*4+000007FC] "GuildII.exe"+444C5: 8B 0E - mov ecx,[esi] "GuildII.exe"+444C7: 8B 11 - mov edx,[ecx] } { // ORIGINAL CODE - INJECTION POINT: "GuildII.exe"+144258 "GuildII.exe"+14422F: D9 1C 24 - fstp dword ptr [esp] "GuildII.exe"+144232: 68 F0 F1 9A 00 - push GuildII.exe+5AF1F0 "GuildII.exe"+144237: E8 64 3D 00 00 - call GuildII.exe+147FA0 "GuildII.exe"+14423C: 8D 4C 24 1C - lea ecx,[esp+1C] "GuildII.exe"+144240: E8 2B 6B 1B 00 - call GuildII.exe+2FAD70 "GuildII.exe"+144245: 8D 4C 24 60 - lea ecx,[esp+60] "GuildII.exe"+144249: E8 22 6B 1B 00 - call GuildII.exe+2FAD70 "GuildII.exe"+14424E: 56 - push esi "GuildII.exe"+14424F: 8D 4C 24 20 - lea ecx,[esp+20] "GuildII.exe"+144253: E8 28 6F 1B 00 - call GuildII.exe+2FB180 // ---------- INJECTING HERE ---------- "GuildII.exe"+144258: 8B 46 54 - mov eax,[esi+54] "GuildII.exe"+14425B: 8B 6C 24 14 - mov ebp,[esp+14] // ---------- DONE INJECTING ---------- "GuildII.exe"+14425F: 6A FF - push -01 "GuildII.exe"+144261: 8D 8C 24 A8 00 00 00 - lea ecx,[esp+000000A8] "GuildII.exe"+144268: 51 - push ecx "GuildII.exe"+144269: 8B 4F 04 - mov ecx,[edi+04] "GuildII.exe"+14426C: 8D 54 24 68 - lea edx,[esp+68] "GuildII.exe"+144270: 52 - push edx "GuildII.exe"+144271: 51 - push ecx "GuildII.exe"+144272: 8D 54 24 2C - lea edx,[esp+2C] "GuildII.exe"+144276: 52 - push edx "GuildII.exe"+144277: 50 - push eax } Garik66 скрипт в игре не работает Видео работы: Скрытый текст P.S. registersymbol(CurX-Y-Z) можешь удалить. Изменено 7 апреля, 2017 пользователем what228 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 11 минуту назад, what228 сказал: скрипт в игре не работает А что именно не работает? был ошибка только вот здесь: registersymbol(INJECT6) registersymbol(INJECT7) // вместо этого было registersymbol(INJECT6). Поправил скрипт. Проверь сейчас. А про третью координату я и не знал, так как об этом и не писали. Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 (изменено) 12 минуты назад, Garik66 сказал: А про третью координату я и не знал, так как об этом и не писали. Я тоже не знал Просто игру скачал и проверил. Но Z скорее тут и не важен но все же мне легче когда и он прописан. У тебя ошибка была в прыжках еще была. Скрытый текст INJECT6: jmp code => newmem db 90 return: INJECT7: jmp code => newmem1 db 90 90 return1: И теперь скрипт работает Изменено 7 апреля, 2017 пользователем what228 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 7 апреля, 2017 Поделиться Опубликовано 7 апреля, 2017 12 минуты назад, what228 сказал: У тебя ошибка была в прыжках еще была. Точно - не обратил внимание. Это в СЕ 6.5 зачем-то Дарк Байт сделал прыжок не newmem, а не на code и приходится всегда вручную это менять. ЗЫ: Поправил. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 7 апреля, 2017 Автор Поделиться Опубликовано 7 апреля, 2017 Just now, what228 said: Видео работы: Просто игру скачал и проверил. Ого. Впечатляет. Спасибо большое. Just now, Garik66 said: А про третью координату я и не знал, так как об этом и не писали. Это координата по вертикали. Я не стал её приводить потому, что перемещение при вводе координат вручную работает и без неё, а если её саму принудительно поменять вручную, то она тут же восстанавливается, игрок не проваливается и не улетает в небо. Вроде как не нужна. Ну и главное: для меня это намного проще, мне бы для начала с двумя координатами хоть немного разобраться. Спасибо за помощь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 7 апреля, 2017 Автор Поделиться Опубликовано 7 апреля, 2017 4 hours ago, Garik66 said: Появились вопросы. 1. Объясни пожалуйста работу этой части скрипта: pushad push 2 // 2 - нажата правая клавиша мыши. Вместо мыши можно использовать любую клавишу call GetAsyncKeyState // Блок проверки - какая клавиша нажата? shr ax,#15 cmp ax,1 popad С твоими подсказками вроде общий смысл уяснил, но дьявол в деталях. Хочется понимания как оно работает, а не только брать готовое. 2. В ходе экспериментов я пробовал эту "непонятную" часть изменить на привычную для меня, получилось в итоге вот что: Spoiler [ENABLE] aobscanmodule(INJECT6,GuildII.exe+44D20,8bxxxx83xxxx3bxx74xx68xxxxxxxx8d) aobscanmodule(INJECT7,GuildII.exe+146668,8bxxxx8bxxxxxx6axx8dxxxxxxxxxxxxxx8bxxxx8d) alloc(newmem,$1000) label(newmem1) label(code) label(return) label(code1) label(return1) label(CoordX) label(CoordY) label(LoadCoord) registersymbol(LoadCoord) registersymbol(INJECT6) registersymbol(INJECT7) newmem: cmp [LoadCoord],2 jne code mov eax,[ebp+78] mov [CoordX],eax mov eax,[ebp+80] mov [CoordY],eax mov [LoadCoord],1 code: mov eax,[ebp+70] or edi,-01 jmp return newmem1: cmp [CoordX],0 je code1 cmp [LoadCoord],1 jne code1 mov eax,[CoordX] mov [esi+5c],eax mov eax,[CoordY] mov [esi+64],eax mov [LoadCoord],0 code1: mov eax,[esi+54] mov ebp,[esp+14] jmp return1 CoordX: dd 0 CoordY: dd 0 LoadCoord: dd 0 INJECT6: jmp newmem db 90 return: INJECT7: jmp newmem1 db 90 90 return1: [DISABLE] INJECT6: mov eax,[ebp+70] or edi,-01 INJECT7: mov eax,[esi+54] mov ebp,[esp+14] unregistersymbol(LoadCoord) unregistersymbol(INJECT6) unregistersymbol(INJECT7) dealloc(newmem) Если вывести в таблицу адрес [LoadCoord] и поставить на него хоткей, устанавливающий значение 2, то скрипт по нажатию хоткея вроде бы телепортирует как надо. Вопрос, правильно ли так делать и не накосячил ли я где-нибудь? 3. Как в таблице по Ctrl+H установить хоткей на ПКМ? Как установить на обычные клавиши понятно, но при нажатии на ПКМ там просто выводится меню Copy/Paste и всё. 4. Поясни, для чего в скрипте нужна проверка: cmp [CoordX],0 je code1 Понимаю, что она делает, но не соображу, зачем. ЗЫ. Почему-то форум не разрешает "спасибки" за посты ставить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 5 часов назад, Foxhound сказал: 4. Поясни, для чего в скрипте нужна проверка: cmp [CoordX],0 je code1 Понимаю, что она делает, но не соображу, зачем. Эта проверка нужна для того, чтобы не прыгнуть в нулевые координаты, если юзер после активации телепорта случайно нажмет возврат к позиции не успев эту самую позицию сохранить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 5 часов назад, Foxhound сказал: 1. Объясни пожалуйста работу этой части скрипта: pushad push 2 // 2 - нажата правая клавиша мыши. Вместо мыши можно использовать любую клавишу call GetAsyncKeyState // Блок проверки - какая клавиша нажата? shr ax,#15 cmp ax,1 popad Здесь все просто, если знаешь основы программирования на ассемблере вообще, и под винду в частности. Все параметры, передаваемые в функцию, сохраняются на стеке, затем делается вызов функции. В данном случае функция GetAsyncKeyState - это функция из набора WinAPI (виндового апи), которая принимает на вход один параметр - код клавиши, чтобы проверить, нажата она или нет. В eax функция возвращает результат проверки. Если не вдаваться в подробности, то старший бит возвращаемого значения как раз сигнализирует о том, что нажата эта клавиша. Потому дальше идет сдвиг на 15 бит вправо и далее проверка на 1. Ну а пара инструкций pushad/popad сохраняет и восстанавливает все состояния регистров. Это делается для того, чтобы вызовом функции не нарушить логику работы программы (игры). Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 6 часов назад, Foxhound сказал: Вопрос, правильно ли так делать и не накосячил ли я где-нибудь? Можно так делать, не накосячил. Но можешь просто заменить в АА-скрипте код клавиши (push 2 -замени 2 на код нужной клавиши). Почему я выбрал ПКМ - для удобства пользователя активируешь скрипт, а потом только жмякаешь ПКМ. (часто ПКМ свободна и делается одной рукой в результате другая рука свободна) 6 часов назад, Foxhound сказал: 3. Как в таблице по Ctrl+H установить хоткей на ПКМ? Как установить на обычные клавиши понятно, но при нажатии на ПКМ там просто выводится меню Copy/Paste и всё. Скорее всего в СЕ не предусмотрено это, я сам ни разу не назначал клавиши мыши в таблице, поэтому точно не знаю. 6 часов назад, Foxhound сказал: ЗЫ. Почему-то форум не разрешает "спасибки" за посты ставить. Возможность появиться попозже - ещё после нескольких постов (наверное после 10). Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 8 апреля, 2017 Автор Поделиться Опубликовано 8 апреля, 2017 7 hours ago, Xipho said: Эта проверка нужна для того, чтобы не прыгнуть в нулевые координаты, если юзер после активации телепорта случайно нажмет возврат к позиции не успев эту самую позицию сохранить. Всё-таки не совсем ясно. Как я себе представляю, такая проверка нужна для "возвратного" телепорта, когда координаты сначала в произвольный момент записываются, какое-то время хранятся, а потом по нажатию считываются. Тогда, если перепутать последовательность, то при нажатии возврата без первого сохранения позиции считаются нули, так? Но в данном случае перепутать нечего - юзер совершает одно нажатие, а не два, телепорт осуществляется в точку курсора, считываемые координаты постоянно обновляются с момента активации скрипта, а не фиксируются вручную по нажатию сохранения текущей позиции. Получается, в нулевые координаты не прыгнуть. В чём ошибка в моих рассуждениях, поясни[те?] пожалуйста? 7 hours ago, Xipho said: Здесь все просто, если знаешь основы программирования на ассемблере вообще, и под винду в частности. Ключевое - "если знаешь". Делаю самые первые шаги и то только лишь в СЕ в рамках игрового взлома. Спасибо за пояснения. 6 hours ago, Garik66 said: Но можешь просто заменить в АА-скрипте код клавиши (push 2 -замени 2 на код нужной клавиши). Это я сразу понял. Просто когда не совсем ясен принцип работы, хочется иметь в запасе вариант собственного осмысленного приготовления, пусть и не лучший, но хотя бы рабочий. Словом, не только рыбу, но и удочку. А то, например, я не знаю, если делать аналогиный телепорт на другую игру, можно ли скопировать этот участок кода неизменным, как шаблон, и если нет, то что менять. 6 hours ago, Garik66 said: Скорее всего в СЕ не предусмотрено это, я сам ни разу не назначал клавиши мыши в таблице, поэтому точно не знаю. В том-то и дело, что в СЕ можно назначить ПКМ на хоткей и она будет работать (проверял), в окошке назначенной клавиши появляется "Right MB", только я не знаю, как это сделать средствами самого СЕ. Может кто-нибудь знает? Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 (изменено) 29 минуты назад, Foxhound сказал: В чём ошибка в моих рассуждениях, поясни[те?] пожалуйста? Проверка нужна чтоб не прыгнуть в 0,0,0 координаты но как ты заметил то в случае с этим скриптом такого случится не может т.к. идет запись а потом лишь перемещение. Но все же лучше когда есть проверки чтоб отсечь все возможные ошибки. 29 минуты назад, Foxhound сказал: можно ли скопировать этот участок кода неизменным, как шаблон, и если нет, то что менять. Если ты про код с клавишей то копируй сколько влезет. Как и большую часть скрипта. 29 минуты назад, Foxhound сказал: Может кто-нибудь знает? Скорее всего это не возможно ибо при использовании мыши будут выполняться скрипты а мышь ( LB RB ) нужны для работы в программе ( жать кнопочки ). Изменено 8 апреля, 2017 пользователем what228 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 47 минуты назад, Foxhound сказал: В том-то и дело, что в СЕ можно назначить ПКМ на хоткей и она будет работать (проверял), в окошке назначенной клавиши появляется "Right MB", только я не знаю, как это сделать средствами самого СЕ. Противоречие какое-то. Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 8 апреля, 2017 Автор Поделиться Опубликовано 8 апреля, 2017 16 minutes ago, what228 said: Проверка нужна чтоб не прыгнуть в 0,0,0 координаты но как ты заметил то в случае с этим скриптом такого случится не может т.к. идет запись а потом лишь перемещение. Но все же лучше когда есть проверки чтоб отсечь все возможные ошибки. Понял, спасибо. 17 minutes ago, what228 said: Если ты про код с клавишей то копируй сколько влезет. Да, про него. Я понял, что в "push 2" достаточно число 2 заменить на код другой клавиши, это просто, но мне неясно, как, например, я должен изменить код, чтобы проверялось нажатие не одной клавиши, а комбинации из двух-трёх, что-то типа Ctrl+Alt+W? 1 minute ago, Xipho said: Противоречие какое-то. Поясню. Выделяю пункт в таблице, жму Ctrl+H, открывается окно хоткеев, указываю нужное мне действие по нажатию и назначаю любую обычную клавишу, которую можно назначить. Выхожу из окна хоткеев, сохраняю таблицу. Затем в notepad++ открываю сохранённый файл таблицы, нахожу по названию искомый пункт, в нём будет запись вида <Key>ZZZ</Key>, где ZZZ - код назначенной клавиши. Меняю его на 2, сохраняю файл. Открываю изменённую таблицу в СЕ. Теперь в окне хоткеев в поле назначенной клавиши будет "Right MB". Срабатывать как хоткей она будет корректно, штатными средствами СЕ её можно снова заменить на что-то другое, но обратно вернуть уже не получается, только опять через внешний редактор. Меня интересует, можно ли проделать всю эту процедуру назначения ПКМ обычным способом внутри стандартного диалога СЕ, без привлечения сторонних редакторов и пр.? Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 1 минуту назад, Foxhound сказал: Меня интересует, можно ли проделать всю эту процедуру назначения ПКМ обычным способом внутри стандартного диалога СЕ, без привлечения сторонних редакторов и пр.? Скорее всего нет и смысла в этом нет. Я тебе дал уже ответ. В программе клавиши мыши используются для других функций да и смысла в этом нет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 8 апреля, 2017 Автор Поделиться Опубликовано 8 апреля, 2017 1 hour ago, what228 said: Скорее всего нет и смысла в этом нет. Я тебе дал уже ответ. В программе клавиши мыши используются для других функций да и смысла в этом нет. В самой программе - да, для других, но не в игре. Смысл мне видится в том, чтобы в игре была возможность совместить хоткей от СЕ и внутриигровую клавишу выполнения какого-то связанного действия, чтобы работало одно нажатие, а не два разных. В своём скрипте Garik66 очень точно угадал с назначением телепорта на ПКМ. Ты сам видел, что в игре клик по ПКМ используется для указания герою "куда бежать" и герой ничинает движение в указанную точку, а срабатывание телепорта по той же кнопке мгновенно переносит его на позицию, что очень удобно - разок клацнул "родную" кнопку перемещения и уже на месте. Однако в моём варианте скрипта с назначением хоткея на адрес в таблице я столкнулся с тем, что этот номер не проходит - назначить ПКМ не удаётся и приходится для телепорта использовать другую, отдельную клавишу. Это неудобно. Причём ладно если бы сам СЕ не понимал по хоткею нажатие ПКМ, тогда и вопросов бы не было. Но он понимает, показывает назначенную ПКМ в окне и работает с ней как положено. Вот и хотелось бы узнать, можно ли её назначить без "надевания штанов через голову". Ну да ладно, неважно, я понял твою мысль. Лучше расскажи пожалуйста, как изменить код для проверки нажатия не одной, а комбинации двух-трёх клавиш. И ещё, как сделать проверку на разные нажатия, просто повторить код для каждой проверяемой клавиши или нет? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 1 час назад, Foxhound сказал: Лучше расскажи пожалуйста, как изменить код для проверки нажатия не одной, а комбинации двух-трёх клавиш. Ctrl+Numpad1 Скрытый текст pushad push 11 // 11 - нажата клавиша Ctrl. call GetAsyncKeyState shr ax,#15 cmp ax,1 popad jne code pushad push 61 // 61 - нажата клавиша Numpad1. call GetAsyncKeyState shr ax,#15 cmp ax,1 popad jne code Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 12 минуты назад, Garik66 сказал: Ctrl+Numpad1 Показать содержимое pushad push 17 // 17 - нажата клавиша Ctrl. call GetAsyncKeyState shr ax,#15 cmp ax,1 popad jne code pushad push 97 // 97 - нажата клавиша Numpad1. call GetAsyncKeyState shr ax,#15 cmp ax,1 popad jne code Хм странно делал то же самое а скрипт не работал ) Думаю стоит указать что pushad не работает в x64 для работы в x64 используются Скрытый текст push rax push rbx push rdx push rsi push rdi push rbp push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 и т.д. pop (reg) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 Только что, what228 сказал: Хм странно делал то же самое а скрипт не работал ) Нужно тестить. Может ошибался в прыжках? Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 Только что, Garik66 сказал: Нужно тестить. Может ошибался в прыжках? Возможно. Сейчас проверю. Странно работает хотя не с первого раза Скорее всего в прошлый раз так же не с первого раза срабатывал но проверял в туториале. И да в твоем скрипте ошибка ctrl -> 11 а не 17 numpad1 -> 61 а не 97 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 8 апреля, 2017 Поделиться Опубликовано 8 апреля, 2017 1 минуту назад, what228 сказал: Возможно. Сейчас проверю. Странно работает хотя не с первого раза Скорее всего в прошлый раз так же не с первого раза срабатывал но проверял в туториале. И да в твоем скрипте ошибка ctrl -> 11 а не 17 numpad1 -> 61 а не 97 Брал из СЕ-ного difines.LUA Скрытый текст --Key codes VK_LBUTTON = 1 VK_RBUTTON = 2 VK_CANCEL = 3 VK_MBUTTON = 4 VK_XBUTTON1 = 5 VK_XBUTTON2 = 6 VK_BACK = 8 VK_TAB = 9 VK_CLEAR = 12 VK_RETURN = 13 VK_SHIFT = 16 VK_CONTROL = 17 // в HEX 11 VK_MENU = 18 VK_PAUSE = 19 VK_CAPITAL = 20 VK_ESCAPE = 27 VK_SPACE = 32 VK_PRIOR = 33 VK_NEXT = 34 VK_END = 35 VK_HOME = 36 VK_LEFT = 37 VK_UP = 38 VK_RIGHT = 39 VK_DOWN = 40 VK_SELECT = 41 VK_PRINT = 42 VK_EXECUTE = 43 VK_SNAPSHOT = 44 VK_INSERT = 45 VK_DELETE = 46 VK_HELP = 47 VK_0 = 48 VK_1 = 49 VK_2 = 50 VK_3 = 51 VK_4 = 52 VK_5 = 53 VK_6 = 54 VK_7 = 55 VK_8 = 56 VK_9 = 57 VK_A = 65 VK_B = 66 VK_C = 67 VK_D = 68 VK_E = 69 VK_F = 70 VK_G = 71 VK_H = 72 VK_I = 73 VK_J = 74 VK_K = 75 VK_L = 76 VK_M = 77 VK_N = 78 VK_O = 79 VK_P = 80 VK_Q = 81 VK_R = 82 VK_S = 83 VK_T = 84 VK_U = 85 VK_V = 86 VK_W = 87 VK_X = 88 VK_Y = 89 VK_Z = 90 VK_LWIN = 91 VK_RWIN = 92 VK_APPS = 93 VK_NUMPAD0 = 96 VK_NUMPAD1 = 97 // в HEX 61 VK_NUMPAD2 = 98 VK_NUMPAD3 = 99 VK_NUMPAD4 = 100 VK_NUMPAD5 = 101 VK_NUMPAD6 = 102 VK_NUMPAD7 = 103 VK_NUMPAD8 = 104 VK_NUMPAD9 = 105 VK_MULTIPLY = 106 А понял в файле в десятичной - спасибо за правку Поправлю в пред. сообщении 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 9 апреля, 2017 Автор Поделиться Опубликовано 9 апреля, 2017 16 hours ago, Garik66 said: Ctrl+Numpad1 Работает, спасибо. Ура. Если не трудно, растолкуй, что делает shr ax,#15 поиском я нашёл, что это сдвиг на 15 бит, но так и понял, зачем он применяется и почему именно на 15. В процессе поисков я набрёл на похожую тему на оф. форуме СЕ, там тоже предлагают call GetAsyncKeyState, но там в примерах кода почему-то нет строки "shr ax,#15", после call GetAsyncKeyState сразу идёт сравнение. Тренировка - наше всё, поэтому ради интереса я попробовал в скрипте телепорта убрать строку "shr ax,#15". Проверил - работает и без неё. Но я понимаю, что ты её использовал не просто так, что для чего-то она нужна и без неё что-то будет работать не так. Объясни? Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 9 апреля, 2017 Поделиться Опубликовано 9 апреля, 2017 (изменено) 13 минуты назад, Foxhound сказал: Если не трудно, растолкуй, что делает shr ax,#15 Но я понимаю, что ты её использовал не просто так, что для чего-то она нужна и без неё что-то будет работать не так. Объясни? 30 секунд поиска :) читай ответ от DarkByte'a Изменено 9 апреля, 2017 пользователем what228 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 9 апреля, 2017 Поделиться Опубликовано 9 апреля, 2017 (изменено) Тоже не понял почему это смещение на 15 бит вправо, вроде же можно сделать так push 0x71 call GetAsyncKeyState test al, 1 je ... Т.е вместо проверки 16 битного регистра, будем проверять его младшую часть 8 бит. Изменено 9 апреля, 2017 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения