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

АМК на ЗП


_Призрак_

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

Такой вопрос. Суть данной работы является перенос НС, или же сюжета ТЧ на двиг ЗП ? (АМК - там понятно, скрипты...) у меня вопрос по сюжету. Просто это было так давно, что я забыл....

Что-то кончается, что-то начинается...

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


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

terror, Если актуально. Нужно подрезать вызов _sdata.

 

под спойлерами правленые скрипты

 

_g.script -- Отучил от dll.

if (jit == nil) then
    profiler.setup_hook    ()
end


function empty    (container)
    if (type(container) == "function") then
        for i in container do
            return    (false)
        end
        return        (true)
    end
    assert            (type(container) == "table")
    if (container[1] ~= nil) then
        return        (false)
    end
    for i,j in pairs(container) do
        return        (false)
    end
    return            (true)
end


schemes = {} -- соответствие схем модулям
stypes = {} -- типv схем

-- іагружает схему из файла на диске и активирует в мотиваторе.
-- ідесь:
--     filename - имя файла, в котором реализована схема, без расширения
--     scheme - имя схем
function load_scheme(filename, scheme, stype)
    schemes[scheme] = filename
    stypes[scheme] = stype
end

----------------------------------------------------------------------
dev_debug = false
sim_debug = false
mus_vol = 0
amb_vol = 0
b_discard_settings_shown = false
----------------------------------------------------------------------
local scripts_to_print =    {
                            ["stalker_generic"] = true,
                            ["xr_smartcover"] = true,
                            ["xr_logic"] = true,
                            ["xr_conditions"] = true,
                            ["xr_cover"] = true,
                            ["xr_motivator"] = true,
                            ["xr_walker"] = true,
                            ["xr_camper"] = true,
                            ["xr_kamp"] = true,
                            ["restrictor_manager"] = true,
                            ["sim_board"] = true,
                            ["sim_faction"] = true,
                            ["post_combat_idle"] = true,
                            ["xr_death"] = true,
                            ["xr_sound"] = true,
                            ["utils"] = true,
                            ["treasure_manager"] = true,
                            ["object_collection"] = true,
                            ["se_actor"] = true,
                            ["smart_terrain"] = true,
                            ["bind_physic_object"] = true,
                            ["bind_heli"] = true,
                            ["bind_anomaly_zone"] = true,
                            ["bind_stalker"] = true,
                            ["state_mgr_animation"] = true,
                            ["se_stalker"] = true,
                            ["db"] = true,
                            ["sim_squad_generic"] = true,
                            ["sim_squad_scripted"] = true,
                            ["se_smart_cover"] = true,
                            ["se_monster"] = true,
                            ["dialog_manager"] = true,
                            ["xr_combat_ignore"] = true,
                            ["xr_remark"] = true,
                            ["cover_manager"] = true,
                            ["xr_danger"]     = true,
                            ["task_manager"] = true,
                            ["task_objects"]     = true
                            }
function printf(fmt,...)

    local is_g = 0
    local result = fmt
    if debug == nil then
        log(string.format(fmt,...))
        return
    end
    local info_table = debug.getinfo(2)
    local script_name = string.gsub(info_table.short_src, "%.script", "")
    script_name = string.gsub(script_name, "gamedata\\scripts\\", "")

    if scripts_to_print[script_name] == false then return end

    script_name,is_g = string.gsub(script_name, "_g", "")
    if is_g == 0 then
        result = script_name..":("..info_table.currentline.."):"..fmt
    else
        result = fmt
    end
    log(string.format(result,...))

end

----------------------------------------------------------------------
if nil == time_global then
    time_global = function () return device():time_global() end
end

function wait_game(time_to_wait)
    verify_if_thread_is_running()
    if (time_to_wait == nil) then
        coroutine.yield()
    else
        local time_to_stop = game.time() + time_to_wait
        while game.time() <= time_to_stop do
            coroutine.yield()
        end
    end
end

function wait(time_to_wait)
    verify_if_thread_is_running()
    if (time_to_wait == nil) then
        coroutine.yield()
    else
        local time_to_stop = time_global() + time_to_wait
        while time_global() <= time_to_stop do
            coroutine.yield()
        end
    end
end

function action(obj,...)
    local arg = {...}
    local act = entity_action()
    local i = 1
    while true do
        if (arg[i] ~= nil) then
            act:set_action(arg[i])
        else
            break
        end
        i = i + 1
    end
    if (obj ~= nil) then
        obj:command(act,false)
    end
    return  entity_action(act)
end

function action_first(obj,...)
    local arg = {...}
    local act = entity_action()
    local i = 1
    while true do
        if (arg[i] ~= nil) then
            act:set_action(arg[i])
        else
            break
        end
        i = i + 1
    end
    if (obj ~= nil) then
        obj:command(act,true)
    end
    return  entity_action(act)
end

function round (value)
    local min = math.floor (value)
    local max = min + 1
    if value - min > max - value then return max end
    return min
end


function distance_between(obj1, obj2)
    return obj1:position():distance_to(obj2:position())
end

