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

Как найти скорость передвижения игрока?


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

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

ЗЫ: Нашёл здесь (раскрой все спойлеры).

 

Ооо, ну наконец то на "ты", а то всё "вы" да "вы".

 

Можно поподробнее об реализации за счет своего множителя?

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

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

 

Ооо, ну наконец то на "ты", а то всё "вы" да "вы".

 

Можно поподробнее об реализации за счет своего множителя?

Для этого мне нужно будет по-новой для какой нибудь игры реализовать такое, так как я глобально чистил комп и много что поудалял. (Поэтому не обещаю, так как со свободным временем сейчас плохо).

Но в какой то теме, что-то подобное по-моему Vlad2 выкладывал, либо laziz  точно не помню, тоже вроде было связано со скоростью передвижения и реализовано было тоже через координаты (ну т.е. свой множитель).

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

Кстати вот нашёл одна из реализаций (не множитель) здесь  - как работает скрипт в самом конце видео.

Скрипт "RUN" из той темы из таблицы:

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

{ Game   : Fable Anniversary.exe
  Version: v.1.0 (Build 867695 / Update 5) R.G. Mechanics
  Date   : 2016-05-02
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
{$LUA}
getAddressList().getMemoryRecordByID(5322).Color=0x00000ff
PlaySound(findTableFile([[Activate]]))
{$ASM}
aobscanmodule(RUNX,Fable Anniversary.exe,F3 0F 10 81 88 00 00 00 F3 0F 58)
aobscanmodule(RUNY,Fable Anniversary.exe,F3 0F 10 40 04 F3 0F 58 81 8C)
aobscanmodule(RUNZ,Fable Anniversary.exe,F3 0F 10 40 08 F3 0F 58 81 90)
alloc(newmem,$1000)
label(newmem1)
label(newmem2)
label(code)
label(code1)
label(code2)
label(return)
label(return1)
label(return2)
label(NewSpeed)
registersymbol(NewSpeed)
registersymbol(RUNX)
registersymbol(RUNY)
registersymbol(RUNZ)

newmem:
  movss xmm0,[ecx+00000088]
  cmp [NewSpeed],2
  jne @f
  addss xmm0,[eax]
  jmp code

@@:
  cmp [NewSpeed],3
  jne @f
  addss xmm0,[eax]
  addss xmm0,[eax]
  jmp code

@@:
  cmp [NewSpeed],4
  jne code
  addss xmm0,[eax]
  addss xmm0,[eax]
  addss xmm0,[eax]

code:
  jmp return

newmem1:
  movss xmm0,[eax+04]
  cmp [NewSpeed],2
  jne @f
  addss xmm0,[ecx+0000008C]
  jmp code1

@@:
  cmp [NewSpeed],3
  jne @f
  addss xmm0,[ecx+0000008C]
  addss xmm0,[ecx+0000008C]
  jmp code1

@@:
  cmp [NewSpeed],4
  jne code1
  addss xmm0,[ecx+0000008C]
  addss xmm0,[ecx+0000008C]
  addss xmm0,[ecx+0000008C]

code1:
  jmp return1

newmem2:
  movss xmm0,[eax+08]
  cmp [NewSpeed],2
  jne @f
  addss xmm0,[ecx+00000090]
  jmp code2

@@:
  cmp [NewSpeed],3
  jne @f
  addss xmm0,[ecx+00000090]
  addss xmm0,[ecx+00000090]
  jmp code2

@@:
  cmp [NewSpeed],4
  jne code2
  addss xmm0,[ecx+00000090]
  addss xmm0,[ecx+00000090]
  addss xmm0,[ecx+00000090]

code2:
  jmp return2

NewSpeed:
dd 1

RUNX:
  jmp newmem
  db 90 90 90
return:

RUNY:
  jmp newmem1
return1:

RUNZ:
  jmp newmem2
return2:

[DISABLE]
{$LUA}
getAddressList().getMemoryRecordByID(5322).Color=0x0008000
PlaySound(findTableFile([[Deactivate]]))
{$ASM}
RUNX:
  db F3 0F 10 81 88 00 00 00
RUNY:
  db F3 0F 10 40 04
RUNZ:
  db F3 0F 10 40 08

unregistersymbol(NewSpeed)
unregistersymbol(RUNX)
unregistersymbol(RUNY)
unregistersymbol(RUNZ)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Fable Anniversary.exe"+1A742F4

"Fable Anniversary.exe"+1A742E7: CC                       -  int 3 
"Fable Anniversary.exe"+1A742E8: CC                       -  int 3 
"Fable Anniversary.exe"+1A742E9: CC                       -  int 3 
"Fable Anniversary.exe"+1A742EA: CC                       -  int 3 
"Fable Anniversary.exe"+1A742EB: CC                       -  int 3 
"Fable Anniversary.exe"+1A742EC: CC                       -  int 3 
"Fable Anniversary.exe"+1A742ED: CC                       -  int 3 
"Fable Anniversary.exe"+1A742EE: CC                       -  int 3 
"Fable Anniversary.exe"+1A742EF: CC                       -  int 3 
"Fable Anniversary.exe"+1A742F0: 8B 44 24 04              -  mov eax,[esp+04]
// ---------- INJECTING HERE ----------
"Fable Anniversary.exe"+1A742F4: F3 0F 10 81 88 00 00 00  -  movss xmm0,[ecx+00000088]
// ---------- DONE INJECTING  ----------
"Fable Anniversary.exe"+1A742FC: F3 0F 58 00              -  addss xmm0,[eax]
"Fable Anniversary.exe"+1A74300: F3 0F 11 81 88 00 00 00  -  movss [ecx+00000088],xmm0
"Fable Anniversary.exe"+1A74308: F3 0F 10 40 04           -  movss xmm0,[eax+04]
"Fable Anniversary.exe"+1A7430D: F3 0F 58 81 8C 00 00 00  -  addss xmm0,[ecx+0000008C]
"Fable Anniversary.exe"+1A74315: F3 0F 11 81 8C 00 00 00  -  movss [ecx+0000008C],xmm0
"Fable Anniversary.exe"+1A7431D: F3 0F 10 40 08           -  movss xmm0,[eax+08]
"Fable Anniversary.exe"+1A74322: F3 0F 58 81 90 00 00 00  -  addss xmm0,[ecx+00000090]
"Fable Anniversary.exe"+1A7432A: F3 0F 11 81 90 00 00 00  -  movss [ecx+00000090],xmm0
"Fable Anniversary.exe"+1A74332: C2 04 00                 -  ret 0004
"Fable Anniversary.exe"+1A74335: CC                       -  int 3 
}

 

 

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

