#1 Вопросы по скриптингу » Нахождение координат объекта на карте » 28-05-2014 10:07

Zynd
Replies: 3

Добрый день всем!

В последнее время часто играю в SA:MP на сервере, где подбор оружия реализован в следующем виде: на земле лежит моделька оружия, ты подходишь к ней, нажимаешь кнопку, появляется диалог с пунктом "взять", нажимаешь и берешь.  Проблема заключается в том, что оружие может лежать и в кустах, и в воде, и везде, где угодно, и куда просто так не заглянешь. Поэтому появилась идея написать CLEO-скрипт, который бы обнаруживал оружие и подсвечивал бы его.

Алгоритм вроде простой - найти оружие на карте, вытащить его координаты и по этим координатам создать какой-нибудь опознавательный знак, например, 3д текст.

С подсвечиванием всё должно быть ок, а вот с поиском объекта на карте возникли проблемы - опкода для поиска объектов я не нашел. Даже не уверен, что моделька, например, шотгана, это объект - в справке к Sanny Builder в списке объектов его нет, там всякие заборы и автоматы с едой sad
Поэтому мне кажется, что например

 0AE3: $object = random_object_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 //IF and SET

не сработает.
Боюсь, что придется лезть в память и там как-то искать модельку, но я этого никогда не делал и очень боюсь smile

Что посоветуете?

#2 Re: Работа с памятью, EXE » Симуляция нажатия Virtual Key » 06-07-2013 11:11

@MelomanCool - вот у меня почему-то ваш с MogAika способ не работает sad
Скрипт MogAika (он во втором посте этой темы есть) у меня игрой вообще не воспринимается как CLEO-скрипт, а когда твою функцию написал, скрипт, как до неё дошёл, "заморозился", что-ли...Короче, что-то странное происходит.
Может, в библиотеке дело? У тебя какой Windows стоит?

#3 Re: Работа с памятью, EXE » Симуляция нажатия Virtual Key » 05-07-2013 04:43

@Sergey81 - огромнейшее тебе спасибо за такое подробное разъяснение! Скачал IDA и Cheat Engine, всё нашёл, всё сделал, всё заработало! smile

Обнаружил, что очень странно работают шифты. Все другие кнопки, в том числе и парные, залипали на строчке

0A8C: write_memory 0@ size 2 value 0xFF virtual_protect 1

и не отлипали, пока память не освободишь нажатием или обратной командой. Шифты же на запись значения в ячейку как будто вообще не реагировали: Cheat Engine показывает, что значение изменилось, но в игре ничего не происходит. Кроме того, ячейки шифтов самовольно сбрасывались на нули сразу же после записи. Аномалия, короче smile

Ещё раз огромное спасибо за примеры и пояснения!

#4 Re: Работа с памятью, EXE » Симуляция нажатия Virtual Key » 04-07-2013 16:53

@Sergey81 - Большое спасибо!
Если действительно можно сделать так (получается похоже на пример из первого поста), то для меня это действительно проще для понимания)
Можешь поподробнее объяснить, как ты рассчитывал для своего случая адрес 0x00864ABC?

#5 Re: Работа с памятью, EXE » Симуляция нажатия Virtual Key » 04-07-2013 11:02

@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 меньше, на этот.

#6 Работа с памятью, EXE » Симуляция нажатия Virtual Key » 04-07-2013 01:39

Zynd
Replies: 9

Всем доброго дня!

Недавно начал писать на 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, но пока ничего не вышло.

Подскажите, можно ли как-нибудь это сделать?

Board footer

Powered by FluxBB