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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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


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

Такой вопрос: у меня на Затоне( платформа ТЧ) стал возникать странный безлоговый вылет при попытке загрузить последнее сохранение. С сохранением все в порядке. Вылет возникает сразу после нажатия "Последнее сохранение". В чем дело, понять не могу. Думаю связано со скриптами. Сделал вывод информации в лог

! Unknown command: ***__zat_sim_4_--_State:_0_--_Total_population:_8/8_--_Non_exclusive_population:_8/8

* Log file has been saved successfully!

! Unknown command: ***__zat_sim_5_--_State:_0_--_Total_population:_8/8_--_Non_exclusive_population:_8/8

* Log file has been saved successfully!

! Unknown command: ***__zat_sim_3_--_State:_0_--_Total_population:_8/8_--_Non_exclusive_population:_8/8

* Log file has been saved successfully!

! Unknown command: ***__zat_b106_smart_terrain_--_State:_0_--_Total_population:_6/6_--_Non_exclusive_population:_6/6

* Log file has been saved successfully!

! Unknown command: RESPAWN:_[zat_b7_stalker_respawn]_net_destroy

* Log file has been saved successfully!

! Unknown command: RESPAWN:_[zat_stalker_base_smart_respawn]_net_destroy

* Log file has been saved successfully!

! Unknown command: RESPAWN:_[zat_b104_zombied_respawn]_net_destroy

* Log file has been saved successfully!

! Unknown command: RESPAWN:_[zat_b103_merc_respawn]_net_destroy

* Log file has been saved successfully!

! Unknown command: RESPAWN:_[zat_b52_port_bandits_respawn]_net_destroy

* Log file has been saved successfully!

! Unknown command: RESPAWN:_[zat_b7_killers_respawn]_net_destroy

 

К20

Значт стоит на сталкере мод "кончающиеся болты" от Charsi. Все прекрасно работает. Далее решил адаптировать мод "худы вещей". Адаптировал аптечку. Но при создании новой игре такой вылет:

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

Line : 73

Description : <no expression>

Arguments : LUA error: ...es\s.t.a.l.k.e.r\gamedata\scripts\bolt_binder.script:40: attempt to index field 'actor' (a nil value)

 

Т.е. лог жалуется на файл bolt_binder.script, который идет от мода "болтов". Только вот не пойму, откуда эти претензии? Ведь после адаптирования аптечки правились совсем другие файлы, а bolt_binder.script вообще принадлежит болтам! Где взаимосвязь между этими вещами?

Начал делать солянку для ТЧ 1.0004. Вставил много всего. И при переходе на Свалку вылетает, причем лога нет. Никакого. Из-за этого начал пересобирать. Выяснилось, что это из-за мода "Аптечки на худе", который выводит кол-во предметов на худ. После комментирования функции в bind_stalker.script вылета нет. Вопрос: как устранить причину вылета, без комментирования функции в bind_stalker.script?

Изменено пользователем Вурдалак

WurDalaK.gif

Вурдалак, Ну проверь куда ты в bind_stalker.script вызов этот вешал, там скорей всего и причина..

FANAT.gif

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

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

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

function actor_binder:update(delta)
    object_binder.update(self, delta)
    //hud_med.HudShowMed() -вот эта функция
    effect_blood.wounded_pp_update()
    timer_in_hud.show_time()
    -- DEBUG slowdown
--    slowdown.update()

    local time = time_global()
    
    game_stats.update (delta, self.object)

    -- апдейт погоды
    self.weather_manager:update()
    
    -- апдейт схемы детектора
    self.actor_detector:update()

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()

    -- перепаковщик патронов
        dunin_ammo.on_update()

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

WurDalaK.gif

Возможно, ли сделать загрузочный экран в ТЧ как в ЗП. Заранее благодарен.

(по сути меня интересует, как изменить размер и место положение экрана на катором

находится картинка локации)

Верес, Вурдалак в большинстве случаев нельзя разнообразные скрипты совмещать, просто вставляя файлы и ни о чем не думая. Для устранения возникших у вас проблем - надо открывать коды скриптов, вникать и думать. Пока вопросы ваши - для Кашпировских.

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

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

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

Хочешь менять - редактируй движек.

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

SoC v 1.0005

Проблема: есть НПС, заспауненный скриптово. У него имеется квест, с квестом все вроде нормально - говорю с неписем, получаю квест, нахожу квестовый предмет, приношу, отдаю - квест выполнен. Все гуд, кроме одного - при взятии квеста, на карте появляется отметка, но она указывает не на НПСа, а в другое место на локации (место зависит от "green_location" или "blue_location"). Уже примерно понимаю, что проблема похоже с неверным story_id, который при скриптовом спавне указать в create не возможно. Но пока задал вопрос здесь - вдруг что-то упустил, и это можно поправить в конфигурационных файлах ? Если нет, пните отсюда, пойду в раздел "Скриптование".

 

И еще - что означает "green_location" и "blue_location" ?

 

 

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

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

AndreySol, для метки, а именно функции map_add_object_spot_ser, которая ставит метку на серверный объект необходим не сюжетный идентификатор (story_id), а его id. Определить id заспавненого НПС можно как раз при его спавне:

--# Здесь будем хранить
local id_npc = nil
function spawn_npc_test()
     --# определяем серверный объект заспавненного НПС
     local s_obj = alife():create("agr_stalker_regular",vector():set(-125.603,-3.734,-87.740),127146,72)
     --# Для валидности
     if s_obj then
         --# Запоминаем
         id_npc = s_obj.id
     end
end

Ну а потом уже и используем её для того, чтобы поставить метку на этого НПС.

green_location и blue_location - это название метки зарегистрированное в файле config\ui\map_spots.xml.

 

 

