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

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


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

Всем привет, все с наступающим праздником.

Возник вопрос. Как выставить проверку на наличие боеприпасов в инвентаре ГГ? Итемная проверка на них не работает, на оружие и все остальное работает, а вот на боеприпасы, гранаты нет. Перепробовал кучу схем, ничего.

Например,

function have_ammo()

return db.actor:object("ammo_5.45x39_fmj") ~= nil

end

Что за бред?

 

Это не бред, а твои банальные ошибки синтаксиса в скрипте. Добавь скобку - и "бред" исчезнет. --/Artos

 

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

Это не бред, а твои банальные ошибки синтаксиса в скрипте. Добавь скобку - и "бред" исчезнет. --/Artos

Да нет. Дело не в этом. Это я здесь ошибся, забыл скобку поставить. Вопрос актуален. Я так понял, боеприпасы и гранаты идут отдельно от всех вещей в игре. Перерыл все моды, нигде подобной проверки не нашел...

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

Roman82, всё прекрасно работает.

Твой способ проверяет наличие у актора патронов, но всё же советую, явно возвращать логическое значение:

if db.actor:object("ammo_5.45x39_ap")~=nil then
    return true
else
    return false
end

Да и понятие "не работает" весьма неоднозначно.

 

P.S. В чистой игре используется проверка на наличие боеприпасов при помощи функции object, так что плохо искал, если искал... ;)

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

Roman82

Ты бы вначале почитал бы вообше материалы по моддингу.

При чем тут что-то "отдельно" от всего? Любой тип/класс предмета/объекта - стоит особняком от других.

Но если у актора есть в инвентаре какой-то предмет, то проверка db.actor:object(section_item) ~= nil работает для ВСЕХ без исключения.

Заменяешь section_item на свои "ammo_5.45x39_fmj" иль "grenade_f1" иль "ammo_vog-25" и все должно получаться.

Если же у тебя не получается - учи матчасть!

 

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

ColR_iT

Строка return db.actor:object("ammo_5.45x39_fmj") ~= nil полностью эквиваленттна твоему варианту, т.к. возвращает только булевы значения в любом случае.

Если же необходимо проверять и db.actor в игре(?), то тогда безопасный код таков:

return (db.actor ~= nil and db.actor:object("ammo_5.45x39_fmj") ~= nil) 

или

if db.actor and db.actor:object("ammo_5.45x39_ap") ~= nil then
    return true
else
    return false
end

 

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos

Матчасть я выучил 5 лет назад. :)

Все-равно не получается. Смысл в том, что я должен принести еду, аптечку, боеприпасы и гранаты сталкеру. Пишется диалог, ставится прекондишены и так далее. Короче, еду, аптечку определяет, гранаты и боеприпасы нет, хотя они в рюкзаке есть. И естественно диалог не появляется.

Диалог -

<dialog id="agroprom_dezerter_about_supply">
        <precondition>agroprom_dialog.have_ammo</precondition>
        <precondition>agroprom_dialog.have_grenade</precondition>
        <precondition>agroprom_dialog.have_1_medkit</precondition>
        <precondition>agroprom_dialog.have_2_tushenka</precondition>
        <precondition>agroprom_dialog.have_2_bread</precondition>
        <dont_has_info>agroprom_dezerter_about_supply_talk_end</dont_has_info>
        <phrase_list>
            <phrase id="0">
                <text>dezerter_about_supply_01</text>
                <next>2</next>
            </phrase>
            <phrase id="2">
                <text>dezerter_about_supply_02</text>
                <next>3</next>
            </phrase>
            <phrase id="3">
                <text>dezerter_about_supply_03</text>
                <next>4</next>
            </phrase>
            <phrase id="4">
                <text>dezerter_about_supply_04</text>
                <next>5</next>
                <next>14</next>
            </phrase>
            <phrase id="5">
                <text>dezerter_about_supply_05</text>
                <next>6</next>
            </phrase>
            <phrase id="6">
                <text>dezerter_about_supply_06</text>
                <next>7</next>
            </phrase>
            <phrase id="7">
                <text>dezerter_about_supply_07</text>
                <next>8</next>
            </phrase>
            <phrase id="8">
                <text>dezerter_about_supply_08</text>
                <next>9</next>
            </phrase>
            <phrase id="9">
                <text>dezerter_about_supply_09</text>
                <next>10</next>
            </phrase>
            <phrase id="10">
                <text>dezerter_about_supply_10</text>
                <next>11</next>
            </phrase>
            <phrase id="11">
                <text>dezerter_about_supply_11</text>
                <next>12</next>
            </phrase>
            <phrase id="12">
                <text>dezerter_about_supply_12</text>
                <next>13</next>
            </phrase>
            <phrase id="13">
                <text>dezerter_about_supply_13</text>
                <give_info>agroprom_dezerter_about_supply_talk_end</give_info>
            </phrase>
            <phrase id="14">
                <text>dezerter_about_supply_14</text>
                <give_info>agroprom_dezerter_about_supply_talk_end</give_info>
            </phrase>
        </phrase_list>
    </dialog>

 

 