-- +сли один объект nil, например нет актера, то считаем, что он далеко
function distance_between_safe(obj1, obj2)
    if(obj1 == nil or obj2 == nil) then return 100000 end
    return obj1:position():distance_to(obj2:position())
end

local aa = nil
--' іроверка на инфопоршнv, даже если игрока не су    ествует
function has_alife_info(info_id)
    if aa == nil then
        return false
    end
    return aa:has_info(0, info_id)
end



function reset_action (npc, script_name)
    if npc:get_script () then
         npc:script (false, script_name)
    end
    npc:script (true, script_name)
end

--------------------------------------------------
-- Functions and variables added by Zmey
--------------------------------------------------

-- іонстанта, которуі использовать в местах, где нужно задать неограниченное время действия
time_infinite = 100000000

-- +сли в даннvй момент вvполняется какое-то действие, прерvвает его и отклічает скриптовvй режим
function interrupt_action(who, script_name)
    if who:get_script() then
        who:script(false, script_name)
    end
end

function random_choice(...)
    local arg = {...}
    local r = math.random(1, #arg)
    return arg[r]
end

function if_then_else(cond, if_true, if_false)
    if cond then
        return if_true
    end
    return if_false
end


function set_current_time (hour, min, sec)
    local current_time_factor = level.get_time_factor ()
    printf ("Need time : %d:%d:%d", hour, min, sec)
    local current_time = game.time ()
    local c_day = math.floor (current_time / 86400000)
    local c_time = current_time - c_day * 86400000
    local n_time = (sec + min * 60 + hour * 3600) * 1000

    if c_time > n_time then c_day = c_day + 1 end
    n_time = n_time + c_day * 86400000
    level.set_time_factor (10000)
    while game.time () < n_time do wait () end
    level.set_time_factor (current_time_factor)
end

function random_number (min_value, max_value)
    math.randomseed (device ():time_global ())
    if min_value == nil and max_value == nil then
        return math.random ()
    else
        return math.random (min_value, max_value)
    end
end


function parse_names( s )
    local t = {}
    for name in string.gfind( s, "([%w_\\]+)%p*" ) do
        --for name in string.gfind( s, "%s*([^%,]+)%s*" ) do
        table.insert( t, name )
    end
    return t
end

function parse_key_value( s )
    local t = {}
    if s == nil then
        return nil
    end
    local key, nam = nil, nil
    for name in string.gfind( s, "([%w_\\]+)%p*" ) do
        if key == nil then
            key = name
        else
            t[key] = name
            key = nil
        end
    end
    return t
end

function parse_nums( s )
    local t = {}
    for entry in string.gfind( s, "([%-%d%.]+)%,*" ) do
        table.insert( t, tonumber( entry ) )
    end
    return t
end

-- Находится ли обьект в онлайне.
function is_object_online(obj_id)
    return level.object_by_id(obj_id) ~= nil
end

function get_clsid(npc)
    if npc == nil then return nil end
    return npc:clsid()
end

--Tvчисляет yaw в радианах
function yaw( v1, v2 )
    return  math.acos( ( (v1.x*v2.x) + (v1.z*v2.z ) ) / ( math.sqrt(v1.x*v1.x + v1.z*v1.z ) * math.sqrt(v2.x*v2.x + v2.z*v2.z ) ) )
end
function yaw_degree( v1, v2 )
    return  (math.acos( ( (v1.x*v2.x) + (v1.z*v2.z ) ) / ( math.sqrt(v1.x*v1.x + v1.z*v1.z ) * math.sqrt(v2.x*v2.x + v2.z*v2.z ) ) ) * 57.2957)
end
function yaw_degree3d( v1, v2 )
    return  (math.acos((v1.x*v2.x + v1.y*v2.y + v1.z*v2.z)/(math.sqrt(v1.x*v1.x + v1.y*v1.y + v1.z*v1.z )*math.sqrt(v2.x*v2.x + v2.y*v2.y + v2.z*v2.z)))*57.2957)
end
function vector_cross(v1, v2)
    return vector():set(v1.y  * v2.z  - v1.z  * v2.y, v1.z  * v2.x  - v1.x  * v2.z, v1.x  * v2.y  - v1.y  * v2.x)
end

--Поворачивает вектор вокруг оси y против часовой стрелки.
function vector_rotate_y(v, angle)
    angle = angle * 0.017453292519943295769236907684886
    local c = math.cos (angle)
    local s = math.sin (angle)
    return vector ():set (v.x * c - v.z * s, v.y, v.x * s + v.z * c)
end

-- очистка таблицы.
function clear_table (t)
    while #t > 0 do
        table.remove (t, #t)
    end
end

function stop_play_sound(obj)
    if obj:alive() == true then
        obj:set_sound_mask(-1)
        obj:set_sound_mask(0)
    end
end

-- Печатает таблицу как дерево.
function print_table(table, subs)
    local sub
    if subs ~= nil then
        sub = subs
    else
        sub = ""
    end
    for k,v in pairs(table) do
        if type(v) == "table" then
            printf(sub.."%s:", tostring(k))
            print_table(v, sub.."    ")
        elseif type(v) == "function" then
            printf(sub.."%s:function", tostring(k))
        elseif type(v) == "userdata" then
            printf(sub.."%s:userdata", tostring(k))
        elseif type(v) == "boolean" then
                    if v == true then
                            if(type(k)~="userdata") then
                                    printf(sub.."%s:true", tostring(k))
                            else
                                    printf(sub.."userdata:true")
                            end
                    else
                            if(type(k)~="userdata") then
                                    printf(sub.."%s:false", tostring(k))
                            else
                                    printf(sub.."userdata:false")
                            end
                    end
        else
            if v ~= nil then
                printf(sub.."%s:%s", tostring(k),v)
            else
                printf(sub.."%s:nil", tostring(k),v)
            end
        end
    end
end
function store_table(table, subs)
    local sub
    if subs ~= nil then
        sub = subs
    else
        sub = ""
    end
    printf(sub.."{")
    for k,v in pairs(table) do
        if type(v) == "table" then
            printf(sub.."%s = ", tostring(k))
            store_table(v, sub.."    ")
        elseif type(v) == "function" then
            printf(sub.."%s = \"func\",", tostring(k))
            elseif type(v) == "userdata" then
                    printf(sub.."%s = \"userdata\",", tostring(k))
        elseif type(v) == "string" then
            printf(sub.."%s = \"%s\",", tostring(k), tostring(v))
        else
            printf(sub.."%s = %s,", tostring(k), tostring(v))
        end
    end
    printf(sub.."},")
end

-------------------------------------------------------------------------------------------
local monster_classes = {}
local stalker_classes = {}
local weapon_classes = {}
local artefact_classes = {}

function IsMonster (object, class_id)
        local id = class_id or get_clsid(object)
        return monster_classes[id] == true
end
function IsStalker (object, class_id)
        local id = class_id or get_clsid(object)
        return stalker_classes[id] == true
end

function isWeapon(object, class_id)
    local id = class_id or get_clsid(object)
    return weapon_classes[id] == true
end

function isArtefact(object, class_id)
        local id = class_id or get_clsid(object)
    return artefact_classes[id] == true
end


-------------------------------------------------------------------------------------------
function get_object_community(obj)
    if type(obj.id) == "function" then
        return character_community(obj)
    else
        return alife_character_community(obj)
    end
end

function character_community (obj)
    if IsStalker(obj) then
        return obj:character_community()
    end
    return "monster"
end

function alife_character_community (obj)
    if IsStalker(obj, obj:clsid()) then
        return obj:community()
    end
    return "monster"
end

-- получить геймобжект по стори_айди.
function level_object_by_sid( sid )
    local sim = alife()
    if sim then
        local se_obj = sim:story_object( sid )
        if se_obj then
            return level.object_by_id( se_obj.id )
        end
    end
    return nil
end
-- Получить айдишник обьекта по стори айди.
function id_by_sid( sid )
    local sim = alife()
    if sim then
        local se_obj = sim:story_object( sid )
        if se_obj then
            return se_obj.id
        end
    end
    return nil
end

-- Крешнуть игру (после вывода сообщения об ошибке в лог)
function abort(fmt, ...)
    amk_dbg.log2("ABORT!!!") 
    amk_dbg.log2(fmt)
    local reason = string.format(fmt, ...)
    --error_log(reason)
    amk_dbg.log2(reason)
    string.format("%s")
    local oops
    local t = 1/oops
end

function set_inactivate_input_time(delta)
    db.storage[db.actor:id()].disable_input_time = game.get_game_time()
    db.storage[db.actor:id()].disable_input_idle = delta
    level.disable_input()
end

-- іринимает: позициі положения, позициі куда смотреть, время сна в минутах.
--[[
function set_sleep_relocate(point, look, timeout)
    db.storage[db.actor:id()].sleep_relocate_time = game.get_game_time()
    db.storage[db.actor:id()].sleep_relocate_idle = timeout*60
    db.storage[db.actor:id()].sleep_relocate_point = point
    db.storage[db.actor:id()].sleep_relocate_look = look
end
]]--

-- проверяет целую часть числа на нечетность
function odd( x )
    return math.floor( x * 0.5 ) * 2 == math.floor( x )
end

--' находится ли NPC во фруструме игрока
function npc_in_actor_frustrum(npc)
    local actor_dir = device().cam_dir
    --local actor_dir = db.actor:direction()
    local npc_dir = npc:position():sub(db.actor:position())
    local yaw = yaw_degree3d(actor_dir, npc_dir)
    --printf("YAW %s", tostring(yaw))
    return yaw < 35
end

function start_game_callback()
    aa = alife()

    squad_community_by_behaviour = {
        ["stalker"]                            = "stalker",
        ["bandit"]                            = "bandit",
        ["dolg"]                            = "dolg",
        ["freedom"]                            = "freedom",
        ["army"]                            = "army",
        ["ecolog"]                            = "ecolog",
        ["killer"]                            = "killer",
        ["trader"]                            = "trader",
        ["zombied"]                            = "zombied",
        ["monolith"]                        = "monolith",
        ["monster"]                            = "monster",
        ["monster_predatory_day"]            = "monster",
        ["monster_predatory_night"]            = "monster",
        ["monster_vegetarian"]                = "monster",
        ["monster_zombied_day"]                = "monster",
        ["monster_zombied_night"]            = "monster",
        ["monster_special"]                    = "monster"
    }




    monster_classes = {
        [clsid.bloodsucker_s]             = true,
        [clsid.boar_s]                     = true,
        [clsid.dog_s]                     = true,
        [clsid.flesh_s]                 = true,
        [clsid.pseudodog_s]             = true,
        [clsid.burer_s]                 = true,
--        [clsid.cat_s]                     = true,
        [clsid.chimera_s]                 = true,
        [clsid.controller_s]             = true,
--        [clsid.fracture_s]                 = true,
        [clsid.poltergeist_s]             = true,
        [clsid.gigant_s]                 = true,
--        [clsid.zombie_s]                 = true,
        [clsid.snork_s]                 = true,
        [clsid.tushkano_s]                 = true,
        [clsid.psy_dog_s]                 = true,
        [clsid.psy_dog_phantom_s]         = true}

    stalker_classes = {
        [clsid.script_actor]             = true,
        [clsid.script_stalker]             = true,
        [clsid.script_trader]            = true}

    weapon_classes = {
        [clsid.wpn_vintorez_s]             = true,
        [clsid.wpn_ak74_s]                 = true,
        [clsid.wpn_lr300_s]             = true,
        [clsid.wpn_hpsa_s]                 = true,
        [clsid.wpn_pm_s]                 = true,
        [clsid.wpn_shotgun_s]             = true,
        [clsid.wpn_auto_shotgun_s]        = true,
        [clsid.wpn_bm16_s]                 = true,
        [clsid.wpn_svd_s]                 = true,
        [clsid.wpn_svu_s]                 = true,
        [clsid.wpn_rg6_s]                 = true,
        [clsid.wpn_rpg7_s]                 = true,
        [clsid.wpn_val_s]                 = true,
        [clsid.wpn_walther_s]             = true,
        [clsid.wpn_usp45_s]             = true,
        [clsid.wpn_groza_s]             = true,
        [clsid.wpn_knife_s]             = true,
        [clsid.wpn_grenade_f1_s]         = true,
        [clsid.wpn_grenade_rgd5_s]         = true,
        [clsid.wpn_grenade_launcher]     = true,
        [clsid.wpn_grenade_fake]         = true}

    artefact_classes = {
        [clsid.art_bast_artefact]         = true,
        [clsid.art_black_drops]         = true,
        [clsid.art_dummy]                 = true,
        [clsid.art_electric_ball]         = true,
        [clsid.art_faded_ball]             = true,
        [clsid.art_galantine]             = true,
        [clsid.art_gravi]                 = true,
        [clsid.art_gravi_black]         = true,
        [clsid.art_mercury_ball]         = true,
        [clsid.art_needles]             = true,
        [clsid.art_rusty_hair]             = true,
        [clsid.art_thorn]                 = true,
        [clsid.art_zuda]                 = true,
        [clsid.artefact]                 = true,
        [clsid.artefact_s]                 = true}

    printf    ("start_game_callback called")
    smart_names.init_smart_names_table()
    task_manager.clear_task_manager()
    sound_theme.load_sound()
    xr_sound.start_game_callback()
    dialog_manager.fill_phrase_table()
    xr_s.init()
    sim_objects.clear()
    sim_board.clear()
    sr_light.clean_up ()
    pda.add_quick_slot_items_on_game_start()
    -- Tестирование оптимизации
    --local test_object = test_object.test_object_class()
    --test_object:test()
    
  --AMK UTILS--
--  amk.on_game_start(obj)
--  amk_utils.start_game()
  --AMK UTILS--
end

--' Lсталость
function on_actor_critical_power()

end

function on_actor_critical_max_power()
end

--' іровотечение
function on_actor_bleeding()

end

function on_actor_satiety()
end

--' іадиация
function on_actor_radiation()

end

--' іаклинило оружие
function on_actor_weapon_jammed()

end

--' не может ходить изза веса
function on_actor_cant_walk_weight()

end

--' пси воздействие
function on_actor_psy()
end

function give_info (info)
    db.actor:give_info_portion(info)
end
function disable_info (info)
    if has_alife_info(info) then
        printf("*INFO*: disabled npc='single_player' id='%s'", info)
        db.actor:disable_info_portion(info)
    end
end

function create_ammo(section, position, lvi, gvi, pid, num)
    local ini = system_ini()

    local num_in_box = ini:r_u32(section, "box_size")
    local t = {}
    while num > num_in_box do
        local obj = alife():create_ammo(section, position, lvi,    gvi, pid, num_in_box)
        table.insert(t, obj)
        num = num - num_in_box
    end
    local obj = alife():create_ammo(section, position, lvi,    gvi, pid, num)
    table.insert(t, obj)
    return t
end

ammo_section = {}
ammo_section["ammo_9x18_fmj"]        = true
ammo_section["ammo_9x18_pmm"]        = true
ammo_section["ammo_9x19_fmj"]        = true
ammo_section["ammo_9x19_pbp"]        = true
ammo_section["ammo_5.45x39_fmj"]    = true
ammo_section["ammo_5.45x39_ap"]        = true
ammo_section["ammo_5.56x45_ss190"]    = true
ammo_section["ammo_5.56x45_ap"]        = true
ammo_section["ammo_5.7x28_fmj"]        = true
ammo_section["ammo_5.7x28_ap"]        = true
ammo_section["ammo_7.62x54_7h1"]    = true
ammo_section["ammo_9x39_pab9"]        = true
ammo_section["ammo_gauss"]            = true
ammo_section["ammo_9x39_ap"]        = true
ammo_section["ammo_11.43x23_fmj"]    = true
ammo_section["ammo_11.43x23_hydro"]    = true
ammo_section["ammo_12x70_buck"]        = true
ammo_section["ammo_12x76_zhekan"]    = true
ammo_section["ammo_pkm_100"]        = true

quest_section = {}
-- преобразует строку в соответствии со значением
function get_param_string(src_string , obj)
    --printf("src_string is [%s] obj name is [%s]", tostring(src_string), obj:name())
    local script_ids = db.script_ids[obj:id()]
    local out_string, num = string.gsub(src_string, "%$script_id%$", tostring(script_ids))
    if num > 0 then
        return out_string , true
    else
        return src_string , false
    end
end

local save_markers = {}

-- Функции для проверки корректности сейв лоад
function set_save_marker(p, mode, check, prefix)

    -- определяем ключ маркера.
    local result = ""
--    if debug ~= nil then
--        local info_table = debug.getinfo(2)
--        local script_name = string.gsub(info_table.short_src, "%.script", "")
--        script_name = string.gsub(script_name, "gamedata\\scripts\\", "")
--        result = script_name
--    end

--    if prefix ~= nil then
        result = result .. "_" .. prefix
--    end

    if check == true then
        if save_markers[result] == nil then
            abort("Trying to check without marker %s", result)
        end

        if mode == "save" then
            local dif = p:w_tell() - save_markers[result]
            printf(result..": SAVE DIF: %s", dif)
            if dif >= 8000 then
                printf("WARNING! may be this is problem save point")
            end
            if dif >= 10240 then
--                abort("You are saving too much")
            end
            p:w_u16(dif)
        else
            local c_dif = p:r_tell() - save_markers[result]
            local dif = p:r_u16()
             if dif ~= c_dif then
                 abort("INCORRECT LOAD [%s].[%s][%s]", result, dif, c_dif)
             else
                 printf(result..": LOAD DIF: %s", dif)
             end
        end
        return
    end

    if mode == "save" then
        printf(result..": set save marker: %s", p:w_tell())
        save_markers[result] = p:w_tell()
        if p:w_tell() > 16000 then
            abort("You are saving too much")
        end
    else
        printf(result..": set load marker: %s", p:r_tell())
        save_markers[result] = p:r_tell()
    end

end
-- переводит вектор в строку.
function vec_to_str (vector)
    if vector == nil then return "nil" end
    return string.format("[%s:%s:%s]", vector.x, vector.y, vector.z)
end
-- выводит в лог стэк вызова функций.
function callstack()
    if debug ~= nil then
        log(debug.traceback(2))
    end
end
-- меняет team:squad:group обьекта.
function change_team_squad_group(se_obj, team, squad, group)
    local cl_obj = db.storage[se_obj.id] and db.storage[se_obj.id].object
    if cl_obj ~= nil then
        cl_obj:change_team(team, squad, group)
    else
        se_obj.team = team
        se_obj.squad = squad
        se_obj.group = group
    end
    --printf("_G:TSG: [%s][%s][%s]", tostring(se_obj.team), tostring(se_obj.squad), tostring(se_obj.group))
end
--     Story_ID -------------------------------------------------------------
function add_story_object(obj_id , story_obj_id)
    story_objects.get_story_objects_registry():register(obj_id , story_obj_id)
end

function get_squad_by_sid(sid)
    local obj_id = story_objects.get_story_objects_registry():get(sid)
    if obj_id == nil then abort("_g.get_squad_by_sid obj_id=nil sid=[%s]",sid) end
    return alife():object(obj_id)
end

function get_story_object(story_obj_id)
    local obj_id = story_objects.get_story_objects_registry():get(story_obj_id)
    if obj_id == nil then return nil end
    return (db.storage[obj_id] and db.storage[obj_id].object) or (level ~= nil and level.object_by_id(obj_id))
end

function get_object_story_id(obj_id)
    return story_objects.get_story_objects_registry():get_story_id(obj_id)
end

function get_story_object_id(story_obj_id)
    return story_objects.get_story_objects_registry().id_by_story_id[story_obj_id]
end

function unregister_story_object_by_id(obj_id)
    story_objects.get_story_objects_registry():unregister_by_id(obj_id)
end

function unregister_story_id(story_id)
    story_objects.get_story_objects_registry():unregister_by_story_id(story_id)
end

-----------------------------------------------------------------------------------------------
-- Получить сквад обьекта!!!!!
function get_object_squad(object)
    if object == nil then abort("You are trying to get squad_object from NIL object!!!") end
    local obj_id = nil
    if type(object.id) == "function" then
        obj_id = object:id()
    else
        obj_id = object.id
    end
    local se_obj = alife():object(obj_id)
    if se_obj and se_obj.group_id ~= 65535 then
        return alife():object(se_obj.group_id)
    end
    return nil
end

function get_story_squad(story_id)
    local squad_id = get_story_object_id(story_id)
    return squad_id and alife():object(squad_id)
end

--Проверка по временному интервалу.
function in_time_interval(val1, val2)
    local game_hours = level.get_time_hours()
    if val1 >= val2 then
        return game_hours < val2 or game_hours >= val1
    else
        return game_hours < val2 and game_hours >= val1
    end
end

function show_all_ui(show)
        local hud = get_hud()
    if(show) then
            level.show_indicators()
--        db.actor:restore_weapon()
            db.actor:disable_hit_marks(false)
            hud:show_messages()
    else
            if db.actor:is_talking() then
                    db.actor:stop_talk()
            end
            level.hide_indicators_safe()
            hud:HideActorMenu()
            hud:HidePdaMenu()
            hud:hide_messages()
--        db.actor:hide_weapon()
            db.actor:disable_hit_marks(true)
    end
end

 

 

Нужно убрать вызов log1(...) из этой функции и привести к ст.значению.

 

function printf(fmt,...)

    local is_g = 0
    local result = fmt
    if debug == nil then
        log(string.format(fmt,...))
        return
    end
    local info_table = debug.getinfo(2)
    local script_name = string.gsub(info_table.short_src, "%.script", "")
    script_name = string.gsub(script_name, "gamedata\\scripts\\", "")

    if scripts_to_print[script_name] == false then return end

    script_name,is_g = string.gsub(script_name, "_g", "")
    if is_g == 0 then
        result = script_name..":("..info_table.currentline.."):"..fmt
    else
        result = fmt
    end
    log(string.format(result,...))

end

 

 

bind_stalker.script -- отключаем вызовы _sdata.script

 

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 weapon_hide = {}
local primary_objects_filled = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
    printf("Prizrak111__init")
    self.bCheckStart = false
    self.weather_manager = level_weathers.get_weather_manager()
    self.surge_manager = surge_manager.get_surge_manager()
    --self.actor_detector = xr_detector.actor_detector()
    self.last_level_name = nil
    self.deimos_intensity = nil
--    self.actor_weapon_on_start = true
    self.loaded_active_slot = 3
    self.loaded_slot_applied = false
    self.last_detective_achievement_spawn_time     = nil
    self.last_mutant_hunter_achievement_spawn_time    = nil
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
    printf("Prizrak111__net_spawn")
--    printf("actor net spawn")
    level.show_indicators()
    self.bCheckStart = true
    self.weapon_hide = false -- спрятано или нет оружие при разговоре.
    self.weapon_hide_in_dialog = false
    weapon_hide = {} -- устанавливаем глобальный дефолтовый флаг.
    if object_binder.net_spawn(self,data) == false then
        return false
    end
    db.add_actor(self.object)
    db.actor.deimos_intensity = self.deimos_intensity
    self.deimos_intensity = nil
    if self.st.disable_input_time == nil then
        level.enable_input()
    end
    xr_s.on_game_load()                                    --' Distemper 03.2008 --
    self.weather_manager:reset()
    --' Загружаем настройки дропа
    death_manager.init_drop_settings()
    --'Устанавливаем ссылку на таскменеджер
    self.task_manager = task_manager.get_task_manager()
    self.spawn_frame = device().frame
    self.already_jumped = false
    self.loaded = false
    benchmark.main()                                      --' Distemper 06.2008 --
    return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
    xr_sound.stop_sounds_by_id(self.object:id())
    local board_factions = sim_board.get_sim_board().players
    if(board_factions) then
            for k,v in pairs (board_factions) do
                    xr_sound.stop_sounds_by_id(v.id)
            end
    end
    if(actor_stats.remove_from_ranking~=nil)then
        actor_stats.remove_from_ranking(self.object:id())
    end
    level.show_weapon(true)
    db.del_actor(self.object)

    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.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)
    self.object:set_callback(callback.use_object, nil)

    log("--------->"..tostring(_G.amb_vol))
    log("--------->"..tostring(_G.mus_vol))
    if(_G.amb_vol~=0) then
        get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
        _G.amb_vol = 0
    end
    if(_G.mus_vol~=0) then
        get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
        _G.mus_vol = 0
    end
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:destroy()
        sr_psy_antenna.psy_antenna = false
    end
    xrs_dyn_music.finish_theme()
    xr_s.on_actor_destroy()
    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.object:set_callback(callback.inventory_info, self.info_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.task_state, self.task_callback, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
    self.object:set_callback(callback.use_object, self.use_inventory_item, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
    local box_name = box:name()
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
    printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
    printf("GIGATEST")
    --' Сюжет
    -- Отметки на карте
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)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
    printf("on_item_take [%s]", obj:name())
    if isArtefact(obj) then
        local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]
        if anomal_zone ~= nil then
            anomal_zone:on_artefact_take(obj)
        else
            bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil
        end
        local artefact = obj:get_artefact()
        artefact:FollowByPath("NULL",0,vector():set(500,500,500))
        xr_statistic.inc_founded_artefacts_counter(obj:id())
--[[
        local s_art = alife():object(obj:id())
        if(s_art) then
            xr_statistic.inc_founded_artefacts_counter(s_art:section_name())
        else
            xr_statistic.inc_founded_artefacts_counter()
        end
]]
    end
    treasure_manager.get_treasure_manager():on_item_take(obj:id())
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
end

function actor_binder:use_inventory_item(obj)
    if(obj) then
        local s_obj = alife():object(obj:id())
        if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then
            xr_effects.disable_ui_only(db.actor, nil)
            level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
            level.add_pp_effector("surge_fade.ppe", 11, false)
            give_info("anabiotic_in_process")
            _G.mus_vol = get_console():get_float("snd_volume_music")
            _G.amb_vol = get_console():get_float("snd_volume_eff")
            get_console():execute("snd_volume_music 0")
            get_console():execute("snd_volume_eff 0")
        end
    end
end

function anabiotic_callback()
    level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2")
    local rnd = math.random(35,45)
    local m = surge_manager.get_surge_manager()
    if(m.started) then
        local tf = level.get_time_factor()
        local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf)
            if(rnd>(m.surge_time-diff_sec)*tf/60) then
            m.time_forwarded = true
            m.ui_disabled = true
            m:kill_all_unhided()
            m:end_surge()
        end
    end
    level.change_game_time(0,0,rnd)
    level_weathers.get_weather_manager():forced_weather_change()
    printf("anabiotic_callback: time forwarded on [%d]", rnd)
