Vano_Santuri 33 Опубликовано 27 Мая 2012 Поделиться Опубликовано 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 Что-то кончается, что-то начинается... Ссылка на комментарий
Артём Карпенко 0 Опубликовано 21 Сентября 2012 Поделиться Опубликовано 21 Сентября 2012 Я в шоке,фиг с тем балансом,моделями,звуками и второстепенными квестами - это всё со временем...Неужели не найдутся те кто допилят основной сюжет?! Ссылка на комментарий
KD87 718 Опубликовано 22 Сентября 2012 Поделиться Опубликовано 22 Сентября 2012 Артём Карпенко, это большой пласт нудной работы, которая не сильно кому нужна в итоге. Нужны квестовики, скриптеры - это для начала. Пойди найди хотя бы пару нормальных скриптеров, которые бы за это взялись. Если очень хочется - займись сам, в чем проблема? Ссылка на комментарий
Артём Карпенко 0 Опубликовано 24 Сентября 2012 Поделиться Опубликовано 24 Сентября 2012 Увы я просто игрок... Ссылка на комментарий
Patogens 0 Опубликовано 26 Декабря 2012 Поделиться Опубликовано 26 Декабря 2012 Что то не распаковываются у меня файлы.Все делал по инструкции.Пишет "не удалось открыть файл ...... как архив". В чем может быть проблема? Ссылка на комментарий
lambdist 16 Опубликовано 13 Февраля 2013 Поделиться Опубликовано 13 Февраля 2013 (изменено) Имеет ли смысл дорабатывать мне наработки из этой модификации? Просто, я затеял ремейк ТЧ на ЗП и оговорюсь, что часть фич придётся мне убирать, если они вызывают баги и не нужны. Ну, и нацелен несущественно изменить локации, добавив на них некоторые элементы. Просто, я прочёл, что при возможности, можно ожидать поддержку от автора и возможно его товарищей. Также я нацелен указать авторство всех, кто мне помогает, ибо не хочется слыть неким вроде Москвина. =-) Ну, и по сути, мне не имеет смысла самому подобное осуществлять заново, ибо я могу улучшить то, что не доделали. Для начала, я попытаюсь улучшить мод в пределах локации Кордон, ибо он имеет некоторые ошибки (одно слегка парящее под наклоном дерево у моста и несколько неприятных вещей). Ну, и попытаюсь настроить и вплести в геймплей игры пару фич, которые я нашёл методом тыка с помощью конфигов. Возможно, договорюсь с авторами ARS мода, т.к. там часть наработок (такие как жажда) сделаны на уровне Fallout: New Vegas и других современных RPG-FPS. Изменено 13 Февраля 2013 пользователем lambdist A.A.A. Modpack:https://yadi.sk/d/UPMwEl7ecjN4i Ссылка на комментарий
Shredder 49 Опубликовано 13 Февраля 2013 Поделиться Опубликовано 13 Февраля 2013 Я надеюсь ты реально представляешь объём работ по переносу ТЧ на ЗП даже без фич? И если уж всерьёз решил взять на себя такую ношу, то я бы тебе посоветовал все фичи оставить на потом, когда основной сюжет будет работать без глюков и багов, ибо при возникновении последних отлаживать будет проще. ИМХО. Ссылка на комментарий
lambdist 16 Опубликовано 13 Февраля 2013 Поделиться Опубликовано 13 Февраля 2013 (изменено) Я надеюсь ты реально представляешь объём работ по переносу ТЧ на ЗП даже без фич? И если уж всерьёз решил взять на себя такую ношу, то я бы тебе посоветовал все фичи оставить на потом, когда основной сюжет будет работать без глюков и багов, ибо при возникновении последних отлаживать будет проще. ИМХО. У меня только пара фич юзабельных через конфиги. Остальные есть желание добавить впоследствии отладки мода и расширения модифификации эпизодически за счёт отключения неотлаженных и подключения отлаженных локаций: эдакий путь от рабочей альфы к отлаженной бете. Не обратил значит... Ну что ж... ColR_iT Изменено 13 Февраля 2013 пользователем ColR_iT A.A.A. Modpack:https://yadi.sk/d/UPMwEl7ecjN4i Ссылка на комментарий
lambdist 16 Опубликовано 16 Февраля 2013 Поделиться Опубликовано 16 Февраля 2013 А, где взять xrGame.dll файл для запуска? =-) A.A.A. Modpack:https://yadi.sk/d/UPMwEl7ecjN4i Ссылка на комментарий
Shredder 49 Опубликовано 18 Февраля 2013 Поделиться Опубликовано 18 Февраля 2013 xray-extension для ЗП Ссылка на комментарий
TORR 4 Опубликовано 23 Февраля 2013 Поделиться Опубликовано 23 Февраля 2013 При загрузке Агропрома вылетает ( жалуется на аи сетку) может кто-нибудь знает решение? Не доставай меня, а то врежу! Ссылка на комментарий
lambdist 16 Опубликовано 23 Февраля 2013 Поделиться Опубликовано 23 Февраля 2013 xray-extension для ЗП Где его взять? Я прочистил все темы в интернете и ссылок нет даже на Google Code. A.A.A. Modpack:https://yadi.sk/d/UPMwEl7ecjN4i Ссылка на комментарий
Shredder 49 Опубликовано 24 Февраля 2013 Поделиться Опубликовано 24 Февраля 2013 Ищи в этой теме http://www.amk-team.ru/forum/index.php?showtopic=10538, там написано, как собрать готовый xrGame.dll Ссылка на комментарий
aka_sektor 1 476 Опубликовано 25 Марта 2019 Поделиться Опубликовано 25 Марта 2019 (изменено) До сих пор не уходят мысли о Тенях Чернобыля на X-Ray 1.6. Интересно, были ли подвижки какие-нибудь за это время? Вот Call of Chernobyl, можно назвать ремейком ТЧ? Вроде бы там нет квестов оригинальной игры. А по факту, если разобраться, ЗП ведь проще ТЧ в плане моддинга. Чего стоит воссоздать сюжетную часть ТЧ на движке ЗП? На первый взгляд ничего сверхъестественного делать не нужно, если понимаешь все эти скрипты, логику. История моддинга серии знавала более хитроумные квесты. Изменено 25 Марта 2019 пользователем aka_sektor Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB Ссылка на комментарий
lafugix 678 Опубликовано 25 Марта 2019 Поделиться Опубликовано 25 Марта 2019 @aka_sektor, действительно, ничего сверхъестественного. Можешь приступать. 2 Убедитесь, что вы имеете право убедиться Ссылка на комментарий
aka_sektor 1 476 Опубликовано 25 Марта 2019 Поделиться Опубликовано 25 Марта 2019 @lafugix, ну давай размышлять. Первый этап: локационный пак. С этим какие сложности в SDK 0.7 ? Никаких. Разве что, если брать из пака исходников, то придется исправить у моделей инвалид фэйсы, и ошибки сглаживания. Второй этап: ключевые персонажи. Расставить неписей, Сидорович, Волк, Петруха, Шустрый, Лис, Серый, Крот, Бармен, Сахаров, О-сознание. Третий этап: основной сюжет. Добавить диалоги, от Сидора к Волку. От Волка к Петрухе. От Шустрого к Сидору. От Сидора к Лису. От Лиса к Серому. От Серого к Кроту. Документы закинуть на Агро, квест занести Бармену. От Бармена квест в X-18, добавить доки. Квест занести доки Бармену (Сидору). Диалог от Бармена к Сахарову. От Сахарова в X-16, добавить доки. От них к Бармену. От Бармена, отключать Выжигатель. Дальше, пробежка Припять -> ЧАЭС-1 -> Монолит -> ЧАЭС-2. Финальный портал. Игра пройдена. Дальше продолжать? Или смысл ясен... 1 Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB Ссылка на комментарий
lafugix 678 Опубликовано 25 Марта 2019 Поделиться Опубликовано 25 Марта 2019 Вот видишь, у тебя даже план какой-никакой есть. Делай же. Или ты поднял тему 2011 года только ради пустопорожних рассуждений, в надежде на то, что кто-то заинтересуется тем, что игнорируется уже шесть лет? Убедитесь, что вы имеете право убедиться Ссылка на комментарий
aka_sektor 1 476 Опубликовано 25 Марта 2019 Поделиться Опубликовано 25 Марта 2019 (изменено) @lafugix, я тему поднял, чтобы обсудить, что мешало другим это сделать за 8 лет с выпуска X-Ray SDK 0.7 в народ? Может неправильный подход? Трудно сказать, как именно @_Призрак_ пытался воссоздать ТЧ, если я правильно понял, он взял пак локаций, и начал переносить куски кода из ТЧ на ЗП, причем всё это на скриптах только, без использования SDK. Иначе, на кой ему координаты на экран выводить? Наверное ему было так проще, мы же знаем все эти скриптовые сюжетные моды. Изменено 25 Марта 2019 пользователем aka_sektor Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB Ссылка на комментарий
UriZzz 1 004 Опубликовано 25 Марта 2019 Поделиться Опубликовано 25 Марта 2019 (изменено) @aka_sektor, амбициозный прожект, но будет ли к нему интерес со стороны конечных юзеров/модеров/ковыряторов? Тут должна быть изюминка которая бы выделила его на фоне прогрессивно развивающегося движка ТЧ Изменено 25 Марта 2019 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
aka_sektor 1 476 Опубликовано 25 Марта 2019 Поделиться Опубликовано 25 Марта 2019 только что, UriZzz сказал: будет ли к нему интерес Ну тут типа мышление такое, Тот Самый ТЧ, но на движке Зова Припяти. Зачем думаешь переносят Обливион на движок Скайрима (см. Skyblivion) ? Думаю, для тех кто это делает - мечта что ли... желание подарить любимой игре вторую жизнь. 3 минуты назад, UriZzz сказал: конечных юзеров/модемов/ковыряторов Ну тут, точно сказать нельзя, пока не зарелизишь. Сарафанное радио сработает, если что-то годное получится. Тех же стримеров, на постоянке спрашивают, посоветуйте ТОП модов на ЗП. Заинтересовать дело нехитрое. Удержать уже сложнее. Пройдут, подведут итоги, хорошо или забагованное Г. Если хорошо, останутся, начнут сами пилить моды. Хе-хе... или с ТЧ переносить. 1 Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти