Форум о Мафии и Мафии 2

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум о Мафии и Мафии 2 » Создание модификаций » Учимся писать скрипты


Учимся писать скрипты

Сообщений 1 страница 10 из 39

1

Пишем Ваши небольшие скриптики в эту тему. Учимся на чужих ошибках, разбираем маф-команды, и т.д. http://forumfiles.ru/files/0012/81/3f/65340.gif

0

2

Попробовал присвоить анимацию модели (в моём случае это Бифф). Я взял скрипт из одного  сообщения  на форуме  вебгеймера (вашего Михаил) и изменил его для себя. Сначала поставил одну анимацию. Работает. И решил присвоить две анимации, следующие одну за другой. Присвоил и тоже работает. И у меня вопрос- можно ли сделать так,чтобы когда я подходил к Биффу, кликал правой кнопкой мыши, анимации заканчивались и он говорил нужную мне фразу,а потом снова эти две анимации воспроизводились? Если да,то подскажите команды,а написать попробую сам. Кстати вот этот скрипт.

Скрипт

dim_act 1
dim_frm 1
findactor 0, "Biff"
label 101
person_playanim 0,  "x kurak stativ.i3d" [,0]
wait 8000
person_playanim 0, "x kurak pokoureni_A.i3d" [, 0]
wait 6000
goto 101

0

3

Melhior написал(а):

можно ли сделать так,чтобы когда я подходил к Биффу, кликал правой кнопкой мыши, анимации заканчивались и он говорил нужную мне фразу,а потом снова эти две анимации воспроизводились? Если да,то подскажите команды,а написать попробую сам. Кстати вот этот скрипт.

На то есть же (при чём используются, как правило, для всех, в т.ч. для телохранителей) такие команды:
enemy_actionsclear - любое действие "анннулируется", и енеми как бы замирает перед очередным "приказанием",
после этой команды и "enemy_stopanim" в принципе без надобсти,
enemy_stop - команда на всякий случай "обездвиживает", останавливает енеми, чтобы он бег на месте не демонстрировал :)
Далее после любого приказа в конце всегда стоит "return", чтобы в дальнейшем Томми мог снова приказывать, разговаривать тому персонажу; а анимаций можно сколько угодно прописывать - всё равно персонаж замрёт, если Том начнёт с ним говорить, если правильно прописать скрипт...

0

4

Приве всем. Попробовал свои силы в написании скриптов.  Получилось с первого раза. Правда написал я его не с нуля,а взял скрипт из статьи на вебгеймере "Как дать в руки предмет" и отредактировал его под себя. Как он у меня работает: Бифф  5 секунд мирно стоит, держит в правой руке сигарету (правда криво), потом пять секунд работают анимации курения. Дальше анимации останавливаются, Бифф замирает и говорит фразу "Как дела, Томми. И дальше всё идёт по кругу. Вот сам скрипт:

Мой первый скрипт

dim_act 3
dim_flt 3
dim_frm 3
findactor 0,"Tommy"
findactor 1, "Biff"
findframe 2, "sigareta"

human_linktohand 1, 2, right
wait 1000
label 3
enemy_ playanim "x kurak stativ.i3d"
wait 5000
enemy_playanim "x kurak pokoureni_A.i3d"
wait 5000
enemy_actionsclear 1, "Biff"
return
enemy_stopanim  1, "Biff"
enemy_talk 1, 28940013
goto 3

label 1
goto 1

Мне кажется, что тут есть что-то лишнее. Или мне в самом деле кажется? И ещё один вопрос: А какую команду задать, чтобы Бифф говорил фразу, когда я нажимал бы правую кнопку мыши рядом с ним?
Нашёл лишнее : Оказывается без 4 строчки, скрипт и так  работает.

Отредактировано Melhior (27 июля, 2013г. 07:54)

0

5

Привет! http://forumfiles.ru/files/0012/81/3f/39411.gif Извини, а теперь немного покритикую: лишнего всё-таки много...

Спойлер
Melhior написал(а):

dim_act 3
dim_flt 3
dim_frm 3
findactor 0,"Tommy"
findactor 1, "Biff"
findframe 0, "sigareta" // начинай всегда с 0, имей привычку, проще будет