Скрипт -

function have_n_items(section,number)
    local actor = db.actor
    if actor then
      local cnt=0
      actor:iterate_inventory(function (dummy, item)
       if item:section()==section then cnt=cnt+1 end
      end, nil)
    return cnt>=number
  end
  return false
end

function have_1_medkit()
  return have_n_items("medkit_army",1)
end

function have_2_tushenka()
  return have_n_items("tushenka",2)
end

function have_2_bread()
  return have_n_items("bread",2)
end

function have_ammo()
return db.actor:object("ammo_5.45x39_fmj") ~= nil
end

function have_grenade()
return db.actor:object("grenade_rgd5") ~=nil
end

 

Пробовал все ваши варианты. Все-равно не работает.

Кстати, в схеме have_n_items тоже не хочет работать. Убираю прекондишены на гранату и боеприпасы, диалог начинает работать. Такие вот дела.

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

Roman82, для проверок патронов и гранат, всё же следовало бы задавать необходимое количество. Твоя функция have_n_items использует второй параметр number, если его не задать, то инициализация пройдёт как nil, а сравнивать число с нил бессмысленно.

Так что либо дописывай количество, либо ставь проверку:

function have_n_items(section,number)
    if number == nil then
        number = 1
    end
    local actor = db.actor
    if actor then
        local cnt=0
        actor:iterate_inventory(function (dummy, item)
                                    if item:section()==section then cnt=cnt+1 end
                                end, nil)
        return cnt>=number
    end
    return false
end

 

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

ColR_iT

Да нет. Этот вариант я тоже пробовал. Ноль. К тому же, при дополнении данной схемы

if number == nil then

number = 1

end

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

Изменено пользователем Roman82
Ссылка на комментарий
Roman82: ...Перерыл все моды, нигде подобной проверки не нашел...

...

И главное, ни в одном моде я не нашел проверок на боеприпасы. Вот что странно.

...

Матчасть я выучил 5 лет назад.

Как видно рыл в модах пятилетней давности, когда они только появлялись ... и были единичны и в пару килобайт :crazy:

Глупо, подозревать, что подобных проверок нет в модах: метания гранат (от xStream), в схеме стрельбы неписями из подствольников и в схеме менеджера оружия. Не говори глупости! В любом мало-мальски глобальном моде таких проверок море ...

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

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

А вот это:

Убираю прекондишены на гранату и боеприпасы, диалог начинает работать.
Скорее говорит об ошибке скрипта. Если бы потрудился бы последовать совету ColR_iT и расшифровал бы более понятн что же подразумеваешь под "работает" - возможно было бы и более конкретно что-то сказать.

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Roman82, только что проверил - всё работает!

Вот содержимое моего файла:

function have_n_items(section,number)
    if number == nil then
        number = 1
    end
    local actor = db.actor
    if actor then
        local cnt=0
        actor:iterate_inventory(function (dummy, item)
                                if item:section()==section then cnt=cnt+1 end
                                end, nil)
        return cnt>=number
    end
    return false
end

function have_1_medkit()
    if have_n_items("medkit_army",1) then
        log1("--Have medkit")
    else
        log1("!!Not have medkit")
    end
end

function have_2_tushenka()
    if have_n_items("conserva",2) then
        log1("--Have two conserva")
    else
        log1("!!Not have conserva")
    end
end

function have_2_bread()
    if have_n_items("bread",2) then
        log1("--Have two bread")
    else
        log1("!!Not have bread")
    end
end

function have_ammo()
    if have_n_items("ammo_5.45x39_ap",2) then
        log1("--Have two ammo")
    else
        log1("!!Not have ammo")
    end