Атаман, есть несколько способов. Вероятно, самым простым для тебя, будет отредактировать секцию актора в all.spawn, дописав ему в секцию [spawn] нужные предметы.

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

Атаман, просьба не путать, тут все же раздел "Школа моддинга", а не "Как почитерить игроку".

Хочется изменить игру под себя - засучивай рукава и начинай читать ФАКи и статьи, изучать конфиги и скрипты ...

Ну а если не хочется утруждать себя, то все равно, почитав ФАКи о которых в шапке топика упоминается, много чего для себя найдешь.

 

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

AndreySol, дополню немного ответ ColR_iT'а:

Проверяй свой квест и смотри на что же там ставится метка. Вероятнее всего ставится на квестовый предмет или место (рестриктор) где выполняется квест. Вот от этого и "пляши" ...

Ну а имя метки (green_location иль blue_location) - уже ставится менеджером заданий иль каким-то "твоим" скриптом, и может быть таким, каким выберешь.

 

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

ColR_iT

:rolleyes: Улыбнуло твое: "самым простым для тебя" ...

Если не знает как ствол прописать хотя бы в диалоге - то уж ставить актив-перл, разбираться с ACDC, декомпилировать, править и опять компилировать ... - не назовешь "простым" для многих :crazy:

 

 

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

ColR_iT

для метки, а именно функции map_add_object_spot_ser, которая ставит метку на серверный объект необходим не сюжетный идентификатор (story_id), а его id.

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

Вот, к примеру, выдержка из tasks_escape.xml

<objective>
    <text>tutorial_help_wounded_3</text>
    <map_location_type hint="escape_trader">blue_location</map_location_type>
    <object_story_id>Escape_Trader</object_story_id>
    <infoportion_complete>esc_serious_talk</infoportion_complete>
</objective>

Тэг <object_story_id> я иначе как "story_id объекта" перевести не могу. 'Escape_Trader' указанный в этом тэге зарегистрирован в game_story_ids.ltx:

[story_ids]
  ......
  003    = "Escape_Trader"

Значит, все-таки, story_id используется менеджером заданий для установки метки на объекты квестов ?

 

Artos

Проверяй свой квест и смотри на что же там ставится метка. Вероятнее всего ставится на квестовый предмет или место (рестриктор) где выполняется квест. Вот от этого и "пляши" ...

Вот код добавляемого мной квеста:

<game_task id="escape_search_tools_task">
    <title>Найти набор инструментов</title>
    <objective>
        <icon>ui_iconsTotal_find_item</icon>
        <object_story_id>Escape_Technic</object_story_id>
        <article>escape_story_search_tools</article>
        <infoportion_complete>escape_player_search_tools_complete</infoportion_complete>
    </objective>
    <objective>
        <text>Найти набор инструментов для техника</text>
        <object_story_id>Escape_Technic</object_story_id>
        <infoportion_set_complete>escape_player_have_tools</infoportion_set_complete>
    </objective>
    <objective>
        <text>Отнести инструменты технику</text><!--green_location-->
        <map_location_type hint="Принести инструменты технику">blue_location</map_location_type>
        <object_story_id>Escape_Technic</object_story_id>
        <infoportion_complete>escape_player_search_tools_complete</infoportion_complete>
    </objective>
</game_task>

 

'Escape_Technic' зарегистрирован в game_story_ids.ltx: 093 = "Escape_Technic". Сам НПС спаунится в Деревне новичков, квестовый предмет - на АТП, а метка, после активации квеста, появляется в лощинке с аномалиями за деревней, там где плоть разрывает и сообщение от Сидора об использовании болтов.

Очень похоже, что менеджер заданий просто не может правильно связать story_id, зарегистрированный в game_story_ids.ltx, с конкретным НПСом. Если мое предположение верно, то подскажите - это можно исправить в конфигурационных файлах, или же надо при скриптовом спауне НПСа устанавливать ему через нет-пакет требуемый story_id ?

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

Теперь по существу...

Очень похоже, что менеджер заданий просто не может правильно связать story_id, зарегистрированный в game_story_ids.ltx, с конкретным НПСом.
А как по твоему они (story_id и конкретный НПС) должны "связаться"? Посредством ментальной связи? Естественно твоему НПС необходимо присвоить story_id со значением 93, в твоём случае.

 

AndreySol

(вашими же словами) Извините, но Вы похоже ответы на ваш вопрос слишком поверхностно прочитали ...

В своем ответе ColR_iT вам дал информацию, какой фцнкцией в конечном итоге ставятся метки и по какому аргументу, т.е. по игровому идентификатору (ID).

Ваша путаница в понятиях и попытки домысливания ... вам же и не дают получить ответы на свои вопросы.

Да, в приведенном примере для Сидоровича, ваши умозаключения в принципе верны, за исключением последних звеньев цепочки:

В game_story_ids.ltx прописаны не сами story_id об'ектам, а соответствия УЖЕ присвоенных об'ектам идентификаторов с их текстовыми идентификаторами для именно таск-менеджера.

003 - прописанный Сидоровичу в all.spawn'e идентификатор story_id, т.е. Сидорович в игре появляется уже с этим идентификатором. Менеджер заданий по "Escape_Trader" определяет, что искомый story_id == 3 и ищет в игре об'ект с этим идентификатором, получая от функции id_by_sid его игровой идентификатор (ID)? на который и ставит метку соответствующего типа (blue_location) и с пояснением (hint).

В товем же случае, заспавненный тобою НПС не имеет персонального story_id (числа!) и твои любые записи в game_story_ids.ltx ни к чему не приводят. Точнее твоя запись для "Escape_Technic" скорее всего указывает на уже занятый какой-нибудь аномалией (иль чем другим) идентификатор ...

Т.о. твое предположение "что менеджер заданий просто не может правильно связать story_id" верно и, если хочешь чтобы на НПС ставилась метка - или позаботься ему присвоить его story_id (нет-пакетами) или ставь "ручками" по его игровому ID? получаемому при его спавне.

Как ставить нет-пакетами смотри в модах, т.к. конкретика зависит от модуля/функций для работы с нет-пакетами (о вариантах десятки раз писАлось).

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

Закоментировал дефолтную выдачу тайников в xr_motivator.Сделал скрипт с флешками,после активации которой выдаеться нужный тайник.(связка через таблицу секция флешки=имя тайника).Но в момент активации тайник помечаеться на карте,но его содержимое спавниться у актора.Вот код скрипта treasure_manager

-- Адаптация под нужды мода Panzyuza

local treasure_manager = nil

function parse_spawns(line)
    local ret = {}
    if not line then
        return ret --/>
    end

    --' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini
    local t = se_respawn.parse_names(line)
    local n = #t        
    local k = 1
    while k <= n do
        local spawn = {}
        spawn.section = t[k]
        -- Проверяем что это не последняя запись
        if t[k+1] ~= nil then
            local p = tonumber(t[k+1])
            -- проверяем что вторым числом задана вероятность, а не другая секция спавну
            if p then
                -- забиваем число
                spawn.prob = p
                k = k + 2
            else
                -- забиваем дефолт 1
                spawn.prob = 1
                k = k + 1
            end
        else
            spawn.prob = 1
            k = k + 1
        end
        table.insert(ret, spawn)
    end
    return ret
end


class "CTreasure"
function CTreasure:__init()
    --' На конструкторе вычитываем LTX и создаем заготовки квестов.
    self.ini = ini_file("misc\\treasure_manager.ltx")

    --' Итерируемся по всем настройкам фраз
    if not self.ini:section_exist("list") then
        abort("There is no section [list] in treasure_manager.ltx")
    end
    local n = self.ini:line_count("list")
    local id, value = "",""

    --' начальная установка
    self.treasure_info = {}

    for i=0,n-1 do
        result, id, value    = self.ini:r_line("list",i,"","")
        
        self.treasure_info[id] = {}

        self.treasure_info[id].target        = utils.cfg_get_number(self.ini, id, "target", nil, true)
        self.treasure_info[id].name            = utils.cfg_get_string(self.ini, id, "name", nil, true, "")
        self.treasure_info[id].description    = utils.cfg_get_string(self.ini, id, "description", nil, true, "")
        self.treasure_info[id].items        = parse_spawns(utils.cfg_get_string(self.ini, id, "items", nil, true, ""))

        local community    = parse_names(utils.cfg_get_string(self.ini, id, "community", nil, false, "", "stalker, bandit, dolg, freedom"))
        self.treasure_info[id].community = {}
        for k,v in pairs(community) do
            self.treasure_info[id].community[v] = true
        end


        if self.treasure_info[id].items == nil then
            abort("cant find 'items' in %s", id)
        end

        self.treasure_info[id].condlist        = xr_logic.parse_condlist(db.actor, "treasure_manager", "condlist", utils.cfg_get_string(self.ini, id, "condlist", nil, false, "", ""))
        
        --' Отметим тайник как новый
        self.treasure_info[id].active = false
        self.treasure_info[id].done = false

        --print_table(self.treasure_info)
    end

    --' Вспомогательные таблицы для облегчения поиска
    self.treasure_by_target = {}
    for k,v in pairs(self.treasure_info) do
        self.treasure_by_target[v.target] = k    
    end

    self.loss_workaround_queue = {}
end
--' Юзание инициатора (возможность выдать тайник)
function CTreasure:use(npc)
    printf("TREASURE USE")
        --if (npc and db.actor) then
        --avs_mod.lootmoney(npc)
    --end
    --' Проверим, не вызывались ли мы уже для этого объекта. 
    local se_obj = alife():object(npc:id())
    if not se_obj or se_obj.treasure_processed == true then
        return --/ Объект уже проверялся
    end
    se_obj.treasure_processed = true

        --' У военных тайник получить нельзя.
    if npc:character_community() == "military" then 
        return
    end

        --' Чем больше значение, тем меньше вероятность.
    local rarets = 80
    if math.random(100) < rarets then 
        return
    end

    --' Нужно рандомно выбрать один из тайников.
    local avail = {}
    local tr_sum = 0
    for k,v in pairs(self.treasure_info) do
        if v.done == false then
            local treasure_prob = xr_logic.pick_section_from_condlist(db.actor, npc, v.condlist)

            if treasure_prob == "" or treasure_prob == nil then
                treasure_prob = 0
            end

            if tonumber(treasure_prob) >= 0 and
            v.community[npc:character_community()] == true and
            v.active == false
            then
                if tonumber(treasure_prob) == 100 then
                    self:give_treasure(k)
                else
                    table.insert(avail, {k = k, prob = treasure_prob})
                    tr_sum = tr_sum + treasure_prob
                end
            end
        end
    end

    if tr_sum == 0 then
        return
    end

    local tr_w = math.random(tr_sum)
    for k,v in pairs(avail) do
        tr_w = tr_w - v.prob
        if tr_w <= 0 then
            --' Выдать тайник
            self:give_treasure(v.k)
            break
        end
    end
end
--' Сохранение
function CTreasure:check()
    --' Проверка тайников
    for k,v in pairs(self.treasure_info) do
        self:give_treasure(k) --/ выдать тайник
    end
