Дата: Воскресенье, 14.06.2009, 04:18 | Сообщение # 1
Мажор сайта
Группа: Проверенные
Сообщений: 396
Статус: Offline
Скриптинг для ГТА Сан-Андреас. С чего начать?
Статья предназначена для тех, кто хочет научиться писать скрипты к этой игре, но не знает, с чего начать. Есть 2 подвида скриптинга – редактирование файла main.scm (файла, в котором прописаны все миссии игры) и CLEO-скриптинг. Многие, в том числе и я, пишут CLEO скрипты. Такой вариант удобен тем, что после установки нового скрипта не нужно начинать новую игру. Для того, чтобы можно было устанавливать CLEO скрипты, надо сначала установить библиотеку CLEO с сайта cleo.sannybuilder.com. Чтобы установить CLEO скрипт, нужно кинуть скомпилированный файл (cs-файл) в папку GTA_San_Andreas /CLEO. Чтобы удалить любой ранее установленный скрипт, достаточно удалить соответствующий файл из папки CLEO.
Sanny Builder. Компиляция и декомпиляция. СБ - это программа, необходимая для написания и редактирования скриптов. Скачать ее можно с сайта sannybuilder.com. Кстати, при установке СБ, можно заодно установить и CLEO, либо в другой удобный момент, нажав кнопку CLEO в правом нижнем углу окна программы. Чтобы создать скомпилированный, готовый к установке, скрипт, надо запустить СБ и применить команду Файл-Создать. Затем можно писать код (или скопировать и вставить какой-то готовый код). После того, как код написан, надо нажать команду Запуск-Компилировать, ввести произвольное имя и нажать ОК. В результате в указанном месте сохранятся 2 файла с одинаковым именем, но разным расширением – txt и cs. В текстовом файле будет записан код скрипта (исходник), второй файл – скомпилированный скрипт. Его можно кинуть в папку CLEO. Если вы захотите внести изменения в свой скрипт, то нужно открыть его исходник (Файл-Открыть), внести соответствующие изменения, после чего перекомпилировать скрипт (Запуск-Компилировать). Теперь обратная ситуация – у вас есть какой-то скомпилированный скрипт (cs файл) и вам нужно получить его код (исходник), например для изучения. Для этого примените команду Запуск-Декомпилировать и укажите путь к файлу. В окне программы появится код скрипта, при этом в соответствующем месте будет создан текстовый файл скрипта (исходник). К СБ прилагается справка – это учебник по скриптингу. О типах данных, переменных и т.п. вы можете прочитать в разделе Кодинг. В разделе Статьи вы можете посмотреть примеры несложных скриптов на различные темы. Так же будет полезно изучить материалы из раздела Документация по SCM – ГТА СА.
Кодинг. Опкоды и комментарии Код скрипта состоит из команд (опкодов). Команды записываются по порядку – сверху вниз, в одной строчке – одна команда. В игре команды будут выполняться в том же порядке, в каком они перечислены в коде. Кроме команд в коде часто прописывают комментарии. Комментарии нужны только для того, чтобы сделать код скрипта более наглядным. В процессе компиляции комментарии игнорируются. Оформляются комментарии либо двумя наклонными чертами (//комментарий), либо фигурными скобками ({комментарий}). Если использовать 2 наклонные черты, то будет закомментировано всё, что написано до конца данной строки. Если использовать фигурные скобки, то будет закомментировано всё, что записано между двумя скобками. Комментарии в тексте кода выделяются синим цветом. Пример из кода: //Здесь можно писать что угодно, потому что это – комментарий {другой вариант оформления комментария}
Параметры опкодов. Целые и дробные десятичные числа. Возвращаемся к опкодам. Большинство опкодов имеют параметры. Если вы возьмете какой-либо скрипт и декомпилируйте его, то, благодаря функции подсветки кода, вы увидите, что опкоды написаны шрифтом черного цвета, а параметры будут выделены различными цветами. При добавлении команд в код допускается менять только параметры. В качестве параметров в большинстве случаев выступают числа (выделяются бордовым цветом) или переменные (выделяются ярко-синим цветом). Что касается чисел, то в основном применяются обычные десятичные числа. Они бывают целыми (без точки) – integer и дробными (с точкой) – float. Какой тип числа должен быть – это зависит от опкода. Целыми числами в игре выражаются время, здоровье игрока, количество денег игрока и др. Дробными числами выражаются расстояния между объектами, углы, скорости транспортных средств и др. Для примера приведу команду ожидания (wait). Параметр для нее выражается в миллисекундах (тысячных долях секунды) и является целым числом. Смысл этой команды состоит в том, что выполнение скрипта приостановится на указанное время. Пример: wait 3000 // выполнение скрипта приостановится на 3 секунды
Начало и окончание CLEO кода Клео-скрипт начинаем всегда так: {$CLEO} wait 0 Первая команда называется директивой. Если ее не написать, то при компиляции будет создан scm файл, а нужен cs. Хотя директива и заключена в фигурные скобки, комментарием она не является. Далее обычно следует нулевое ожидание. Казалось бы, что эта команда бессмысленна, но если ее не написать, то при компиляции может появиться отчет об ошибке. Далее пишем основной код и завершаем скрипт опкодом: 0A93: end_custom_thread То есть простейший скрипт выглядит так: {$CLEO} wait 0 0A93: end_custom_thread Обычно после нулевого ожидания пишут проверку на существование игрока – об этом ниже.
Переменные Переменные используются для хранения каких-либо данных. Можно читать их значения или записывать в них новые. Переменные бывают двух типов: глобальные и локальные. В переменную можно записать не только обычное число, но, например и указатель на какой-либо игровой объект (актер, транспорт и др.). Глобальные переменные обозначаются так: $IMYA_PEREMENNOI Локальные переменные: 0@ , 1@ , 2@ , 3@ … ВАЖНО: в клео-скриптах, как правило, используем только локальные переменные. Исключения есть, но их немного, например переменные игрока (CJ-я): $PLAYER_ACTOR и $PLAYER_CHAR (какую из этих переменных надо использовать – зависит от опкода). В одном CLEO скрипте можно использовать до 32 локальных переменных (0@, 1@, 2@ .. 31@). Переменные 32@ и 33@ - это таймеры. Числовое значение, записанное в них, автоматически увеличивается с каждой миллисекундой на единицу. Запись числового значения в переменную осуществляется просто: 0@ = 1 // в переменную 0@ записано целое число - 1 1@ = 1.0 // в переменную 1@ записано дробное число – 1.0 (дробное т.к. с точкой) Записав однажды в переменную, например целое число, дальше мы можем записывать в нее другие значения, но они должны быть того же типа (тип в данном случае – целое число). Чтобы в переменную можно было записывать данные другого типа, ее необходимо переобъявить. Об этом можете почитать в разделе Кодинг-Переменные, хотя переобъявление в скриптинге используется нечасто. Кстати, есть опкоды для записи значения одной переменной в другую переменную. Пример: 12@ = 1 0085: 13@ = 12@ // (int) Как определить, что делает данный опкод? В скриптинге СЛЕВА от знака равно стоит то, КУДА записываем, СПРАВА стоит то, ЧТО записываем. В примере в переменную 13@ скопировано значение переменной 12@, т.е. 1. В комментарии написано int (integer), следовательно данный опкод можно использовать, если в переменных записаны целые числа. Арифметические действия с переменными записываются так: 0@ += 2 // прибавление целого числа к значению переменной 0@ *= 2 // умножение значения переменной на целое число 0@ /= 3 // деление значения переменной на целое число 0@ += -2 //вычитание целого числа из значения переменной Для дробных чисел всё точно также, только числа будут с точками. Домашнее задание: найдите ошибки в скрипте. Всего там 3 ошибки. {$CLEO} wait 0 0@ += 1 0@ = 9 wait 1000 0@ += 15 1@ = 1000 1@ *= 2.258 2@ = 2 0087: 3@ = 2@ // (float) 0A93: end_custom_thread
Опкоды действия и условные опкоды Большинство опкодов можно разделить на 2 большие группы. С помощью одних опкодов мы что-то проверяем – это условные опкоды (или просто - проверки). С помощью других опкодов мы что-то делаем, производим какие-то действия – это опкоды действия. Любой опкод можно найти через поиск опкодов в СБ – Сервис-Инструменты-ПоискОпкодов. Некоторые наиболее часто употребляемые проверки с описанием можно найти в справке СБ – Статьи-УсловныеОпкоды.
Метки и переходы Метки используются почти во всех скриптах. Обозначение: :ImyaMetki Команда «перейти на метку с именем ImyaMetki»: jump @ImyaMetki Принцип очень простой. Если выполнение кода дойдет до строчки, в которой написана команда перехода на какую-то метку, то дальше код будет выполняться со строчки, в которой записана эта метка. После каждой метки надо писать ожидание (хотя бы нулевое), иначе игра может зависнуть. Пример: {$CLEO} wait 0 :0 wait 0 jump @1 0@ = 1 :1 wait 0 jump @0 Такой код будет выполняться бесконечно, поэтому здесь опкод окончания скрипта не нужен. Команда 0@ = 1 никогда не будет выполнена, несложно понять почему.
Условия Условие записывается так – сначала кодовое слово if (если), потом условный опкод, потом команда перехода на метку. Выше я показал команду перехода на метку, если условие верно. Есть еще команда перехода на метку, если условие ложно: jump_if_false @imya_metki // перейти на метку imya_metki если условие ложно. Можно записать короче – jf. Если в переменных записаны числа, то проверки выглядят так: 0@ == 1 // значение переменной равно 1 0@ > 1 0@ < 1 0@ <> 1 // значение переменной не равно 1 Не забываем, что если используем дробные числа, то они должны быть с точками. Простейший пример – значение переменной 0@ будет с каждой секундой увеличиваться на 1 до тех пор, пока не достигнет 50. {$CLEO} wait 0 0@ = 0 :0 wait 1000 // ждем секунду 0@ += 1 // прибавляем единицу if // если 0@ == 50 // значение в переменной - 50 jf @0 // условие ложно, тогда переходим на метку :0 0A93: end_custom_thread Я показал как проверить какое-то одно условие. Но можно проверить и несколько условий одновременно:
а) проверка одновременного выполнения всех условий Всё делается точно также, как я описал выше, но вместо if пишется if and , далее перечисляются проверяемые условия (максимум 7 условий, если не ошибаюсь). Пример кода – если значения переменных 1@ и 2@ больше 100 , то запишем в обе переменные ноль: {$CLEO} wait 0 1@ = 0 2@ = -10 :0 wait 0 1@ += 2 2@ += 3 if and 1@ > 100 2@ > 100 jf @0 1@ = 0 2@ = 0 0A93: end_custom_thread
б) проверка выполнения любого условия из нескольких Вместо if and здесь используется if or. Для примера возьмем такой код – если В ОДНОЙ из двух переменных записано число 10.0 , то запишем в обе переменные число 100.0. {$CLEO} wait 0 1@ = 0.0 2@ = -4.1 :0 wait 0 1@ += 0.1 2@ += 0.1 if or 1@ == 10.0 2@ == 10.0 jf @0 1@ = 100.0 2@ = 100.0 0A93: end_custom_thread Домашнее задание со звездочкой: напишите скрипт, решающий такую же задачу, но вместо проверки выполнения любого условия используйте проверку выполнения всех условий. Еще один простой пример на условия, уже не с числами: {$CLEO} wait 0 :0 wait 0 if // если 0256: player $PLAYER_CHAR defined // игрок (Сиджей) существует jf @0 // если условие ложно (игрок не существует), то возвращаемся на метку :0 010D: set_player $PLAYER_CHAR wanted_level_to 0 {уровень интереса полиции к игроку делаем нулевым} jump @0 Данный код делает так, что игроком никогда не интересуется полиция. Здесь команду окончания скрипта опять не используем, т.к. код будет выполняться бесконечно (скрипт зациклен). Здесь вы видите проверку на то, существует игрок или нет. Ну вот и всё, что я хотел рассказать. Изучайте справку к СанниБилдеру (Кодинг я вам вкратце пересказал, читайте разделы Статьи и Документация по СКМ – ГТА СА).
:RaceMission1_111 wait 0 ms for $par = 1 to $a if Model.Available($model[$par]) jf @RaceMission1_111 end 01EB: set_traffic_density_to 0.0 0395: clear_area 1 at $carx[$ak] $cary[$ak] $carz[$ak] range 300.0 for $par = 1 to $a if $par == $ak then $car[$ak] = Actor.Car($PLAYER_ACTOR) Car.PutAt($car[$ak], $carx[$par], $cary[$par], $carz[$par]) Car.Angle($car[$ak]) = $angle[$ak] wait 500 ms Continue end $car[$par] = Car.Create($model[$par], $carx[$par], $cary[$par], $carz[$par]) Car.Angle($car[$par]) = $angle[$par] Car.SetImmunities($car[$par], 1, 1, 1, 1, 1) 01EC: make_car $car[$par] very_heavy 1 07EE: car $car[$par] enable_tire_marks 1 Car.DoorStatus($car[$par]) = 2 if $par <> $ak then 0560: $car[$par] = create_random_driver_in_vehicle $act[$par] end end 0407: create_coordinate $camx $camy $camz from_car $car[$ak] offset 0.0 -23.7 14.1 Camera.SetPosition($camx, $camy, $camz, 0.0, 0.0, 0.0) Camera.OnVehicle($car[$ak], 15, 1) Player.CanMove($PLAYER_CHAR) = False 03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 1 03F4: set_all_vehicles_apply_damage_rules 0 wait 2500 ms fade 1 1000 wait 1000 ms 00BA: text_styled 'RACES_4' 1100 ms 4 // 3 097A: at 0.0 0.0 0.0 play_sound 1056 wait 1100 ms 0407: create_coordinate $camx2 $camy2 $camz2 from_car $car[$ak] offset 0.0 -13.7 7.1 Camera.SetPosition($camx2, $camy2, $camz2, 0.0, 0.0, 0.0) Camera.OnVehicle($car[$ak], 15, 1) 0460: set_camera_pointing_time 0.0 2000 00BA: text_styled 'RACES_5' 1100 ms 4 // 2 097A: at 0.0 0.0 0.0 play_sound 1056 wait 1100 ms 0407: create_coordinate $camx3 $camy3 $camz3 from_car $car[$ak] offset 0.0 -6.7 3.1 Camera.SetPosition($camx3, $camy3, $camz3, 0.0, 0.0, 0.0) Camera.OnVehicle($car[$ak], 15, 1) 0460: set_camera_pointing_time 0.0 2000 00BA: text_styled 'RACES_6' 1100 ms 4 // 1 097A: at 0.0 0.0 0.0 play_sound 1056 wait 1100 ms 00BA: text_styled 'RACES_7' 800 ms 4 // GO! 097A: at 0.0 0.0 0.0 play_sound 1057 01BD: 11@ = current_time_in_ms Player.CanMove($PLAYER_CHAR) = True 03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 0 03F4: set_all_vehicles_apply_damage_rules 1 01EB: set_traffic_density_to $traff Camera.SetBehindPlayer Camera.Restore for $par = 1 to $a if $par <> $ak then 05D1: AS_actor $act[$par] drive_vehicle -1 to $pointx[$a1] $pointy[$a1] $pointz[$a1] speed $speed[$a1] $type[$a1] 0 2 $mark[$par] = Marker.CreateAboveCar($car[$par]) Marker.SetColor($mark[$par], 2) Marker.SetIconSize($mark[$par], 2) end end 03C3: set_timer_with_text_to $time type 0 text 'TIMER' // TIME for $kar = 1 to $b $nar = $kar // integer values $nar += 1 // integer values 018A: $chekp = create_checkpoint_at $pointx[$kar] $pointy[$kar] $pointz[$kar] 0168: show_on_radar $chekp 4 if $kar == $b // integer values then Marker.SetColor($chekp, 0) $a0 = 1 // integer values end 06D5: $rchekp = create_racing_checkpoint_at $pointx[$kar] $pointy[$kar] $pointz[$kar] point_to $pointx[$nar] $pointy[$nar] $pointz[$nar] type $a0 radius 6.0 while 8100: not actor $PLAYER_ACTOR near_point_in_vehicle $pointx[$kar] $pointy[$kar] $pointz[$kar] radius 12.0 12.0 12.0 sphere 0 gosub @RaceMission1_211 03F0: toggle_text_draw 0 $pos2 = $pos // integer values 0340: set_text_draw_color 134 155 184 255 0349: text_draw_style = 1 033F: set_text_draw_letter_width_height 1.0 3.6 0341: unknown_text_stuff 3 0342: set_text_draw_centered 1 0343: set_text_linewidth 640.0 060D: draw_text_shadow 2 color 0 0 0 alpha 180 038E: draw_box position 570.7242 356.2812 scale 68.2072 48.2072 color 0 0 0 alpha 255 038E: draw_box position 570.7242 356.2812 scale 66.2072 46.2072 color 134 155 184 alpha 255 038E: draw_box position 570.7242 356.2812 scale 62.2072 42.2072 color 0 0 0 alpha 255 045A: text_draw_1number 570.0 339.0 'RACES44' $pos2 // ~1~TH $pos = 1 // integer values if not Actor.InCar($PLAYER_ACTOR, $car[$ak]) then jump @RaceMission1_2497 end if or 01F4: vehicle $car[$ak] flipped 02BF: car $car[$ak] sunk then Car.StorePos($car[$ak], $xpos, $ypos, $zpos) 02C1: set $xpos $ypos $zpos to_car_path_coords_closest_to $xpos $ypos $zpos Car.PutAt($car[$ak], $xpos, $ypos, $zpos) end wait 0 ms end Marker.Disable($chekp) 06D6: delete_racing_checkpoint $rchekp 097A: at 0.0 0.0 0.0 play_sound 1058 end jump @RaceMission1_2491
:RaceMission1_211 for $ind = 1 to $a if $ind <> $ak // integer values then if $car[$ind] <> -1 then if $stage[$ind] <= $b then $tar = $stage[$ind] if 0100: actor $act[$ind] near_point_in_vehicle $pointx[$tar] $pointy[$tar] $pointz[$tar] radius 12.0 12.0 12.0 sphere 0 then $stage[$ind] += 1 if $stage[$ind] <= $b then $tar = $stage[$ind] 05D1: AS_actor $act[$ind] drive_vehicle $car[$ind] to $pointx[$tar] $pointy[$tar] $pointz[$tar] speed $speed[$tar] $type[$tar] 0 2 end end if $kar == $stage[$ind] then Car.StorePos($car[$ak], $xpos, $ypos, $zpos) 0509: $dist = distance between point $xpos $ypos and point $pointx[$kar] $pointy[$kar] Car.StorePos($car[$ind], $xpos2, $ypos2, $zpos2) 0509: $dist2 = distance between point $xpos2 $ypos2 and point $pointx[$kar] $pointy[$kar] if $dist > $dist2 then $pos += 1 end else if $stage[$ind] > $kar then $pos += 1 end end else $pos += 1 end if or Car.Wrecked($car[$ind]) 02BF: car $car[$ind] sunk not Actor.Driving($act[$ind]) then Actor.RemoveReferences($act[$ind]) $car[$ind] = -1 Car.RemoveReferences($car[$ind]) Marker.Disable($mark[$ind]) end end end end return
:RaceMission1_REMOVE 01EB: set_traffic_density_to 1.0 Car.DoorStatus($car[$ak]) = 0 for $par = 1 to $a if $par == $ak then wait 500 ms Continue end if $car[$par] <> -1 then Car.SetImmunities($car[$par], 0, 0, 0, 0, 0) Model.Destroy($model[$par]) Car.RemoveReferences($car[$par]) if $par <> $ak then Marker.Disable($mark[$par]) Actor.RemoveReferences($act[$par]) end end end Marker.Disable($chekp) 06D6: delete_racing_checkpoint $rchekp 03F0: toggle_text_draw 0 014F: delete_timer $time 01B7: release_weather return
Дата: Воскресенье, 14.06.2009, 18:04 | Сообщение # 6
Мажор сайта
Группа: Проверенные
Сообщений: 396
Статус: Offline
@Санек Это не клео-скрипт, а миссия для мейна. Можно переделать в клео-миссию - для этого надо заменить глобальные переменные на локальные и сделать скрипт-стартер для этой миссии. С подобными вопросами - в "Вопросы по созданию скриптов", а здесь обсуждаем статью.
Сообщение отредактировал Den_spb - Воскресенье, 14.06.2009, 18:06
Папки cleo.asi нет, у папок вообще нет расширений. Есть файл cleo.asi, он является частью cleo. Где взять и как установить cleo подробно расписал выше.
Сообщение отредактировал Den_spb - Суббота, 20.06.2009, 22:24
Дата: Воскресенье, 21.06.2009, 00:07 | Сообщение # 11
Мажор
Группа: Проверенные
Сообщений: 221
Статус: Offline
Можете скриптёра сделать один скрипт я вроде всё делаю правильно всё получалось но не могу сохранить в файле CS в сани билдере можете просто сделать это очень плиз
Если едеш на машине - жми "Yes" + "Главный огонь" или "Yes" + "Дополнительный огонь", чтобы машина ехала на 2 колесах.
Вот код в сани:
Code
:WHEELIE 0001: wait 0 ms 00D6: if 4 0256: player $PLAYER_CHAR defined 00DF: actor $PLAYER_ACTOR driving 84C8: NOT $PLAYER_ACTOR ; not samolet 84A9: NOT $PLAYER_ACTOR ; not vertolet 847A: NOT $PLAYER_ACTOR ; not moto 004D: jump if false ЈЈWHEELIE 03C0: $carpl = actor $PLAYER_ACTOR car 0002: jump ЈЈWHEELIE2
:WHEELIE2 0001: wait 0 ms 00D6: if 2 8137: NOT car $carpl id == #BMX 8137: NOT car $carpl id == #BIKE 8137: NOT car $carpl id == #MTBIKE 004D: jump if false ЈЈWHEELIE_UNLOAD 00D6: if 0 00E1: key pressed 0 11 ; Yes 004D: jump if false ЈЈWHEELIE_UNLOAD 0407: create coordinate $wx1 $wy1 $wz1 from car $carpl offset 0.0 0.0 1.0 0407: create coordinate $wx2 $wy2 $wz2 from car $carpl offset 0.0 0.0 -1.0 0061: $wz1 -= $wz2 ;; floating-point values 00D6: if 0 0020: $wz1 > 1.75 ;; floating-point values 004D: jump if false ЈЈWHEELIE_UNLOAD 0002: jump ЈЈWHEELIE_LEFT
:WHEELIE_LEFT 0001: wait 0 ms 00D6: if 1 00E1: key pressed 0 17 ; prim fire 80E1: NOT key pressed 0 4 ; sec fire 004D: jump if false ЈЈWHEELIE_RIGHT 07DB: $carpl 0.0 0.75 0.0 0002: jump ЈЈWHEELIE_UNLOAD
:WHEELIE_RIGHT 0001: wait 0 ms 00D6: if 1 00E1: key pressed 0 4 ; sec fire 80E1: NOT key pressed 0 17 ; prim fire 004D: jump if false ЈЈWHEELIE_UNLOAD 07DB: $carpl 0.0 -0.75 0.0 0002: jump ЈЈWHEELIE_UNLOAD
:WHEELIE_UNLOAD 0001: wait 0 ms 01C3: remove references to car $carpl 0002: jump ЈЈWHEELIE
Очень надо спс заранее))))))))))))))))))))))))))))))))) Токо сделать файлик CS надо и всё)
Дата: Воскресенье, 21.06.2009, 01:21 | Сообщение # 12
Мажор сайта
Группа: Проверенные
Сообщений: 396
Статус: Offline
Во-первых, это формат МиссионБилдера. Конвертация осуществляется так: Сервис - Конвертация - МБ-СБ Во-вторых, в клео по большей части допускаются только локальные переменные (см. статью). То есть все переменные со значком $ кроме переменной игрока надо заменить на локальные. В-третьих, клео-скрипт должен начинаться и заканчиваться соответствующими командами (см. статью).
{$CLEO} wait 0 :0 wait 0 if and Player.Defined($PLAYER_CHAR) Actor.Driving($PLAYER_ACTOR) 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle 84A9: not actor $PLAYER_ACTOR driving_heli 847A: not actor $PLAYER_ACTOR driving_bike jf @0 03C0: 0@ = actor $PLAYER_ACTOR car jump @1
:1 wait 0 if and not Car.Model(0@) == #BMX not Car.Model(0@) == #BIKE not Car.Model(0@) == #MTBIKE jf @0 if 00E1: player 0 pressed_key 11 jf @0 0407: store_coords_to 1@ 2@ 3@ from_car 0@ with_offset 0.0 0.0 1.0 0407: store_coords_to 4@ 5@ 6@ from_car 0@ with_offset 0.0 0.0 -1.0 0061: 3@ -= 6@ // (float) if 3@ > 1.75 jf @0 jump @2
:2 wait 0 if and 00E1: player 0 pressed_key 17 80E1: not player 0 pressed_key 4 jf @0 07DB: set_car 0@ rotation_velocity_XYZ 0.0 0.75 0.0 through_center_of_mass jump @3 wait 0 if and 00E1: player 0 pressed_key 4 80E1: not player 0 pressed_key 17 jf @0 07DB: set_car 0@ rotation_velocity_XYZ 0.0 -0.75 0.0 through_center_of_mass jump @3
:3 wait 0 Car.RemoveReferences(0@) jump @0
Код исправлен
Сообщение отредактировал Den_spb - Воскресенье, 21.06.2009, 02:34
Дата: Воскресенье, 21.06.2009, 02:48 | Сообщение # 13
Мажор
Группа: Проверенные
Сообщений: 221
Статус: Offline
Den_spb, Ой спасибо огромное тебе)))))))))))))))))))) Щас проверю)
Добавлено (21.06.2009, 02:45) --------------------------------------------- Den_spb Не получаеться конвертирую но оно не делаеться в CS сделай плиз файл если не сложно?
Дата: Понедельник, 22.06.2009, 10:30 | Сообщение # 22
Мажор сайта
Группа: Проверенные
Сообщений: 396
Статус: Offline
Quote (d88)
Интересное дело! Как будто он сохраняется куда хочет! Куда сохранишь – там и появится.
При сохранении файла программа обычно запоминает, куда был сохранен последний файл. Если сохранить файл в клео-папке, то в следующий раз программа предложит сохранить файл там же.
Я имел ввиду то, что если в директиве не указать расширения, т.е. написать {$CLEO}, то будет скомпилирован цс-файл. Если же директивы вообще не будет, то код скомпилится в скм.
Дата: Понедельник, 29.06.2009, 14:04 | Сообщение # 29
Мажор сайта
Группа: Проверенные
Сообщений: 396
Статус: Offline
Во-первых, в клео употребляем не 004E: end_thread а 0A93: end_custom_thread Но команда окончания скрипта в данном случае не нужна, т.к. скрипт должен быть зациклен - см. пример кода в статье. Во-вторых, чтобы сделать игрока неуязвимым, можно просто поставить ему иммунитеты: actor.SetImmunities($player_actor,1,1,1,1,1) Насчет патронов не помню, надо мануал смотреть. А код неуязвимого сиджея, которым вдобавок абсолютно не интересуется полиция, выглядит так:
{$CLEO} wait 0 :0 wait 0 if 0256: player $PLAYER_CHAR defined jf @0 actor.SetImmunities($player_actor,1,1,1,1,1) :1 wait 0 010D: set_player $PLAYER_CHAR wanted_level_to 0 jump @1
Поясняю. Команда присвоения иммунитетов, примененная один раз, делает игрока неуязвимым на всё время, пока запущена игра. Поэтому и в коде она записана так, что будет выполнена один раз. Команда присвоения уровню интереса полиции определенного значения (в данном случае нулевого) работает только один раз, поэтому в коде она записана так, что будет выполняться постоянно.
Сообщение отредактировал Den_spb - Понедельник, 29.06.2009, 14:23
dreamer2008, пиши в тему "Вопросы по созданию скриптов", на вопрос ответят с большей вероятностью, чем на оффтоп. Den_spb, хорошая статья, с нее я начал учится скриптингу return
Дата: Понедельник, 04.01.2010, 10:39 | Сообщение # 47
Мажор сайта
Группа: Проверенные
Сообщений: 396
Статус: Offline
Quote (Colt_8)
ну это слишком просто!
Для тебя просто, потому что ты уже это знаешь Кстати, в статье обнаружились некоторые неточности: 1. не обязательно ставить ожидания после каждой метки. 2. В первом домашнем задании 2 ошибки, а не 3.
Статья кул!Пригодилась!автору + =) Хотел кое чего спросить.... Вот я зделал самый простой клео скрипт:(я ток 2 дня назад начал обучатся) // This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007
{$VERSION 3.1.0027} {$CLEO .cs}
//-------------MAIN--------------- 0000: NOP
:test1 wait 0 if 0AB0: key_pressed 90 004D: jump_if_false @test1
wait 0 Model.Load(#TEARGAS) Model.Load(#MOLOTOV) Model.Load(#DESERT_EAGLE) Model.Load(#SAWNOFF) Model.Load(#MICRO_UZI) Model.Load(#AK47) Mo del.Load(#M4) Model.Load(#SNIPER) Model.Load(#HEATSEEK) Model.Load(#FLAME) Model.Load(#MINIGUN) Model.Load(#NVGOGGLES) 038B: load_requested_models wait 0 if Model.Available(#TEARGAS) Model.Available(#MOLOTOV) Model.Available(#DESERT_EAGLE) Model.Available(#SAWNOFF) Model.Available(#MICRO_UZI) Model.Available(#AK47) Model.Available(#M4) Model.Available(#SNIPER) Model.Available(#HEATSEEK) Model.Available(#FLAME) Model.Available(#MINIGUN) Model.Available(#NVGOGGLES) 032B: $WEAP = create_weapon_pickup #TEARGAS group 15 ammo 999999 at 2504.549 -1680.08 13.384 032B: $WEAP = create_weapon_pickup #MOLOTOV group 15 ammo 999999 at 2504.549 -1678.08 13.384 032B: $WEAP = create_weapon_pickup #DESERT_EAGLE group 15 ammo 999999 at 2504.55 -1676.1 13.4 032B: $WEAP = create_weapon_pickup #SAWNOFF group 15 ammo 999999 at 2504.549 -1674.08 13.384 032B: $WEAP = create_weapon_pickup #MICRO_UZI group 15 ammo 999999 at 2504.549 -1672.08 13.384 032B: $WEAP = create_weapon_pickup #AK47 group 15 ammo 999999 at 2504.549 -1670.08 13.384 032B: $WEAP = create_weapon_pickup #M4 group 15 ammo 999999 at 2504.549 -1668.08 13.384 032B: $WEAP = create_weapon_pickup #SNIPER group 15 ammo 999999 at 2504.549 -1666.08 13.384 032B: $WEAP = create_weapon_pickup #HEATSEEK group 15 ammo 999999 at 2504.549 -1664.08 13.384 032B: $WEAP = create_weapon_pickup #MINIGUN group 15 ammo 999999 at 2504.549 -1662.08 13.384 032B: $WEAP = create_weapon_pickup #NVGOGGLES group 15 ammo 1 at 2504.549 -1660.08 13.384 032B: $WEAP = create_weapon_pickup #FLAME group 15 ammo 999999 at 2504.549 -1658.08 13.384 wait 100 Model.Destroy(#TEARGAS) Model.Destroy(#MOLOTOV) Model.Destroy(#DESERT_EAGLE) Model.Destroy(#SAWNOFF) Model.Destroy(#MICRO_UZI) Model. Destroy(#AK47) Model.Destroy(#M4) Model.Destroy(#SNIPER) Model.Destroy(#HEATSEEK) Model.Destroy(#MINIGUN) Model.Destroy(#NVGOGGLES) Mo del.Destroy(#FLAME) wait 0 Model.Load(#BALLAS1) Model.Load(#FAM1) 038B: load_requested_models wait 0 if Model.Available(#FAM1) Model.Available(#BALLAS1) $MYACT = Actor.Create(CivMale, #BALLAS1, 2485.2202, -1664.8018, 13.3437) $MYACT = Actor.Create(CivMale, #FAM1, 2484.6963, -1668.2174, 13.3437) $MYACT = Actor.Create(CivMale, #FAM1, 2481.7915, -1668.3193, 13.3392) $MYACT = Actor.Create(CivMale, #BALLAS1, 2481.7915, -1668.3193, 13.3392) $MYACT = Actor.Create(CivMale, #BALLAS1, 2481.8481, -1674.3522, 13.3401) $MYACT = Actor.Create(CivMale, #FAM1, 2484.626, -1676.3137, 13.338) end_thread
Скрипт правельный,в сане наротает.Но я хотел спроситть,как сделать так,чобы это действие можно было повторять??!? Кто не понял:Этот скрипт делает так,что при нажатии клавиши "Z" у дома CJ появляються оружия с бесконечными патронами и балассы с бандой гроув.Тупо хватаеш пушку(или пешки)и мочиш их!Но как сделать,чтобы когда они все сдохли(баласы и банда гроув)при нажатии "Z" опять появились пушки и балласы с бандой гроув??!Подскажите плиз!!..
Если можно,то выложите мой скрипт с этим добавлением!...
Добавлено (24.02.2010, 17:42) --------------------------------------------- // This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007 {$VERSION 3.1.0027} {$CLEO .cs}