1. Для общения на форуме, в чате или личной переписке наличие аватара ОБЯЗАТЕЛЬНО!

Самое необходимое

Тема в разделе "S.T.A.L.K.E.R.", создана пользователем 1bober1, 4 фев 2011.

  1. DikiyKblCO

    DikiyKblCO Гость

    Как узнать координаты (X, Y, Z)

    Копируем в gamedata/scripts/ui_main_menu.script

    OnButton_credits_clicked()
    local text
    local vid
    local gvid
    local a = vector()
    local text a = db.actor:position()
    vid = db.actor:level_vertex_id()
    gvid = db.actor:game_vertex_id()
    text = "Позиция:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid news_manager.send_tip(db.actor, text, nil, nil, 30000) end
     
  2. basil

    basil Гость

    Состояния тела

    Автор: modos189 Раздел: S.T.A.L.K.E.R.: Shadow of Chernobyl

    Разобрал состояния тела и подумал мож кому это надо и вот чтоб не разбирать с самого начала выкладываю!

    Ходячие состояния:
    patrol – просто идет
    run - бежит
    walk – ходит без оружия
    assault – бежит в денжере
    raid – идет опустив ствол
    raid_fire – идет в денжере
    sprint – бежит в денжере
    patrol_fire – патрулирует с оружие в руках
    sneak_no_wpn - сидя крадется без оружия
    sneak_run - сидя бежит с опущенной волыной
    sneak – сидя крадется в денжере
    rush – бежит и машет валыной


    Стоячие состояния:
    wait – просто стоит, дефолт
    wait_trade – стоит и часто потирает руки, переминается
    wait_na – стоит боком, типа недоверчиво
    guard – валыну в руках крутит
    guard_na – стоит на изготовке с оружием в руках
    guard_fire – целиться куда смотрел при подходе, при разговоре поворачивается
    threat – целиться куда смотрел
    threat_heli – целиться в ГГ и при разговоре
    threat_na – целиться но при разговоре убирает ствол
    threat_fire – целиться куда смотрел
    threat_sniper_fire
    hide – целиться в валыну и играет ей
    hide_na
    hide_fire
    hide_sniper_fire
    caution – руки облокотил на колени
    choose – стоит свободно переминается, короче как обычный человек
    press – тычит пальцем
    ward – руки за спиной голова вниз
    search – стоит, садиться и чтото ищет и опять заново
    salut – стоит смирно, харя довольная
    salut_free – подставляет руку в виску
    prisoner – сидит как пленник типа Шустрый
    hide_no_wpn – сидит руки на земле чето высматривает



    Сидячие состояния:
    Sit – сидит на корточках
    sit_knee - просто сидит одну раку на колено и позевывает
    sit_ass – сидит на ж… руки на коленях
    sleep – лежит спит
    sleep_sit – сидя на ж… спит положив голову на колени
    eat_bread – ест хлеб если есть, если нет то сидит лежа
    eat_vodka - пьет водку если есть – нет имитирует что пьет
    eat_energy - пьет напиток если есть – нет то просто лежа сидит
    eat_kolbasa – ест колбасу если есть – нет сидит лежа
    guitar - играет на гитаре если есть если нет то типа играет
    harmonica - видимо должен играть на губной гармошке
    hello – машет одной рукой (без валыны)
    hello_wpn – в одной руке оружие а другой машет
    refuse – пожимает плечами и разводит руки
    claim – в одной руке оружие а другой подзывает, типа иди сюда
    backoff – держит оружие в руках и машет рукой типа убери оружие, а потом показывает фак
    backoff2 – тоже самое что и backoff
    suicide – сидит на коленях и пушка в руке у виска
    punch – типа ударяет рукой
    hide_s_left – сидтся в одной руке валына а другой показывает тихо!
    hide_s_right – сидит в одной руке оружие а другой чето делает
    dynamite – закладывает динамит
    binocular – смотрит в бинокль
    hide – сидит с оружием в руках
    hide_rac – сидит в одной руке оружие в другой рация
    wait_rac – стоя говорит в рацию
    guard_rac – стоит в одной руке оружие в другой рация
    probe – смотрит на прибор который держит в руках
    probe_1 - смотрит на прибор который держит в руках
    probe_2 - смотрит на прибор который держит в руках
    probe_3 - смотрит на прибор который держит в руках
    mode_shlem
    hands_up – руки вверх


    Раненный:
    Wounded – сидит и держиться за грудь
    wounded_heavy – лежит как раненный
    wounded_heavy_2 – лежит и держиться
    wounded_heavy_3 – лежит скрючевшись
    wounded_zombie – очень низко сидит одной рукой упирается в землю другой держиться за грудь
    help_me - очень низко сидит одной рукой упирается в землю другой держиться за грудь, потом рукой машет
    trans_0 – сидит на коленях, там же руки и покачивается
    trans_1 – сидит на коленях руки там же и крутит торсом
    trans_zombied - сидит на коленях руки там же и машет головой (короткая)


    Пси раненный:
    psy_pain – сидит на коленях, руки за голову, мотает ,бьет себя по голове
    psy_armed – сидит на коленях, руки за голову, мотает ,бьет себя по голове только с оружием
    psy_shoot – опирается рукой в землю потом стреляет себе в висок и умирает


    Псих в баре:
    psycho_pain – держиться за голову
    psycho_shoot - опирается рукой в землю потом стреляет себе в висок и умирает


    Бармен:
    bar_fas – стоит облокотившись типа на стойку
    bar_left – стоит облокотившись левой рукой на стойку
    bar_head – стоит локтями уперся на стоику в одной руке держит голову типа спит
    bar_sleep – руки сложены на стойке голова опущена
    bar_right – правая рука на стойке а на руке голова, левая на стойке
    barman_talk_free --остальные анимки нужно спавнить в баре и на самом Бармене
    barman_walk_free
    barman_tv
    barman_wait_free
    barman_walk_danger
    barman_shock
    barman_wait_danger


    Доктор в мертвом городе:
    doctor_wakeup – когда доктор склоняется над Стрелком и базарит

    Автор: Byurrer
     
    Последнее редактирование модератором: 5 авг 2020
    1 человеку нравится это.
  3. basil

    basil Гость

    Последнее редактирование модератором: 19 апр 2020
    2 пользователям это понравилось.
  4. basil

    basil Гость

    На сайте ТТ-2 ссылка на интересные скриптовые функции стала не рабочей, поэтому, информацию там содержащуюся, воспроизвожу здесь:

    Скриптовые функции

    1) Спавн НПС с присвоением ID:

    function spawn_mervin2()
    local obj=alife():create("esc_mervin2",vector():set(9.693,56.273,48.022),5205,2417)
    local params=amk.read_stalker_params(obj)
    params.custom="[logic]\ncfg = scripts\\new\\esc_mervin2.ltx"
    params.sid=30137
    amk.write_stalker_params(params,obj)
    end

    --В функции прописывается не только ID, но и путь к файлу логики НПС.
    Sid необходимо зарегистрировать в файле: game_story_ids.ltx (путь: \gamedata\config)
    Sid присваивается не сразу – условие такое, что таким методом НПС следует спавнить с другой локации, т.е. предположим, что нам нужен НПС с Сидом, по которому мы будем ставить на него метки, удалять и т.д. В этом случае нужно заспавнить его, когда ГГ находится на локации, отличной от той, где должен заспавниться НПС.


    2) Удаление НПС по ID или по имени:
    function del_mervin2()--удаление по ID (если спавнили НПС с присвоением ID)
    local sim = alife()
    local se_obj = sim:story_object(30137)
    if se_obj then
    sim:release(se_obj, true)
    end
    end

    function delete_osoz1() --удаление по имени (если спавнили НПС без присвоения ID)
    for a=10,65635,1 do
    local obj=alife():object(a)
    if obj and string.find(obj:name(),"esc_osoz1") then
    alife():release(obj,true)
    end
    end
    end

    3) Функции проверки появления предмета (предметов) в инвентаре:

    function first_urok_dialog_have(task, objective) --проверка одного предмета
    return new_dialog.item_much("svitok_1",1) ~= false
    end

    function first_urok_dialog_have(task, objective) --проверка нескольких одинаковых предметов
    return new_dialog.item_much("svitok_1",5) ~= false
    end

    function graf_first_dialog_have(task, objective) --проверка нескольких разных предметов с разным количеством
    return new_dialog.item_much("doc1",1) ~= false and
    new_dialog.item_much("wpn_aug_a3",5) ~= false
    end

    function graf_second_dialog_have(task, objective) --альтернативный способ проверки одного предмета в инвентаре
    if db.actor ~= nil then
    return db.actor:object("wpn_g3_camo") ~= nil
    end
    return false
    end

    4) Функция завершения квеста, когда отдаём найденный (найденные предметы) и получаем награду:

    function graf_tri_dialog_done(first_speaker, second_speaker)
    flamethrower.relocate_n_items_section(second_speaker, "flash_tsezar", "out", 3) --отдаём 3 флешки Цезаря
    dialogs.relocate_item_section(second_speaker, "af_cristall", "in") --получаем в награду от Цезаря Кристалл
    end

    Альтернативная функция передачи предметов через new_dialog.out_item_much:

    function pekar_first_dialog_done(first_speaker, second_speaker)
    new_dialog.out_item_much("muka",5)
    new_dialog.out_item_much("pekar_outfit",1)
    flamethrower.relocate_n_items_section(second_speaker, "bread_pekar", "in", 10)
    end
    --Здесь отдаём Пекарю 5 мешков муки, возвращаем антигравитационный костюм и получаем в награду 10 буханок хлеба. В первом примере, когда используем relocate_n_items_section, предмет остаётся в инвентаре НПС. Во втором примере, когда используем new_dialog.out_item_much, предмет просто исчезает, в инвентаре НПС его не будет.

    5) Функция передачи ГГ предметов от какого-нибудь НПС:

    function tsezar_first_dialog_dal(first_speaker, second_speaker)
    dialogs.relocate_item_section(second_speaker, "super_outfit", "in")
    flamethrower.relocate_n_items_section(second_speaker, "antirad", "in", 10)
    end
    --В этой функции видно, что для передачи 1 шт. чего-либо, используем dialogs.relocate_item_section, а для передачи нескольких однотипных предметов flamethrower.relocate_n_items_section. В принципе, можно обойтись и только последним видом: flamethrower.relocate_n_items_section, но только поставив количество после запятой 1.

    6) Функция спавна трупа с присвоением ему ID:

    function spawn_trupak()
    local obj = alife():create("esc_trupak",vector():set(-168.462,-0.001,17.821),1737,1392)
    local tbl = amk.read_stalker_params(obj)
    tbl.sid = 30117
    tbl.health = 0
    tbl.updhealth = 0
    amk.write_stalker_params(tbl, obj)
    end

    --Чтобы труп не убирался уборщиком, надо в скриптовом файле: sak_off_corpses.script в функции: off_corpses (она в самом начале) прописать нашего трупа (esc_trupak) в исключения. Вот так (по аналогии с остальными): and npc_name~="esc_trupak". Кроме этого, надо всегда учитывать максимальный номер ID трупов в моде. В случае НС5+ТТ, значение (в этой же функции) выставлено так: if obj.m_story_id > 30200 then (это после списка трупов). Говорит о том, что максимально допустимый СИД трупа может быть 30200, если у трупа будет СИД = 30201, то он не попадёт в исключение и будет удаляться.

    --То же самое и с оружием. Если мы хотим заспавнить скриптом ствол на земле или ещё где и не хотим, чтобы он удалился уборщиком, то в этой же функции (ниже) находим массив с перечислением стволов и добавляем туда свой ствол. Вот так:
    and not string.find(wpn_name,"wpn_winchester_knyaz")

    7) Функция выдачи СМС сообщения, привязанного к спавну НПС или чего угодно другого:

    function spawn_killer_attak()
    local obj=alife():create("esc_killer_attak1",vector():set(210.178,-0.010,-26.217),51168,1265)
    local obj=alife():create("esc_killer_attak2",vector():set(210.178,-0.010,-26.217),51168,1265)
    local obj=alife():create("esc_killer_attak3",vector():set(224.825,-0.011,6.590),56564,1175)
    news_manager.send_tip(db.actor, "Стрелок, это Бармен. На южный блокпост Бара напали наёмники, выручай, я знаю, ты где то рядом!", nil, nil, 20000)
    end

    --Значение 20000 — это время, которое сообщение будет «висеть» на мониторе. Зависит от количества символов. Чем больше сообщение, тем побольше стоит поставить время отображения на экране, но более 60000 ставить не стоит, слишком долго. Я для себя выбрал значение 30000, как базовое, для коротких сообщений — 20000).

    8 ) Выдача СМС сообщения по условию:

    Чтобы выдать сообщение по условию, надо прописать вначале само условие с выдачей инфопоршня в файл: dimos.script в функцию: start_dimos. Например так:
    if (или elseif, если это не первое условие, а последующее в массиве условий) level.name()=="l03_agroprom" and has_alife_info("sledopyt_first_dialog_start") and not has_alife_info("taynik_sms") then db.actor:give_info_portion("taynik_sms")

    Создаём в этом же файле (dimos.script) функцию:
    function sms_taynik()
    db.actor:give_info_portion("taynik_talk")
    news_manager.send_tip(db.actor, "Стрелок, иди по дороге вперёд, к северному корпусу, ищи у дороги заваленный вход в катакомбы. Как подойдёшь, я тебе проход открою.", nil, nil, 30000)
    end

    --Далее, регистрируем 2 новых инфопоршня в файле с инфопоршнями. Прописываем в инфопоршень taynik_sms вызов функции СМС. Вот так должно всё выглядеть:

    dimos.sms_taynik



    --Всё сообщение готово. Теперь, когда получили задание от Следопыта встретиться с Инкогнито и перешли на локацию Агропром, то придёт СМС_ка.

    9) Создание условия на зачёт задания при убийстве НПС или монстров:

    --Вначале надо создать уникальных (можно и безымянных) НПС или монстров и в их логике добавить строку on_death и создать секцию [death]. Вот так должно это выглядеть :

    Для НПС:

    [logic]
    on_death = death

    [death]
    on_info = %+killer_attak1_dead%

    Для монстров:
    [logic]
    on_death = mob_death

    [mob_death]
    on_info = %+vypolzen_dol1_dead%

    Обязательно добавить новый инфопоршень (инфопоршни, если объект уничтожения не один) в файл с инфопоршнями.

    Далее создаём функцию проверки мёртв ли объект:


    function bar_help_have(task, info)
    if db.actor and db.actor:has_info("killer_attak1_dead") and db.actor:has_info("killer_attak2_dead") and db.actor:has_info("killer_attak3_dead") and db.actor:has_info("killer_attak4_dead") and db.actor:has_info("killer_attak5_dead") and db.actor:has_info("killer_attak6_dead") and db.actor:has_info("killer_attak7_dead") and db.actor:has_info("killer_attak8_dead") and db.actor:has_info("killer_attak9_dead") and db.actor:has_info("killer_attak10_dead") and db.actor:has_info("killer_attak11_dead") and db.actor:has_info("killer_attak12_dead") and db.actor:has_info("killer_attak13_dead") and db.actor:has_info("killer_attak14_dead") and db.actor:has_info("killer_attak15_dead") then
    return db.actor:give_info_portion("bar_help_have")
    end
    return false
    end

    Вот пример, когда надо отстрелять 15 наёмников при атаке на южный блокпост Бара. По факту отсрела всех 15-и получаем поршень: bar_help_have (его тоже не забыть зарегистрировать в файл с поршнями) и задание засчитывается. Тоже самое и с монстрами.

    10) Функция вызова музыкального фрагмента:

    function sound_svitok1()
    local snd_obj = xr_sound.get_safe_sound_object([[new\svitok1]])
    snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
    end
    --Ставим в любое место, будь то диалог или по условию. Главное правильно прописать путь до нужного файла .ogg в папке sounds.

    11) Функция вызова видеофрагмента:

    --По аналогии с аудио, можно вызвать эту функцию откуда угодно:
    function immortal_video()
    game.start_tutorial("mov_desire_1")
    end
    --В примере представлен файл видео, которое вызывается в диалоге с Семецким, стоя у Монолита.

    12) Функция спавна предмета в инвентаре актёра (просто тупо в рюкзаке появляется какой-либо предмет):

    function spawn_vodka()
    local obj=alife():create("vodka", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    end

    13) Создание спейс_рестриктора — точки, при попадании в которую актёра или какого-нибудь НПС (с прописанным сидом), можно назначить какое-нибудь действие.
    --Функции работают только в файле braad_test.script (мод ТТ2), так как там прописан большой массив перепаковки нет пакета спейс_рестриктора, который нет смысла дублировать в другом скриптовом файле.
    Если рестриктор должен срабатывать, когда в него попадает ГГ:


    function create_x16_restr()
    local se_obj = alife():create("space_restrictor",vector():set(-66.073,-19.088,-158.844),15672,1490)
    local custom = "[logic]\ncfg = scripts\\new\\restr\\x16_restr.ltx"--задаём путь к файлу логики
    rewrite_restrictor(se_obj, custom, 5.0)
    end

    --Создаём файл логики рестриктора по заданному пути:
    [logic]
    active = sr_idle@one

    [sr_idle@one]
    on_actor_inside = {+potapov_first_dialog_start} nil %+x16_pauk_spawn%

    --Получаем следующее: если актёр попал в спейс_рестриктор в лабе х-16 и выдан инфопоршень potapov_first_dialog_start (взято задание у Потапова на поиск частей инструкции по сборке Минигана), то выдаётся инфопоршень x16_pauk_spawn (который надо не забыть прописать в файл инфопоршней). Внутрь этого инфопоршня прописываем функцию спавна пауков.

    Если рестриктор должен срабатывать, когда в него попадает НПС (с присвоенным ID):


    function dyak_mesto()
    local sr = alife():create("space_restrictor",vector():set(703.585,-0.102,-45.824),304659,2299)
    local custom = [[[logic]
    active = sr_idle
    [sr_idle]
    on_npc_in_zone = 9604|]]..sr:name()..[[|nil %+dyak_na_meste%]]
    rewrite_restrictor(sr, custom, 12.0)
    end

    --Здесь всё проще, логика прописывается в скриптовой функции. В примере, Дьяк на Чаэс-1 приходит в точку рестриктора и спавнятся вояки при условии получения инфопоршня: dyak_na_meste.

    14) Деньги. ГГ получает или ГГ отдаёт (работает только в диалогах):

    function trader_money(first_speaker, second_speaker) --получение денег ГГ от НПС
    dialogs.relocate_money(second_speaker, 5000, "in")
    end

    function give_money_30000(t1,t2) --передача денег от ГГ к НПС
    local npc=t1
    if npc:id()==db.actor:id() then
    npc=t2
    end
    dialogs.relocate_money(npc,30000,"out")
    end

    15) Функция перевода НПС во врага (в диалоге):

    function bar_nps_enemy(first_speaker, second_speaker)
    second_speaker:set_relation(game_object.enemy, first_speaker)
    end

    16) Функция перевода НПС во врага просто когда угодно:

    --Дородина делаем врагом, чтобы не падала репутация после его убийства:

    function ecolog_new()
    local npc,obj
    for i=0,65534 do
    npc = level.object_by_id(i)
    if npc and npc:name() == "ecolog_new" then
    obj = alife():object(npc:id())
    npc:set_relation (game_object.enemy, db.actor)
    end
    end
    end

    17) Как сделать, чтобы актёр сменил группировку с первоначальной на актёра-нейтрала:

    Вызываем функцию из скрипта dialogs.script:

    function actor_clear_community(actor, npc)
    printf("ACTOR NOW IN [NEUTRAL] COMMUNITY")
    if db.actor then
    db.actor:set_character_community("actor", 0, 0)
    end
    return true
    end

    И делаем какую-нибудь группировку , в которой состоял актёр ранее, врагами к ГГ:

    function enemyactor(community1, community2)
    relation_registry.set_community_goodwill ("monolith", "actor", -5000)
    end

    А ещё какую-нибудь группировку делаем друзьями:

    function friendactor(community1, community2)
    relation_registry.set_community_goodwill ("neutral", "actor", 2500)
    end

    18) НПС меняет свою бывшую группировку и переводится в друзья:

    --Две функции, которые переводят Соломона в Сталкера-нейтрала (после ограбления на Чаэс-2):

    function set_solomon(sid)
    local npc = level_object_by_sid(9611)
    if npc == nil or npc:alive () == false then
    return
    end
    npc:set_character_community("stalker", 0, 0)
    end

    function set_community_solomon(actor, npc)
    db.actor:set_character_community("stalker", 0, 0)
    end

    19) Телепорты (3 разновидности):

    --Функция телепортации. Вставляется в любой скриптовый файл. Действует только в пределах текущей локации. В данном примере ГГ перебрасывается из диалога с Мервином на крышу дома в припяти за 4-м свитком:


    function teleport_cherdak()
    level.add_pp_effector ("teleport.ppe", 25003, false)
    db.actor:set_actor_position(vector():set(-19.27,18.80,-156.86)) --ГГ на чердаке дома в Припяти
    local snd_obj = xr_sound.get_safe_sound_object([[anomaly\teleport_work_1]])
    snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
    end

    --Функция телепортации на другую локацию. Вставляется только в определённый файл, с привязанным алгоритмом. В ТТ - это xyz_teleportation.script. В данном примере ГГ перебрасывается в диалоге с Мэрвином в Саркофаг:

    function sarcofag_start() --телепортация. Функция вставляется в диалог или через рестриктор можно сделать.
    create_level_changer(20101, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),
    10193,
    2437,
    vector():set(66.210,15.040,4.250),
    vector():set(0.0, 0.0, 0.0),
    "l12u_sarcofag",
    1)
    end

    function delete_sarcofag() --удаление телепорта (Обязательно удалить сразу после телепортации! Иначе постоянно будет телепортировать в заданную точку с того места, откуда первый раз произошла телепортация).
    local sim = alife()
    local se_obj = sim:story_object(20101)
    if se_obj then
    sim:release(se_obj, true)
    end
    local actor = db.actor
    end

    --Функция телепортации с созданием телепорта (можно делать как видимый, так и невидимый телепорты). Работает эта функция только, если есть определённый скриптовый файл в папке scripts. Это файл называется bind_mteleport.script и файл: zone_teleport.ltx (\gamedata\config\misc). Далее, создаём любой скриптовый файл в папке scripts и создаём в нём такую функцию:

    function spawn_teleport2() --телепорт, перебрасывающий недалеко от входа в тайник Стрелка
    local se_obj = alife():create("m_teleport_2",vector():set(-83.591,-14.648,-70.751),2582,717)
    local t = amk.get_anomaly_data(se_obj)
    t.sid = 30106
    amk.set_anomaly_data(t, se_obj)
    end

    --Затем, в конце файла: zone_teleport.ltx (\gamedata\config\misc) создаём новую секцию телепорта:

    [m_teleport_2]:zone_teleport_out --если убрать _out, то телепорт будет видимым
    teleport = standart
    script_binding = bind_mteleport.bind
    ;Параметры нашего телепорта
    radius = 1
    ;Высота захвата телепорта
    z_radius = 1

    ;Куда телепортируемся (телепортация всегда идет в пределах карты)
    poz_x = -85.191
    poz_y = -16.464
    poz_z = -62.322

    ; Угол зрения при появлении. Если параметра нет то не меняется
    rotate = 3.8

    --Удалить такой телепорт можно также по СИД_у, как и предыдущий.

    20) Ограбление.

    function mervin_vyrubaet() --эффект вырубания с головокружением и звуковым сопровождением, типа от удара.
    level.add_cam_effector("camera_effects\\prison_1.anm", 25, false, "")
    level.add_pp_effector("yantar_underground_psi.ppe", 2007, false)
    level.add_pp_effector("total_recall.ppe", 2008, false)
    local snd_obj = xr_sound.get_safe_sound_object([[characters_voice\human_01\stalker\states\breath\breath_2]])
    snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 15.0)
    level.add_cam_effector("camera_effects\\hit_back_left.anm", 26, false, "")
    end

    function mervin_vzyal(actor,npc) --ограбление всего инвентаря, кроме предметов, которые квестовые и которые прописаны в исключение. Функцию надо вызывать только через выдаваемый инфопоршень, иначе будет конфликт с функцией эффекта вырубания.
    local inv_box_1 = level_object_by_sid(9608) --***
    out_object = db.actor
    in_object = inv_box_1
    db.actor:inventory_for_each(transfer_object_items)
    end

    ***Указан СИД того места, куда будут перемещены вещи. В данном случае, это подставной НПС (Призрак), который их потом и вернёт, но можно заспавнить, например, ящик с присвоением СИД_а и в него всё сложить.

    function transfer_object_items(item) --исключения для ограбления

    local sect = item:section()
    if sect == "detector_simple"
    or sect == "bioradar"
    or sect == "detector_kruglov"
    then
    return
    end
    out_object:transfer_item(item, in_object)
    --dbg.log("transfer item=%s from %s to %s", item:name(), out_object:name(), in_object:name())
    end


    function money_out(t1,t2) --отбираем у ГГ все деньги
    local npc=t1
    if npc:id()==db.actor:id() then
    npc=t2
    end
    dialogs.relocate_money(npc,db.actor:money(),"out")
    end

    Вот последние строки диалога, где происходит (на предпоследней фразе) отбирание денег, а в последней фразе вставлены функции эффекта от вырубания и выдаётся инфопоршень, в который вписывается функция ограбления инвентаря. Все функции разнесены, так как конфликтуют, если вызваны вместе. При условии, что последняя фраза — это фраза НПС, то всё происходит мгновенно (мы не видим последней фразы, так как диалог завершает функция dialogs.break_dialog, которая сворачивает окно диалога):


    fokusnik_dialog_start
    fokusnik_dialog_done


    fokusnik_dialog_est_0
    1


    fokusnik_dialog_est_1
    2


    fokusnik_dialog_est_2
    braad_test.money_out --отбираем все деньги
    3


    fokusnik_dialog_est_3
    fokusnik_dialog_done --получаем поршень, в который впишем функцию ограбления
    braad_test.mervin_vyrubaet --эффект вырубания
    dialogs.break_dialog --сворачивание диалогового окна




    Из файла с инфопоршнями:


    braad_test.mervin_vzyal --вот здесь вставляем функцию ограбления.


    --Ну, и наконец, возврат имущества (деньги уже не вернуть):

    function mervin_otdal(actor,npc) --вызываем из диалога или по условию сдачи задания или по другому какому-нибудь условию
    local inv_box_1 = level_object_by_sid(9608)
    in_object = db.actor
    out_object = inv_box_1
    out_object:inventory_for_each(transfer_object_item)
    end
     
    Последнее редактирование модератором: 19 апр 2020
    2 пользователям это понравилось.

Поделиться этой страницей