end
--' Выдача тайника
function CTreasure:give_treasure(k)
    local v = self.treasure_info[k]
    local sim = alife()
    local obj = sim:story_object(v.target)
    if obj ~= nil then
        news_manager.send_treasure(v.name)

        --' Пометить на карте        
        local text = "%c[255,238,155,23]"..game.translate_string(v.name).."\\n".."%c[default]"..game.translate_string(v.description)
        level.map_add_object_spot_ser(obj.id, "treasure", text)

        --' Сгенерить вещи
        --'
        --' Из-за какого-то дефекта в xrGame.dll тайник потеряет
        --' сгенерированное содержимое в следующей ситуации:
        --'  1) получена ссылка на тайник, который находится в online;
        --'  2) игрок сохраняется и загружается;
        --'  3) между 1 и 2 не было переводов тайника в offline хотя бы раз.
        --' Для предотвращения этого создаём вещи у актёра, запоминаем
        --' идентификаторы, а в вызове actor_binder:update() переносим их
        --' в нужный ящик.
        local item_ids = {}
        local pos, lvid, gvid, pid, new_obj
        local need_workaround = level.object_by_id(obj.id) ~= nil
        if need_workaround then
            pos = db.actor:position()
            lvid = db.actor:level_vertex_id()
            gvid = db.actor:game_vertex_id()
            pid = db.actor:id()
        else
            pos = obj.position
            lvid = obj.m_level_vertex_id
            gvid = obj.m_game_vertex_id
            pid = obj.id
        end
        for kk,vv in pairs(v.items) do
            if ammo_section[vv.section] == true then
                local left, box_size = vv.prob, system_ini():r_u32(vv.section, "box_size")
                while left > box_size do
                    new_obj = sim:create_ammo(vv.section, pos, lvid, gvid, pid, box_size)
                    table.insert(item_ids, new_obj.id)
                    left = left - box_size
                end
                if left > 0 then
                    new_obj = sim:create_ammo(vv.section, pos, lvid, gvid, pid, left)
                    table.insert(item_ids, new_obj.id)
                end
            else
                for i=1,vv.prob do
                    new_obj = sim:create(vv.section, pos, lvid, gvid, pid)
                    table.insert(item_ids, new_obj.id)
                end
            end
        end
        if need_workaround then
            self.loss_workaround_queue[v.target] = item_ids
        end
        
        --' Пометим тайник как выданный
        self.treasure_info[k].active = true
        self.treasure_info[k].done = true
    else
        printf("TREASURE %s, target doesnt exist", k)
    end
end
--' Перенос содержимого для предотвращения возможной потери
function CTreasure:loss_workaround()
    for k,v in pairs(self.loss_workaround_queue) do
        box = level_object_by_sid(k)
        if box == nil then
            abort("inv box nil")
        end
        dbglog("loss_workaround:box=%d", k)
        for kk,vv in ipairs(v) do
                        local lobj = level.object_by_id(vv)
            if lobj then
            printf("transfering items: "..lobj:section())
            db.actor:transfer_item(lobj, box)
                        end
        end
    end
    self.loss_workaround_queue = {}
end
--' Снимаем отметку с тайника
function CTreasure:treasure_empty(box, box_story_id)
    local k = self.treasure_by_target[box_story_id]

    if not (k and self.treasure_info[k]) then
        return --/>
    end

    self.treasure_info[k].active = false
    level.map_remove_object_spot(box:id(), "treasure")
end
--' Сохранение
function CTreasure:save(p)
    --' Сохраняем размер таблицы
    local size = 0
    for k,v in pairs(self.treasure_info) do
        size = size + 1
    end
    p:w_u16(size)
    for k,v in pairs(self.treasure_info) do
        p:w_u16(v.target)
        p:w_bool(v.active)
        p:w_bool(v.done)
    end
end
--' Загрузка
function CTreasure:load(p)
    local t = p:r_u16()
    for i = 1,t do
        local k = self.treasure_by_target[p:r_u16()]
        self.treasure_info[k].active = p:r_bool()
        self.treasure_info[k].done = p:r_bool()
    end
end


function get_treasure_manager()
    if treasure_manager == nil then
        treasure_manager = CTreasure()
    end
    return treasure_manager
end

function take_item_from_box(box, box_story_id)
    if box:is_inv_box_empty() == true then
        get_treasure_manager():treasure_empty(box, box_story_id)
    end
end

function save(p)
    get_treasure_manager():save(p)
end
function load(p)
    get_treasure_manager():load(p)
end
function clear_treasure_manager()
    treasure_manager = nil
end

Наверно это из за функции, которая предотвращает потерю тайника и переносит содержимое.Как можно исправить данную проблему?И при правке стандартных тайников что нужно написать в данной переменной?Число 10 или 5?

condlist = {=npc_rank(novice)} 3

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

Смотрим твой скрипт:

--' Выдача тайника
function CTreasure:give_treasure(k)

- проблемная функция

  local obj = sim:story_object(v.target)

- получаем об'ект тайника (ящик/...)

    local pos, lvid, gvid, [b]pid[/b], new_obj
    local need_workaround = level.object_by_id(obj.id) ~= nil --/ некий флаг того, что тайник в онлайне, т.е. на текущей локации
    if need_workaround then
      ...
      pid = db.actor:id() --/??? спавнить актору???

- сам же задаешь спавн актору в рюкзак если тайник на текущей локации.

Т.о. скрипт тупо делает то, что ты же ему и задал.

 

Ну а для condlist = {=npc_rank(novice)} 3 - последнее число - это вероятность (в %) заспавнить тайник при обыске соответствующего трупа и какова она должна быть решаешь именно ты.

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

Кстати, в мотиваторе не комментировать что-то нужно, а немного подправить код ...

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

Хочу в свою солянку добавить смарт мародер мод. Все совместил. Игра жалуется на bind_stalker.script, вот лог:

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...ое Издание\shoc\gamedata\scripts\bind_stalker.script:61: attempt to index global 'death_manager' (a nil value)

 

 

Можете помочь совместить два bind_stalker-а?

 

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

function init    (obj)
    xr_motivator.AddToMotivator(obj)
end

function actor_init    (npc)
    npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
    [0] = "gd_novice",
    [1] = "gd_stalker",
    [2] = "gd_veteran",
    [3] = "gd_master"
    }

