Vano_Santuri 33 Опубликовано 21 Октября 2011 Такой вопрос. Суть данной работы является перенос НС, или же сюжета ТЧ на двиг ЗП ? (АМК - там понятно, скрипты...) у меня вопрос по сюжету. Просто это было так давно, что я забыл.... Что-то кончается, что-то начинается... Поделиться этим сообщением Ссылка на сообщение
Vano_Santuri 33 Опубликовано 27 Мая 2012 (изменено) 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 Вроде так ... было давно и не правда... Изменено 27 Мая 2012 пользователем Vano_Santuri Что-то кончается, что-то начинается... Поделиться этим сообщением Ссылка на сообщение