Перейти к содержанию

Помогите сделать телепорт


Рекомендуемые сообщения

Игра 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, то персонаж телепортируется в точку курсора.
Как сделать это действие автоматически, по нажатию клавиши? Видеоуроки по телепорту посмотрел, попробовал "подружить" оба скрипта, ничего не получилось, то не работает, то виснет.

Ссылка на комментарий
Поделиться на другие сайты

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
Ссылка на комментарий
Поделиться на другие сайты

Твой персонаж если он выделен будет всегда следовать за курсором
 

Скрытый текст

[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) можешь удалить.

Изменено пользователем what228
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, what228 сказал:

скрипт в игре не работает

А что именно не работает?

был ошибка только вот здесь:

registersymbol(INJECT6)
registersymbol(INJECT7) // вместо этого было registersymbol(INJECT6). Поправил скрипт.

Проверь сейчас.

А про третью координату я и не знал, так как об этом и не писали.

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, Garik66 сказал:

А про третью координату я и не знал, так как об этом и не писали.

Я тоже не знал :) Просто игру скачал и проверил. Но Z скорее тут и не важен но все же мне легче когда и он прописан.

У тебя ошибка была в прыжках еще была.
 

Скрытый текст

INJECT6:
	jmp code	=>	newmem
	db 90
return:

INJECT7:
	jmp code	=>	newmem1
	db 90 90
return1:

 

И теперь скрипт работает :)

Изменено пользователем what228
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, what228 сказал:

У тебя ошибка была в прыжках еще была.

Точно :D - не обратил внимание. Это в СЕ 6.5 зачем-то Дарк Байт сделал прыжок не newmem, а не на code и приходится всегда вручную это менять. 

 

ЗЫ: Поправил.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Just now, what228 said:

Видео работы:

 

Просто игру скачал и проверил.

 

Ого. Впечатляет. :) Спасибо большое.

 

 

Just now, Garik66 said:

А про третью координату я и не знал, так как об этом и не писали.

 

Это координата по вертикали. Я не стал её приводить потому, что перемещение при вводе координат вручную работает и без неё, а если её саму принудительно поменять вручную, то она тут же восстанавливается, игрок не проваливается и не улетает в небо. Вроде как не нужна. Ну и главное: для меня это намного проще, мне бы для начала с двумя координатами хоть немного разобраться. :) Спасибо за помощь.

Ссылка на комментарий
Поделиться на другие сайты

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
Понимаю, что она делает, но не соображу, зачем.


ЗЫ. Почему-то форум не разрешает "спасибки" за посты ставить.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Foxhound сказал:

4. Поясни, для чего в скрипте нужна проверка:
    cmp [CoordX],0
    je code1
Понимаю, что она делает, но не соображу, зачем.

Эта проверка нужна для того, чтобы не прыгнуть в нулевые координаты, если юзер после активации телепорта случайно нажмет возврат к позиции не успев эту самую позицию сохранить.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Foxhound сказал:

1. Объясни пожалуйста работу этой части скрипта:
    pushad
    push 2                       // 2 - нажата правая клавиша мыши. Вместо мыши можно использовать любую клавишу
    call GetAsyncKeyState        // Блок проверки - какая клавиша нажата?
    shr ax,#15
    cmp ax,1
    popad

Здесь все просто, если знаешь основы программирования на ассемблере вообще, и под винду в частности. Все параметры, передаваемые в функцию, сохраняются на стеке, затем делается вызов функции. В данном случае функция

GetAsyncKeyState - это функция из набора WinAPI (виндового апи), которая принимает на вход один параметр - код клавиши, чтобы проверить, нажата она или нет. В eax функция возвращает результат проверки. Если не вдаваться в подробности, то старший бит возвращаемого значения как раз сигнализирует о том, что нажата эта клавиша. Потому дальше идет сдвиг на 15 бит вправо и далее проверка на 1.

Ну а пара инструкций pushad/popad сохраняет и восстанавливает все состояния регистров. Это делается для того, чтобы вызовом функции не нарушить логику работы программы (игры).

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Foxhound сказал:

Вопрос, правильно ли так делать и не накосячил ли я где-нибудь?

Можно так делать, не накосячил. Но можешь просто заменить в АА-скрипте код клавиши (push 2 -замени 2 на код нужной клавиши).

Почему я выбрал ПКМ - для удобства пользователя активируешь скрипт, а потом только жмякаешь ПКМ. (часто ПКМ свободна и делается одной рукой в результате другая рука свободна):D

6 часов назад, Foxhound сказал:

3. Как в таблице по Ctrl+H установить хоткей на ПКМ? Как установить на обычные клавиши понятно, но при нажатии на ПКМ там просто выводится меню Copy/Paste и всё.

Скорее всего в СЕ не предусмотрено это, я сам ни разу не назначал клавиши мыши в таблице, поэтому точно не знаю.

 

6 часов назад, Foxhound сказал:

ЗЫ. Почему-то форум не разрешает "спасибки" за посты ставить.

Возможность появиться попозже - ещё после нескольких постов (наверное после 10).

Ссылка на комментарий
Поделиться на другие сайты

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", только я не знаю, как это сделать средствами самого СЕ.
Может кто-нибудь знает?

Ссылка на комментарий
Поделиться на другие сайты

29 минуты назад, Foxhound сказал:

В чём ошибка в моих рассуждениях, поясни[те?] пожалуйста?

