Можно ли применить спидхак не ко всей игре, а к отдельной инструкции?
-
Суть в том, чтобы уменьшить интервал срабатывания инструкции.
Скажем, ускорить таймер.
Например (с потолка) инструкция inc eax раз в секунду увеличивает таймер на единицу. Соответственно, можно ли как-то сделать так, чтобы эта оригинальная инструкция срабатывала не 1 раз в секунду, а 1 раз в милисекунду, то есть 1000 раз в секунду?
Конечно, можно просто записать любое значение в таймер, но меня такой вариант не устраивает.
И дело не в конкретном примере. Примеров много разных, где это может пригодиться. Я хочу именно понять, можно ли, и как это выглядит в скрипте.
То есть, понятно, что вот такой скрипт активирует спидхак x10 на всю игру целиком:
[ENABLE]
luacall(speedhack_setSpeed(10))
[DISABLE]
luacall(speedhack_setSpeed(1))
А как привязать это к отдельной известной инструкции, найденной по адресу? На примере, скажем, того же inc eax
Можно в качестве примера рассмотреть игру NFS PAYBACK. Там есть крутилка-рулетка на получение деталей для машин. Она очень медленно крутится. Было бы неплохо так ускорить локально рулетку, не трогая всю игру целиком. Повторюсь, это просто пример. -
@sinkhrophazatron Это тебе надо руками делать спидхак на нужной инструкции. Встроенный в СЕ тут не поможет.
-
@StoneWeaver Так об этом и речь! Как это делается? Как выглядит такой скрипт? Или, может, есть какие-то другие инструменты для изменения интервалов срабатывания инструкций. А так же еще вот такой, косвенно связанный вопрос - Есть оригинальная инструкция, допустим тоже inc eax, которая увеличивает значение какой-нибудь статистики для получения ачивки, но инструкция разовая, срабатывающая в конкретных условиях, а я, допустим, хочу из этой разовой оригинальной инструкции сделать цикличную, которая бы, скажем, увеличивала статистику на единицу каждые 3 секунды. И так далее. Или это вообще нереально? То есть, какие интервалы цикличности разрабы заложили, такие и будут всегда и повлиять на них нельзя?
-
@sinkhrophazatron
Ищи тогда условие, которое вызывает эту функцию ( inc ) а то есть прибавление... Перетирай её или на неё делай безусловный переход и делай с этой функцией ( inc ) , всё что угодно.
Она же не сама по себе работает, в определенный момент срабатывает, вот этот момент, тебе и нужен для реализации задуманного. -
@sinkhrophazatron
Ну самый простой способ как по мне увеличить скорость таймеров(как делает это CE, GetTickCount и прочих функций) во время выполнения этой функции. Такой вариант не устроит?
что-то типо:function debugger_onBreakpoint() if EIP == 0xDEADC0DE then -- your function called... print(string.format("Something to log 0x%x", 0xDEADC0DE )) speedhack_setSpeed(10) elseif EIP == 0xCAFEF00D then -- another function called print(string.format("Something to log 0x%x", 0xCAFEF00D)) speedhack_setSpeed(1) else print("ELSE...") end return 1 end
Типо 0xDEADC0DE - вызов твоей функции - рулетки. В 10 раз умножаются результаты функций-таймеров, для всей игры
А 0xCAFEF00D - любая другая функция, которая вызывается после нужной тебе, если как пример был рулетка, то тут может быть получение результата это рулетки, который и востановит таймеры в нормальное положениеP.S. Да я изобретаю велосипеды)
P.S1. должно сработать -
@sinkhrophazatron Мне Почему-то пришла в голову идея с созданием своего потока. И вызывать нужную функцию по своему таймеру.