sasha47007 3 Опубликовано 15 Июня 2009 (изменено) Для начала нужно создать диалог, сделаем его у Волка: Заходим в gamedata\config\gameplay\dialogs_escape.xml и в самом конце до строчки </game_dialogs> пишем: <dialog id="escape_volk_ak74u_quest"> <has_info>esc_kill_bandits_quest_done</has_info> <dont_has_info>escape_volk_ak74u_start</dont_has_info> <phrase_list> <phrase id="0"> <text>escape_volk_ak74u_quest_0</text> <next>1</next> </phrase> <phrase id="1"> <text>escape_volk_ak74u_quest_1</text> <next>2</next> <next>3</next> </phrase> <phrase id="2"> <text>escape_volk_ak74u_quest_2</text> <give_info>escape_volk_ak74u_start</give_info> <action>new_life.spawn_ak74u</action> </phrase> <phrase id="3"> <text>escape_volk_ak74u_quest_3</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog> <dialog id="escape_volk_ak74u_quest_completed"> <precondition>new_life.escape_volk_ak74u_have</precondition> <has_info>escape_volk_ak74u_have</has_info> <dont_has_info>escape_volk_ак74u_done</dont_has_info> <phrase_list> <phrase id="0"> <text>escape_volk_ak74u_quest_completed_0</text> <next>1</next> </phrase> <phrase id="1"> <text>escape_volk_ak74u_quest_completed_1</text> <next>2</next> </phrase> <phrase id="2"> <text>escape_volk_ak74u_quest_completed_2</text> <give_info>escape_volk_ak74u_done</give_info> <action>new_life.give_volk_ak74u</action> <next>3</next> </phrase> <phrase id="3"> <text>escape_volk_ak74u_quest_completed_3</text> <action>new_life.complete_volk_quest</action> </phrase> </phrase_list> </dialog> Теперь нужно прописать эти диалоги Волку, для этого заходим в gamedata\config\gameplay\character_desc_escape.xml и находим профиль Волка(он называется esc_wolf), перед строкой </specific_character> пишем: <actor_dialog>escape_volk_ak74u_quest</actor_dialog> <actor_dialog>escape_volk_ak74u_quest_completed</actor_dialog> Нам понадобятся два диалога: 1 для получения квеста, 2 для передачи автомата.<dialog id="escape_volk_ak74u_quest"> - Это название диалога<has_info>esc_kill_bandits_quest_done</has_info> - эта строка означает что квест появится только если получен инфопоршень esc_kill_bandits_quest_done<dont_has_info>escape_volk_ak74u_start</dont_has_info> - эта строка означает что если получен инфопоршень escape_volk_ak74u_start, то этот диалог больше не появится.<text>escape_volk_ak74u_quest_0</text> - это ссылка на текст фразы меченого<next>1</next> - это ссылка на текст с id= 1 , а id= 1 это <text>escape_volk_ak74u_quest_1</text> (ссылка на текст Волка)<next>2</next><next>3</next> - эти две строчки означают что идет разветвление диалога<give_info>escape_volk_ak74u_start</give_info> - выдача инфопоршня, после которого начинается квест<action>new_life.spawn_ak74u</action> - функция вызываемая из скрипта new_life, в данном случае спаунится предмет AK74У<action>dialogs.break_dialog</action> - функция отвечающая за выход из диалогаВо втором диалоге есть строка <precondition>new_life.escape_volk_ak74u_have</precondition> - она отвечает за появление диалога если выполняется функция escape_volk_ak74u_haveТеперь нужно сделать текст диалога на русском языке, для этого заходим в gamedata\config\tex\rus\stable_dialogs_escape.xml и в нём пишем следующее(в конце перед </string_table>): <string id="escape_volk_ak74u_quest_0"> <text>Здорова Волк, для меня есть какая-нибудь работа?</text> </string> <string id="escape_volk_ak74u_quest_1"> <text>Да, есть одно дело: вобщем шёл сюда в лагерь к Сидырычу, решил пройти через тоннель чтоб воякам денег не платить, а там собак было штук десять. Ну я начал отстреливаться, где-то шестерых убил и патроны кончились, пришлось АКСУ выкинуть, чтоб от стаи собак убежать. Таки лежит там наверно АКСУ. \nНу как, возьмёшься? Только осторожней там, после последнего выброса появились в тоннеле перещающиеся аномалии электра.</text> </string> <string id="escape_volk_ak74u_quest_2"> <text>Да, я как раз буду рядом проходить, конечно принесу...</text> </string> <string id="escape_volk_ak74u_quest_3"> <text>Нет, Волк, сам туда иди...</text> </string> <string id="escape_volk_ak74u_quest_completed_0"> <text>Привет, Волк, ну как оно?...</text> </string> <string id="escape_volk_ak74u_quest_completed_1"> <text>Сидор водку не даёт, хе хе, а так всё хорошо.</text> </string> <string id="escape_volk_ak74u_quest_completed_2"> <text>Вот, нашел я твой АКСУ.</text> </string> <string id="escape_volk_ak74u_quest_completed_3"> <text>Эх спасибо тебе Меченый, вот держи, может на что-нибудь хватит.</text> </string> Итак, диалог готов, теперь нужно сделать сам квест, для этого заходим в gamedata\config\gameplay\tasks_escape.xml и в самом конце пишем: <game_task id="escape_volk_ak74u"> <title>Найти потерянный АКСУ</title> <objective> <text>Найти потерянный АКСУ</text> <icon>ui_iconsTotal_weapons</icon> <infoportion_complete>escape_volk_ak74u_done</infoportion_complete> <article>tex_escape_volk_ak74u</article> </objective> <objective> <text>Найти АКСУ</text> <function_complete>new_life.escape_volk_ak74u_have</function_complete> <infoportion_set_complete>escape_volk_ak74u_have</infoportion_set_complete> </objective> <objective> <text>Принести АКСУ Волку</text> <map_location_type hint="Волк">blue_location</map_location_type> <object_story_id>Escape_novice_lager_volk</object_story_id> <infoportion_complete>escape_volk_ak74u_done</infoportion_complete> </objective> </game_task> <game_task id="escape_volk_ak74u"> - id квеста;<title>Найти потерянный АКСУ</title> - название квеста;<text>Найти потерянный АКСУ</text> - название подзадачи;<icon>ui_iconsTotal_weapons</icon> - иконка задания;<infoportion_complete>escape_volk_ak74u_done</infoportion_complete> - квест будет выполнен, если был получен инфопоршень escape_volk_ak74u_done;<article>tex_escape_volk_ak74u</article> - ссылка на текстовый файл с описанием задания;<text>Найти АКСУ</text> - название подзадачи;<function_complete>new_life.escape_volk_ak74u_have</function_complete> - проверка на наличие предмета;<infoportion_set_complete>escape_volk_ak74u_have</infoportion_set_complete> если функция new_life.escape_volk_ak74u_have выполнилась, то выдаётся инфопоршень escape_volk_ak74u_have и выполняется подзадача;<text>Принести АКСУ Волку</text> - название второй подзадачи;<map_location_type hint="Волк">blue_location</map_location_type> - указатель на Волка;<object_story_id>Escape_novice_lager_volk</object_story_id> - id Волка в Файле gamedata\config\game_story_ids.ltx[/i][/b];<infoportion_complete>escape_volk_ak74u_done</infoportion_complete> - если будет получен этот инфопоршень, то выполнится подзадача и соответственно сам квест.Нужно сделать инфопоршни, заходим в gamedata\config\gameplay\info_l01escape.xml и в нём в конце до строчки </game_information_portions> пишем: <info_portion id="escape_volk_ak74u_start"> <task>escape_volk_ak74u</task> </info_portion> <info_portion id="escape_volk_ak74u_have"></info_portion> <info_portion id="escape_volk_ak74u_done"></info_portion> Теперь нужно сделать описание квеста, заходим в gamedata\config\gameplay\storyline_info_escape.xml и пишем в конце: <article id="tex_escape_volk_ak74u" name="Найти потерянный ак74u" article_type="task"> <texture x="0" y="800" width="200" height="100">ui\ui_icon_equipment</texture> <text>tex_escape_volk_ak74u</text> </article> Сделаем описание на русском, заходим в stable_dialogs_escape.xml и в конце до строки </string_table> пишем: <string id="tex_escape_volk_ak74u"> <text>Волк попросил принести потерянный в туннеле АКСУ</text> </string> Теперь создадим скриптовый файл new_life в gamedata\scripts\new_life.script и пишем: function spawn_ak74u() amk.spawn_item("wpn_ak74u",vector():set(-78.85,-1.29,154.74),163,189935) -- спавн ak74u в тоннеле на кордоне end function escape_volk_ak74u_have() return sak.have_item_namber("wpn_ak74u",1) ~= false -- проверка на нахождение предмета в рюкзаке end function give_volk_ak74u(first_speaker, second_speaker) -- передача предмета sak.out_item_namber("wpn_ak74u", 1) end function complete_volk_quest(first_speaker, second_speaker) -- получение награды dialogs.relocate_money(second_speaker, 1500, "in") end Чтобы эти скрипты заработали, нужно создать файлы amk.script и sak.script.В аmk.script пишем: function spawn_item(spawn_item, pos, gv,lv) if gv==nil then gv=db.actor:game_vertex_id() end if lv==nil then lv=db.actor:level_vertex_id() end return alife():create(spawn_item, pos, lv, gv) end function remove_item_from_inventory(remove_item,npc) if npc==nil then npc=db.actor end if remove_item~=nil then -- npc:mark_item_dropped(remove_item) alife():release(alife():object(remove_item:id()), true) return true end return false end В sak.script пишем: local items_count=0 local itemin=nil function have_item_namber(itm,need_namber) local actor=db.actor items_count=0 itemin=itm actor:iterate_inventory(cheking_item,actor) if items_count>=need_namber then return true else return false end end function cheking_item(actor,item) local items=item:section() if items==itemin then items_count=items_count+1 end end function create_items(npc,section,number) for i=1,number do alife():create(section, npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) end end local reloc_params={} local stalk function out_item_namber(itm_section,need_number) reloc_params.itm_section=itm_section reloc_params.itm_cnt=need_number reloc_params.itm_cnt_found=0 db.actor:iterate_inventory(checkout_items_count,db.actor) reloc_params.itm_cnt_found=0 if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then db.actor:iterate_inventory(out_items_count,db.actor) end news_manager.relocate_item(db.actor, "out", itm_section) reloc_params={} end function relocate_item_namber(stalker,itm_section,need_number) stalk=stalker reloc_params.itm_section=itm_section reloc_params.itm_cnt=need_number reloc_params.itm_cnt_found=0 db.actor:iterate_inventory(checkout_items_count,db.actor) reloc_params.itm_cnt_found=0 if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then db.actor:iterate_inventory(reloc_items_count,db.actor) end news_manager.relocate_item(db.actor, "out", itm_section) reloc_params={} end function checkout_items_count(actor,item) if item.section and item:section()==reloc_params.itm_section then reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 end end function reloc_items_count(actor,item) if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found<reloc_params.itm_cnt then db.actor:transfer_item(item, stalk) reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 end end function out_items_count(actor,item) if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found<reloc_params.itm_cnt then amk.remove_item_from_inventory(item, actor) reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 end end Всё! Можно тестировать.Примечание!!! Если вы делаете такой квест на оригинальном сталкере, то ОБЯЗАТЕЛЬНО нужно создать файлы amk.script и sak.script.Если вы делаете квест на amk моде, то нужно создать только файл sak.script Автор: sasha47007 Изменено 20 Сентября 2014 пользователем World_Stalker 1 1 3 Поделиться этим сообщением Ссылка на сообщение