end

function have_grenade()
    if have_n_items("grenade_rgd5",2) then
        log1("--Have two grenade")
    else
        log1("!!Not have grenade")
    end
end

function check_all ()
    have_1_medkit()
    have_2_tushenka()
    have_2_bread()
    have_ammo()
    have_grenade()
end

Функция log1 выводит в консоль текст в скобках и при вызове функции check_all из диалога, я в консоли увидел пять строк:

Have medkit
Have two conserva
Have two bread
Have two ammo
Have two grenade

Так что делай выводы.

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

ColR_iT, Artos

Друзья, дело в том что в консоле и у меня все работает! А в диалоге нет.

А теперь, самое интересное. Знаете в чем было дело? В схеме патроны и гранаты на поясе! Как я сразу не допер... К ним же там фэйки добавляются. Отключил схему, все заработало. Такие вот пироги.

Ради бога прошу прощения за все это. Кто бы мог подумать. Спасибо большое за помощь.

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

Вобщем, созрел вопрос, в той области с которой я раньше дела не имел, а пришлось.

С чем работаю: ТЧ 1,0004 + Пак локаций из "Сообщества мапперов", последняя из выложенных в их шапке версий, на чистую игру (т.е. не АМК)

В чем состоит цель: сделать на предбаннике стоянку новой группировки, Военных нато.

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

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

 

[11625]
; cse_abstract properties
section_name = smart_terrain
name = predb_mnato_smart_terrain
position = -550.030944824219,14.6607055664063,286.763793945313
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3881
distance = 9.09999942779541
level_vertex_id = 105016
custom_data = <<END
[smart_terrain]
type     = predb_mnato_smart_terrain
capacity = 8
END

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 20.5595703125

; cse_alife_space_restrictor properties
restrictor_type = 3

; se_smart_terrain properties


[11626]
; cse_abstract properties
section_name = respawn
name = predb_respawn_military_nato_post
position = -550.030944824219,14.6607055664063,286.763793945313
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3881
distance = 10
level_vertex_id = 105016
object_flags = 0xffffff3e
custom_data = <<END
[respawn]
respawn_section = prb_milnato_respawn_1
max_count = 8
min_count = 4
max_spawn = 2
idle_spawn = medium
conditions = 100
END

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 1

; cse_alife_space_restrictor properties
restrictor_type = 0

; se_respawn properties

 

 

 

[predb_mnato_smart_terrain_kamp]
points = p0
p0:name = name00
p0:position = -559.256103515625,14.6880102157593,282.203582763672
p0:game_vertex_id = 3881
p0:level_vertex_id = 92380


[predb_mnato_smart_terrain_walker_1_walk]
points = p0,p1,p2
p0:name = name00
p0:position = -557.199768066406,14.3911476135254,284.340942382813
p0:game_vertex_id = 3881
p0:level_vertex_id = 94401
p0:links = p1(1)

p1:name = name01
p1:position = -538.838684082031,17.3168258666992,290.285552978516
p1:game_vertex_id = 3881
p1:level_vertex_id = 121121
p1:links = p2(1)

p2:name = name02
p2:position = -552.039306640625,14.2716541290283,307.063873291016
p2:game_vertex_id = 3881
p2:level_vertex_id = 101861
p2:links = p0(1)


[predb_mnato_smart_terrain_walker_2_walk]
points = p0,p1,p2
p0:name = name00
p0:position = -566.4130859375,14.8234539031982,262.069152832031
p0:game_vertex_id = 3880
p0:level_vertex_id = 80983
p0:links = p1(1)

p1:name = name01
p1:position = -554.135864257813,15.1366109848022,262.086944580078
p1:game_vertex_id = 3880
p1:level_vertex_id = 98577
p1:links = p2(1)

p2:name = name02
p2:position = -553.250915527344,14.7384147644043,272.294494628906
p2:game_vertex_id = 3881
p2:level_vertex_id = 100733
p2:links = p0(1)

 

 

    if type == "predb_mnato_smart_terrain" then

                    for i = 1, 6 do

                            t = { section = "logic@predb_mnato_smart_terrain_kamp",
                    idle = 0,
                    prior = 8-i, state = {0,1},
                    in_rest = "", out_rest = ""
                }
                table.insert(sj, t)
            end

                        for i = 1, 2 do

                    t = { section = "logic@predb_mnato_smart_terrain_walker_"..i,
                        idle = 0,
                        prior = 9-i, state = {0,1},
                        in_rest = "", out_rest = ""
                    }
                    table.insert(sj, t)
                        end        

    end

 

 

    if type == "predb_mnato_smart_terrain" then
        return function (gulag)
            return 0
        end
    end

 

 