lasthealth  = 0
lasttime    = 0
post_process = 0
local weapon_hide = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
    self.bCheckStart = false
    self.weather_manager = level_weathers.WeatherManager()
    self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
    printf("actor net spawn")        

    level.show_indicators()

    self.bCheckStart = true
    self.weapon_hide = false -- спрятано или нет оружие при разговоре.
    weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

    if object_binder.net_spawn(self,data) == false then
        return false
    end

    db.add_actor(self.object)
    
    if self.st.disable_input_time == nil then
        level.enable_input()
    end

    self.weather_manager:reset()
--    game_stats.initialize ()

    if(actor_stats.add_to_ranking~=nil)then
        actor_stats.add_to_ranking(self.object:id())
    end

    --' Загружаем настройки дропа
    death_manager.init_drop_settings()

    funcs.on_game_load()

    return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
    if(actor_stats.remove_from_ranking~=nil)then
        actor_stats.remove_from_ranking(self.object:id())
    end
--    game_stats.shutdown ()
    db.del_actor(self.object)

    sr_light.clean_up ()

    self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:destroy()
        sr_psy_antenna.psy_antenna = false
    end

    xr_sound.stop_all_sound_object()

    object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
    object_binder.reinit(self)
    
    local npc_id = self.object:id()

    db.storage[npc_id] = { }

    self.st = db.storage[npc_id]
    self.st.pstor = nil

    self.next_restrictors_update_time = -10000

    self.object:set_callback(callback.inventory_info, self.info_callback, self)
    self.object:set_callback(callback.article_info, self.article_callback, self)
    self.object:set_callback(callback.on_item_take, self.on_item_take, self)
    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
    self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
    --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
    self.object:set_callback(callback.task_state, self.task_callback, self)
    --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
    self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
    self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
    local story_id = box:story_id()
    if story_id == nil then
        return
    end

    treasure_manager.take_item_from_box(box, story_id)
--[[    
    local respawner = se_respawn.get_respawner_by_parent(story_id)
    if respawner == nil then
        return
    end
    
    --' Необходимо уменьшить счетчик в респавнере
    respawner:remove_spawned(item:id())

    local smart_terrain = db.strn_by_respawn[respawner:name()]
    if smart_terrain == nil then
        return
    end

    local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
    if npc ~= nil then
        xr_sound.set_sound_play(npc, "reac_box")
        xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)        
    end
]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
    self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
    self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
    printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
    --' Сюжет
    level_tasks.proceed(self.object)
    -- Отметки на карте
    level_tasks.process_info_portion(info_id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
    if sell_bye == true then
       game_stats.money_trade_update (money)
    else       
       game_stats.money_trade_update (-money) 
    end   
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
    --printf("article_callback [%s][%s]", group, name)
    if device().precache_frame >1 then return end
    
    if group == "Diary" then
        news_manager.send_encyclopedy("diary", group)
    else
        news_manager.send_encyclopedy("encyclopedy", group)
    end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_take_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
    task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
    if _objective:get_idx() == 0 then
        if _state == task.fail then
            news_manager.send_task(db.actor, "fail", _task, _objective)
        elseif _state == task.completed then
            task_manager.reward_by_task(_task)
            news_manager.send_task(db.actor, "complete", _task, _objective)
        else
            news_manager.send_task(db.actor, "new", _task, _objective)
        end
    else
        if _task:get_objective(0):get_state() == task.in_progress then
            news_manager.send_task(db.actor, "update", _task, _objective)
        end
    end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
    if (false==app_ready()) or (device().precache_frame>1) then return end
    --'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
    object_binder.update(self, delta)

    -- DEBUG slowdown
--    slowdown.update()

    local time = time_global()
    
    game_stats.update (delta, self.object)

    -- апдейт погоды
    self.weather_manager:update()
    
    -- апдейт схемы детектора
    self.actor_detector:update()

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()
    
    --' Проверка потери жизни
--[[
    if self.object.health - lasthealth > 0.001 or
       self.object.health - lasthealth < -0.001 then
        printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
        lasthealth = self.object.health
        lasttime = game.time()
    end
]]    
    -- Обновление отключения ввода с клавиатуры.
    if self.st.disable_input_time ~= nil and
       game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle 
    then
        level.enable_input()
        self.st.disable_input_time = nil
    end
    -- Обновление сна с переносом чувака в указанную позицию
    if self.st.sleep_relocate_time ~= nil and
       game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle 
    then
        self.object:set_actor_position(self.st.sleep_relocate_point)
        local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
        self.object:set_actor_direction(dir:getH())
        self.st.sleep_relocate_time = nil
    end

    -- Апдейт прятание оружия игрока во время диалога
    if weapon_hide == true or self.object:is_talking() then
        if self.weapon_hide == false then
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            self.object:restore_weapon()
            self.weapon_hide = false
        end
    end    

    -- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
    if self.next_restrictors_update_time < time then
        bind_restrictor.actor_update(delta)

        self.next_restrictors_update_time = time + 200

        task_manager.actor_update()
    end

    -- обновление постпроцессов
    if post_process ~= 0 then
        if post_process:update () == true then
           post_process = 0
        end
    end

    -- обновление пси-антенны
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:update(delta)
    end

    --' Вывод сообщения о большой радиации
    if self.object.radiation >= 0.7 then
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static == nil then
            hud:AddCustomStatic("cs_radiation_danger", true)
            hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
        end
    else
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("cs_radiation_danger")
        end
    end



    if self.bCheckStart then
        printf("SET DEFAULT INFOS")        

        if not has_alife_info("storyline_actor_start") and
           (level.name() == "l01_escape")
        then
            self.object:give_info_portion("storyline_actor_start")
            _G.g_start_avi = true
            printf("*AVI* RUN START AVI")            
        end

--        if not has_alife_info("encyclopedy") then
--            self.object:give_info_portion("encyclopedy")
--        end

        if not has_alife_info("global_dialogs") then
            self.object:give_info_portion("global_dialogs")
        end

        if not has_alife_info("level_changer_icons") then
            self.object:give_info_portion("level_changer_icons")
        end

        level_tasks.add_lchanger_location()

        self.bCheckStart = false        
    end        
    funcs.on_actor_update()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)

    local save_treasure_manager = true

    printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    --' Сохраняем уровень сложности
    if save_treasure_manager == true then
        packet:w_u8(level.get_game_difficulty() + 128)
    else
        packet:w_u8(level.get_game_difficulty())
    end


    --' Сохраняем данные об отключенном вводе
    if self.st.disable_input_time == nil then
        packet:w_bool(false)
    else
        packer:w_bool(true)
        utils.w_CTime(packet, self.st.disable_input_time)
    end

    xr_logic.pstor_save_all(self.object, packet)
    self.weather_manager:save(packet)

    sr_psy_antenna.save( packet )

    if save_treasure_manager == true then
        treasure_manager.save(packet)      
    end 

    task_manager.save(packet)
    self.actor_detector:save(packet)    
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
    printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)
    printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

    --' Загружаем уровень сложности
    local game_difficulty = reader:r_u8()

    local load_treasure_manager = false      
    if game_difficulty >= 128 then           
        game_difficulty = game_difficulty - 128
        load_treasure_manager = true           
    end                                      


    get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    local stored_input_time = reader:r_u8()
    if stored_input_time == true then
        self.st.disable_input_time = utils.r_CTime(reader)
    end

    xr_logic.pstor_load_all(self.object, reader)
    self.weather_manager:load(reader)

    sr_psy_antenna.load(reader)

    if load_treasure_manager == true then
        treasure_manager.load(reader)      
    end                                  

    
    task_manager.load(reader)
    self.actor_detector:load(reader)