end

function anabiotic_callback2()
    xr_effects.enable_ui(db.actor, nil)
    get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
    get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
    _G.amb_vol = 0
    _G.mus_vol = 0
    disable_info("anabiotic_in_process")
end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _state)
    if _state ~= task.fail then
        if _state == task.completed then
            news_manager.send_task(db.actor, "complete", _task)
        else
            news_manager.send_task(db.actor, "new", _task)
        end
    end
    task_manager.task_callback(_task, _state)
end

----------------------------------------------------------------------------------------------------------------------

function actor_binder:update(delta)
    object_binder.update(self, delta)

    if string.find(command_line(), "-designer") then
        return
    end

    if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
        jump_level.try_to_jump()
        self.already_jumped = true
        return
    end

    -- Вызов апдейта переноса игрока проводником
    if travel_func ~= nil then
        travel_func()
    end

    -- DEBUG slowdown
    --slowdown.update()
    local time = time_global()
    game_stats.update (delta, self.object)
    -- апдейт погоды
    self.weather_manager:update()

    self:check_detective_achievement()
    self:check_mutant_hunter_achievement()

    --' Апдейт саундменеджера
    xr_sound.update(self.object:id())

    -- Обновление отключения ввода с клавиатуры.
    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.object:is_talking() then
        if self.weapon_hide_in_dialog == false then
            self.object:hide_weapon()
            printf("hiding weapon!!!")
            self.weapon_hide_in_dialog = true
        end
    else
        if self.weapon_hide_in_dialog == true then
            printf("restoring weapon!!!")
            self.object:restore_weapon()
            self.weapon_hide_in_dialog = false
        end
    end
    -- Апдейт прятание оружия игрока в зоне sr_no_weapon
    if check_for_weapon_hide_by_zones() == true then
        if self.weapon_hide == false then
            printf("hiding weapon!!!")
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            printf("restoring weapon!!!")
            self.object:restore_weapon()
            self.weapon_hide = false
        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():TextControl():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("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
        self.bCheckStart = false

--        if self.actor_weapon_on_start == true then
--            db.actor:activate_slot(3)
--            self.actor_weapon_on_start = false
--        end
    end
--    device().precache_frame  == 0 and
    if not self.loaded_slot_applied then
        self.object:activate_slot(self.loaded_active_slot)
        self.loaded_slot_applied = true
    end
    
    xr_s.on_actor_update(delta)

    if(self.surge_manager) then
        if(self.f_surge_manager_loaded ~= true) then
            self.surge_manager:initialize()
            self.f_surge_manager_loaded = true
        end
        if(self.surge_manager.levels_respawn[level.name()]) then
            self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
        end
        self.surge_manager:update()
    end
    -- Апдейт доступности для симуляции.
    simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())

    if not self.loaded then
        get_console():execute("dump_infos")
        self.loaded = true
    end
    treasure_manager.get_treasure_manager():update()

    if not(primary_objects_filled) then
        pda.fill_primary_objects()
        primary_objects_filled = true
    end
    pda.fill_sleep_zones()
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
    set_save_marker(packet, "save", false, "actor_binder")
    object_binder.save(self, packet)
    --' Сохраняем уровень сложности
    packet:w_u8(level.get_game_difficulty())
    --' Сохраняем данные об отключенном вводе
    if self.st.disable_input_time == nil then
        packet:w_bool(false)
    else
        packet: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)
    release_body_manager.get_release_body_manager():save(packet)
    self.surge_manager:save(packet)
    sr_psy_antenna.save( packet )
    packet:w_bool(sim_board.get_sim_board().simulation_started)

    xr_sound.actor_save(packet)
    packet:w_stringZ(tostring(self.last_level_name))
    xr_statistic.save(packet)
    treasure_manager.get_treasure_manager():save(packet)

    local n = 0
    for k,v in pairs(db.script_ids) do
        n = n + 1
    end
    packet:w_u8(n)
    for k,v in pairs (db.script_ids) do
        packet:w_u16(k)
        packet:w_stringZ(v)
    end
    task_manager.get_task_manager():save(packet)

