You are not logged in.
Всем доброго дня!
Недавно начал писать на SannyBuilder с исп. CLEO, и вот возник такой вопрос: возможно ли симулировать (вызвать из скрипта) нажатие конкретно клавиши Enter, или правого Ctrl, в общем любой Virtual Key?
Получается симулировать нажатие клавиш управления - "вход/выход из машины", "присесть", "прыжок" и других. Например, я нашёл (и вроде бы даже понял) вот этот кусок кода (нажимается "спринт"):
0AB1: call_scm_func @imitate_keypad 1 No 16 :imitate_keypad 0@ *= 2 0@ += 0xB73458 0A8C: write_memory 0@ size 2 value 0x80 virtual_protect 0 0AB2: ret 0
Мне кажется, что нужно лезть в игровую память (поэтому написал в этот раздел), но я новичок и не совсем понимаю, как это правильно сделать. Я пытался использовать коды виртуальных клавиш из поста Wesser'a и Memory Write / Memory Read из поста Seemann'a, но пока ничего не вышло.
Подскажите, можно ли как-нибудь это сделать?
Last edited by Zynd (04-07-2013 01:43)
Offline
{$CLEO} wait 0 0000: //Инициализация if 0AA2: 0@ = load_library "User32.dll" // IF and SET jf @error_load_user32 if 0AA4: 1@ = get_proc_address "keybd_event" library 0@ // IF and SET jf @error_proc_keybd_event //Главный цикл :key wait 1000 0AA5: call 1@ num_params 4 pop 0 0 0 0 0x57 0AA5: call 1@ num_params 4 pop 0 0 0x02 0 0x57 jump @key //Блок обработки ошибок :error_proc_keybd_event 0AA3: free_library 0@ :error_load_user32 0A93: end_custom_thread
by MogAika
Offline
@mgmoldova - Спасибо огромнейшее! А можешь объяснить (хотя бы в общих чертах) как этот скрипт работает? Больше всего интересует часть
0AA5: call 1@ num_params 4 pop 0 0 0 0 0x57 0AA5: call 1@ num_params 4 pop 0 0 0x02 0 0x57
Особенно почему процедура вызывается 2 раза и что делает 0x02? Это смещение какое-то?
UPD: Забавно, у меня почему-то GTA SA вообще не видит этот скрипт) Не грузит его и всё. Сколько бы скриптов не было в GTA San Andreas\CLEO, грузится на 1 меньше, на этот.
Last edited by Zynd (04-07-2013 12:01)
Offline
@Zynd - Делай запись 0xFF в "0xB72CB0 _activeKeyState CKeyState" для нужной клавиши да и все(адрес указан для SA).
Я в Vice City это часто использую(обычно для проверки нажатия), т.к. стандартный опкод в клео работает только по праздникам.
Пример для Vice City:
if and 14@ == 1 0124: last_input_was_pad 2@ <> 0 80E0: not player $PLAYER_CHAR driving then 05DF: write_memory 0x00864ABC size 1 value 0xFF virtual_protect 1 wait 0 05DF: write_memory 0x00864ABC size 1 value 0x00 virtual_protect 1 end
Эмулирует нажатие кнопки R, когда нажата кнопка "X" на геймпаде, для перезарядки оружия.
Last edited by Sergey81 (04-07-2013 13:39)
Offline
@Sergey81 - Большое спасибо!
Если действительно можно сделать так (получается похоже на пример из первого поста), то для меня это действительно проще для понимания)
Можешь поподробнее объяснить, как ты рассчитывал для своего случая адрес 0x00864ABC?
Offline
@Zynd - Берешь базу здесь: http://public.sannybuilder.com/gtasa_ex … 101014.rar
Её можно открыть с помощью IDA Pro.
Допустим, требуется бесконечно эмулировать нажатие клавиши Enter после запуска игры. В скрипте пишем:
{$CLEO} 0000: 0@ = 0xB72CB0 //_activeKeyState 0@ += 0x23C // enter while true wait 0 0A8C: write_memory 0@ size 2 value 0xFF virtual_protect 1 end
Чтобы найти смещение для нужной клавиши, в IDA находим структуру CKeyState(можно нажать G, вставить адрес 0xB72CB0, и 2 раза нажать на CKeyState):
Если работать с базой не вариант, Cheat Engine всегда поможет:
Здесь нажата клавиша TAB, а по адресу 0xB72F06 (0xB72CB0 + 0x256) записывается значение 0xFF в этот момент. Таким образом можно найти адрес для любой клавиши.
Offline
@Sergey81 - огромнейшее тебе спасибо за такое подробное разъяснение! Скачал IDA и Cheat Engine, всё нашёл, всё сделал, всё заработало!
Обнаружил, что очень странно работают шифты. Все другие кнопки, в том числе и парные, залипали на строчке
0A8C: write_memory 0@ size 2 value 0xFF virtual_protect 1
и не отлипали, пока память не освободишь нажатием или обратной командой. Шифты же на запись значения в ячейку как будто вообще не реагировали: Cheat Engine показывает, что значение изменилось, но в игре ничего не происходит. Кроме того, ячейки шифтов самовольно сбрасывались на нули сразу же после записи. Аномалия, короче
Ещё раз огромное спасибо за примеры и пояснения!
Offline
Давно когда-то создавал функцию. Автор оригинального кода - MogAika.
:keyPress // 0@ - key, 1@ - time // Example: 0AB1: call @keyPress 2 key 0@ time 1@ if 0AA2: 2@ = load_library "User32.dll" then if 0AA4: 2@ = get_proc_address "keybd_event" library 2@ then 0AA5: call 2@ num_params 4 pop 0 0 0 0 0@ wait 1@ 0AA5: call 2@ num_params 4 pop 0 0 0x02 0 0@ end end 0AB2: ret 0
Offline
@MelomanCool - вот у меня почему-то ваш с MogAika способ не работает
Скрипт MogAika (он во втором посте этой темы есть) у меня игрой вообще не воспринимается как CLEO-скрипт, а когда твою функцию написал, скрипт, как до неё дошёл, "заморозился", что-ли...Короче, что-то странное происходит.
Может, в библиотеке дело? У тебя какой Windows стоит?
Offline
@Zynd - XP
Offline