--------------------------------------------------------------------------
-- Dynamic ltx
--------------------------------------------------------------------------
function load_ltx(gname, type)
if type == "predb_mnato_smart_terrain" then
    ltx = "[logic@predb_mnato_smart_terrain_kamp]\n"..
        "active = kamp@predb_mnato_smart_terrain\n"..

            "[kamp@predb_mnato_smart_terrain]\n"..
            "center_point = kamp\n"..




        "[logic@predb_mnato_smart_terrain_walker_1]\n"..
            "active = walker_1@predb_mnato_smart_terrain\n"..

        "[walker@predb_mnato_smart_terrain_1]\n"..
        "path_walk = walk_1\n"..



                "[logic@predb_mnato_smart_terrain_walker_2]\n"..
            "active = walker_2@predb_mnato_smart_terrain\n"..

        "[walker@predb_mnato_smart_terrain_2]\n"..
        "path_walk = walk_2\n"



    return ltx
    end


    return nil
end

 

    if gulag_type == "predb_mnato_smart_terrain" then
        return npc_community == "military_nato"
    end

 

 

 

Где тут искать ошибку - не могу взять в толк. Подскажите кто разбирается в данном вопросе.

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

Заранее спасибо.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Zander_driver

1. Появиться на локации у тебя кто-нибудь должен!

Твой респавнер на локации предбанника обязан при старте игры заспавнить как минимум 4-х неписей и далее отреспавнивать по паре ...

А вот останутся ли они в игре и на локации - это уже иной вопрос.

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

 

2. Очень странно, что ты засунул работы для гулага на одной локации в скрипт работ для другой (gulag_escape.script). В чем заключается такой "экономный" смысл, когда ничего не мешает и везде именно так и делается писать работы и пр. параметры гулагов именно в скрипт работ для конкретной локации, регистрируя его в xr_gulag.script.

 

3. Заодно не мешает показать начало xr_gulag.script, где регистрируется и собственно новая локация в табличке level_groups. Если не зарегистрирована локация то ... откуда твои респавнящиеся неписи будут получать свойство squad? Не уверен что дефолтный 0 даст возможность работать именно в твоем гулаге.

 

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Вынес гулаг в отдельный файл

local t = {}
local ltx = ""

function load_job(sj, gname, type, squad, groups)
    if type == "predb_mnato_smart_terrain" then

                    for i = 1, 6 do

                            t = { section = "logic@predb_mnato_smart_terrain_kamp",
                    idle = 0,
                    prior = 8-i, state = {0,1},
                    in_rest = "", out_rest = ""
                }
                table.insert(sj, t)
            end

                        for i = 1, 2 do

                    t = { section = "logic@predb_mnato_smart_terrain_walker_"..i,
                        idle = 0,
                        prior = 9-i, state = {0,1},
                        in_rest = "", out_rest = ""
                    }
                    table.insert(sj, t)
                        end        

    end
end

function load_states(gname, type)
return 0
end

--'------------------------------------------------------------------------
--' Dynamic ltx
--'------------------------------------------------------------------------
function load_ltx(gname, type)


if type == "predb_mnato_smart_terrain" then
    local ltx = "[logic@predb_mnato_smart_terrain_kamp]\n"..
        "active = kamp@predb_mnato_smart_terrain\n"..

            "[kamp@predb_mnato_smart_terrain]\n"..
            "center_point = kamp\n"..




        "[logic@predb_mnato_smart_terrain_walker_1]\n"..
            "active = walker_1@predb_mnato_smart_terrain\n"..

        "[walker@predb_mnato_smart_terrain_1]\n"..
        "path_walk = walk_1\n"..



                "[logic@predb_mnato_smart_terrain_walker_2]\n"..
            "active = walker_2@predb_mnato_smart_terrain\n"..

        "[walker@predb_mnato_smart_terrain_2]\n"..
        "path_walk = walk_2\n"



    return ltx
    end


    return nil
end