Прикольно, получается это такой же метод , по какому @keng делал двойной прыжок

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

 

 

 

Что интересно, при спидхаке персонаж в Fable Anniversary не только быстрее перемещается, но еще и соответственно этому также быстро передвигает ноги. Например в игре Watch Dog, если изменить множитель на 2,3,4... персонаж будет перемещаться быстро, но его ноги будут двигаться также как и при обычной ходьбе.

 

Есть еще идеи как сделать суперспид персонажа? Тебе не обязательно качать игру, можно просто рассказать суть.

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

15 минуту назад, AntonVit сказал:

Прикольно, получается это такой же метод , по какому @keng делал двойной прыжок

Да здесь я реализовал именно как у kenga.

 

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

17 минуту назад, AntonVit сказал:

Есть еще идеи как сделать суперспид персонажа?

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

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

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

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

 

Расскажи суть способа "свой множитель", что да как нужно делать?

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

3 минуты назад, AntonVit сказал:

 

Расскажи суть способа "свой множитель", что да как нужно делать?

 

1 час назад, Garik66 сказал:

Для этого мне нужно будет по-новой для какой нибудь игры реализовать такое, так как я глобально чистил комп и много что поудалял. (Поэтому не обещаю, так как со свободным временем сейчас плохо).

Память плохая стала, не помню уже как делал. 

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