end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
--    sound_prefetch.prefetch_sounds()
--end


-- Weapon functions
function hide_weapon()
    weapon_hide = true
end
function restore_weapon()
    weapon_hide = false
end

// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
    printf            ("file    : %s",file_name)
    printf            ("section : %s",section_name)
    
    local            file = ini_file(file_name)
    local            n = file:line_count(section_name)
    printf            ("lines   : %d",n)
    
    local            id, value = "", "", result
    for i=0,n-1 do
        result, id, value    = file:r_line(section_name,i,"","")
        printf        ("line %d : %s = %s",i,id,value)
    end
end

test_section_iteration("system.ltx","space_restrictor")
/**/

 

function init    (obj)
    xr_motivator.AddToMotivator(obj)
end

function actor_init    (npc)
    npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
    [0] = "gd_novice",
    [1] = "gd_stalker",
    [2] = "gd_veteran",
    [3] = "gd_master"
    }

local post_time = 0
lasthealth  = 0
lasttime    = 0
post_process = 0
local weapon_hide = false
-->> Dynamic campfire mod
local scan_flag
local upd_time
--<< Dynamic campfire mod
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
    self.bCheckStart = false
    self.weather_manager = level_weathers.WeatherManager()
    self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
    printf("actor net spawn")        

    level.show_indicators()

    self.bCheckStart = true
    self.weapon_hide = false -- спрятано или нет оружие при разговоре.
    weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

    if object_binder.net_spawn(self,data) == false then
        return false
    end

    db.add_actor(self.object)
    
    if self.st.disable_input_time == nil then
        level.enable_input()
    end

    self.weather_manager:reset()
--    game_stats.initialize ()

    if(actor_stats.add_to_ranking~=nil)then
        actor_stats.add_to_ranking(self.object:id())
    end

    --' Загружаем настройки дропа
    death_manager.init_drop_settings()
    ogsm_freeplay.mark_lc()    
    ogsm_funcs.on_game_load()
    if xrs_ai then xrs_ai.actor_net_spawn(self) end
    ui_main_menu.start()
    -- added by xmk
    -- Новости(фильтр левелов)
    news_main.filter()

    return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
    if(actor_stats.remove_from_ranking~=nil)then
        actor_stats.remove_from_ranking(self.object:id())
    end
--    game_stats.shutdown ()
    db.del_actor(self.object)

    sr_light.clean_up ()

    self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:destroy()
        sr_psy_antenna.psy_antenna = false
    end

    xr_sound.stop_all_sound_object()

    object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
    object_binder.reinit(self)
    
    local npc_id = self.object:id()

    db.storage[npc_id] = { }

    self.st = db.storage[npc_id]
    self.st.pstor = nil

    self.next_restrictors_update_time = -10000

    self.object:set_callback(callback.inventory_info, self.info_callback, self)
    self.object:set_callback(callback.article_info, self.article_callback, self)
    self.object:set_callback(callback.on_item_take, self.on_item_take, self)
    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
    self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
    --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
    self.object:set_callback(callback.task_state, self.task_callback, self)
    --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
    self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
    self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
    local story_id = box:story_id()
    if story_id == nil then
        return
    end

    treasure_manager.take_item_from_box(box, story_id)
--[[    
    local respawner = se_respawn.get_respawner_by_parent(story_id)
    if respawner == nil then
        return
    end
    
    --' Необходимо уменьшить счетчик в респавнере
    respawner:remove_spawned(item:id())

    local smart_terrain = db.strn_by_respawn[respawner:name()]
    if smart_terrain == nil then
        return
    end

    local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
    if npc ~= nil then
        xr_sound.set_sound_play(npc, "reac_box")
        xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)        
    end
]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
    self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
    self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
    printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
    --' Сюжет
    level_tasks.proceed(self.object)
    -- Отметки на карте
    level_tasks.process_info_portion(info_id)

    --======================================================================
    _Sin_Linking.Sin_Info_callback(npc, info_id)
    --======================================================================
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
    if sell_bye == true then
       game_stats.money_trade_update (money)
    else       
       game_stats.money_trade_update (-money) 
    end   
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
    --printf("article_callback [%s][%s]", group, name)
    if device().precache_frame >1 then return end
    
    if group == "Diary" then
        news_manager.send_encyclopedy("diary", group)
    else
        news_manager.send_encyclopedy("encyclopedy", group)
    end