function checkStalker(npc_community, gulag_type, npc_rank, se_obj)
    if gulag_type == "predb_mnato_smart_terrain" then
        return npc_community == "military_nato"
    end
    news_manager.send_tip(db.actor, "check_stalker", nil, nil, 12000) 
end

function checkMonster(npc_community, gulag_type)
return false
end

 

 

В gulag_escape.script соответственно все изменения закомментил, и вот

 

level_gulags = {gulag_general, gulag_escape, gulag_garbage, gulag_agroprom, gulag_agroprom_underground, gulag_dark_valley, gulag_labx18, gulag_bar,
                gulag_military, gulag_radar, gulag_radar_u, gulag_yantar, gulag_pripyat, gulag_kishka, gulag_sarcofag,
                gulag_deadcity, gulag_predbannik}

level_groups = {l01_escape = 1, l02_garbage = 2, l03_agroprom = 3, l03u_agr_underground = 4,
                l04_darkvalley = 5, l04u_labx18 = 6, l05_bar = 7, l06_rostok = 8,
                l07_military = 9, l08_yantar = 10, l08u_brainlab = 11, l10_radar = 12,
                l10u_bunker = 13, l11_pripyat = 14, l12_stancia = 15, l12u_sarcofag = 16, 
                l12u_control_monolith = 17, l12_stancia_2 = 18, predbannik = 19}

local gulag_tasks_file_name  = "misc\\gulag_tasks.ltx"
local gulag_tasks_ltx        = ini_file( gulag_tasks_file_name )

local job_position_threshold = 120 --'50  -- расстояние до места работы при котором персонаж в онлайне считается достигшим места работы
local job_idle_after_death   = 600 -- в течении такого периода времени после смерти персонажа его работа будет недоступна

idle_nil  = nil
idle_once = -1
idle_none = -2

local path_fields = { "path_walk", "path_main", "path_home", "center_point" }

-----------------------------------------------------------------------
class "gulag"

-- конструктор
function gulag:__init(smrttrn, type, squad, groups, npc_info, capacity)
    self.smrttrn  = smrttrn
    self.name     = smrttrn:name()
    self.type     = type
    self.squad    = squad
    self.groups   = groups or {}
    self.npc_info = npc_info
    self.capacity = capacity     -- общая ёмкость гулага
--    self.capacity_non_exclusive  -  ёмкость гулага для неэксклюзивных персонажей
    
    self.population = 0                    -- Население гулага
    self.population_comed = 0            -- Уже пришедшее население гулага
    self.population_non_exclusive = 0    -- Неэксклюзивное население



    self.Object                 = {} -- объекты по id. Значения: nil-нету такого, true-есть в офлайне, game_object-есть в онлайн
    self.Object_begin_job       = {} -- по id. true/nil достиг ли объект места своей работы
    self.Object_didnt_begin_job = {} -- по id. начинал ли объект хотя бы раз любую работу с момента добавления под смарт
    self.ObjectJob              = {} -- по id. номер работы для каждого персонажа
    self.JobLoaded              = {} -- для каждой работы загруженные из save данные
    self.Job_avail_in_state     = nil

    self.state      = 0
    self.stateBegin = nil

    self.casualities = 0
end

-- загрузка работ
function gulag:load_jobs()
    self.Job                  = {} -- работы
    self.Job_avail_in_state_0 = {}

    gulag_tasks.loadJob( self.Job, self.name, self.type, self.squad, self.groups, self )
    self:init_ltx( self.name, self.type )

    table.sort( self.Job, function(a,b) return a.prior > b.prior end )

    self:prepare_jobs_for_new_state()

    local capacity = 0

    for i, job in ipairs( self.Job ) do
        if self:job_exists_in_state_0( job ) then
            table.insert( self.Job_avail_in_state_0, job )
            capacity = capacity + 1
        end

        if type( job.online ) == "string" then
            job.online_condlist = job.online
            job.online          = xr_logic.parse_condlist( self.smrttrn, "gulag:setup_job_online", "job_online", job.online_condlist )
        end
    end

    self.capacity               = math.min( capacity, self.capacity )
    self.capacity_non_exclusive = self.capacity

--    printf("LOAD JOBS %s", tostring(self.name))
    -- DEBUG
--    self:validate_jobs()
end