Только что, AntonVit сказал:

 

Зачем?

В своё время - засыпали вопросами - не успевал отвечать всем, после этого осталась привычка.

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

5 минут назад, AntonVit сказал:

 

У меня немного другой способ, но спасибо.

Способов всего два:

1) реверсить игру и искать множитель передвижения

2) самому генерировать новые координаты, посредством тригонометрических формул(ссылку скинул выше), но для этого нужно еще и угол поворота найти

 

Есть еще третий способ, но он грязный - это ускорить или замедлить всю игру, как это делается в СЕ

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

Только что, Dino сказал:

Способов всего два:

1) реверсить игру и искать множитель передвижения

2) самому генерировать новые координаты, посредством тригонометрических формул(ссылку скинул выше), но для этого нужно еще и угол поворота найти

 

Есть еще третий способ, но он грязный - это ускорить или замедлить всю игру, как это делается в СЕ

 

А еще есть четвертый способ, - продублировать инструкцию работающую с координатами (как у Гарика и Kenga).

Угол поворота - Азимут имеется в виду?

 

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

8 минут назад, AntonVit сказал:

А еще есть четвертый способ, - продублировать инструкцию работающую с координатами (как у Гарика и Kenga).

Это прокатит с высотой прыжка, но не с передвижением

 

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

 

Угол поворота - Азимут имеется в виду?

 

Да

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

20 минуты назад, Dino сказал:

Это прокатит с высотой прыжка, но не с передвижением

Если работать именно с координатами, то да. Я работал не с координатами (AntonVit ошибся), а с дельтой (разница  м/у текущей и следующей координатой) в  Fable Anniversary в коде инструкции с координатами и с дельтами находились рядом. Мне было влом выходить, где эти дельты рассчитываются, поэтому воспользовался способом kengа. 

Dino, вот посмотри видео:

 

Скрипт здесь.

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

 

Ну здесь в eax наверное и хранится то что принято называть множителем скорости, а ниже по коду уже производится подсчет новых координат с учетом этого множителя

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

3 минуты назад, Dino сказал:

 

Ну здесь в eax наверное и хранится то что принято называть множителем скорости, а ниже по коду уже производится подсчет новых координат с учетом этого множителя

в еах лежит адрес

в [eax+a] - лежат координты

в [ecx+b] - лежат дельты.

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

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

 

Пример кода для плавного ускорения

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

Multiply:
dd (float)1.01

MultiplyAdder:
dd (float)0.01

newmem:
cmp [hotkey_Speed],#1
je SpeedAct
some orig code
mov [Multiply],(float)1.01
jmp exit

SpeedAct:
cmp [Multiply],(float)1.2
jge @f
fld dword ptr [Multiply]
fadd dword ptr [MultiplyAdder]
fstp dword ptr [Multiply]

@@:
fld dword ptr [adress_delta_X]
fmul dword ptr [Multiply]
fstp dword ptr [adress_delta_X]

fld dword ptr [adress_delta_Y]
fmul dword ptr [Multiply]
fstp dword ptr [adress_delta_Y]
jmp exit

 

 

Получается что способа всего три; множитель, тригонометрия с координатами положения, и работа с дельтами.

Я хотел сделать по способу тригонометрии, взять для работы координаты X,Y персонажа, и косинус/синус камеры слежения. Далее воспользоваться формулой

to X = X + cos * Multiply
to Y = Y + sin * Multiply

Но минус такого способа заключается в том, что персонаж может уйти под землю, если перед ним окажется горка.


 

 

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

18 минуту назад, AntonVit сказал:

Не думал что в играх с персонажем, тоже есть так называемые дельты.

Тоже не думал, но нашлись. 

Собственно другая реализация моя была именно в создании этих дельт в ручную (так как не находил игровых ни дельт, ни множителя для игры, т.е. пришлось опираться только на инструкции работающие с координатами) в инъекции и использовании их. И это тоже работало.

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

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

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

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