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

Скриптование


Svoboда

Рекомендуемые сообщения

if who:active_slot() == 3 then ...

else

  local item = who:active_item()

  if item and t[item:section()] then ...

  end

end

 

Может, все-таки так ?

 

Или сразу:

if who and who.active_slot and ( ( who:active_slot() == 3 ) or ( who:active_item() and t[who:active_item():section()] ) ) then ... end

 

Поделиться этим сообщением


Ссылка на сообщение

Изрядно гадская, да. Пришлось шаманствовать с removeNpc():

    local kamp_end = xr_evaluators_id.stohe_kamp_base + 1
    local on_pos = xr_evaluators_id.stohe_kamp_base + 2

    local mgr = npc:motivation_action_manager()

-- todo: слишком сложно. ПРОСТО оторвать лишние эвалюаторы СОВСЕМ. Оставить все в одном.
    local a = mgr and mgr:action( xr_actions_id.alife )
    if a then a:remove_precondition( kamp_end )
    else log( "warning", "(%s):removeNpc, no action (alife) (%s)", self.center_point, npc:name() )
    end

    a = mgr:action( xr_actions_id.stohe_kamp_base + 3 )
    if a then
        xr_logic.unsubscribe_action_from_events( npc, st, a )
        mgr:remove_action( xr_actions_id.stohe_kamp_base + 3 )
        -- log( "info", "(%s):removeNpc, %s, 2", self.center_point, npc:name() )
    else log( "warning", "(%s):removeNpc, no action (action_kamp_wait) (%s)", self.center_point, npc:name() )
    end

    mgr:remove_action( xr_actions_id.stohe_kamp_base + 1 )
    -- log( "info", "(%s):removeNpc, %s, 3", self.center_point, npc:name() )

    mgr:remove_evaluator( kamp_end )
    -- mgr:add_evaluator( kamp_end, property_evaluator_const( true ) )
    mgr:remove_evaluator( on_pos )
    -- mgr:add_evaluator( on_pos, property_evaluator_const( true ) )

    -- if npc:name() == "bar_dolg_ivancov" then
    --    log( "info", "(%s):removeNpc, %s, remove_evaluators, ok", self.center_point, npc:name() )
    -- end

    st.on_position = false    -- поскольку строжейж грохнуть не дают, сделаем вид, что он новый.
    st.count = 0
    st.pos_lvid = nil
    st.dest_lvid = nil

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

Партикл - партиклу рознь. Есть бесконечные, есть те, для которых время ограничено. Последние - да, надо перезапускать, если еще нужны.

Поделиться этим сообщением


Ссылка на сообщение

А death - это вообще где ?

И, да, я не уверен, что движок делает с партиклами, хранящимися внутри функций.

Поделиться этим сообщением


Ссылка на сообщение

Так это вообще-то запуск другого элемента, когда закончился основной.

Вообще, на сколько я понял, запускается particle group, а не element, так ? Тогда время надо смотреть для каждого из элементов.

 

И, да, отключенные, но оставленные эффекты и элементы - хороший способ получить странных и загадочных вылетов.

 

p.s. Но вообще это все уже явно не скрипты.

Поделиться этим сообщением


Ссылка на сообщение

Ы ?

 

Как бы да, стартовая менюшка - сама по себе, пространства _G, game, level и еще много разных - сами по себе.

Более того, традиционная лапша в сталкере, и, особенно, модах, со всеми перекрестными ссылками, требует долгого распутывания, если мы хотим что-то в каком-то ином порядке, чем в том, в котором как-то работает.

 

типа так: https://www.dropbox.com/s/miqjdrqmn95nbjn/_init.script?dl=0

 (закомментированное - работало после распутывания, но перестало после принятия дополнительных мер "против читеров поганых" в одном и том же по сути моде.)

  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение
2 часа назад, Graff46 сказал:

Цель, подключиться к биндеру объекта и пользоваться, например, его апдейтом в своих целях.

Тогда делается строго наоборот: биндер при апдейте сам дергает за то, что надо.

Можно дать ему табличку при ините, и потом по мере надобности добавлять в нее ненужное.

Поделиться этим сообщением


Ссылка на сообщение

Смотрим  все псевдООПшное творчество из amk. Ну или многострадальные "псиантенну"/таскменеджер от ПЫС.

Поделиться этим сообщением


Ссылка на сообщение

И, да, ни кто кроме Вас не знает, что у Вас там было и что должно быть после строк

    local reason=dead_reason[math.random(table.getn(dead_reason))]
    local dead=where_dead[math.random(table.getn(where_dead))]

 

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

А напомните мне кто-нибудь, как вызвать my_subdir\my_script.my_function() ?