-- проверки правильности набора работ.
-- а) в любом состоянии кол-во 100-но доступных работ должно быть >= ёмкости смарта
function gulag:validate_jobs()
    local jobs_avail_in_states = {}

    -- а)
    for i, job in ipairs( self.Job ) do
        if job.predicate == nil and
           job.idle == 0 and
           job.timeout == nil and
           job.fill_idle == nil
        then
            for j, state in ipairs( job.state ) do
                jobs_avail_in_states[state] = (jobs_avail_in_states[state] or 0) + 1
            end
        end
    end

    for i, v in ipairs( jobs_avail_in_states ) do
        if v < self.capacity then
            print_table( self.Job )
            abort( "[smart_terrain %s] type=%s state=%d capacity=%d: too few absolutely available jobs", self.name, self.type, i, self.capacity )
        end
    end
end

-- подготовка гулага к работе
function gulag:initialize()
    self.ObjectJobPathName = {} --' по id. имя патрульного пути места работы персонажа
    self.restrictors       = {} --' по id. назначенные гулагом рестрикторы для каждого персонажа

    self:prepare_jobs()

    self.calculateStates = gulag_tasks.loadStates( self.name, self.type )

    local ini = self.smrttrn:spawn_ini()
    local sect = "smart_terrain"
    if not ini:section_exist( sect ) then
        sect = "gulag1"
    end

    self.state_switch_0 = xr_logic.parse_condlist( self.smrttrn, "gulag1", "switch_0", utils.cfg_get_string(ini, sect, "switch_0", self.smrttrn, false, "", "") )
    self.state_switch_1 = xr_logic.parse_condlist( self.smrttrn, "gulag1", "switch_1", utils.cfg_get_string(ini, sect, "switch_1", self.smrttrn, false, "", "") )

    self.JobLoaded = nil
end

-- подготовить работы.
-- подготовить данные о местоположении каждой работы; о объекте, который на ней занят.
-- подсчитать ёмкость = min(кол-во работ в 0 состоянии, поле capacity в custom data)
function gulag:prepare_jobs()
    local ptrl, path_name
    local job_loaded
    local empty_table = {}

    for i, job in ipairs( self.Job ) do
        job.num              = i

        path_name            = self:get_job_path_name( job )
        ptrl                 = patrol( path_name )

        job.path_name        = path_name
        job.game_vertex_id   = ptrl:game_vertex_id( 0 )
        job.level_id         = game_graph():vertex(job.game_vertex_id):level_id()
        job.position         = ptrl:point( 0 )

        job_loaded           = self.JobLoaded[i] or empty_table

        job.begin            = job_loaded.begin
        job.fill_idle        = job_loaded.fill_idle
        job.idle_after_death_end = job_loaded.idle_after_death_end
    end

    local job

    for obj_id, jobN in pairs( self.ObjectJob ) do
        job        = self.Job[jobN]
        job.object = obj_id
        self.ObjectJobPathName[obj_id] = job.path_name
    end
end

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

 

В итоге этих действий - при начале новой игры (точнее при попытке) вылет

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: error in error handling


stack trace:

 

Поставь вывод в лог строки при создании этим респавнером неписей
А кстати как это сделать? Разве, используя данные респавнера, сам спавн производит скрипт? Я думал что раз в алл-спавне прописано, то этим движок занимается...

 

Пара уточнений...

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

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

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Zander_driver, перебирайся с подобными ковыряниями и гданиями в соответствующий топик "[soC] Ковыряемся в файлах", т.к. к скрипам твои проблемы имеют самое последнее отношение. Там же (и в этом топике) почитай уже понаписанное про респавнеры.

Вообще советую вначале подучить матчасть по статьям создания смартов/гулагов и потренироваться на каком-нибудь простеньком на том же Кордоне, а не замахиваться на все новое (локация+смат+гулаг+респавн+группировка+...), тем более делаешь все методом "тыка" и "в темную" (без инфы в логах).

 

Если заглянешь в se_respawn.script, то даже по комментам разрабов игры и закомменированным строкам вывода в лог можно многое понять (было бы желание). Сам респавнер действительно спавнится движком по твоей инфе из алл.спавно, но с какого такого ... респавном неписей движек должен заниматься?

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

 

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