end
----------------------------------------------------------------------------------------------------------------------
    
-- dunin ammo
    local ammo_aggregation = true
    local ps_need_update = false

function actor_binder:on_item_take (obj)
    if obj:clsid() ~= clsid.wpn_ammo then
    level_tasks.proceed(self.object)
    --=============================================================================
    _Sin_Linking.Sin_On_item_take (obj)
    --=============================================================================
    if xrs_ai then xrs_ai.actor_item_take(obj) end
    else --obj:clsid() == clsid.wpn_ammo
        if ammo_aggregation then
            if dunin_ammo.on_take(obj) then
                ps_need_update = true
            end
        end
    end
    --game_stats.update_take_item (obj, self.object)
    dunin_ammo.on_take(obj)
    
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
    player_ogg.lose_item(obj)
    level_tasks.proceed(self.object)
    --=============================================================================
    _Sin_Linking.Sin_On_item_drop (obj)
    --=============================================================================
    --game_stats.update_drop_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
    task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
    if _objective:get_idx() == 0 then
        if _state == task.fail then
            news_manager.send_task(db.actor, "fail", _task, _objective)
        elseif _state == task.completed then
            task_manager.reward_by_task(_task)
            news_manager.send_task(db.actor, "complete", _task, _objective)
        else
            news_manager.send_task(db.actor, "new", _task, _objective)
        end
    else
        if _task:get_objective(0):get_state() == task.in_progress then
            news_manager.send_task(db.actor, "update", _task, _objective)
        end
    end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
    if (false==app_ready()) or (device().precache_frame>1) then return end
    --'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
    object_binder.update(self, delta)
    //hud_med.HudShowMed()
    effect_blood.wounded_pp_update()
    timer_in_hud.show_time()
    -- DEBUG slowdown
--    slowdown.update()

    local time = time_global()
    
    game_stats.update (delta, self.object)

    -- апдейт погоды
    self.weather_manager:update()
    
    -- апдейт схемы детектора
    self.actor_detector:update()

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()
    nd_news_main_data.show_news_main()
    -- перепаковщик патронов
        dunin_ammo.on_update()
    
    --' Проверка потери жизни
--[[
    if self.object.health - lasthealth > 0.001 or
       self.object.health - lasthealth < -0.001 then
        printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
        lasthealth = self.object.health
        lasttime = game.time()
    end
]]    
    -- Обновление отключения ввода с клавиатуры.
    if self.st.disable_input_time ~= nil and
       game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle 
    then
        level.enable_input()
        self.st.disable_input_time = nil
    end
    -- Обновление сна с переносом чувака в указанную позицию
    if self.st.sleep_relocate_time ~= nil and
       game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle 
    then
        self.object:set_actor_position(self.st.sleep_relocate_point)
        local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
        self.object:set_actor_direction(dir:getH())
        self.st.sleep_relocate_time = nil
    end

    -- Апдейт прятание оружия игрока во время диалога
    if weapon_hide == true or self.object:is_talking() then
        if self.weapon_hide == false then
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            self.object:restore_weapon()
            self.weapon_hide = false
        end
    end    

    -- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
    if self.next_restrictors_update_time < time then
        bind_restrictor.actor_update(delta)

        self.next_restrictors_update_time = time + 200

        task_manager.actor_update()
    end

    -- обновление сна
    if post_time < time then
        post_time = time + 250

        if sleep_manager.is_sleep_active() and xr_conditions.actor_dead() then
            xr_logic.issue_event(db.actor, db.storage[db.actor:id()]["ar_sleep"], "update")
        end

        sleep_manager.update(delta)
    end
    -- обновление постпроцессов
    if post_process ~= 0 then
        if post_process:update () == true then
           post_process = 0
        end
    end

    -- обновление пси-антенны
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:update(delta)
    end

    --' Вывод сообщения о большой радиации
    if self.object.radiation >= 0.7 then
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static == nil then
            hud:AddCustomStatic("cs_radiation_danger", true)
            hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
        end
    else
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("cs_radiation_danger")
        end
    end

    -- UI Radiation Mod additions
    if (ui_rad and self.object) then
        ui_rad.update(self.object)
    end
    -- UI Radiation Mod additions


    -- dunin ammo end
    
    if self.bCheckStart then
        printf("SET DEFAULT INFOS")        

        if not has_alife_info("storyline_actor_start") and
           (level.name() == "l01_escape")
        then
          --=============================================================================
          _Sin_Linking.Sin_Start()
          --=============================================================================
            self.object:give_info_portion("storyline_actor_start")
            _G.g_start_avi = true
            printf("*AVI* RUN START AVI")            
        end

--        if not has_alife_info("encyclopedy") then
--            self.object:give_info_portion("encyclopedy")
--        end

        if not has_alife_info("global_dialogs") then
            self.object:give_info_portion("global_dialogs")
        end

        if not has_alife_info("level_changer_icons") then
            self.object:give_info_portion("level_changer_icons")
        end

        level_tasks.add_lchanger_location()

        self.bCheckStart = false        
    end        

--================================================================================
====================================
    _Sin_Linking.Sin_Update(delta)
