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

[SoC] Ковыряемся в файлах


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

Подскажите как прописать оружию два прицела и более? Через запятую (как патроны) не получается: 

scope_name =  wpn_addon_scope2, wpn_addon_scope3

по отдельности цепляются. Спасибо.

 

 

 

Ссылка на комментарий
Подскажите как прописать оружию два прицела и более?

Никак не прописать.

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

Изменено пользователем BFG
  • Спасибо 1

"Кругом зомби.....у меня кончаются патроны...."

Ссылка на комментарий

Ребята, подскажите в каком файле можно изменить звуки от костра, или как называется этот файл OGG?

Для этого надо сначала знать, что за костер. А затем воспользоваться поиском по файлам, и найти соответствующий ltx. Обычно - config\misc\zone_что-то_там.ltx
dc

Изменено пользователем Dennis_Chikin

ba9599747b.png  36914dd0ee.png

Ссылка на комментарий

Подскажите, кто знает, как при заходе на локацию подсчитать количество находящихся в онлайне зверей, желательно по видам. Ну к примеру, сколько гуляет плотей. Или кабанов.
 
С чего начать-то надо? Вызывать функцию подсчета надо, я так понимаю, из "function actor_binder:net_spawn(data)". А дальше с чего начинать? Сам принцип хотя бы объясните.

В момент захода на локацию онлайновых зверей там нет. Вообще. Появляются через какое-то время после actor_binder:net_spawn(), в зависимости от условий. То есть, тебе надо явно что-то другое. dc

Изменено пользователем Dennis_Chikin

Сталкер - наше всё!

Ссылка на комментарий

Здравствуйте, как сделать, чтобы НПСов после диалога засосало в гулаг?Например: сталкеров засосало в гулаг зомбированных на Янтаре.

 

Очевидно, создать гулаг, и прописать в его работах предикаты, по которым подходят только нужные сталкеры после нужного момента. Как прописывать работы в гулагах со всеми условиями - в двух словах не описывается. Читаем первый пост, читаем вики. dc

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

dc, я наверно неправильно выразился. Мне нужно узнать, сколько на данной локации живых (не трупов), скажем, плотей. Заспавнено, причем неважно, скриптом или через all.spawn. Или сие в момент захода невозможно узнать в принципе?


Или, если на то пошло, сколько тех же плотей находится под гулагами на данной локации?

Изменено пользователем AndrewMor

Сталкер - наше всё!

Ссылка на комментарий

Либо добавлять свое в se_monster.script (отслеживает всех существующих монстров), и проверять их живость/нахождение на нужной локации, либо что-то типа

 

