Уроки CLEO. Урок №5: даем главному герою объект в руки
Содержание урока:
1. Предыстория
2. Программы
3. Находим объект или оружие
4. Даем в руки объект или оружие
1. Предыстория
Вы наверняка хотите, чтобы главный герой брал что-то в руки, например оружие. Это очень легко!
Если кратко, нужно прописать в скрипте команду 01B2: give_actor $PLAYER_ACTOR weapon 25 ammo 1000 // Load the weapon model before using this. Вместо 25 вы ставите ID оружия (можно посмотреть в справке: Помощь > Статьи > Пикапы), вместо 1000 вы должны поставить любое число, хоть 1000000! Это количество патронов.
Но мы сейчас заинтересованы в том, чтобы дать герою именно объект, а не оружие. Например, бутылку. В любом случае, ниже мы подробно рассмотрим оба варианта.
2. Программы
Нам потребуются такие программы:
3. Находим объект или оружие
Итак, мы начнём искать для начала обычный объект. Для этого скачайте и установите Map Editor, зайдите в программу, укажите путь к игре и нажмите ОК. В первый раз программа может вылететь, во второй раз всё пройдёт гладко!
Когда вы зашли, вы не увидите ничего кроме пустого окна, но нажмите на Scene и у вас появится окно с частями мира GTA SA. Но лучше не открывать все файлы сразу, видеокарта и оперативная память слишком загрузятся.
Чтобы полетать по окрестностям или интерьерам GTA SA, ставьте галочку на любой из частей мира. Полетайте и найдите свой объект, а потом кликните дважды по нем, он будет выделен красным.
Объект нашли, теперь надо записать его ID (числовой идентификатор). Он отображается там, где показано на нижнем рисунке.
ID моего объекта – 1520. Значит, мне можно закрывать Map Editor и уже делать скрипт.
Для продолжения создания скрипта, который вручит герою в руки объект переходите к разделу статьи №4. А если вы хотите вручить в руки герою не объект, а оружие — читайте ниже.
Узнаем ID оружия. Для этого установим GMMM, откроем программу, войдем в меню Weapons и отыщем там нужное оружие.
Я выбрал катану. Так как в прошлом уроке я ставил анимацию медитации, катана подойдёт очень хорошо! Теперь нам осталось сделать скрипт.
4. Даем в руки объект или оружие
Передача персонажу объекта или оружия очень схожи, но есть отличие. Для того чтобы дать, например, выбранный ранее объект (бутылка), нужно писать Model.Load(1520), а чтобы дать оружие, нужно написать Model.Load(#katana) (также, чтобы дать оружие в руки, надо обозначить его как переменную, о чем ниже).
Итак, начнём! Сначала разберемся, как давать в руки объект, а потом как давать оружие.
Открываем наш начатый уже в прошлых уроках скрипт, и в части, в которой мы пишем, какие вещи скрипту нужно загрузить, прописываем код, указывающий на загрузку нужной модели:
Model.Load(1520)
Весь скрипт выглядит так:
Потом нужно сделать так, чтобы когда герой исполняет какую-то анимацию (как прикреплять анимацию я писал в предыдущем уроке), объект сам появлялся в руках.
$BUT = Object.Init(1520, 10@, 20@, 30@)
070A: AS_actor $PLAYER_ACTOR attach_to_object $BUT offset 0.05 0.06 0.05 on_bone 6 16 perform_animation "NULL" IFP_file "NULL" time -1
Вот так у меня выглядит код:
Всё, объект попадает в руку, но нужно сделать, чтобы по окончанию проигрывания анимации он исчез! Пропишите после последней анимации следующее:
0687: clear_actor $Player_actor task
Object.Destroy($BUT)
Object.RemoveReferences($BUT)
Model.Destroy(1520)
Вот код скрипта целиком:
{$VERSION 3.1.0027}
{$CLEO .cs}
//-------------MAIN---------------
04ED: load_animation "PARK"
Model.Load(1520)
038B: load_requested_models
04EE: animation "PARK" loaded
:NONAME_1
wait 0
if
0AB0: key_pressed 90
else_jump @NONAME_1
wait 0
0812: AS_actor $Player_actor perform_animation "Tai_Chi_in" IFP_file "PARK" 4.0 loopA 1 lockX 1 lockY 1 lockF 0 time -1 // versionB
$BUT = Object.Init(1520, 10@, 20@, 30@)
070A: AS_actor $PLAYER_ACTOR attach_to_object $BUT offset 0.05 0.06 0.05 on_bone 6 16 perform_animation "NULL" IFP_file "NULL" time -1
wait 1000
:NONAME_2
wait 0
if
0AB0: key_pressed 84
else_jump @NONAME_2
wait 0
0812: AS_actor $Player_actor perform_animation "Tai_Chi_Out" IFP_file "PARK" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 time -1// versionB
0687: clear_actor $Player_actor task
Object.Destroy($BUT)
Object.RemoveReferences($BUT)
Model.Destroy(1520)
wait 1000
jump @NONAME_1
Можете проверить в игре. Всё, давать в руки объект во время проигрывания анимации мы научились.
Теперь разберемся как давать в руки оружие.
Для этого пишем в скрипте, как загружать наше оружие:
Model.Load(#KATANA)
Теперь делаем катану переходной, пишем это после строчки:
0812: AS_actor $Player_actor perform_animation "Tai_Chi_in" IFP_file "PARK" 4.0 loopA 1 lockX 1 lockY 1 lockF 0 time -1 // version
Тут пишем:
0781: get_weapon_with_ID 8 model_to 22@
8 – это ID катаны, ID вы можете узнать из справки (см. выше). Значит, теперь катана является переходной 22@, а дальше делать нужно всё так же, как мы ставили бутылку, только заменяя названия и цифры.
Это туда, где мы писали 0781: get_weapon_with_ID 8 model_to 22@, только обязательно после:
$KAT = Object.Init(22@, 10@, 20@, 30@)
070A: AS_actor $PLAYER_ACTOR attach_to_object $KAT offset 0.05 0.06 0.05 on_bone 6 16 perform_animation "NULL" IFP_file "NULL" time -1
А это вписываем после последней анимации:
0687: clear_actor $Player_actor task
Object.Destroy($KAT)
Object.RemoveReferences($KAT)
Model.Destroy(22@)
Вот так выглядит весь скрипт, который позволяет дать в руки игроку оружие при выполнении анимации:
{$VERSION 3.1.0027}
{$CLEO .cs}
//-------------MAIN---------------
04ED: load_animation "PARK"
Model.Load(#KATANA)
038B: load_requested_models
04EE: animation "PARK" loaded
:NONAME_1
wait 0
if
0AB0: key_pressed 90
else_jump @NONAME_1
wait 0
0812: AS_actor $Player_actor perform_animation "Tai_Chi_in" IFP_file "PARK" 4.0 loopA 1 lockX 1 lockY 1 lockF 0 time -1 // versionB
0781: get_weapon_with_ID 8 model_to 22@
$KAT = Object.Init(22@, 10@, 20@, 30@)
070A: AS_actor $PLAYER_ACTOR attach_to_object $KAT offset 0.05 0.06 0.05 on_bone 6 16 perform_animation "NULL" IFP_file "NULL" time -1
wait 1000
:NONAME_2
wait 0
if
0AB0: key_pressed 84
else_jump @NONAME_2
wait 0
0812: AS_actor $Player_actor perform_animation "Tai_Chi_Out" IFP_file "PARK" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 time -1// versionB
0687: clear_actor $Player_actor task
Object.Destroy($KAT)
Object.RemoveReferences($KAT)
Model.Destroy(22@)
wait 1000
jump @NONAME_1
Вот и все, можно играть.