human_linktohand 1, 2, right
wait 1000 // это необязательно
label 3
enemy_ playanim "x kurak stativ.i3d"
wait 5000
enemy_playanim "x kurak pokoureni_A.i3d"
wait 5000
//getactirdist 1, 0, 2 // мерим расстояние:
//if flt[2] < 10, -1, 3 // если меньше 10 м - говорит Бифф, если Том далеко - курим дальше :)
enemy_actionsclear 1, "Biff"
enemy_actionsclear // команда выглядет так во всех "родных" миссиях
return // здесь не надо
enemy_stopanim // для этой команды и enemy_playanim не нужно указывать персонажа
// в виде цифры перед запятой, ведь пишут их в скрипте персонажа,
// а для Тома использую непосредственно "personal_playanim".
enemy_talk 1, 28940013 // здесь можно с ед-цей, можно и без, например.
enemy_wait // ждём, пока скажет
goto 3

label 1
goto 1
// в данном случае, лишние: не нужно лишний раз усложнять скрипты,
// надо проще писать, нумеровать по порядку, чтоб потом не путаться, и т.д.

И продолжим по скрипту: Бифф будет в любом случае, даже Том будет за три девять земель от него, говорить "как дела, Томми" - на "шизу" смахивает ;)
Т.е. использовать надо или команду ""event use_ab сразу после основной шапки (перечня акторов, фреймов в скрипте и т.п.) для обращения к персонажу, таким образм Бифф заканчивает курить сигаретку, смотрит на Тома и говорит фразу (пишу словами, чтобы хотелось самому исправить скрипт), или в твой скрипт довать команду "getactirdist x,y,z" для измерения расстояния, т.е. если перед произнесением фразы Бифф измеряет расстояние от него до Тома, если оно меньше, скажем, 5-10 м, говорит приветствие, если Том далеко, идём в начало скрита.

Надеюсь, маленько понятнее? Теперь можешь дописать свой скрипт: всё-таки надо стараться правильно писать скрипты, а там всё получится http://forumfiles.ru/files/0012/81/3f/55442.gif

0

6

Спасибо,что разъяснил.

Михаил Орлов написал(а):

//if flt[2] < 10, -1, 3 // если меньше 10 м - говорит Бифф, если Том далеко - курим дальше :)

А можешь объяснить что значит flt и -1? 3-это я как понимаю номер этого flt

0

7