function init()
    lname = level.name()
    cur_map = lids[lname]
    sim = alife()
    gg = game_graph()

    local obj, cls_id, obj_name, obj_t, sect, gvid, lvid, map, pid, parent, ini, t, tt
    for k, v in pairs( xl_types ) do obj_by_type[k] = {} end

    log( "log", "init, lv: %s (%s)", lname, tostring( cur_map ) )

    for i = 1, 65534 do
        obj = sim:object( i )
        if obj then
            cls_id = obj:clsid()
            sect = obj:section_name()
            if bad_clsid[cls_id] or bad_sect[sect] then
                log( "warning", "bad item: %s", obj:name() )
                cls_id = false    -- пометка глючных объектов на удаление
            else                -- продолжаем чистить глючные объекты
                pid = obj.parent_id    -- заодно узнаем владельца...
                if pid == 65535 then    -- и локу, если ничейный
                    gvid = obj.m_game_vertex_id
                    if gg:valid_vertex_id( gvid ) then
                        map = gg:vertex( gvid ):level_id()
                        lvid = obj.m_level_vertex_id
                        if lvid < 4294967296 and vids[map][3] < lvid then
                            log( "error", "invalid level vertex, level %s, obj: %s",
                                sim:level_name( map ) or "none", obj:name() )
                            ini = obj:spawn_ini()
                            if ini then
                                if ini:section_exist( "logic" ) then
                                    log( "info", "logic present, keep" )
                                else cls_id = false
                                end
                            else log( "info", "no spawn_ini, keep" )
                        end    end
                    else
                        log( "error", "invalid game vertex, obj: %s, delete", obj:name() )
                        cls_id = false
                    end
                    parent = false
                else
                    map = false    -- если есть владелец, то пофиг на карту
                    parent = pid and sim:object( pid )
                    if parent and parent.name then parent = parent:name()
                    else parent = false
            end    end    end

            if cls_id then            -- если валидный
                obj_t = cls_xl[cls_id]    -- и нужный, то раскладываем по таблицам
                obj_name = obj:name()
                if obj_t == "anoms" and obj_by_name[obj_name] then
                    t = obj_by_name[obj_name]
                    log( "error", "duplicate object: %s (type: %s), id: %s, level: %s, parent: %s (vs. id: %s (type: %s), level: %s, parent: %s )", obj_name, obj_t or "?", i, map or "?", parent or "none", t.id, t.type, t.map or "?", t.parent or "none" )
                    sim:release( obj, true )
                elseif obj_t and obj_by_type[obj_t] then
                    t = { ["map"] = map, ["id"] = i, ["type"] = obj_t, ["sect"] = sect,
                        ["obj"] = obj, ["name"] = obj_name, ["parent"] = parent }

                    obj_by_name[obj_name] = t
                    obj_by_id[i] = t

                    if parent then
                        tt = obj_by_parent[pid]
                        if tt then tt[i] = t
                        else obj_by_parent[pid] = { [i] = t }
                        end
                    else obj_by_type[obj_t][i] = t
                    end
                else    -- ищем амк-респавнеры
                    ini = obj:spawn_ini()
                    s = ini and ini:section_exist( "respawn" )
                        and ini:line_exist( "respawn", "amk_name" )
                        and ini:r_string( "respawn", "amk_name" )
                    if s then respawners[s] = obj end
                end
            else log( "info", "delete" ); sim:release( obj, true )    -- удаляем глючные объекты
    end    end    end

    for k, v in pairs( vids ) do
        wpn_by_map[k] = {}
        t = { ["npc_dead"] = {}, ["mob_dead"] = {} }
        for k, v in pairs( xl_types ) do t[k] = {} end
        obj_by_map[k] = t
    end

    local p
    t = obj_by_type.wpn_prot
    for k, v in pairs( obj_by_type.firearm ) do    -- бесхозные стволы проверяем на близость к неписям
        p = ( t_wprm or get_wprm() ).prot or prot_name[ v.name ] or
            v.obj.m_story_id ~= 4294967296
        if p then v.prot = p; t[k] = v    -- защищенные стволы храним отдельно
            -- log( "info", "init, wpn: %s, prot: %s", v.name, tostring( p ) )
        elseif v.map ~= curr_map then    -- остальные раскладываем по картам
            wpn_by_map[ v.map ][k] = v
        end
    end

    clr_dead_mob()
    clr_dead_npc()    -- при уборке хлама удаляются сначала трупы, потом стволы

    t = {}
    local n, c = 0, 0
    local prm
    for k, v in pairs( wpn_by_map ) do    -- готовим стволы на удаление
        for kk, vv in pairs( v ) do
            if vv.keep then    -- стволы рядом с кем-то считаем
                c = c + 1
                obj_by_map[ vv.map ].firearm = vv
            else            -- лежащие далеко от неписей - на удаление
                prm = t_wprm[ vv.sect ] or get_wprm( vv.sect )
                vv.r = prm.cost * get_wpn_cond( vv.obj )
                n = n + 1; t[n] = vv
    end    end    end

    if lim_wpn < c then lim_wpn = 0
    else lim_wpn = lim_wpn - c
    end

    if lim_wpn < n then    -- оставляем для подбирания неписями или ГГ
        table_sort( t, function( a, b ) return a.r < b.r end )
        for i = 1, lim_wpn do tt = t[i]; obj_by_map[ tt.map ].firearm = tt end
    end
    for i = lim_wpn + 1, n do    -- удаляем свыше лимита
        obj = t[i].obj
        sim:release( obj, true )
        obj_by_id[ obj.id ] = nil
    end

    for k, v in pairs( obj_by_type.npc ) do obj_by_map[ v.map ].npc[k] = v end
    for k, v in pairs( obj_by_type.npc_dead ) do obj_by_map[ v.map ].npc_dead[k] = v end
    for k, v in pairs( obj_by_type.mob ) do obj_by_map[ v.map ].mob[k] = v end
    for k, v in pairs( obj_by_type.mob_dead ) do obj_by_map[ v.map ].mob_dead[k] = v end
    fake_trade( obj_by_type.npc )
    amk_spawners()
    return true
end

- это из уборщика кусок.

Ссылка на комментарий

Ну хорошо. И все же я так не въехал, как определить принадлежность монстра к конкретной локации. По вертексам?

 

gvid = obj.m_game_vertex_id
if gg:valid_vertex_id( gvid ) then  map = gg:vertex( gvid ):level_id()

 

dc

Изменено пользователем Dennis_Chikin

Сталкер - наше всё!

Ссылка на комментарий

