Здравствуйте, всем.
Снова возникала проблема со скрипитом сплавна авто в заданных координатах.
1)В CLEO-скриптах
НЕ используй глобальные переменные(те, что со знаком "
$"), кроме
$PLAYER_CHAR,
$PLAYER_ACTOR.
Если вкратце, то есть единый массив глобальных переменных для всех скриптов, включая main.scm, поэтому, когда ты используешь любую глобальную переменную - где-то в main.scm перестает нормально работать какой-то скрипт, потому что ты записал в глобальную переменную значение, которое конфликтует с этим скриптом. Самое печальное, что значения, сохраненные в глобальных переменных,
сохраняются в сохранениях. То есть из-за твоего скрипта у людей могут в дальнейшем возникнуть вылеты игры на пустом месте. Даже если они удалят твой скрипт - у них уже "запорятся" сохранения, которые они делали с твоим скриптом.
Выход есть - используй только локальные переменные(те, что со знаком "
@"). Их всего 16(от
0@ до
15@), плюс 2 таймера(
16@ и
17@).
Но если с умом подходить к скриптингу, то их хватает за глаза. Разумеется, если у тебя чересчур масштабные разработки - лучше делать их в main.scm.
2) "jump" можно не писать, если необходимая метка идет сразу после места, где ты хотел написать "jump".
3)Не стоит
через CLEO-скрипт создавать парковки, пикапы, значки на карте и прочее. Всё это дело
сохраняется в файлах сохранения! Это значит, что если человек хотя бы раз сохранится с твоим скриптом - у него твоя парковка не исчезнет никогда - даже если он удалит твой скрипт. Самое страшное, что при каждом заходе в игру будет создаваться новая парковка, т.е. если человек сделал операцию "
загрузил сохранение/сохранился/вышел из игры"
10 раз - у него на одиннадцатый заход в игру будет
11 парковок в одном месте! Не факт, что игра будет спавнить все эти авто, но всё равно это лишняя нагрузка и вообще неправильный подход к скриптингу.
Лучше напиши скрипт, который будет спавнить машину при определенных условиях, например - если игрок подошел к нужному месту на расстоянии 30 метров:
{$CLEO}
thread 'CAMFSTF'
:MyCar
wait 0
if
00F5: player $player_char in_sphere 0 near_point 106.39 -807.28 10.46 radius 30.0 30.0 30.0 // проверяется нахождение игрока в радиусе 30 метров
jf @MyCar
model.Load(#BLOODRB) // загружаем модель, точнее ставим её в очередь на загрузку
038B: load_requested_models // принудительная загрузка всех моделей, стоящих в очереди на загрузку
:MyCar2
wait 0
if
Model.Available(#BLOODRB) // на всякий пожарный проверяем, загрузилась ли модель
jf @MyCar2
Car.Create(0@, #BLOODRB, 106.39, -807.28, 10.46) // спавним авто
0249: release_model #BLOODRB // обязательно выгружаем модель из памяти игры, ведь авто мы уже заспавнили, и модель нам не нужна
0175: set_car 0@ z_angle_to 180.0 // поворот авто
01C3: remove_references_to_car 0@ // выгружаем авто из памяти игры, чтобы оно автоматически исчезло "за спиной", если игрок куда-нибудь уйдет
:MyCar3
wait 0
if
00F5: player $player_char in_sphere 0 near_point 106.39 -807.28 10.46 radius 30.0 30.0 30.0 // проверяется нахождение игрока в радиусе 30 метров
jf @MyCar // Как только игрок отошел от этого места снова на 30 метров - скрипт перезапускается(а авто само удалится благодаря опкоду 01C3)
jump @MyCar3
Конечно, сразу будет бросаться в глаза, что авто появляется "перед носом"(больший радиус не советую делать, пока ты не получил достаточно опыта в скриптинге), поэтому
лучше "спрятать" это авто куда-нибудь в "укромный уголок", где его появление не будет столь заметно. Но с некоторыми не работает, например, PANLANT
Это что вообще за машина такая? Её не существует в оригинальной игре.
Здравствуйте.
Подскажите, пожалуйста, хочу создать пачку денег на точке, а игра вылетает.
Во-первых:
004F: create_thread @Noname_12
Так нельзя делать! Каждый CLEO-скрипт - это уже отдельный тред, а ты создаешь еще один тред(система CLEO устроена так, что всё это дело конфликтует с main.scm!)!
Во-вторых:
00D6: if // ЕСЛИ
0256: player $PLAYER_CHAR defined // ИГРОК СУЩЕСТВУЕТ
04A6: 3@ = create_asset_money_pickup_at 109.39 -808.28 10.46 money 1 1 // ТО СОЗДАЕМ ПИКАП
А если игрок не существует(во время загрузки, например)?
В каждом условии должен быть переход куда-нибудь на случай, если проверка не сработает!Иначе говоря, эта часть кода должна быть такой:
00D6: if // ЕСЛИ
0256: player $PLAYER_CHAR defined // ИГРОК СУЩЕСТВУЕТ
004D: jump_if_false @OLOLO // ЕСЛИ НЕТ - ПРЫГАЕМ НА МЕТКУ OLOLO
04A6: 3@ = create_asset_money_pickup_at 109.39 -808.28 10.46 money 1 1 // А ЕСЛИ ВСЁ ЖЕ СУЩЕСТВУЕТ - ТО СОЗДАЕМ ПИКАП
Но вообще - проверять, существует ли игрок - необязательно, если ты в скрипте не проводишь никаких операций непосредственно с ним.
В-третьих, пикап пачки денег создается по-другому
В-четвертых - ты пишешь:
0109: player $PLAYER_CHAR money 1+= 4@
Т.е. даешь игроку кол-во денег, которое записано в переменную
4@. Но ты ничего не записал в переменную
4@! Конечно, это не вызовет вылета игры(не буду описывать здесь, почему), но это явная ошибка!
В-пятых - читай, что я писал выше в пункте
3 про создание парковок,
пикапов, значки на карте и т.д.
Опять же - лучше написать скрипт, который будет создавать пикап, когда игрок в определенном радиусе от нужной точки:
{$CLEO}
0000:
thread 'PICKU01'
:PICKU01_01
wait 0
if
00F5: player $player_char in_sphere 0 near_point 109.39 -808.28 10.46 radius 30.0 30.0 30.0 // проверяется нахождение игрока в радиусе 30 метров
jf @PICKU01_01
model.Load(337) // ставим в очередь на загрузку модель денег под номером 337(см. в Vice City\data\maps\generic.ide)
038B: load_requested_models // принудительная загрузка всех моделей, стоящих в очереди на загрузку
:PICKU01_02
wait 0
if
Model.Available(337) // на всякий пожарный проверяем, загрузилась ли модель
jf @PICKU01_02
0@ = Pickup.Create(337,8,109.39, -808.28, 10.46) // создаем пикап денег, автоматически исчезающий через 30 секунд
0249: release_model 337 // обязательно выгружаем модель из памяти игры, ведь пикап мы уже создали, и модель нам не нужна
:PICKU01_03
wait 0
if
00F5: player $player_char in_sphere 0 near_point 109.39 -808.28 10.46 radius 30.0 30.0 30.0 // проверяется нахождение игрока в радиусе 30 метров
jf @PICKU01_04 // если игрок покинул этот радиус - переход на метку "3", где удаляется пикап
if
pickup.Picked_up(0@) // если пикап был подобран
jf @PICKU01_03
0109: player $player_char money += 10000 // даем игроку 10000 долларов
jump @PICKU01_03
:PICKU01_04
0215: destroy_pickup 0@
jump @PICKU01_01
ВНИМАНИЕ! Нельзя, чтобы при этом в этом радиусе была точка сохранения/спавна. Иначе будет опять проблема с файлами сохранений(сохранение пикапа в файле сохранения).
Опять же, чтобы не было заметно, что пикап появляется "перед носом" - лучше "спрятать" этот пикап куда-нибудь в "укромный уголок"(см. пример с машиной выше).
Ну и последнее: У тебя очень много косяков в скриптах.
Это не проблема,
если приложить усилия. Пожалуйста, прочитай в справке SannyBuilder
основы скриптинга(Статьи/введение в скриптинг). Конечно, там инфа в основном для SA, но тебе нужно изучать хотя бы самое-самое важное: узнать всё про переменные, метки(label), циклы и т.д.
Однако там инфа про скриптинг в main.scm, а в CLEO-скриптинге иногда действуют другие правила.
Поэтому скачай
последнюю библиотеку CLEO для Vice City, затем скачай
актуальные VCSCM.INI и opcodes.txt для SannyBuilder(кинь эти файлы в Sanny Builder 3\data\vc\) и смотри
эти уроки по скриптингу на youtube. Конечно, они опять для SA, но первые несколько уроков подходят и для Vice City. Они хотя бы дадут общее понимание скриптинга.