Здравствуйте. Сегодня я сделаю урок по созданию хорошего CarShooter'а aka CarGun'а с довольно хорошей синхронизацией, плюс с стрельбой в центра экрана. Этот урок я советую людям, которые уже ранее занимались Cleo скриптингом, и которые уже имеют опыт работы. P.S. Снизу под спойлером будет сразу готовый код, плюс прикреплю файлы .txt и .cs И так, поехали.
{$CLEO .cs} - создаем файл с расширением .cs 0000: nop - переходим на нулевой офсет
Код
:1 wait 0 if and 0ab0: 17 0ab0: 90 jf @1 0ACD: show_text_highpriority "~R~ACTIVATED: ~W~ CARSHOOTER ~B~ON." time 2000 wait 200
Это проверка на нажатие клавиш CTRL+Z, т.е. активация.
Код
:2 wait 0 if and 0ab0: 17 0ab0: 90 jf @3 0ACD: show_text_highpriority "~R~DEACTIVATED: ~W~ CARSHOOTER ~B~OFF." time 2000 wait 200 jump @1
Опять же проверка на нажатие клавиш CTRL+Z, но в этот раз это дезактивация.
Код
:3 wait 0 if and 0ab0: 1 not Actor.Driving($PLAYER_ACTOR) not Actor.Dead($PLAYER_ACTOR) else_jump @2
Тут сразу 3 проверки 1 - Это на нажатие ЛКМ 2 - На то не находится ли игрок в авто 3 - На то жив ли игрок
Код
13@ = 2.0 17@ = 0
Присваивание переменным значение. Это нам понадобиться в дальнейшем.
Не знаю как лучше объяснить, но опкод 07D5 сам по себе задает как бы движение авто в направление координат 0@ 1@ 2@. Опкод 0AB1 сам по себе поход на gosub. Записываем в переменную 17@ 1-ку, дабы в дальнейшем поиск опкодом 0AE2 не останавливался только на одном авто.
Код
:8 0A96: 3@ = actor $PLAYER_ACTOR struct 0A97: 2@ = car 0@ struct 0A8E: 4@ = 3@ + 1328 // int 0A8C: write_memory 4@ size 4 value 50 virtual_protect 0 0A8E: 4@ = 3@ + 1420 // int 0A8C: write_memory 4@ size 4 value 2@ virtual_protect 0 0AB2: ret 0
:9 0A96: 3@ = actor $PLAYER_ACTOR struct 0A8E: 4@ = 3@ + 1328 // int 0A8C: write_memory 4@ size 4 value 1 virtual_protect 0 0AB2: ret 0
А это и есть код самой синхронизации.
{$CLEO .cs} 0000: nop
:1 wait 0 if and 0ab0: 17 0ab0: 90 jf @1 0ACD: show_text_highpriority "~R~ACTIVATED: ~W~ CARSHOOTER ~B~ON." time 2000 wait 200 :2 wait 0 if and 0ab0: 17 0ab0: 90 jf @3 0ACD: show_text_highpriority "~R~DEACTIVATED: ~W~ CARSHOOTER ~B~OFF." time 2000 wait 200 jump @1 :3 wait 0 if and 0ab0: 1 not Actor.Driving($PLAYER_ACTOR) not Actor.Dead($PLAYER_ACTOR) else_jump @2 13@ = 2.0 17@ = 0
:8 0A96: 3@ = actor $PLAYER_ACTOR struct 0A97: 2@ = car 0@ struct 0A8E: 4@ = 3@ + 1328 // int 0A8C: write_memory 4@ size 4 value 50 virtual_protect 0 0A8E: 4@ = 3@ + 1420 // int 0A8C: write_memory 4@ size 4 value 2@ virtual_protect 0 0AB2: ret 0
:9 0A96: 3@ = actor $PLAYER_ACTOR struct 0A8E: 4@ = 3@ + 1328 // int 0A8C: write_memory 4@ size 4 value 1 virtual_protect 0 0AB2: ret 0
http://rghost.ru/46857790 - Ссылка на файлы.
Если вам понравился урок, и вы считаете что он будет полезен в дальнейшем вам и другим скриптерам, просто поставь в мне в репутацию в поле "Действие", "не изменять репутацию" и в поле "Комментарий" просто напиши "За урок". Тогда я буду знать что уроки действительно нужны, и буду делать чаще и разного уровня сложности.