Expropriator 2 118 Опубликовано 12 Октября 2016 (изменено) Я думаю, что назрела эта тема. Практика на отдельной локации. Мод для ЗП https://cloud.mail.ru/public/JT17/vLiwh4eqa На скрине - запуск квеста. Всё начиналось безобидным развлечением: А закончилось правкой движка. В этой теме, постараюсь подробно изложить практическое применение и сам процесс. 1.Как известно, в движке в один момент может отыгрываться только один туториал - это важно запомнить! 2.Для запуска туториала нам необходим собственно сам запуск. 3.Туториалы можно контролировать функциями скриптов. 4. По ходу беседы, можете поправлять меня, если считаете, что то неверным. Начнём работу с файла gamedata\configs\ui\game_tutorials.xml Что бы не захламлять сам файл, можно вывести свои туториалы в отдельный файл, сделав ссылку рядом с ссылкой титров: #include "ui\ui_credits.xml"#include "ui\tutorials.xml" Как выглядит сам туториал, примерно: <ostrova_mishen_01_guest_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\pda\pda_alarm</sound><auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">ui\ui_ostrova_tir_start</texture> </auto_static> </global_wnd><global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\pda\pda_alarm</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">ui\ui_ostrova_tir_start</texture> </auto_static> </global_wnd_16><item> <length_sec>4</length_sec><function_on_stop>ostrova_spawn.spawn_mishen_01a</function_on_stop> <grab_input>off</grab_input> <main_wnd/></item></ostrova_mishen_01_guest_death> Что бы запустить туториал, нам необходимо событие. Его обычно получают из диалогов, а в конкретном случае мы его получаем из смерти динамической модели. A: Для этого на локации спавнится разрушаемый объект в all.spawn: [256]; cse_abstract propertiessection_name = physic_destroyable_objectname = mishen_01_questposition = -169.268035888672,64.2635803222656,-195.247039794922direction = 0.714245021343231,-2.53366994857788,-0.0480710007250309; cse_alife_object propertiesgame_vertex_id = 0distance = 0level_vertex_id = 937950object_flags = 0xffffff3acustom_data = <[collide]small_object[logic]cfg = scripts\ostrova\ostrova_mishen_01_quest.ltxEND; cse_visual propertiesvisual_name = tir\mishen_01_quest; cse_ph_skeleton properties; cse_alife_object_physic propertiesphysic_type = 0x3mass = 10fixed_bones = root с логикой: [logic]active = ph_on_death[ph_on_death]on_info = %+mishen_01_quest_death% B: Для контроля квеста, нам понадобится спейс-рестриктор такого типа в алспавне: [375]; cse_abstract propertiessection_name = space_restrictorname = ostrova_tir_controlposition = -217.726089477539,42.432071685791,-34.122875213623direction = 1.99999999495049e-006,0,-1.99999999495049e-006; cse_alife_object propertiesgame_vertex_id = 0distance = 0level_vertex_id = 937950object_flags = 0xffffff3ecustom_data = <[logic]cfg = scripts\ostrova\ostrova_tir_control.ltxEND; cse_shape propertiesshapes = shape0shape0:type = boxshape0:axis_x = 17.7328681945801,0,0shape0:axis_y = 0,7.65130805969238,0shape0:axis_z = 0,0,29.5696659088135shape0:offset = 0,0,0; cse_alife_space_restrictor propertiesrestrictor_type = 3 с логикой [logic]active = sr_idle@tir_start[sr_idle@tir_start]on_info = {=actor_on_level(ostrova)} sr_idle@timer %=run_tutorial(ostrova_tir_start)%[sr_idle@timer]on_game_timer = 1 | {+mishen_01_quest_death} sr_idle@timer2 %=run_tutorial(ostrova_mishen_01_guest_death) =give_task(give_ostrova_tir_mishen_01a)%[sr_idle@timer2]on_game_timer = 50 | {+mishen_01a_death} sr_idle@timer3 %=run_tutorial(ostrova_mishen_01a_death) =give_task(give_ostrova_tir_mishen_01b)%[sr_idle@timer3]on_game_timer = 50 | {+mishen_01b_death} sr_idle@timer4 %=run_tutorial(ostrova_mishen_01b_death) =give_task(give_ostrova_tir_mishen_01c)%[sr_idle@timer4]on_game_timer = 50 | {+mishen_01c_death} sr_idle@timer5 %=run_tutorial(ostrova_mishen_01c_death) =give_task(give_ostrova_tir_mishen_01d)%[sr_idle@timer5]on_game_timer = 50 | {+mishen_01d_death} sr_idle@timer6 %=run_tutorial(ostrova_mishen_01d_death) =give_task(give_ostrova_tir_mishen_01e)%[sr_idle@timer6]on_game_timer = 50 | {+mishen_01e_death} sr_idle@timer7 %=run_tutorial(ostrova_mishen_01e_death) =give_task(give_ostrova_tir_mishen_01g)%[sr_idle@timer7]on_game_timer = 50 | {+mishen_01g_death} sr_idle@time %=run_tutorial(ostrova_mishen_01g_death)%[sr_idle@time]on_game_timer = 40 | sr_idle@nil %=run_tutorial(ostrova_tir_end) +tir_end%[sr_idle@nil] Что важно знать о следующем: =run_tutorial(имя_туториала) - старт туториала =give_task(имя_задания) - старт на выдачу задания. Возможна замена разрушаемого объекта на простое событие из диалога, но рестриктор для контроля всё равно необходим. Далее нам надо определится, что мы хотим получить в результате? Какой квест и наполнение? На примере видео про тир, рассмотрим вариант с мишенями. Для этого мы заспавнили уже в алспавн стартовую мишень, а остальные будем спавнить через скрипты: function spawn_mishen_01a()alife():create("ostrova_mishen_01a",vector():set(-101.05,50.04,-174.32),58343,0)endfunction spawn_mishen_01b()alife():create("ostrova_mishen_01b",vector():set(200.96,21.30,-441.99),58343,0)endfunction spawn_mishen_01c()alife():create("ostrova_mishen_01c",vector():set(178.17,31.14,441.98),58343,0)endfunction spawn_mishen_01d()alife():create("ostrova_mishen_01d",vector():set(-169.28,54.88,227.79),58343,0)endfunction spawn_mishen_01e()alife():create("ostrova_mishen_01e",vector():set(-32.02,44.36,-5.87),58343,0)endfunction spawn_mishen_01g()alife():create("ostrova_mishen_01g",vector():set(-159.79,29.50,-248.43),58343,0)endfunction spawn_mishen_01_quest()alife():create("ostrova_mishen_01_quest",vector():set(-71.97,60.66,-70.03),58343,0)end со следующими свойствами: [ostrova_mishen_01a]$spawn = "dynamic_objects\ostrova_mishen_01a"visual = tir\mishen_01a.ogffixed_bones = rootcustom_data = scripts\ostrova\ostrova_mishen_01a.ltxGroupControlSection = spawn_groupclass = O_DSTR_Sremove_time = 60; after this time unbreaked removable bone will be removedscript_binding = bind_physic_object.initstory_id = ostrova_mishen_01a[ostrova_mishen_01b]$spawn = "dynamic_objects\ostrova_mishen_01a"visual = tir\mishen_01a.ogffixed_bones = rootcustom_data = scripts\ostrova\ostrova_mishen_01b.ltxGroupControlSection = spawn_groupclass = O_DSTR_Sremove_time = 60; after this time unbreaked removable bone will be removedscript_binding = bind_physic_object.initstory_id = ostrova_mishen_01b[ostrova_mishen_01c]$spawn = "dynamic_objects\ostrova_mishen_01a"visual = tir\mishen_01a.ogffixed_bones = rootcustom_data = scripts\ostrova\ostrova_mishen_01c.ltxGroupControlSection = spawn_groupclass = O_DSTR_Sremove_time = 60; after this time unbreaked removable bone will be removedscript_binding = bind_physic_object.initstory_id = ostrova_mishen_01c[ostrova_mishen_01d]$spawn = "dynamic_objects\ostrova_mishen_01a"visual = tir\mishen_01a.ogffixed_bones = rootcustom_data = scripts\ostrova\ostrova_mishen_01d.ltxGroupControlSection = spawn_groupclass = O_DSTR_Sremove_time = 60; after this time unbreaked removable bone will be removedscript_binding = bind_physic_object.initstory_id = ostrova_mishen_01d[ostrova_mishen_01e]$spawn = "dynamic_objects\ostrova_mishen_01a"visual = tir\mishen_01a.ogffixed_bones = rootcustom_data = scripts\ostrova\ostrova_mishen_01e.ltxGroupControlSection = spawn_groupclass = O_DSTR_Sremove_time = 60; after this time unbreaked removable bone will be removedscript_binding = bind_physic_object.initstory_id = ostrova_mishen_01e[ostrova_mishen_01g]$spawn = "dynamic_objects\ostrova_mishen_01a"visual = tir\mishen_01a.ogffixed_bones = rootcustom_data = scripts\ostrova\ostrova_mishen_01g.ltxGroupControlSection = spawn_groupclass = O_DSTR_Sremove_time = 60; after this time unbreaked removable bone will be removedscript_binding = bind_physic_object.initstory_id = ostrova_mishen_01g имеющих свойства разрушаемого объекта: ;--- destroyed sections --------------------------------------------------------;-------------------------------------------------------------------------------;--- disable -------------------------------------------------------------------;-------------------------------------------------------------------------------[disable]linear_factor = 0.5angular_factor = 0.5;-------------------------------------------------------------------------------;--- collide -------------------------------------------------------------------;-------------------------------------------------------------------------------[collide]not_collide_parts;-------------------------------------------------------------------------------;--- destroyed part ------------------------------------------------------------;-------------------------------------------------------------------------------[destroyed]tir\mishen_01_crash[autoremove_parts]time = 60;-------------------------------------------------------------------------------;--- damage params -------------------------------------------------------------;-------------------------------------------------------------------------------[collision_damage]root = 0.9link = 0.2base = 1.40centr = 0.01;-------------------------------------------------------------------------------;--- particles -----------------------------------------------------------------;-------------------------------------------------------------------------------[particles]destroy_particles =;-------------------------------------------------------------------------------;--- particle_bones ------------------------------------------------------------;-------------------------------------------------------------------------------[particle_bones]link = 0.0, 1.0, 0.5root = 0.0, 1.0, 0.5centr = 0.0, 1.0, 0.5base = 0.0, 1.0, 0.5;-------------------------------------------------------------------------------;--- sound ---------------------------------------------------------------------;-------------------------------------------------------------------------------[sound]break_sound = material\human\step\n_grass_2;-------------------------------------------------------------------------------;--- damage_bones --------------------------------------------------------------;-------------------------------------------------------------------------------;bone_name = ,<-1>,; - коэфф. изменения хита (уменьшения здоровья); - коэфф. изменения величины открытой раны - незадействован;-------------------------------------------------------------------------------default = 1.0, -1, 0.0[immunities]burn_immunity = 0.0000005 ;коэффициенты иммунитетаstrike_immunity = 0.000005shock_immunity = 0wound_immunity = 0radiation_immunity = 0telepatic_immunity = 0chemical_burn_immunity = 0explosion_immunity = 0.4fire_wound_immunity = 1.7;-------------------------------------------------------------------------------;--- impulse_transition --------------------------------------------------------;-------------------------------------------------------------------------------[impulse_transition_to_parts]random_min = 2.0 ; величина случайно направленного импульса пропорционально массе нового объектаrandom_hit_imp = 1.0 ; величина случайно направленного импульса пропорционально разрушающему хиту;ref_bone ; кость из по которой определяется скорость для частей у который связь не задана, по умолчанию рутimp_transition_factor = 1.0 ; фактор с которым прикладывается хит по исходному объекту ко всем частямlv_transition_factor = 0.1 ; коэффициент передачи линейной скоростиav_transition_factor = 0.1 ; коэффициент передачи угловой скорости;-------------------------------------------------------------------------------;------ End params -------------------------------------------------------------;------------------------------------------------------------------------------- Для управления спавном, нам и понадобятся туториалы: <ostrova_tir_start> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\pda\pda_alarm</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768"></texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\pda\pda_alarm</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768"></texture> </auto_static> </global_wnd_16> <item> <length_sec>5.1</length_sec> <function_on_stop>xr_effects.zat_a1_tutorial_end_give</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_tir_start> <ostrova_tir_end> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\pda\pda_alarm</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">ui\ui_ostrova_tir_end</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\pda\pda_alarm</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">ui\ui_ostrova_tir_end</texture> </auto_static> </global_wnd_16> <item> <length_sec>5.1</length_sec> <function_on_stop>xr_effects.zat_a1_tutorial_end_give</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_tir_end> <ostrova_mishen_01_guest_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\pda\pda_alarm</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">ui\ui_ostrova_tir_start</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\pda\pda_alarm</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">ui\ui_ostrova_tir_start</texture> </auto_static> </global_wnd_16> <item> <length_sec>4</length_sec> <function_on_stop>ostrova_spawn.spawn_mishen_01a</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_mishen_01_guest_death> <ostrova_mishen_01a_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\bridge\motor_stop</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\bridge\motor_stop</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd_16> <item> <length_sec>2</length_sec> <function_on_stop>ostrova_spawn.spawn_mishen_01b</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_mishen_01a_death> <ostrova_mishen_01b_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\bridge\motor_stop</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\bridge\motor_stop</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd_16> <item> <length_sec>2</length_sec> <function_on_stop>ostrova_spawn.spawn_mishen_01c</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_mishen_01b_death> <ostrova_mishen_01c_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\bridge\motor_stop</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\bridge\motor_stop</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd_16> <item> <length_sec>2</length_sec> <function_on_stop>ostrova_spawn.spawn_mishen_01d</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_mishen_01c_death> <ostrova_mishen_01d_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\bridge\motor_stop</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\bridge\motor_stop</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd_16> <item> <length_sec>2</length_sec> <function_on_stop>ostrova_spawn.spawn_mishen_01e</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_mishen_01d_death> <ostrova_mishen_01e_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\bridge\motor_stop</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\bridge\motor_stop</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd_16> <item> <length_sec>2</length_sec> <function_on_stop>ostrova_spawn.spawn_mishen_01g</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_mishen_01e_death> <ostrova_mishen_01g_death> <global_wnd width="1024" height="768"> <pause_state>off</pause_state> <sound>device\bridge\motor_stop</sound> <auto_static x="1" y="1" width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd> <global_wnd_16 x="0" y="0" width="1024" height="768" stretch="1"> <sound>device\bridge\motor_stop</sound> <auto_static width="1024" height="768" stretch="1"> <texture x="1" y="1" width="1024" height="768">award\award_1</texture> </auto_static> </global_wnd_16> <item> <length_sec>2</length_sec> <function_on_stop>xr_effects.zat_a1_tutorial_end_give</function_on_stop> <grab_input>off</grab_input> <main_wnd/> </item> </ostrova_mishen_01g_death> Для отображения маркеров мишеней нам понадобится выдача заданий give_task [give_ostrova_tir_mishen_01a]icon = ui_inGame2_Mesta_evakuatsiiprior = 306storyline = falsetitle = title_ostrova_tir_mishen_01a_kaban_namedescr = descr_ostrova_tir_mishen_01a_kaban_texttarget = ostrova_mishen_01acondlist_0 = {+mishen_01a_death} completeon_complete = %=play_sound(shooting_target_hit)%[give_ostrova_tir_mishen_01b]icon = ui_inGame2_Mesta_evakuatsiiprior = 306storyline = falsetitle = title_ostrova_tir_mishen_01b_kaban_namedescr = descr_ostrova_tir_mishen_01b_kaban_texttarget = ostrova_mishen_01bcondlist_0 = {+mishen_01b_death} completeon_complete = %=play_sound(shooting_target_hit)%[give_ostrova_tir_mishen_01c]icon = ui_inGame2_Mesta_evakuatsiiprior = 306storyline = falsetitle = title_ostrova_tir_mishen_01c_kaban_namedescr = descr_ostrova_tir_mishen_01c_kaban_texttarget = ostrova_mishen_01ccondlist_0 = {+mishen_01c_death} completeon_complete = %=play_sound(shooting_target_hit)%[give_ostrova_tir_mishen_01d]icon = ui_inGame2_Mesta_evakuatsiiprior = 306storyline = falsetitle = title_ostrova_tir_mishen_01d_kaban_namedescr = descr_ostrova_tir_mishen_01d_kaban_texttarget = ostrova_mishen_01dcondlist_0 = {+mishen_01d_death} completeon_complete = %=play_sound(shooting_target_hit)%[give_ostrova_tir_mishen_01e]icon = ui_inGame2_Mesta_evakuatsiiprior = 306storyline = falsetitle = title_ostrova_tir_mishen_01e_kaban_namedescr = descr_ostrova_tir_mishen_01e_kaban_texttarget = ostrova_mishen_01econdlist_0 = {+mishen_01e_death} completeon_complete = %=play_sound(shooting_target_hit)%[give_ostrova_tir_mishen_01g]icon = ui_inGame2_Mesta_evakuatsiiprior = 306storyline = falsetitle = title_ostrova_tir_mishen_01g_kaban_namedescr = descr_ostrova_tir_mishen_01g_kaban_texttarget = ostrova_mishen_01gcondlist_0 = {+mishen_01g_death} completeon_complete = %=play_sound(shooting_target_hit)% Урок не закончен, пока я не скажу, что закончил. От автора: не советую тупо копировать со страницы скрипты и конфиги, скачайте архив вверху. Изменено 12 Октября 2016 пользователем Дизель 2 2 3 Поделиться этим сообщением Ссылка на сообщение
Expropriator 2 118 Опубликовано 12 Октября 2016 (изменено) @Шиш, они есть на ТЧ, ты через них интру, лого, все видеоролики короче и титры смотришь. Почему именно ЗП, потому как структура файлов отличается, да и сами функции тоже, однако. Я вот не уверен, что ТЧ поддерживает: %=run_tutorial(имя_туториала)% Если неправ - поправьте?! Изменено 12 Октября 2016 пользователем Дизель 1 Поделиться этим сообщением Ссылка на сообщение
Expropriator 2 118 Опубликовано 13 Октября 2016 (изменено) @aka_sektor, про ЧН не могу сказать, возможно там уже присутствует такой вызов. Изменено 13 Октября 2016 пользователем Дизель Поделиться этим сообщением Ссылка на сообщение
Expropriator 2 118 Опубликовано 20 Октября 2016 (изменено) @Akello, http://www.amk-team.ru/forum/topic/8230-cop-kovyriaemsia-v-fajlakh/?p=1022022 Изменено 20 Октября 2016 пользователем Дизель 1 Поделиться этим сообщением Ссылка на сообщение