Эту парочку скриптов я выковырнул из миссии в порту, там, где нужно таскать ящики
Ставим двух персонажей (Это Джо Барбаро  и Эдди ВитоСкалетта Скарпа (модели: Enemy91 и Enemy92) друг напротив друга и прописываем в каждого следующее.

Открыть

Джо Барбаро:

dim_act 3
dim_flt 1
dim_frm 1

findactor 0, "Tommy"
findactor 1
findactor 2, "JoeBARB" ///Имя Джо Барбары
findframe 0, "mestoJOE" ///Место, где стоит Джо

label START
enemy_playanim "Gesto_02a.I3D"
{ DOWN
label WAIT
wait 1000
goto WAIT
}
if flt[0] = 0, WAIT, -1
enemy_stopanim

event 3
let flt[0] = 1
event_use_cb 1
return

label FINSIH
debug_text "Delnik: SCRIPT FINISHED"

Эдди ВитоСкалетта Скарпа:
dim_act 4 ///С запасом на всякий
dim_flt 4
dim_frm 1
findactor 0, "Tommy"
findactor 1, "Eddy" //Имя второго собеседника
findactor 2

findframe 0, "mestoEddy"

let flt[3] = 2
enemy_group_new 3
enemy_group_add 3, 1
enemy_group_add 3, 2

label WAIT
frm_seton 0, 1
{ DOWN
enemy_playanim "Gestikulace01.I3D", 0
let flt[0] = flt[0] - 83
wait flt[0]
enemy_playanim "Gestikulace02.I3D", 0
let flt[0] = flt[0] - 83
wait flt[0]
enemy_playanim "Gestikulace04.I3D", 0
let flt[0] = flt[0] - 83
wait flt[0]
goto WAIT
}
if flt[1] = 0, WAIT, -1

event USE_AB, 18970052

enemy_look 0
enemy_wait
human_looktoactor 2, 0, 1
human_looktoactor 1, 0, 1
enemy_talk 0, 18990501
enemy_wait
gosub CHECKDIST
enemy_talk 18990511
enemy_wait
if flt[1] = 1, 2, -1
enemy_talk 0, 18990521
enemy_wait
gosub CHECKDIST
enemy_talk 18990531
enemy_wait
goto RET
label 2
enemy_talk 0, 18990481
enemy_wait
gosub CHECKDIST
enemy_talk 18990491
enemy_wait
label SEND3
setevent 1, 3, SEND3
human_eraseab 2
event_use_cb 1
label RET
human_looktoactor 2
human_looktoactor 1
enemy_look 1
enemy_wait
commandblock 1
let flt[0] = 0
set_remote_float 0, 3, 6
commandblock 0
return

label CHECKDIST
getactorsdist 0, 2, 0
if flt[0] < 5, -1, CHECKDIST
return

event 1
let flt[1] = 1
event_use_cb 0
return

event 2
let flt[2] = 1
event_use_cb 1
return

event ENEMY_TO_AI
frm_seton 0, 0
event_use_cb 0
enemy_getstate 0
if flt[0] > 1, -1, RET2
human_eraseab 2
label RET2
return

label FINISH
debug_text "Delnik2: SCRIPT FINISHED"

Теперь эти два собеседника будут стоять, один молча будет что то рассказывать другому, а когда Томми к ним обратиться, то они его культурно пошлют.
В этих двух скриптах я особо разбираться не стал.  И дальше на их место поставил скрипты определения координат и быстрые ноги (от MikeMouse), которые в этом случае активируются после использования (Перед командой проверки нажатия кнопки вставить команду ожидания использования (типа: Detector wait for use)
З.Ы. В миссионых файлах лежит очень много интересных скриптов. http://kolobok.us/smiles/user/mr47_05.gif

0

8

Melhior написал(а):

А можешь объяснить что значит flt и -1? 3-это я как понимаю номер этого flt


FLT - значения переменных для скрипта.

В шапке скрипта у тебя указаны были:
dim_act 3 - сколько в данном скрипте будет задействовано акторов,
dim_flt 3 - количество самих переменных,
dim_frm 3
- сколько фреймов, куда, например, пойдут / поедут акторы.

кусок скрипта

freeride_scoreget 1
if flt[1] < 5000, MALOPENEZ, -1
let flt[1] = flt[1] - 5000
freeride_scoreset flt[1]

На примере этого отрывка видно, что для команды freeride_scoreget задействовано переменная "1", т.е. будет искаться сколько на счёту у Томми денег. Если сумма меньше 5000, будет произведён переход в метку (лэйбл, строчку) "MALOPENEZ", если денег достаточно - переход на строчку ниже.

"-1" в скрипте ВСЕГДА показывает, что будет происходить переход на строчку ниже (разумеется, если это не значение какого-то параметра)!

На примере:
getactirdist 1, 0, 2 // 1 - № первого актора, 0 - № второго актора (указываются в начале скрипта), 2 - № переменной!
if flt[2] < 10, -1, 3 // здесь же та же двойка - переменная, она же "отсчитывает" расстояние, если меньше станет 10, переход ниже,
// если больше - перезод в строку "3" (в данном случае, в начало).

Схематично:
if flt[a] < x, y, z,
если переменная А меньше значения X - переход на строку Y, если это не правда, если значение БОЛЬШЕ - переход на строчку Z.

Итак, "3" - это не номер переменной. В строке "if flt[2] < 10, -1, 3": "2" - сама переменная, "-1" - показывает, что будет переход на строку ниже, "3" - возврат в начало строки.
А теперь по самой команде - читать следует данную строчку так: if (это ведь если!), значит если значение переменной "2" станет меньше "10" (метров, в данном скрипте), то переход ниже (второе значение отвечает за положительный ответ, т.е. если да - идём дальше, т.к. стоит значение "-1", если не равно расстояние 10, если Томми далеко находится - идём в строчку "3" (в начало).

Ну вот как-то так http://forumfiles.ru/files/0012/81/3f/89797.gif

0

9

Переменные не так страшны на первый взгляд. Как мне кажется страшнее всего Эвенты  http://forumfiles.ru/files/0012/81/3f/68958.gif

0

10

Михаил Орлов написал(а):

Извини, а теперь немного покритикую

Ну, а теперь покритикую я. Если не возражаешь. Во-первых я поменял в 6 строчке двойку на ноль (где примечание "начинать с нуля"), и знаешь что? Сигарета исчезла. Вернул двойку-сигарета вернулась. Вот такие дела. Во-вторых у тебя опечатка в  команде getactirdist. Правильно - getactorsdist. Спасибо ребятам из Mafia-Game, что указали на опечатку. А так всё работает, спасибо за указанные ошибки и разъяснение каждой строчки. http://forumfiles.ru/files/0012/81/3f/19540.gif .
P.S. Ничего,если я на "ты" обращаюсь?   http://forumfiles.ru/files/0012/81/3f/55442.gif

0


Вы здесь » Форум о Мафии и Мафии 2 » Создание модификаций » Учимся писать скрипты