Перейти к контенту

sttt912

Пользователи
  • Число публикаций

    8
  • Регистрация

  • Последнее посещение

  • AMKoin

    0 [Подарить AMKoin]

Сообщения опубликованы sttt912

  1. И так вот по этому уроку делал квест.

    Создадим квест по поиску АК74У.

    Для начала нужно создать диалог, сделаем его у Волка:

    Заходим в 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

    <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

     

     

    Первий квест получился. Я только сделал, что в квесте вместо калаша нужно найти КПК. Все роботало.

    По этой же схеме начал делать второй квест. Только в скрипте new_life.scrip написал:

    function escape_volk_moy_kpk2_have() 
        return sak.have_item_namber("moy_kpk2",1) ~= false 
    end
    
    function give_volk_moy_kpk2(first_speaker, second_speaker) 
        sak.out_item_namber("moy_kpk2", 1) 
    end 
    
    function complete_volk_quest(first_speaker, second_speaker) 
        dialogs.relocate_money(second_speaker, 1500, "in") 
    end

     

    При розговоре на получение награды начал ловить вылет:

    Expression : fatal error 
    Function : CScriptEngine::lua_error 
    File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp 
    Line : 73 
    Description : <no expression> 
    Arguments : LUA error: d:\games\st\shoc\gamedata\scripts\new_life.script:18: attempt to index global 'sak' (a nil value)

     

    Отредактировал функции и вышло так

    function escape_volk_moy_kpk2_have() 
        return sak2.have_item_namber("moy_kpk2",1) ~= false 
    end 
    
    function give_volk_moy_kpk2(first_speaker, second_speaker) 
        sak2.out_item_namber("moy_kpk2", 1) 
    end 
    
    function complete_volk_quest(first_speaker, second_speaker) 
        dialogs.relocate_money(second_speaker, 1500, "in") 
    end

     

    После начал ловить вилет при получении награды:

    Expression    : fatal error
    Function      : CScriptEngine::lua_error
    File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
    Line          : 73
    Description   : <no expression>
    Arguments     : LUA error: d:\games\st\shoc\gamedata\scripts\sak2.script:70: attempt to index global 'amk' (a nil value)

     

    В sak скрипт отредактировал 70 строчку с

    amk.remove_item_from_inventory(item, actor)

    на

    amk2.remove_item_from_inventory(item, actor)

    И создал скрипт аmk2.script c точно таким же содержаниям.

     

    Ловлю вилет при розговоре о награде:

    Expression : fatal error 
    Function : CScriptEngine::lua_error 
    File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp 
    Line : 73 
    Description : <no expression> 
    Arguments : LUA error: d:\games\st\shoc\gamedata\scripts\sak2.script:70: attempt to index global 'amk2' (a nil value)

     

    И так вопрос^ где я накосячил? :ny_rolleyes:

  2. Я извиняюсь но как можно устранить етот вилет:

    Expression : !phrase_dialog->m_PhraseVector.empty()

    Function : CPhraseDialog::SayPhrase

    File : D:\prog_repository\sources\trunk\xrGame\PhraseDialog.cpp

    Line : 146

    Description : No available phrase to say, dialog[hello_dialog]

     

    Выскакивает при разговоре с Германом, Озерским и Новиковим

     

    Читаем ФАК'и и статьи на wiki и создаем/правим фразы/диалоги для проблемных НПС/группировок. --/Artos

  3. Народ как в зп, при переходе с Затона на Янов отключить ролик с Лоцманом?

     

    Предвыборная лихорадка что ли у многих? Почему к "народу" вопрошают, находясь не на площади, а в форуме? --/Artos

  4. У меня к вам ище один вопрос.

    У меня есть логика:

    [logic]

    on_death = death

    active = remark1

    danger = danger_ignore

     

    [danger_ignore]

    ignore_distance = 5

     

    [death]

    on_info = %+test_nps_mertv%

     

    [remark1]

    no_move = true

    anim = sit_ass

    on_actor_dist_le = 2| remark@hello

    meet = meet_guide

     

    [meet_guide]

    abuse = false

    use = true

    allow_break = false

    meet_on_talking = false

     

    [remark@hello]

    no_move = true

    meet = meet_guide

    on_actor_dist_le = 10| remark1

     

     

    Что нужно отредактировать штоби НПС с етой логикой нападал на обичних сталкеров?

     

    Во-первых, нужно писать грамотно, уважая других и не нарушая правил форума. --/Artos

  5. Извиняюсь если вопрос не по теме но при спавне НПС через all.spawn пишет ето:

     

    C:\Perl\bin>perl acdccop.pl -c all.ltx -o new.spawn

    Died at stkutils/ini_file.pm line 47, line 58451.

     

    C:\Perl\bin>pause

    Для продолжения нажмите любую клавишу . . .

     

     

     

    Добвал такую секцию:

     

    [1866]

    ; cse_abstract properties

    section_name = killer

    name = test_kvest_test

    position = 16.834948,-1.186064,81.275002

    direction = -0.986938,0.000000,0.161102

     

    ; cse_alife_abstract properties

    character_profile = test_kvest_test

     

    ; cse_alife_object properties

    game_vertex_id = 159

    distance = 0

    level_vertex_id = 978206

    object_flags = 0xffffffff

    custom_data = <END

    [logic]

    cfg = scripts\test_kvest_test.ltx

    END

     

    ; cse_visual properties

    visual_name = actors\stalker_hero\stalker_hero_novice_1

     

    ; cse_alife_creature_abstract properties

    g_team = 0

    g_squad = 0

    g_group = 0

    health = 1

    dynamic_out_restrictions =

    dynamic_in_restrictions =

     

    upd:health = 1

    upd:timestamp = 0

    upd:creature_flags = 0

    upd:position = 16.834948,-1.186064,81.275002

    upd:o_model = 0

    upd:o_torso = 0,0,0

    upd:g_team = 0

    upd:g_squad = 0

    upd:g_group = 0

     

    ; cse_alife_monster_abstract properties

     

    upd:next_game_vertex_id = 65535

    upd:prev_game_vertex_id = 65535

    upd:distance_from_point = 0

    upd:distance_to_point = 0

     

    ; cse_alife_human_abstract properties

    predicate5 = 2,2,1,1,2

    predicate4 = 1,0,0,1

     

    ; cse_ph_skeleton properties

     

    upd:start_dialog =

     

    ; se_stalker properties

     

    Неподскажите в чем проблема?

     

     

    Добавлено через 37 мин.:

    А теперь ище один вопрос:

    Што ето означает:

     

    C:\Perl\bin>perl acdccop.pl -c all.ltx -o new.spawn

    Died at acdccop.pl line 3024, <GEN7> line 22949.

     

     

    C:\Perl\bin>pause

    Для продолжения нажмите любую клавишу . . .

     

    Добавлял в way_zaton.ltx ето:

     

    [zat_9_kvest_squad]]

    points = p0,p1

    p0:name = wp00

    p0:flags = 0x1

    p0:position = 16.834948,-1.186064,81.275002

    p0:game_vertex_id = 159

    p0:level_vertex_id = 978206

    p0:links = p1

     

    p1:name = wp01

    p1:flags = 0x2

    p1:position = 6.993692,-5.020605,29.268555

    p1:game_vertex_id = 19

    p1:level_vertex_id = 958168

     

AMK-Team.ru

×
×
  • Создать...