Проверка нужна чтоб не прыгнуть в 0,0,0 координаты но как ты заметил то в случае с этим скриптом такого случится не может т.к. идет запись а потом лишь перемещение. Но все же лучше когда есть проверки чтоб отсечь все возможные ошибки.

 

29 минуты назад, Foxhound сказал:

можно ли скопировать этот участок кода неизменным, как шаблон, и если нет, то что менять.

Если ты про код с клавишей то копируй сколько влезет. Как и большую часть скрипта.

 

29 минуты назад, Foxhound сказал:

Может кто-нибудь знает?

Скорее всего это не возможно ибо при использовании мыши будут выполняться скрипты а мышь ( LB RB ) нужны для работы в программе ( жать кнопочки ).

Изменено пользователем what228
Ссылка на комментарий
Поделиться на другие сайты

47 минуты назад, Foxhound сказал:

В том-то и дело, что в СЕ можно назначить ПКМ на хоткей и она будет работать (проверял), в окошке назначенной клавиши появляется "Right MB", только я не знаю, как это сделать средствами самого СЕ.

Противоречие какое-то.

Ссылка на комментарий
Поделиться на другие сайты

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". Срабатывать как хоткей она будет корректно, штатными средствами СЕ её можно снова заменить на что-то другое, но обратно вернуть уже не получается, только опять через внешний редактор.
Меня интересует, можно ли проделать всю эту процедуру назначения ПКМ обычным способом внутри стандартного диалога СЕ, без привлечения сторонних редакторов и пр.?

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Foxhound сказал:

Меня интересует, можно ли проделать всю эту процедуру назначения ПКМ обычным способом внутри стандартного диалога СЕ, без привлечения сторонних редакторов и пр.?

Скорее всего нет и смысла в этом нет. Я тебе дал уже ответ. В программе клавиши мыши используются для других функций да и смысла в этом нет.

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, what228 said:

Скорее всего нет и смысла в этом нет. Я тебе дал уже ответ. В программе клавиши мыши используются для других функций да и смысла в этом нет.

 

В самой программе - да, для других, но не в игре. Смысл мне видится в том, чтобы в игре была возможность совместить хоткей от СЕ и внутриигровую клавишу выполнения какого-то связанного действия, чтобы работало одно нажатие, а не два разных. В своём скрипте Garik66 очень точно угадал с назначением телепорта на ПКМ. Ты сам видел, что в игре клик по ПКМ используется для указания герою "куда бежать" и герой ничинает движение в указанную точку, а срабатывание телепорта по той же кнопке мгновенно переносит его на позицию, что очень удобно - разок клацнул "родную" кнопку перемещения и уже на месте. Однако в моём варианте скрипта с назначением хоткея на адрес в таблице я столкнулся с тем, что этот номер не проходит - назначить ПКМ не удаётся и приходится для телепорта использовать другую, отдельную клавишу. Это неудобно. Причём ладно если бы сам СЕ не понимал по хоткею нажатие ПКМ, тогда и вопросов бы не было. Но он понимает, показывает назначенную ПКМ в окне и работает с ней как положено. Вот и хотелось бы узнать, можно ли её назначить без "надевания штанов через голову".
Ну да ладно, неважно, я понял твою мысль. :)

 

Лучше расскажи пожалуйста, как изменить код для проверки нажатия не одной, а комбинации двух-трёх клавиш.
И ещё, как сделать проверку на разные нажатия, просто повторить код для каждой проверяемой клавиши или нет?

Ссылка на комментарий
Поделиться на другие сайты

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

 

 

Ссылка на комментарий
Поделиться на другие сайты

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 сказал:

Нужно тестить. Может ошибался в прыжках?

Возможно. Сейчас проверю. Странно работает хотя не с первого раза :) Скорее всего в прошлый раз так же не с первого раза срабатывал но проверял в туториале.
И да в твоем скрипте ошибка
ctrl -> 11 а не 17
numpad1 -> 61 а не 97

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

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
Ссылка на комментарий
Поделиться на другие сайты

16 hours ago, Garik66 said:

Ctrl+Numpad1

 

Работает, спасибо. Ура. :)

 

Если не трудно, растолкуй, что делает
shr ax,#15
поиском я нашёл, что это сдвиг на 15 бит, но так и понял, зачем он применяется и почему именно на 15. В процессе поисков я набрёл на похожую тему на оф. форуме СЕ, там тоже предлагают call GetAsyncKeyState, но там в примерах кода почему-то нет строки "shr ax,#15", после call GetAsyncKeyState сразу идёт сравнение. Тренировка - наше всё, поэтому ради интереса я попробовал в скрипте телепорта убрать строку "shr ax,#15". Проверил - работает и без неё. Но я понимаю, что ты её использовал не просто так, что для чего-то она нужна и без неё что-то будет работать не так. Объясни?

Ссылка на комментарий
Поделиться на другие сайты

13 минуты назад, Foxhound сказал:

Если не трудно, растолкуй, что делает
shr ax,#15
Но я понимаю, что ты её использовал не просто так, что для чего-то она нужна и без неё что-то будет работать не так. Объясни?

30 секунд поиска :) читай ответ от DarkByte'a

Изменено пользователем what228
Ссылка на комментарий
Поделиться на другие сайты

Тоже не понял почему это смещение на 15 бит вправо, вроде же можно сделать так 

push 0x71
call GetAsyncKeyState
test al, 1
je ...

Т.е вместо проверки 16 битного регистра, будем проверять его младшую часть 8 бит.

 

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.