Сповіщення
Очистити все

Створення квесту (повний розбір)


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Для цього ми створимо нового NPC і зробимо квест щоб взяти у нього флеш-карту.) Для цього нам знадобиться:

Папка config:
	gameplay\character_desc_escape.xml
	gameplay\dialogs_escape.xml
	gameplay\info_l01escape.xml
	gameplay\npc_profile.xml
	gameplay\tasks_escape.xml
	game_story_ids.ltx
	misc\quest_items.ltx
	scripts\tester_logic.ltx - його ми створимо
	text\rus\stable_dialogs_escape.xml
	text\rus\string_table_items.xml
Папка scripts
	escape_dialog.script	
І природно all.spawn

BEGIN

Насамперед знімемо координати, де буде наш флешко-давець.)

У мене такі координати: position = -172.21215820313,-19.941787719727,-161.09272766113, game_vertex_id = 52, level_vertex_id = 76655

Розпаковуємо з ACDC all.spawn відкриваємо alife_l01_escape.ltx і пишемо в кінець:

	[ 870 ]
 ; cse_abstract properties 
section_name = stalker - / / це для гри тут пишеться наприклад якщо це у тебе сталкера або бандюки то має бути section_name = stalker 
name = tester - / / пишемо що хочемо 
position = -172.21215820313 , -19.911727 3 -// позиція direction = 0 , 0 , 0 -// напрям погляду ( можна писати завжди нулі ) 
 
 
 
; cse_alife_trader_abstract properties 
money = 5000 -//його бабло character_profile = tester -//посилання на профіль в character_desc_локація ( раз створюємо в алайф ескейп значить і профіль буде шукатися в чарактер_деск_ескейп ) 

 
 
; cse_alife_object properties 
game_vertex_id = 52 - // гейм вертекс distance = 0 level_vertex_id = 76655 - / / левів вертекс object_flags = 0xffffffbf custom_data = <<END 
 
 


 
 
[ logic ]
 cfg = scripts\tester_logic.ltx -// посилання на логіку
 
 
; cse[smart_terrains] 
none = true
END
story_id = 6001 -// його стор. 
 
; cse_visual properties 
visual_name = actors\soldier\soldier_beret_1 -// його візуал
 
 
upd: 
health = 1 upd : 
timestamp = 0 upd 
: 
creature_flags = 0 upd 
: position = -172.21215820313 , -19.941787719727 , -161.09272766113 - / up = 0.028013030067086 , 0 , 0.9996075630188 
upd : g_team = 0 
upd: g_squad = 1 
upd: g_group = 2         
 
 
upd: next_game_vertex_id = 65535 - // чесно не знаю що це , я завжди пишу ці цифри 
upd: prev_game_vertex_id = 65535 - // не знаю, але пишемо завжди це 
upd: distance_from_point = 0 
upd: distance_to    
 
 
; cse_alife_human_abstract properties 
predicate5 = 1 , 2 , 2 , 1 , 2 predicate4 = 0 , 1 , 1 , 1 
 
 
	; cse_ph_skeleton properties
 
upd:start_dialog =
 
; se_stalker properties

Далі опишемо в character_desc_escape.xml нашого НПС-а:

	<!---------------------------------------tester-------- ----------->
	<specific_character id= "tester"  team_default = "1" >
<name>Факер Марезфакер</name>
<icon>ui_npc_u_green_stalker_3</icon> <!--його іконка-->
<bio>Сталкер.</bio>
 
<class>tester</class>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <!--це краще не знати-->
 
<rank> 150 </rank>
<reputation> 5 </reputation>
<money min= "500" max= "1000" infinitive= "0" />
 
<snd_config>characters_voice\human_01\stalker\</snd_config> <!--його голос-->
<crouch_type> -1 </crouch_type>
 
<visual>actors\novice\green_stalker_3</visual> <!--його візуал-->
<supplies>
	[ spawn ] \n <!--його інвентар,що в ньому є-->
	wpn_ak74u \n
	ammo_5. 45x39_fmj = 10 \n 
	</supplies>
 
<start_dialog>hello_dialog</start_dialog> <!--його діалоги-->
<actor_dialog>test_kvest_dialog_npc</actor_dialog>
	</specific_character>