Засим, отправляюсь заниматься воплощением того что вы мне посоветовали, спасибо) надеюсь переползать в ковырялки с последующими вопросами мне уже не придется, и все благополучно разрешится.

 

 

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Повторюсь - Возможно, ли убрать свет от ламп на статике при помощи all.spawn, то есть источник света удаляется, а освещение вокруг него остается, хочу полностью удалить освещение от ламп. И еще одно можете ли привести пример спавна ветряка (ветрогенератор) через all.spawn как в «Истории Прибоя» или «Paradise Lost beta» просмотрел весь all.spawn ИП так и не нашел как заспавнить, если спавнить просто модель вылетает и жалуется на анимацию.Заранее благодарен.

 

 

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

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

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

В некотрых оружейных конфигах есть эти параметры,

hit_probability_gd_novice = 0.80

hit_probability_gd_stalker = 0.85

hit_probability_gd_veteran = 0.90

hit_probability_gd_master = 0.95

но, не понятно, что именно они означают, где то стоят такие коменты,

hit_probability_gd_novice = 0.80 ; точность стрельбы,

hit_probability_gd_stalker = 0.85 ; когда оружие в руках НПС

hit_probability_gd_veteran = 0.90 ; в зависимости от уровня

hit_probability_gd_master = 0.95 ; сложности игры

а где то, стоят коменты, в которых говорится, что это урон, которое наносит оружие в зависимости от уровня сложности..

 

Мог бы просто перевести слово "probability" - вопрос бы сразу отпал. Вероятность попадания НПС по ГГ в зависимости от сложности. Cyclone

FANAT.gif

Мой канал на ютабчике... / Недельки из жизни фаната STALKER'a / Клуб 'Фанат Отчуждения'

Я нет-нет, а думаю, может я неправильно жил, надо ж брать деньги у богатых и давать их бедным, а таким как ты давать по морде, шоб у мире была красота и гармония.(с)Ликвидация

Всё в порядке, всё нормально, я беру тебя с собой, я беру тебя с собой. В тёмный омут головой.(с)Смысловые Галлюцинации

Ссылка на комментарий
FANAT, читай коменты в одно предложение, это тоже самое что в actor.ltx но для данного оружия персонально Изменено пользователем Saruman

S.T.A.L.K.E.R 1.004, Народная..Солянка от 19.04.10, дополнение 14.08.10, патч 3.09.10, DMX 1.3.5, Saruman addon 1.1

Vkontakte

Добавление нового транспорта в сталкер

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

Коллеги, возник вопрос.

Есть девайс. При его использовании на экран выводится окно. В этом окне я вывожу текстовую переменную:

if string.len(opisTXT) > 0 then

wopisTXT = CUIStatic()

wopisTXT:SetWindowName("wopisTXT")

wopisTXT:SetAutoDelete(true)

wopisTXT:SetText("Рецепт: "..opisTXT)

wopisTXT:SetTextColor(255,155,255,0)

wopisTXT:SetFont(GetFontGraffiti19Russian())

wopisTXT:Init(600,140,320,200)

self:AttachChild(wopisTXT)

end

Сама переменная opisTXT имеет (для примера) такой вид:

Артефакт Капли получается путем совместной трансмутации в аномалии Карусель сразу четырех ингредиентов: Хвост собаки, Водка, Бинт, Выверт. Преобразование происходит в течении 5-10 минут.

По идее этот текст должен выводиться в прямоугольник (wopisTXT:Init(600,140,320,200), а на практике - все выводится в одну строку и на экране я вижу только первые 4-5 слов, все остальное - улетает за край монитора.

Не подскажете в чем моя ошибка? Есть ли возможность вывести такую переменную в несколько строк в указанный диапазон координат экрана?

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

SoC v 1.0005

В секции детектора 'detector_advances' есть такой параметр:

night_vision_particle = damage_fx\heli_burn
Он имеет какое-то значение для детектора ?

 

Marafon6540

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

Решить проблему можно прописав Ваше окно в xml-файле, к примеру так:

<st_wopisTXT x="600" y="140" width="320" height="200">
    <text align="c" complex_mode="1" x="1" y="1" a="250"></text> 
</st_wopisTXT>

здесь параметр complex_mode="1" как раз и обеспечивает многострочное отображение текста.

Затем создать окно, использовав этот xml-файл:

local xml = CScriptXmlInit()
xml:ParseFile("имя_файла.xml")-- файл-описатель элементов --
wopisTXT = xml:InitStatic("st_wopisTXT", self)

ну и далее, используйте wopisTXT для всех остальных манипуляций с окном.

 

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

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

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

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

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

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

Войти

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

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

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