Создание квестов в примерах...
#1
Huh Хотел бы создать квест для мультиплеера... прочитал FAQ, но ссылка на пост про "пошаговое создание квеста" оказалась только для избранных. Все необходимые программы есть. Изучив парочку mob файлов понял ровным счетом ничего) Расскажите как и что. Желательно в примерах. Заранее спасибо. Huh
Ответ
#2
Хмм... вопрос о многом и ни о чем...

в общих чертах:

1) Нужен Mob Rev. Tool
2) можно редактировать зоны (например zone3obr-lmp)
или карты квестов (например z3q1)
3) в ID_SS_TEXT написан скрипт зрны или квеста соосветственно (но чтоб его редактировать нужно в этих скриптах что-то понимать) Tongue
4) в ID_OBJECSECTION прописаны юниты (ID_UNIT) или обекты (ID_OBJECT)

но так очень долго рассказывать... - быстрее будет туториал написать... :blink:

ты спроси что конкретно тебя интересует или что непонятно?
Ответ
#3
В общем, я понимаю что это непросто, но..=) расскажи в примерах, как нужно создавать квесты. Вот к примеру, я хочу на зоне предгорья поставить белого волка или другого моба... и поставить квест его убить. Как мутить диалоги знаю. Все остальное..) :unsure:
Ответ
#4
Значит белый волк... Рассказываю.
Для начала нужно выбрать стандартный квест, на основе которого мы будем делать новый. Здесь исходим из соображений практичности - если квест просто на убийство волка на зоне Предгорья, то надо выбрать максимально на него похожий. Это z3q2.mob (z3 - Зона Предгорий, q2 - квест номер два), т.е. Жаба-людоед. Открываем данный квест Mob Rev. Tool'ом и ищем в основной ветке ID_SS_TEXT, ветку со скриптами. Нас интересует следующее:
Код:
Script VTriger#2#1
(
 if
 (
 )
 then
 (
   KillScript(  )
   QStart( "z3q2" )
   QObjSeeUnit( "GetObject(1000324)" )
   QObjKillUnit( "GetObject(1000324)" )
   QFinish(  )
 )
)
Строка QSTART( "z3q2" ) - это строка старта скрипта. Если ты разбираешься с брифингами на базе, то здесь проблем быть не должно. Строка QObjKillUnit объявляет нам, что для выполнения квеста надо уничтожить юнит. В скобках - ID юнита. Ничего, кроме z3q2 здесь менять не нужно. Открываем ветку OBJECT_SECTION. Проверяем все ID_UNIT - в строке ID_UNIT_PROTOTYPE должно стоять LMP Unique Toad Cannibal 5 - имя жабы-людоеда в базе данных игры. Обычно это довольно трудоемкая задача, найти нужного монстра, но что бы не копаться скажу - шестая ветка ID_UNIT снизу. В вышеупомянутой строке ID_UNIT_PROTOTYPE меняем жабу на LMP Wolf White 5. Далее в строке ID_UNIT_SPELLS убираем все, что там написано (это отвечает за заклинания). В строке ID_OBJTYPE заменяем 51 на 52 (это отвечает за тип объекта), в строке ID_OBJTEMPLATE меняем на unanwiwo (это отвечает за модель объекта), в строке ID_OBJPRIMTXTR меняем на Wolf00 или на Wolf01 (это отвечает за текстуру, первое значение для текстуры серого волка, а второе для белого). В строке ID_OBJPOSITION - позиция юнита. Меняем ее на угодное нам (можно оставить без изменений). И последнее - ID_OBJCOMPLECTION. Там телосложение объекта - меняйте там, каким вы хотите видеть вашего волка, мясистым и здоровым или заморенным щенком. Затем сохраняйте... Далее идет работа с файлами квестов. Если знаешь, то хорошо, если нет, то потом поясню.
Ответ
#5
Это я был.
Теперь остановимся поподробней на ветви ID_SS_TEXT, которая отвечает за скрипты на карте. Рассмотрим каждый элемент:
Код:
 GlobalVars ( // Объявление глобальных переменных. Конкретно в этом
 NULL : object, // квесте это не несет практически ни какой полезной
 VSS#i#val : object, // информации, просто запишите это.
 i : object
)

Код:
DeclareScript VTriger#2#1 (  this : object ) // объявлене скриптовых блоков. О
DeclareScript VTriger#2#2 (  this : object ) // них ниже.

Код:
Script VTriger#2#1 // Это скриптовый блок. Каждый подобный блок состоит из
(        // блоков if () и then (). В первом записываются условия, при которых
 if     // выполняется блок. Во втором - сами действия скрипта, т.е. старт
 (     // скрипта, убийство, завершение и т.д. Блок if () пустой, т.к. блок  
 )     // выполняется при загрузке карты
 then
 (
   KillScript(  ) // уничтожить скрипт конкретно здесь (по выполнение)
   QStart( "z3q2" ) // Старт квеста для игрока (из меню квестов, где карта)
   QObjSeeUnit( "GetObject(1000324)" ) // Когда игрок увидит монстра
   QObjKillUnit( "GetObject(1000324)" ) // Когда игрок убьет монстра
   QFinish(  ) // Завершить квест
 )
)

Код:
Script VTriger#2#2 // Это название второго блока
(
 if
 (
 )
 then
 (
   KillScript(  )
   ActivateTrap( Pyramid, 0 ) // Отключить оркскую пирамиду.
 )
)

Код:
WorldScript // Глобальные скрипты
(
 Sleep( 2 ) // Уснуть (?)
 VTriger#2#1( NULL ) // Обнулить блок 1
 VTriger#2#2( NULL ) // Обнулить блок 2
)