У файлі npc_profile.xml прописуємо клас непису:

	<character id= "escape_trader" >	
	<class>Trader</class>
	<specific_character>escape_trader</specific_character>
</character>
	<!------------------------------------------------ ---------------TEST---------------------------------- ------------------>
	<character id= "tester" >	
	<class>tester</class>
	<specific_character>tester</specific_character>
</character>

У файлі game_story_ids.ltx прописуємо його SID, який повинен збігатися з його id з all.spawn:

	  ; Escape (0-99) 
	  6001           = "tester"

Дамо неписю логіку, створимо файл: scripts\tester_logic.ltx , мені сподобалася щоб він сидів на п'ятій точці, пишемо:

	[ logic ]
 active = remark1 
danger = danger_ignore
 
[ danger_ignore ]
 ignore_distance = 5 
 
[ remark1 ]
 anim = sit_ass 
no_move = true

Фуххх, начебто непся створили переходимо до довгоочікуваного квесту))))

Нам потрібно створити інфопоршен для цього у файлі з адресою: gameplay\info_l01escape.xml після <game_information_portions> пишемо:

<info_portion id= "test_kvest_start" >
	<task>test_kvest</task> <!--звернення до таска-->
	</info_portion>
	<info_portion id= "test_kvest_have" ></info_portion>
	<info_portion id= "test_kvest_done" ></info_portion>

Отже, ми створили направлення на завдання <task>test_kvest</task>, що ж пропишемо його. Для цього відкриваємо файл за адресою gameplay\tasks_escape.xml і пишемо на самому початку:

	<!------------------------------------------------ ------------test---------->
	<game_task id= "test_kvest" > <!--назва тяга з gameplay\info_l01escape.xml-->
<title>Принести КПК Сидору</title> <!--назва яка буде писатися в кпк-->
<objective>
	<text>Бігати до сталкера</text> <!--назва частини тяга в кпк-->
	<icon>ui_iconsTotal_lost_thing</icon> <!--іконка таска-->
	<infoportion_complete>test_kvest_done</infoportion_complete> <!--інфопоршень з info_l01escape.xml при його отриманні, частина таска виконується-->
</objective>
<objective>
	<text>Бігати до сталкера</text> <!--назва частини тяга в кпк-->
	<map_location_type hint= "Факер Мазерфакер" >green_location</map_location_type> <!--позначення на карті-->
	<object_story_id>tester</object_story_id> <!--сюди пишемо наш sid з game_story_ids.ltx, який у свою чергу визначається за story_id з all.spawn-->
	<infoportion_complete>test_kvest_have</infoportion_complete> <!--інфопоршень з info_l01escape.xml при його отриманні, частина таска виконується-->
</objective>
<objective>
	<text>Повернутися до Сидору</text> <!--назва частини тяга в кпк-->
	<map_location_type hint= "Сидорович" >blue_location</map_location_type> <!--позначення на карті-->
	<object_story_id>Escape_Trader</object_story_id> <!--сюди пишемо наш sid з game_story_ids.ltx, який у свою чергу визначається за story_id з all.spawn-->
	<infoportion_complete>test_kvest_done</infoportion_complete> <!--інфопоршень з info_l01escape.xml при його отриманні, частина таска виконується-->
</objective>
	</game_task>
<!------------------------------------------------ ------------test---------->

Таск готовий! Після всього цього я вже втомився писати це все, ну та гаразд, продовжимо)))

Створимо наш новий КПК який нам дасть наш шановний Факер Мазерфакер)))

Для цього відкриємо файл misc\quest_items.ltx і пропише секцію нашого КПК:

	[ moy_kpk ] :identity_immunities
 GroupControlSection	 = spawn_group 
discovery_dependency =
$ spawn = "devices\quest_items\moy_kpk" 
;	 $ prefetch = 32 
class = II_ATTCH 
cform = skeleton 
visual = equipments\item_pda.ogf 
radius = 1 ; 


 
description          = item_moy_kpk_desc
 
inv_name	 = item_moy_kpk_name 
inv_name_short = item_moy_kpk_name 
inv_weight	 = 0.2 
 
inv_grid_width = 2 inv_grid_height = 1 inv_grid_x	 = 6 inv_grid_y	 = 13 cost = 0 
 
 
 
 

І русифікуємо його у файлі text\ukr\string_table_items.xml

	<string id= "item_moy_kpk_desc" >