--================================================================================
====================================

    --if not self.particle then
    --    self.particle = particles_object([[weather\water]])
    --    self.particle:play_at_pos(self.object:position())
    --else
        --self.particle:move_to(self.object:position():add(vector():set(0,1,0)),vector():set(0,0,0))
    --end
    
    if xrs_ai then xrs_ai.actor_update(delta) end

    ogsm_funcs.on_actor_update()
    --added by xmk
    -- Новости
    news_main_data.show_news_main()

    -->> Dynamic campfire mod
    if scan_flag == nil then
        scan_flag = 1
        local lvl = level.name()
        local exc_tbl = {
            ["zone_flame_small_0002"] = {"l05_bar"},
            ["zone_flame_small_0005"] = {"l06_rostok"},
            ["zone_flame_small_0006"] = {"l06_rostok"},
            ["zone_flame_small_0007"] = {"l06_rostok"},
            ["zone_flame_small_0008"] = {"l06_rostok"},
            ["zone_flame_small_0010"] = {"l06_rostok"},
            ["zone_flame_small_0012"] = {"l11_pripyat"},
            ["zone_flame_small_0013"] = {"l11_pripyat"},
            ["zone_flame_small_0024"] = {"l11_pripyat"},
            ["zone_flame_small_0025"] = {"l11_pripyat"},
            ["lights_camp_fire_omni_r1_r2_0002"] = {"l05_bar"},
            ["lights_camp_fire_omni_r1_r2_0011"] = {"l11_pripyat"},
            ["lights_camp_fire_omni_r1_r2_0012"] = {"l11_pripyat"},
            ["lights_camp_fire_omni_r1_r2_0031"] = {"l08_yantar"}
--            МОЖЕТ БЫТЬ ТАК:    ["zone_flame_small_9999"] = {"l01_escapel02_garbagel05_barl07_military"},
--            МОЖЕТ БЫТЬ ТАК:    ["lights_camp_fire_omni_r1_r2_9999"] = {"l01_escapel02_garbagel05_barl07_military"}
        }
        for id=1, 65535 do
            local obj = level.object_by_id(id)
            if obj then
                local name = obj:name()
                local exc_obj = exc_tbl[name]
                if exc_obj and string.find(exc_obj[1], lvl) then
--                    printf("EXEPTIONS: OBJ:[%s] LEVELS:[%s]", name, exc_obj[1])
                else
                    if obj:section() == "zone_flame_small" then
                        table.insert(xr_kamp.lvl_objs, obj)
                        obj:disable_anomaly()
                    elseif string.find(name, "r1_r2") then
                        table.insert(xr_kamp.lvl_objs, obj)
                        obj:get_hanging_lamp():turn_off()
                    -- Масляные горелки (требуется доп. правка particles.xr)
--                    elseif string.find(name, "light_gas") then
--                        obj:get_hanging_lamp():turn_off()
                    end
                end
            end
        end
    end
    if upd_time == nil then
        upd_time = time + 10000
    elseif upd_time < time then
        upd_time = time + 10000
        xr_kamp.update(time)
    end
    --<< Dynamic campfire mod
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
    
    local save_treasure_manager = true
    
    printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    --' Сохраняем уровень сложности
    if save_treasure_manager == true then
        packet:w_u8(level.get_game_difficulty() + 128)
    else
        packet:w_u8(level.get_game_difficulty())
    end


    --' Сохраняем данные об отключенном вводе
    if self.st.disable_input_time == nil then
        packet:w_bool(false)
    else
        packer:w_bool(true)
        utils.w_CTime(packet, self.st.disable_input_time)
    end

    xr_logic.pstor_save_all(self.object, packet)
    self.weather_manager:save(packet)

    sr_psy_antenna.save( packet )
    
    if save_treasure_manager == true then
        treasure_manager.save(packet)      
    end                                  

    task_manager.save(packet)
    self.actor_detector:save(packet)    
    --==================================================
    _Sin_Linking.Sin_Save(packet)
    --==================================================
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
    printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)
    printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

    --' Загружаем уровень сложности
    local game_difficulty = reader:r_u8()
    
    local load_treasure_manager = false      
    if game_difficulty >= 128 then           
        game_difficulty = game_difficulty - 128
        load_treasure_manager = true           
    end                                      

    
    get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    local stored_input_time = reader:r_u8()
    if stored_input_time == true then
        self.st.disable_input_time = utils.r_CTime(reader)
    end

    xr_logic.pstor_load_all(self.object, reader)
    self.weather_manager:load(reader)

    sr_psy_antenna.load(reader)
    
    if load_treasure_manager == true then
        treasure_manager.load(reader)      
    end                                  

    
    task_manager.load(reader)
    self.actor_detector:load(reader)    

    --================================================
    _Sin_Linking.Sin_Load(reader)
    --================================================
end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
--    sound_prefetch.prefetch_sounds()
--end


-- Weapon functions
function hide_weapon()
    weapon_hide = true
end
function restore_weapon()
    weapon_hide = false
end

// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
    printf            ("file    : %s",file_name)
    printf            ("section : %s",section_name)
    
    local            file = ini_file(file_name)
    local            n = file:line_count(section_name)
    printf            ("lines   : %d",n)
    
    local            id, value = "", "", result
    for i=0,n-1 do
        result, id, value    = file:r_line(section_name,i,"","")
        printf        ("line %d : %s = %s",i,id,value)
    end
end

test_section_iteration("system.ltx","space_restrictor")
/**/

 

 

Одна из возможных причин данного вылета, это синтаксическая ошибка в файле death_manager.script, проверяй чекером.

ColR_iT

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

WurDalaK.gif

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

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

 

Вурдалак

Он меня постоянно выручает script Syntax Checker.rar

Народ, хочу сделать так, чтобы мп-5 9х18 на свалке спавнилась в трупе в новом состоянии? Я так понял, ее надо добавить как исключение в death_manager, как это сделать?

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

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

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

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

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

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

Войти

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

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

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