--    packet:w_bool(self.actor_weapon_on_start)
    
    packet:w_u8(self.object:active_slot())


    local deimos_exist = false
    for k,v in pairs(db.zone_by_name) do
        if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then
            deimos_exist = true
            packet:w_bool(true)
            packet:w_float(db.storage[v:id()].sr_deimos.intensity)
        end
    end
    if not deimos_exist then
        packet:w_bool(false)
    end

    if self.last_detective_achievement_spawn_time == nil then
        packet:w_bool(false)
    else
        packet:w_bool(true)
        utils.w_CTime(packet, self.last_detective_achievement_spawn_time)
    end
    if self.last_mutant_hunter_achievement_spawn_time == nil then
        packet:w_bool(false)
    else
        packet:w_bool(true)
        utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time)
    end
    set_save_marker(packet, "save", true, "actor_binder")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
    printf("Prizrak111__load")
    set_save_marker(reader, "load", false, "actor_binder")
    object_binder.load(self, reader)
    --' Загружаем уровень сложности
    local game_difficulty = reader:r_u8()
    printf("load game_difficulty %s", tostring(game_difficulty))
    get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
    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)
    release_body_manager.get_release_body_manager():load(reader)
--    self.surge_manager:initialize()
    self.surge_manager:load(reader)
    self.f_surge_manager_loaded = true
    sr_psy_antenna.load(reader)
    sim_board.get_sim_board().simulation_started = reader:r_bool()

    xr_sound.actor_load(reader)
    local n = reader:r_stringZ()
    if(n~="nil") then
        self.last_level_name = n
    end
    xr_statistic.load(reader)
    treasure_manager.get_treasure_manager():load(reader)
    n = reader:r_u8()
    for i = 1,n do
        db.script_ids[reader:r_u16()] = reader:r_stringZ()
    end

    task_manager.get_task_manager():load(reader)