Ну вроде все. За скриптовыми командами идите на сайт Чейза. У сайта немного другая направленность, но азы скриптинга он все же преподаст. А все остальное можно познать только практикой и изучением готовых квестов.
Say it once, say it twice,
Take a chance and roll the dice...
Ответ
#6
Спасибо! Big Grin Теперь понял кое-что) Буду изучать квесты и творить свои.

Добавил: Vicc [mergetime]1139416314[/mergetime]
И кстати... пробовал орковскому шаману поставить вместо огненной стрелки молнию. Нашел, значит, раздел с магиями, заменил arrow на lightning и ничего... пер######л всех шаманов на карте, смотрел как каждый бьёт... не получилось! почему? (ничего кроме магии не менял)
Ответ
#7
Заклинания ставятся в мобе только для сравнения, что бы их действительно изменить, пользуйтесь датабазой. Где-то здесь руководство было.
Say it once, say it twice,
Take a chance and roll the dice...
Ответ
#8
Если не ошибаюсь, то если в строке NEED_IMPORT или что-то вроде этого вместо 0 вписать 1, то тогда вся инфа о юните будет братся не частично с датабазы, частично с моба (или полностью с датабазы), а полностью с моба. То есть у конкретный юнит которому вместо стрелки молнию поставили будет пулятся молнией. Но, если хочешь чтоб ВСЕ шаманы молнией пулялись... тогда уж лучше в датабазе лазить.
Ответ
#9
Цитата:WorldScript // Глобальные скрипты
(
Sleep( 2 ) // Уснуть (?)
VTriger#2#1( NULL ) // Обнулить блок 1
VTriger#2#2( NULL ) // Обнулить блок 2
)
Позволю себе не согласиться. Что значит - обнулить? NULL - это переменная-объект, и она обычно ничем не инициализируется, т.е. выполняет роль заглушки. А эти строки - вызов скрипта. NULL передаётся туда параметром, хотя реально он не используется. Sleep - это приостановка выполнения следующей строчки скрипта на одну ПЗ-шную секунду, которая равна 1/15 реальной(то есть 15 ПЗс = 1 с). В начале скрипта слип написан для того, чтоб не сглючило чего Smile

Цитата:Блок if () пустой, т.к. блок выполняется при загрузке карты
И опять же не соглашусь. Блок пустой, так как он не требует условия для выполнения. А убери из WorldScript'a вызов этого скрипта, и ничего там не выполнится Smile Ибо только WorldScript запускается при старте карты(или load'е) и запускает то, что прописано в нём...
Есть и ещё некоторые претензии к скрипту(нечеловеческие имена скриптов и то, что подзадания не будут выдаваться нормально, а только в виде сообщений), но в целом автору респект Smile
Ответ
#10
SnAIperK,Четверг, 09 Февраля 2006, 22:23 Написал:И опять же не соглашусь. Блок пустой, так как он не требует условия для выполнения. А убери из WorldScript'a вызов этого скрипта, и ничего там не выполнится Smile Ибо только WorldScript запускается при старте карты(или load'е) и запускает то, что прописано в нём...
Есть и ещё некоторые претензии к скрипту(нечеловеческие имена скриптов и то, что подзадания не будут выдаваться нормально, а только в виде сообщений), но в целом автору респект Smile
[right][snapback]36819[/snapback][/right]
Все претензии по скрипту отправляйте в Нивал, ибо это был разбор оригинального квеста, а не моего - мое лишь комментарии.
Say it once, say it twice,
Take a chance and roll the dice...
Ответ
#11
Ну про нечеловеческие имена я понял, что нивальские - их триггерный редактор постарался Smile А про комментарии претензий не много, я ж говорю - респект Smile
Вообще, если уж на то пошло, то программист, пишущий скрипт руками - был бы эффективнее нивальского редактора, и к нему бы даже комментарии вряд ли потребовались, так как он их сам пишет Smile))
Ответ
#12
by Talarasha:
Эффектинее то эффективнее, да где его взять...
Ответ
#13
Да, и ещё... возможно ли изменение хп юнитов не через датабазу? Хочу, чтобы у конкретного юнита на карте было столько хп, сколько поставлю, а у другого, того же вида обычное кол-во... Пробовал менять в проге для просмотра mob-файлов.. не получилось( просто не хочет сохранять то что я изменил.
Ответ
#14
Vicc,Пятница, 17 Февраля 2006, 18:26 Написал:Да, и ещё... возможно ли изменение хп юнитов не через датабазу? Хочу, чтобы у конкретного юнита на карте было столько хп, сколько поставлю, а у другого, того же вида обычное кол-во... Пробовал менять в проге для просмотра mob-файлов.. не получилось( просто не хочет сохранять то что я изменил.
[right][snapback]36877[/snapback][/right]


К сожалению, в MobRevТ это сделать нельзя..., а ничего другого в свободном доступе нет...

И как уже говорил Farlander, единственное что можно, в ID_UNIT_NEED_IMPORT поставить 1 вместо 0 - тогда параметры юнита будут браться не с database а с ID_UNIT_STATS, но изменить их в MobRevТ все равно нельзя...
Ответ
#15
Кстати а никто не пробовал через блокнотик редактировать *.mob? А то я попробовал нашёл всё, что надо... заменил, но после сохранения игра вылетает при загрузке квеста... может там что-то текстовый редактор меняет? никто не пробовал?
Ответ
#16
В блокноте ничего не выйдет..., он сохраняет их коряво!
Ответ
#17
В блокноте нильзя по нескольким причинам , вот некоторые из них :
1 . В блокноте нету BINARY-SAVED MODE
2 . Блокнот к сожаленю в отличии от MRT неперещитывает длину блоков моба Smile
3 . В блокноте заменить числовое значение неполучится ибо оно записано в байтовом виде а не в текстовом .
...
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)