<text>КПК з інформацією. Доступ без пароля неможливий</text>
	</string>
	<string id= "item_moy_kpk_name" >
<text>КПК з інформацією</text>
	</string>

КПК готовий, млинець тепер створимо мудрий діалог:

1. Говоримо з Сидором про завдання

2. Факер Мазерфакер нам дає КПК

3. Віддаємо сидору КПК

BEGIN! (ВПЕРЕД(хто не в курсі справи))

Пропишемо шлях до діалогу, відкриваємо файл gameplay\character_desc_escape.xml і tradery дописуємо 2 діалоги:

Шукаємо Сидора аха ось він

	<specific_character id= "escape_trader"  no_random = "1" >
<name>escape_trader_name</name>
<icon>ui_npc_u_trader</icon>
<bio>escape_trader_bio</bio>
 
<class>trader</class>
<community>trader</community>
<visual>actors\trader\trader</visual>
 
<rank> 330 </rank>
<reputation> 23 </reputation>
<money min= "100000" max= "100000" infinitive= "1" />
<supplies>
	[ spawn ] \n
	wpn_knife \n
</supplies>
 
<start_dialog>escape_trader_start_dialog</start_dialog>
<actor_dialog>escape_trader_talk_info</actor_dialog>
<actor_dialog>escape_trader_jobs</actor_dialog>
<actor_dialog>tm_trader_dialog</actor_dialog>
<actor_dialog>tm_trader_reward</actor_dialog>
<actor_dialog>escape_trader_done_blockpost_box</actor_dialog>
	</specific_character>

Значить пишемо:

	<specific_character id= "escape_trader"  no_random = "1" >
<name>escape_trader_name</name>
<icon>ui_npc_u_trader</icon>
<bio>escape_trader_bio</bio>
 
<class>trader</class>
<community>trader</community>
<visual>actors\trader\trader</visual>
 
<rank> 330 </rank>
<reputation> 23 </reputation>
<money min= "100000" max= "100000" infinitive= "1" />
<supplies>
	[ spawn ] \n
	wpn_knife \n
</supplies>
 
<start_dialog>escape_trader_start_dialog</start_dialog>
<actor_dialog>escape_trader_talk_info</actor_dialog>
<actor_dialog>escape_trader_jobs</actor_dialog>
<actor_dialog>tm_trader_dialog</actor_dialog>
<actor_dialog>tm_trader_reward</actor_dialog>
<actor_dialog>escape_trader_done_blockpost_box</actor_dialog>
<actor_dialog>test_kvest_dialog</actor_dialog> <!--наш діалог-->
<actor_dialog>test_kvest_dialog_done</actor_dialog> <!--наш діалог-->
	</specific_character>

А шлях до діалогу у Факера Мазерфакера вже прописано:

<actor_dialog>test_kvest_dialog_npc</actor_dialog>

Переходимо безпосередньо до діалогу. Відкриваємо gameplay\dialogs_escape.xml і на самому початку після рядка <game_dialogs> пишемо:

	    <dialog id= "test_kvest_dialog" >
<dont_has_info>test_kvest_start</dont_has_info> <!--перевірка, чи не отримав ГГ інфопоршень раніше, якщо отримав той діалог не спрацьовує-->
       <phrase_list>
	            <phrase id= "0" >
	                <text>test_kvest_dialog_0</text>
               <next> 11 </next>
           </phrase>
           <phrase id= "1" >
               <text>test_kvest_dialog_1</text>
	<give_info>test_kvest_start</give_info> <!--даємо інфопоршень-->
           </phrase>
           <phrase id= "11" >
               <text>test_kvest_dialog_11</text>
               <next> 1 </next>
               <next> 2 </next>
           </phrase>
           <phrase id= "2" >
               <text>test_kvest_dialog_2</text>
           </phrase>
       </phrase_list>
   </dialog>
 
   <dialog id= "test_kvest_dialog_done" >