Вот еще такой вопрос: есть смарт для мобов, есть сами мобы. Все заспавнены через all.spawn. Все они приписаны к гулагу и сидят под логикой mob_home. Собственно вопрос: если часть мобов грохнуть, в гулаге ведь появятся свободные работы? И если скриптом заспавнить других мобов, пойдут они на работу или нет? Ведь логики-то у них нету, как таковой. Можно ли им скриптом прописать логику и определить в нужный гулаг?

Сталкер - наше всё!

Ссылка на комментарий

@AndrewMor, да, можно, у меня на такой системе скриптовые гулаги живут. Динамический контроль населения, если можно так сказать.

 

upd:

@Anonim, монстрам писать логику в конфиге - перебор.

Изменено пользователем Struck
Ссылка на комментарий

@AndrewMor, В конфиге своих симуляционных персонажей допиши им логику. Или делай по АМК через нет-пакеты.

Изменено пользователем Anonim
Ссылка на комментарий

@AndrewMor, да, можно, у меня на такой системе скриптовые гулаги живут. Динамический контроль населения, если можно так сказать.

Поделись примером, если нетрудно. Просто монстры спавнятся обычным способом (alife():create....). Как им скриптом логику прикрутить? Какие через олл.спавн спавнены - там никаких проблем не возникает, но они одноразовые. Грохнешь - и гулаг пустеет.

@AndrewMor, В конфиге своих симуляционных персонажей допиши им логику. Или делай по АМК через нет-пакеты.

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

Сталкер - наше всё!

Ссылка на комментарий

local t = read_monster_params( obj )

t.custom = "[logic]\ncfg = scripts\\что-попало.ltx

write_monster_params( t, obj )

 

функции взять из amk

  • Полезно 1
Ссылка на комментарий

PlayMod,

если пути не изменены от чистого ТЧ, то звук костров лежит в папке: \sounds\ambient и файлы самого звука называются: fire1-...

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Ссылка на комментарий

 

 

Грохнешь - и гулаг пустеет.
Ну так для этого у ПЫСов вроде респавнеры предусмотрены?

 

 

Просто монстры спавнятся обычным способом (alife():create....). Как им скриптом логику прикрутить?
А может подумать в общем над вопросом: кто должен рулить распределением мобов по гулагам ? Наверное не мобы должны индивидуальной логикой работы занимать в гулагах, а гулаги назначать подходящих мобов на свободные\освободившиеся работы. А пополнением убыли мобов как раз должны заниматься респавнеры.

Но в общем - на вкус и цвет...

  • Не согласен 1
Ссылка на комментарий

local t = read_monster_params( obj )

t.custom = "[logic]\ncfg = scripts\\что-попало.ltx

write_monster_params( t, obj )

 

функции взять из amk

Спасибо, буду пробовать.

 

 

Ну так для этого у ПЫСов вроде респавнеры предусмотрены?

Правильно, предусмотрены. Я пробовал через респавнеры (правда давно), но чего-то не вышло. Че-нибудь не так делал. Правда я неписей респавнить пытался.

Вопрос вдогонку: а можно ли отследить ситуацию, когда актор открывает тайник (нажав F), и еще когда открыто окно торговли? Может поршень какой отслеживать надобно?

 

Нужно, чтобы определенные предметы нельзя было положить в тайник или продать.

Сталкер - наше всё!

Ссылка на комментарий

@AndrewMor, тайник - 'ui_car_body'; торговля - 'ui_trade'. Запрет на перемещение в тайник корректно сделать не получится, в ТЧ нет нормальных методов работы с тайником (по-этому на станадартном патче придется все делать через актора, но сделать можно, и вполне не трудно (у меня на такой системе объемы тайников работают, все никак руки не дойдут переписать)). В ЧН например есть метод получения количества предметов в тайнике. На ТЧ такое только с движковыми правками имеется.

 

upd:

@UnLoaded, рассматривать "квестовость" предмета для этих целей имеет смысл только при возможности изменить этот параметр (чтоб было красиво), а это выйдет только на ХЕ и 7 движке, но на этих платформах уже просто масса вполне нормальных вариантов реализации этой задачи. При чем тут таблица предметов в _g  я искренне не понял.

Изменено пользователем Struck
Ссылка на комментарий

В файле info_portions.xml все "системные" инфо-порции, включая обыск нычек(ui_car_body\ui_car_body_hide) и торговли(ui_trade\ui_trade_hide).

 

 

Нужно, чтобы определенные предметы нельзя было положить в тайник или продать.
Для этого стоит смотреть в сторону файла quest_items.ltx и секции quest_section в _g.script. А чтоб не торговался предмет - прописать ;NO TRADE везде, где нужно.
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   2 пользователя

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