--    self.actor_weapon_on_start = reader:r_bool()
    
    self.loaded_active_slot = reader:r_u8()
    
    self.loaded_slot_applied = false

    local b = reader:r_bool()
    if(b) then
        self.deimos_intensity = reader:r_float()
    end

    local stored_achievement_time = reader:r_bool()
    if stored_achievement_time == true then
        self.last_detective_achievement_spawn_time = utils.r_CTime(reader)
    end
    stored_achievement_time = reader:r_bool()
    if stored_achievement_time == true then
        self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader)
    end
    set_save_marker(reader, "load", true, "actor_binder")
end

--*************************************************************
--*                    Подспаун вещей в ящики                      *
--*************************************************************
local detective_achievement_items         = {    "medkit",
                                            "antirad",
                                            "bandage"}

local mutant_hunter_achievement_items    = {    "ammo_5.45x39_ap",
                                            "ammo_5.56x45_ap",
                                            "ammo_9x39_ap",
                                            "ammo_5.56x45_ap",
                                            "ammo_12x76_zhekan"}

local function spawn_achivement_items(items_table, count, inv_box_story_id)
    local inv_box = alife():object(get_story_object_id(inv_box_story_id))
    for i = 1,count do
        alife():create(items_table[math.random(#items_table)],
                        inv_box.position,
                        inv_box.m_level_vertex_id,
                        inv_box.m_game_vertex_id,
                        inv_box.id)
    end
end

function actor_binder:check_detective_achievement()
    if not has_alife_info("detective_achievement_gained") then
        return
    end
    if self.last_detective_achievement_spawn_time == nil then
        self.last_detective_achievement_spawn_time = game.get_game_time()
    end
    if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then
        spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure")
        xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"})
        self.last_detective_achievement_spawn_time = game.get_game_time()
    end
end

function actor_binder:check_mutant_hunter_achievement()
    if not has_alife_info("mutant_hunter_achievement_gained") then
        return
    end
    if self.last_mutant_hunter_achievement_spawn_time == nil then
        self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
    end
    if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then
        spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure")
        xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"})
        self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
    end

end

----------------------------------------------------------------------------------------------------------------------

function check_for_weapon_hide_by_zones()
    for k,v in pairs(weapon_hide) do
        if v == true then
            return true
        end
    end
    return false
end

-- Weapon functions
function hide_weapon(zone_id)
    printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
    weapon_hide[zone_id] = true
end

function restore_weapon(zone_id)
    printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
    weapon_hide[zone_id] = false
end

 

 

Вроде так ... было давно и не правда...

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

Что-то кончается, что-то начинается...

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


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

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