<dont_has_info>test_kvest_done</dont_has_info> <!--перевірка, чи не отримав ГГ інфопоршень раніше, якщо отримав те діалог не спрацьовує-->
<has_info>test_kvest_have</has_info> <!--перевірка,чи є у РР інфопоршень, якщо отримав те діалог спрацьовує-->
<precondition>escape_dialog.have_kpk</precondition> <!--перевірка зі скрипта-->
       <phrase_list>
           <phrase id= "0" >
               <text>test_kvest_dialog_done_0</text>
               <next> 1 </next>
           </phrase>
           <phrase id= "1" >
               <text>test_kvest_dialog_done_1</text>
	<action>escape_dialog.money_give_test</action> <!--виклик функції зі скрипта-->
	<give_info>test_kvest_done</give_info> <!--даємо інфопоршень-->
	<action>escape_dialog.give_kpk_to_sidor</action> <!--виклик функції зі скрипта-->
           </phrase>
       </phrase_list>
   </dialog>
 
   <dialog id= "test_kvest_dialog_npc" >
<dont_has_info>test_kvest_have</dont_has_info> <!--перевірка, чи не отримав РР інфопоршень раніше, якщо отримав те діалог не спрацьовує-->
<has_info>test_kvest_start</has_info> <!--перевірка,чи є у РР інфопоршень, якщо отримав те діалог спрацьовує-->
       <phrase_list>
           <phrase id= "0" >
               <text>test_kvest_dialog_npc_0</text>
               <next> 1 </next>
           </phrase>
	          <phrase id= "1" >
               <text>test_kvest_dialog_npc_1</text>
	<give_info>test_kvest_have</give_info> <!--даємо інфопоршень-->
	<action>escape_dialog.give_kpk_to_actor</action> <!--виклик функції зі скрипта-->
               <next> 2 </next>
         </phrase>
           <phrase id= "2" >
	              <text>test_kvest_dialog_npc_2</text>
	                <action>dialogs.break_dialog</action> <!--виклик функції зі скрипта-->
	   </phrase>
	        </phrase_list>
	    </dialog>

Перекладаємо наші doodle у файлі text\rus\stable_dialogs_escape.xml

<!-------------------------------------------test---- -------------------->
	<string id= "test_kvest_dialog_0" >
<text>Дарів, радіоактивне м'ясо.</text>
	</string>
	<string id= "test_kvest_dialog_11" >
<text>Слухай Мечений тобі я дивлюся грошей потрібно підзаробити? Сходи до сталкера одному він мені інфу винен.</text>
	</string>
	<string id= "test_kvest_dialog_1" >
<text>Так, давай схожу.</text>
	</string>
	<string id= "test_kvest_dialog_2" >
<text>Ні, мені влом.</text>
	</string>
	<string id= "test_kvest_dialog_done_0" >
<text>Ось я приніс.</text>
	</string>
	<string id= "test_kvest_dialog_done_1" >
<text>Молодець! Тримай нагороду.</text>
	</string>
	<string id= "test_kvest_dialog_npc_0" >
<text>Гей, сталкер. Так ти мені Сидор сказав те, що ти йому інфу повинен принести.</text>
	</string>
	<string id= "test_kvest_dialog_npc_1" >
<text>Ой так, чувак на візьми.Спасибі, що нагадав, а то мені Сидір дупу надрав би.</text>
	</string>
	<string id= "test_kvest_dialog_npc_2" >
<text>Давай. Я погнав.</text>
	</string>
<!-------------------------------------------test---- -------------------->

Прописуємо спавн кпк в інвертар ектора при розмові з Самі-Знаєте_Ким)))

Відкриваємо escape_dialog.script і малюємо всередині поза всякими функціями!

 
-- це наші функції, що викликаються з діалогу
function money_give_test ( first_speaker, second_speaker ) -ГГ отримує гроші
	dialogs.relocate_money ( first_speaker, 1000 , "in" )
end
function have_kpk ( first_speaker, second_speaker ) - перевірка чи є у ГГ наш КПК
  	return first_speaker:object ( "moy_kpk" ) ~= nil
end
function give_kpk_to_sidor ( first_speaker, second_speaker ) - ГГ віддає КПК
	dialogs.relocate_item_section ( first_speaker, "moy_kpk" , "out" )
end
function give_kpk_to_actor ( first_speaker, second_speaker ) - ГГ приймає КПК
	dialogs.relocate_item_section ( first_speaker, "moy_kpk" , "in" ) 
end

Ну. Наче все. Що ж якщо якісь вильоти перевірте ще раз всі пункти


   
Цитата