Где-то такое видел, но не помню, как правильно делается.

 

То есть, файлы лежат не в gamedata\scripts, а в gamedata\scripts\my_subdir

Можно, конечно, и все в sripts, но там возможна куча файлов  на одну тему, и получается как-то "неаккуратненько" (tm).

 

Поделиться этим сообщением


Ссылка на сообщение

Например, путь я пытался узнать. Все перебранные варианты - либо nil, либо "ушла и не вернулась".

Поделиться этим сообщением


Ссылка на сообщение

getFS():update_path("$game_scripts$","my_subdir\\my_script.script")

 

Вот это надо было. Спасибо.

  • Согласен 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
 

    local obj, t, cd
    for i, v in ipairs( {    -- НЕ "ОПТИМИЗИРОВАТЬ" ! Конфиги жрут, и читаются медленнее !
        { "respawn_atp_disk_bandit2", 834395, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk11\npath_look=atp_disk_bandit_look11" },
        { "respawn_atp_disk_bandit1", 838425, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk12\npath_look=atp_disk_bandit_look12" },
        { "respawn_atp_disk_bandit2", 895677, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk13\npath_look=atp_disk_bandit_look13" },
        { "respawn_atp_disk_bandit1", 897708, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk14\npath_look=atp_disk_bandit_look14" },
        { "respawn_atp_disk_bandit2", 785290, 2846,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk15\npath_look=atp_disk_bandit_look15" },
        { "respawn_atp_disk_bandit1", 782279, 2846,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk16\npath_look=atp_disk_bandit_look16" },
        { "respawn_atp_disk_bandit2", 709736, 2841,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk17\npath_look=atp_disk_bandit_look17" },
        { "respawn_atp_disk_bandit1", 936206, 2855,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk18\npath_look=atp_disk_bandit_look18" },
      } ) do
        obj = sim:create( v[1], level.vertex_position( v[2] ), v[2], v[3] )
        if obj then
            obj = sim:object( obj.id )
            if obj then
                t = get_npc_data( obj )
                t.custom = t.custom .. v[4]
                set_npc_data( t, obj )
                obj.smart_none = true
        end    end
    end

ЧДЯНТ ? (С)

 

И, кстати, какая все-таки функция ставит метку по sid ?

 

upd: А вот, кстати, с использованием олспавна:

function check_spawn3()
    if actor:dont_has_info( "spawn_hospit_live" ) then
        local obj = sim:object( "hospital_muha_trup" )
        if obj then sim:release( obj, true ) end
        obj = sim:create( 10008 )
        if obj then
            local t = get_npc_data( obj )
            t.custom = "[dont_spawn_loot]\n"
            set_npc_data( t, obj )
            local p = obj.position
            p.x, p.y, p.z = -95.5, 29, 566.9
            obj.position = p
            obj.death_call = muha_up
            -- obj.death_droped = true
        end
        -- level.add_call( muha_up, dummy )

        muha_pp = particles_object( "static\\zharka_buble_idle" )
        if muha_pp then muha_pp:play_at_pos( vector():set( -95.6, 28.3, 566.6 ) ) end

        local p
        for i, v in ipairs( {
            { "anomaly2\\studen_idle_bottom000", vector():set( -94.7, 28.2, 565.5 ) },
            { "anomaly2\\studen_idle_bottom000", vector():set( -94.7, 28.3, 566.4 ) },
            { "anomaly2\\studen_idle_bottom000", vector():set( -95.1, 28.4, 566.6 ) },
            { "anomaly2\\studen_idle_bottom000", vector():set( -95.0, 28.4, 567.4 ) }
        } ) do
            p = particles_object( v[1] )
            if p then
                p:play_at_pos( v[2] )
                table_insert( t_muha_pp, p )
            end
        end

        if actor:dont_has_info( "spawn_kamen_udachy" ) then
            for i, v in ipairs( {
                { "anomaly2\\studen_idle_bottom000", vector():set( -95.5, 32.5, 613.7 ) },
                { "anomaly2\\studen_idle_bottom000", vector():set( -96.0, 32.6, 614.6 ) },
                { "anomaly2\\studen_idle_bottom000", vector():set( -95.5, 32.6, 615.5 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -94.1, 32.5, 615.6 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -93.6, 32.4, 614.9 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -92.8, 32.3, 614.2 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -92.3, 32.3, 614.8 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -91.7, 32.3, 615.7 ) }
            } ) do
                p = particles_object( v[1] )
                if p then
                    p:play_at_pos( v[2] )
                    table_insert( t_stone_pp, p )
                end
        end    end
    end

    if actor:dont_has_info( "father_pant_say_start" ) then
        if not sim:object( "hospital_pantera_girl" ) then sim:create( 9998 ) end
        if actor:has_info( "real_dok_and_father_spawn" ) then
            if not sim:object( "hosp_father" ) then sim:create( 9980 ) end
    end    end

    if actor:has_info( "real_dok_and_father_spawn" ) then
        add_ports( "real_dok_and_father_spawn", true )
        if not sim:object( "hosp_real_bl_dok" ) then sim:create( 9979 ) end
        if sim:object( "hospital_bl_dok" ) then _util.release_npc( "hospital_bl_dok" ) end
    elseif not sim:object( "hospital_bl_dok" ) then sim:create( 9978 )
    end

    for k, v in pairs( {
        ["hos_no_gulag_verh_black2"] = 9982,
        ["hos_no_gulag_verh_black3"] = 9983,
        ["hos_no_gulag_nad_black4"] = 9986,
        ["hospital_black_stalk3"] = 9989,
        ["hospital_black_stalk1"] = 9990,
        ["hospital_black_stalk2"] = 9991,
        ["hospital_sapsan"] = 9993,
        ["hos_black_niz_rayt"] = 9996,
        ["hos_black_niz_left"] = 9997,
    } ) do
        if not sim:object( k ) then sim:create( v ) end
    end

    if actor:dont_has_info( "prodaznay_tvar" ) and actor:dont_has_info( "spawn_hospit_live" ) then
        add_ports( "spawnim_3otsek", true )
    end
end

Адовы тучи неписей, аномалий, телепортов и еще неведомой некро-сами-знаете-чего. Но все - "одноразовое", нужно только когда актор на локе и только при соблюдении определенных условий.

Поделиться этим сообщением


Ссылка на сообщение

"чтобы получить секцию / профиль нпс и передать полученное в number."

А-ааа ! Зачем ???

 

Если мы его сами создаем - ид мы получаем при создании.

Если мы знаем имя - мы получаем объект, и из него - ид.

Если это непись, получившийся в результате работы респавнера - этот непись под смартом, и мы достаем его ид из смарта.

 

Секцию и профиль - это надо перебирать все от 1 до 65534, и проверять для каждого существующего, но, зачем ???

  • Согласен 2

Поделиться этим сообщением


Ссылка на сообщение

Короче, по обоим постам: "стол заказов" - "сделайте мне мод" - не здесь.

По тому что даже если вам сделают мод с меткой на карте, где стоит какой-то непись, и раздает всем мимопроходящим рэндомные награды - все равно окажется, что это не тот непись, и вообще оно у вас "почему-то" не запускается.

Тем более, что вполне конретные примеры по обоим вопросам как раз были на последних страницах, но полностью проигнорированы.

 

Не разбираетесь - да, совершенно верно -  берите тот же amk-мод, благо, он маленький по нынешним временам, или "симбион", который вообще создавался как образец "академического" стиля - по сути, именно, чтобы на его примере все и изучать,  и  разбирайтесь, как что работает, пока не будет достигнут хоть минимум понимания.

 

Вот возникнут конкретные вопросы - на них хоть ответить можно будет как-то, вместо того, чтобы все бросить, и срочно делать вам мод.

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

Повторюсь еще раз: если мы знаем sid объекта, то уж его имя мы тем более знаем.

Если не знаем ни того, ни другого - на этом приплыли.

 

Дальше получаем собственно объект - ради его ид.

Как здесь - local obj = sim:story_object(91)

Кстати, совершенно лишние манипуляци:

    local sim = alife()     if sim then, поскольку запускать нечто подобное до запуска собственно alife() - занятие в высшей степени странное.

Или, по имени local obj = sim:object( "как_он_там_называется" )

 

Далее, собственно, ставится метка: level.map_add_object_spot(obj.id, "level_changer", "to_garbage")

Первое - ид, ради которого городился весь предшествующий огород. Тип метки - из того, что прописано в gamedata\config\ui\map_spots.xml  - то есть, всякие синие, желтые, и зеленые и прочие кракозябры, которые будут рисоваться на карте. Ну и произвольный текст, который будет выводиться при тыкании в кракозябры мышой.

 

Никаких координат для метки задать нельзя. Ставится ТОЛЬКО на что-то существующее.

 

 

Есть вариант с перебором всего-всего, и установкой меток на все, что кажется подходящим. Типа такого:

function set_spots()
    -- local obj = sim:object( "old_doc_4" )
    -- if obj then
    --    level.map_add_object_spot( obj.id, "artefact_location", obj:name() .. " y:" .. obj.position.y )
    -- end

    local c_af = clsid.artefact    -- clsid.artefact_s == electric_ball
    local c_ibox = clsid.inventory_box

    local obj, gvid, cls_id
    for i = 1, 65534 do
        obj = sim:object( i )
        if obj then
            cls_id = obj:clsid()
            if cls_id == c_af then
                if obj.parent_id == 65535 then    -- арты
                    gvid = obj.m_game_vertex_id
                    if gg:valid_vertex_id( gvid ) then
                        if gg:vertex( gvid ):level_id() == level_id then
                            log( "info", "found art: %s ( %.02f, %.02f, %.02f )", obj:name(),
                                obj.position.x, obj.position.y, obj.position.z )
                            level.map_add_object_spot( i, "artefact_location",
                                obj:name() .. " y:" .. obj.position.y )
                end    end    end

            elseif cls_id == c_ibox    -- and not онлайновый_ящик:is_inv_box_empty()
                and ( string_sub( obj:section_name(), 1, 1 ) == "m" or string_sub( obj:section_name(), 1, 1 ) == "e" )
                -- and string_sub( obj:section_name(), 1, 1 ) ~= "m"

                and obj.position.y >= -290    -- ящики Бака
              then    -- тайники
                gvid = obj.m_game_vertex_id
                if gg:valid_vertex_id( gvid ) then
                    if gg:vertex( gvid ):level_id() == level_id then
                        -- log( "info", "found treasure: %s", obj:name() )
                        local ini = obj:spawn_ini()
                        if ini and ini:section_exist( "logic" )
                          and ini:line_exist( "logic", "actor_item" ) then
                            level.map_add_object_spot( i, "habar_location",
                                obj:name() .. " y:" .. obj.position.y )
                        else level.map_add_object_spot( i, "habar_clear_location", --"treasure"
                            obj:name() .. " y:" .. obj.position.y )
                        end

                        --local item = level.object_by_id( i )
                        --if item then amk_particle.amk_particle( {
                        --    ["obj"] = item, ["looped"] = true,
                        --    ["particle"] = "explosions\\campfire_grill" } )
                        --end
                end    end

            elseif cls_id == 89 then
                gvid = obj.m_game_vertex_id
                if gg:valid_vertex_id( gvid ) then
                    if gg:vertex( gvid ):level_id() == level_id then
                        local ini = obj:spawn_ini()
                        if ini and ini:section_exist( "drop_box" ) then
                            -- log( "info", "found drop_box: %s", obj:name() )
                            level.map_add_object_spot( i, "green_location", obj:name() )
                end    end    end

            -- elseif c_anoms[cls_id] then
            --    gvid = obj.m_game_vertex_id
            --    if gg:valid_vertex_id( gvid ) then
            --        if gg:vertex( gvid ):level_id() == level_id then
            --            level.map_add_object_spot( i, "alife_combat_attack", obj:name() )
            --    end    end
            -- elseif cls_id == clsid.controller_s then
            --    gvid = obj.m_game_vertex_id
            --    if gg:valid_vertex_id( gvid ) then
            --        if gg:vertex( gvid ):level_id() == level_id then
            --            level.map_add_object_spot( i, "defend_lager_location", obj:name() )
            --            log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(),
            --                obj.position.x, obj.position.y, obj.position.z )
            --    end    end
            elseif string.sub( obj:section_name(), 6, 10 ) == "ameba" then
                gvid = obj.m_game_vertex_id
                if gg:valid_vertex_id( gvid ) then
                    if gg:vertex( gvid ):level_id() == level_id then
                        level.map_add_object_spot( i, "alife_combat_attack", obj:name() )
                        log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(),
                            obj.position.x, obj.position.y, obj.position.z )
                end    end
            -- elseif obj:section_name() == "lights_hanging_lamp" then
            --    gvid = obj.m_game_vertex_id
            --    if gg:valid_vertex_id( gvid ) then
            --        if gg:vertex( gvid ):level_id() == level_id then
            --            level.map_add_object_spot( i, "defend_lager_location", obj:name() )
            --            log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(),
            --                obj.position.x, obj.position.y, obj.position.z )
            --    end    end
            -- elseif obj:name() == "muha_hosp_live" then    -- вписать ненужное
            --    log( "info", "found: %s ( %.02f, %.02f, %.02f ), lv: %s", obj:name(),
            --        obj.position.x, obj.position.y, obj.position.z,
            --        ( gg:valid_vertex_id( obj.m_game_vertex_id )
            --          and gg:vertex(sobj_gv):level_id() ) or "n/a" )
            --    level.map_add_object_spot( i, "defend_lager_location", obj:name() )
    end    end    end
end

Далее - тему "справочник по функциям и классам" в руки, и разбираемся с тем, что непонятно. Дублировать все посты оттуда сюда, вместе с руководством по LUA - уже перебор.

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...