Хантер 0 Опубликовано 1 Октября 2010 Поделиться Опубликовано 1 Октября 2010 мужики, выручайте! делаю свой мод на основе р.м.а. В общем, много чего уже добавил, но не могу справиться с одним вылетом, который происходит при загрузке быстрого сейва вот лог: * Detected CPU: AuthenticAMD , F15/M15/S2, 2141.00 mhz, 5-clk 'rdtsc' * CPU Features: RDTSC, MMX, 3DNow!, SSE, SSE2 Initializing File System... using fs-ltx fsgame.ltx --found external arch mp_military_2.xdb0 FS: 48143 files cached, 9227Kb memory used. Init FileSystem 5.181684 sec 'xrCore' build 3312, Feb 27 2008 Initializing Engine... Executing config-script "user.ltx"... [f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\user.ltx] successfully loaded. Starting INPUT device... Loading DLL: xrRender_R2.dll Loading DLL: xrGame.dll * [win32]: free[1970228 K], reserved[52380 K], committed[74480 K] * [ D3D ]: textures[0 K] * [x-ray]: crt heap[11216 K], process heap[1706 K], game lua[0 K], engine lua[0 K], render[0 K] * [x-ray]: economy: strings[1361 K], smem[0 K] Executing config-script "f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx"... ! cant convert dik_name for dik[144], prop=[ [f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx] successfully loaded. Executing config-script "user.ltx"... Executing config-script "f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\rspec_high.ltx"... ! Unknown command: r__wallmark_ttl ! Unknown command: rs_skeleton_update [f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\rspec_high.ltx] successfully loaded. Executing config-script "f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx"... [f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx] successfully loaded. [f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\user.ltx] successfully loaded. SOUND: OpenAL: enumerate devices... SOUND: OpenAL: EnumerationExtension Present devices Generic Hardware SOUND: OpenAL: system default SndDevice name is Generic Hardware SOUND: OpenAL: default SndDevice name set to Generic Software SOUND: OpenAL: All available devices: 1. Generic Software, Spec Version 1.1 (default) 2. Generic Software, Spec Version 1.1 (default) SOUND: OpenAL: SelectBestDevice is Generic Software 1.1 SOUND: OpenAL: Required device: Generic Software. Created device: Generic Software. * sound: EAX 2.0 extension: absent * sound: EAX 2.0 deferred: absent * sound : cache: 65538 kb, 7609 lines, 8820 bpl Starting RENDER device... * GPU [vendor:1002]-[device:9586]: ATI Radeon HD 2600 XT AGP (Microsoft Corporation WDDM 1.1) * GPU driver: 8.14.10.630 * CREATE: DeviceREF: 1 * Vertex Processor: PURE HARDWARE * Texture memory: 739 M * DDI-level: 9.0 * GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30) * GPU vertex cache: unrecognized, 16 * DVB created: 1536K * DIB created: 512K ! Version conflict in shader 'def_shaders\def_aref' ! Version conflict in shader 'def_shaders\def_aref_v' ! Version conflict in shader 'def_shaders\def_trans' ! Version conflict in shader 'def_shaders\def_trans_v' ! Version conflict in shader 'def_shaders\def_trans_v_tuchi' ! Version conflict in shader 'def_shaders\lod_old' ! Renderer doesn't support blender 'effects\shadow_world' ! Version conflict in shader 'effects\watertest-1' ! Version conflict in shader 'flora\leaf' ! Version conflict in shader 'flora\leaf_lm' ! Version conflict in shader 'flora\leaf_sux' ! Version conflict in shader 'flora\trunk_lm' count of .thm files=14 load time=77 ms * HWDST/PCF supported and used - r__tf_aniso 16 - r2_tf_mipbias 0. Starting engine... Loading DLL: xrGameSpy.dll ! Invalid ogg-comment version, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\wasteland2_l.ogg ! Invalid ogg-comment version, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\wasteland2_r.ogg * DVB created: 1536K * DIB created: 512K - r__tf_aniso 16 - r2_tf_mipbias 0. * GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30) * GPU vertex cache: unrecognized, 16 *** RESET [4781 ms] "f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\bin\xr_3da.exe" * phase time: 0 ms * phase cmem: 123268 K Кэширование объектов... Loading objects... Loading models... ! auto-generated bump map: act\act_darkstalker3_bump# * [prefetch] time: 29323 ms * [prefetch] memory: 91729Kb * phase time: 29406 ms * phase cmem: 209801 K Сервер: Старт... * phase time: 306 ms * phase cmem: 210024 K Сервер: Загрузка симуляции жизни... * phase time: 41 ms * phase cmem: 210024 K Загрузка игры "Денис_quicksave.sav"... * Loading spawn registry... * 9158 spawn points are successfully loaded * Loading objects... * 18953 objects are successfully loaded * Game Денис_quicksave is successfully loaded from file 'f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\savedgames\Денис_quicksave.sav' (5.423s) * phase time: 5393 ms * phase cmem: 243610 K Сервер: Соединяемся... MaxPlayers = 32 * phase time: 70 ms * phase cmem: 243642 K Клиент: Соединение с localhost... # Player not found. New player created. * client : connection accepted - <> * phase time: 26 ms * phase cmem: 243666 K Открытие потока... * phase time: 17 ms * phase cmem: 243666 K Загрузка формы объектов... * phase time: 7901 ms * phase cmem: 316334 K Загрузка шейдеров... * phase time: 877 ms * phase cmem: 317494 K Загрузка геометрии... * [Loading VB] 65532 verts, 2047 Kb * [Loading VB] 65525 verts, 2047 Kb * [Loading VB] 65535 verts, 2047 Kb * [Loading VB] 65466 verts, 2045 Kb * [Loading VB] 17208 verts, 537 Kb * [Loading VB] 65533 verts, 2047 Kb * [Loading VB] 65534 verts, 2047 Kb * [Loading VB] 65534 verts, 2047 Kb * [Loading VB] 65531 verts, 2047 Kb * [Loading VB] 65535 verts, 2047 Kb * [Loading VB] 65535 verts, 2047 Kb * [Loading VB] 46595 verts, 1456 Kb * [Loading VB] 65534 verts, 2047 Kb * [Loading VB] 65533 verts, 2047 Kb * [Loading VB] 65535 verts, 2047 Kb * [Loading VB] 65532 verts, 2047 Kb * [Loading VB] 65533 verts, 2047 Kb * [Loading VB] 65533 verts, 2047 Kb * [Loading VB] 53181 verts, 1661 Kb * [Loading IB] 1048575 indices, 2047 Kb * [Loading IB] 1048572 indices, 2047 Kb * [Loading IB] 1048572 indices, 2047 Kb * [Loading IB] 1048572 indices, 2047 Kb * [Loading IB] 1048572 indices, 2047 Kb * [Loading IB] 1048572 indices, 2047 Kb * [Loading IB] 1048575 indices, 2047 Kb * [Loading IB] 1048572 indices, 2047 Kb * [Loading IB] 1048575 indices, 2047 Kb * [Loading IB] 228285 indices, 445 Kb * [Loading VB] 65533 verts, 767 Kb * [Loading VB] 65534 verts, 767 Kb * [Loading VB] 65534 verts, 767 Kb * [Loading VB] 65535 verts, 767 Kb * [Loading VB] 65535 verts, 767 Kb * [Loading VB] 65534 verts, 767 Kb * [Loading VB] 65535 verts, 767 Kb * [Loading VB] 14030 verts, 164 Kb * [Loading IB] 1048575 indices, 2047 Kb * [Loading IB] 1048575 indices, 2047 Kb * [Loading IB] 1048575 indices, 2047 Kb * [Loading IB] 718302 indices, 1402 Kb * phase time: 1047 ms * phase cmem: 317885 K Загрузка базы пространств... * phase time: 3279 ms * phase cmem: 322185 K Загрузка детальных объектов... * [DETAILS] VertexConsts(256), Batch(61) * [DETAILS] 40687 v(20), 26352 p * [DETAILS] Batch(61), VB(794K), IB(154K) * phase time: 180 ms * phase cmem: 322227 K Загрузка секторов и порталов... * Loading HOM: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\levels\l01_escape\level.hom * phase time: 27 ms * phase cmem: 322417 K Загрузка ИИ объектов... ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\nature\new_flies1.ogg - Loading music tracks from 'l01_escape_musics'... ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\amb01_l.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\amb01_r.ogg * phase time: 174 ms * phase cmem: 322454 K Клиент: Создание... - Game configuring : Started - Game configuring : Finished * phase time: 760 ms * phase cmem: 334272 K Загрузка текстур... * t-report - base: 1501, 672616 K * t-report - lmap: 7, 7168 K * phase time: 11778 ms * phase cmem: 334272 K Загрузка Oblivion Lost... * phase time: 138 ms * phase cmem: 334288 K * [win32]: free[557596 K], reserved[97668 K], committed[1441824 K] * [ D3D ]: textures[679784 K] * [x-ray]: crt heap[334288 K], process heap[6473 K], game lua[24907 K], engine lua[133 K], render[0 K] * [x-ray]: economy: strings[4161 K], smem[64597 K] ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_draw.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_holster.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\binoculars_zoomin.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\binoculars_zoomout.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_empty.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\pm_draw.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\fort_shoot2.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_close.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\ak74_draw.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\fort_draw.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\crow\idle_0.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\crow\idle_1.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\crow\idle_2.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_idle_0.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_idle_1.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_idle_2.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_eat_0.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_attack_0.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_attack_1.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_attack_hit_0.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_take_damage_0.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_take_damage_1.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_die_0.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\kamaz.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\kamaz_on.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\kamaz_off.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\gear_old.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\zaz.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\zaz_on.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\zaz_off.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\gear_middle.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\niva.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\niva_on.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\niva_off.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\gear_new.ogg ! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_checkout.ogg FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...- Серебряное Издание\shoc\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) stack trace: if (jit == nil) then profiler.setup_hook () end schemes = {} -- соответствие схем модулям stypes = {} -- типы схем -- Загружает схему из файла на диске и активирует в мотиваторе. -- Здесь: -- filename - имя файла, в котором реализована схема, без расширения -- scheme - имя схемы function load_scheme(filename, scheme, stype) schemes[scheme] = filename stypes[scheme] = stype end ---------------------------------------------------------------------- function printf(fmt,...) log(string.format(fmt,...)) end function dbglog(fmt,...) local msg = string.format(fmt, ...) local msg_no_ws = string.gsub(msg, "%s", "_") get_console():execute("dbg:" .. msg_no_ws) 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 ~= nil) then act:set_action(arg) 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 ~= nil) then act:set_action(arg) 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 debug_get_level_object(obj_name) local res = level.debug_object(obj_name) while res == nil do // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // !!!!! НЕ ЗАКОММЕНТАРИВАЙТЕ, ИНАЧЕ НЕ БУДЕТ ВИДНО ОШИБОК ПРИ РАССТАНОВКЕ ОБЪЕКТОВ !!!!! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! printf("get_level_object() is waiting for object \"%s\"", obj_name) res = level.object(obj_name) wait () end return res end function debug_get_actor() local res = level.debug_actor() while res == nil do res = level.debug_actor() wait () end return res 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 --' Проверка на инфопоршны, даже если игрока не существует function has_alife_info(info_id) local aa = alife() if aa == nil then return false end return aa:has_info(0, info_id) end -------------------------------------------------- -- іласс LUA реализуі ий Finite State Machine -- для управления персонажами -------------------------------------------------- class 'FSM' -- инициализация путем задания объекта Non-Player Character function FSM:__init(script_name, npc_obj) -- указатель на подконтрольнvй NPC self.npc = npc_obj -- строка - имя скрипта, которvй запускает игру self.script_name = script_name -- матрица, задаі ая граф переходов состояний -- реализуется как двумерная таблица self.transition_matrix = {[0] = {}} -- номер теку его состояния self.current_state = 0 -- флаг того, что машина вклічена self.machine_running = true printf("inialization FSM for NPC %s", self.npc:name()) end function FSM:is_running() return self.machine_running end function FSM:start() printf("starting FSM for %s", self.npc:name()) self.machine_running = true end function FSM:stop() printf("stoping FSM for %s", self.npc:name()) self.machine_running = false self:reset_script_control() end -- добавление указателя на булеву -- функциі условия перехода function FSM:set_transition(from_state_num, to_state_num, cond_func) printf("in setting transition %d, %d ", from_state_num, to_state_num) if self.transition_matrix[from_state_num] == nil then self.transition_matrix[from_state_num] = {[to_state_num] = cond_func} else self.transition_matrix[from_state_num][to_state_num] = cond_func end end -- единичная проверка FSM function FSM:run() local transition_vector = self.transition_matrix[self.current_state] table.foreach(transition_vector, function(to_state_num, cond_func) if cond_func(self.npc, self) == true then printf("transition from %d to %d", self.current_state, to_state_num) if to_state_num == 0 then self:reset_script_control() end --if self.current_state == 0 then -- self:set_script_control() --end self.current_state = to_state_num return true end return nil end) end -- запуск бесконечного цикла FSM function FSM:run_loop() printf("running FSM loop for NPC %s", self.npc:name()) while self:is_running() do local transition_vector = self.transition_matrix[self.current_state] table.foreach(transition_vector, function(to_state_num, cond_func) if cond_func(self.npc, self) == true then printf("transition from %d to %d", self.current_state, to_state_num) if to_state_num == 0 then self:reset_script_control() end --if self.current_state == 0 then -- self:set_script_control() --end self.current_state = to_state_num return true end return nil end) if self.npc:alive () == false then self.npc:script (false, self.script_name) return end wait() end end -- взятие под контроль скрипта NPC (переход из нулевого состояния) function FSM:set_script_control() printf("set script control for FSM of NPC %s", self.npc:name()) self.npc:script(true, self.script_name) end -- отпускание из под контроля скрипта NPC (переход в нулевое состояние) function FSM:reset_script_control() printf("reset script control for FSM of NPC %s", self.npc:name()) self.npc:script(false, self.script_name) end -------------------------------------------------- -- end of class 'FSM' -------------------------------------------------- function reset_action (npc, script_name) if npc:get_script () then npc:script (false, script_name) end npc:script (true, script_name) end class "script_object" function script_object.__init(self,name,script,...) self.action = action(nil,...) self.object_name = name self.script_name = script self.object = nil end function script_object:update() local obj = self.object self.object = level.object(self.object_name) if ((obj == nil) and (self.object ~= nil)) then self.object:script (true,self.script_name) self.object:command (self.action,false) end end -- -- іередача персонажу информации -- function GiveInfoViaPda(obj_receiver, obj_sender, info_number) obj_receiver:give_info_portion_via_pda(info_number, obj_sender) end -------------------------------------------------- -- Functions and variables added by Zmey -------------------------------------------------- -- іонстанта, которуі использовать в местах, где нужно задать неограниченное время действия time_infinite = 100000000 -- =азвание скрипта, которvй в даннvй момент находится в отладке -- (в этом скрипте будут срабатvвать вvзовv функции debug_log) debug_script_name = "" -- Tvводит в лог строчку, если script_name == debug_script_name -- Lспользуется для отрадки сценариев function debug_log(script_name, fmt, ...) if debug_script_name == script_name then log(string.format(fmt, ...)) end end -- +сли в данн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, table.getn(arg)) return arg[r] end function new_action(...) local arg = {...} local act = entity_action() for i = 1, table.getn(arg) do act:set_action(arg) end return act; end obj_last_actions = {}; function perform_action(obj, action_name, action) if (obj ~= nil) then obj_last_actions[obj] = action_name obj:command(act, false) end end function last_action(obj) return obj_last_actions[obj] end function if_then_else(cond, if_true, if_false) if cond then return if_true end return if_false end function update_action (npc, script, ...) local arg = {...} if npc == nil then return end local act = npc:action () if arg.n == 0 then return end if act == nil then act = entity_action () end for a = 1, arg.n, 1 do if arg[a] ~= nil then act:set_action (arg[a]) end end reset_action (npc, script) npc:command (act, 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 if (editor() == false) then class "pp_effector" (effector) function pp_effector:__init(effector_type,start_time,dest_power,life_time) super(effector_type,start_time) self.start_time = start_time self.stop_time = start_time + life_time self.max_power = dest_power end function pp_effector:process(pp) effector.process(self,pp) local curr_time = time_global() local d = 0.0 if curr_time < self.start_time then d = 0.0 else if curr_time < self.stop_time then d = (curr_time - self.start_time) / (self.stop_time - self.start_time) else self.info = self.max_power return true end end local dual = duality() local noise = noise() local base = color() local gray = color() local add = color() dual.h = self.max_power.dual.h * d dual.v = self.max_power.dual.v * d noise.grain = self.max_power.noise.grain * d noise.intensity = self.max_power.noise.intensity * d noise.fps = self.max_power.noise.fps * d base.r = self.max_power.color_base.r * d base.g = self.max_power.color_base.g * d base.b = self.max_power.color_base.b * d gray.r = self.max_power.color_gray.r * d gray.g = self.max_power.color_gray.g * d gray.b = self.max_power.color_gray.b * d add.r = self.max_power.color_add.r * d add.g = self.max_power.color_add.g * d add.b = self.max_power.color_add.b * d pp.gray = self.max_power.gray * d pp.blur = self.max_power.blur * d pp.dual = dual pp.noise = noise pp.color_base = base pp.color_gray = gray pp.color_add = add self.info = pp return true end function pp_effector:finished() return self.stop_time < time_global() end -- -- postprocess for rainbow -- class "pp_linear_lerp" (effector) function pp_linear_lerp:__init(effector_type,start_time,life_time,start_power,dest_power) super(effector_type,start_time) self.start_time = start_time self.stop_time = start_time + life_time self.min_power = start_power self.max_power = dest_power end function pp_linear_lerp:process(pp) effector.process(self,pp) local curr_time = time_global() local d = 0.0 if curr_time < self.start_time then d = 0.0 else if curr_time < self.stop_time then d = (curr_time - self.start_time) / (self.stop_time - self.start_time) else self.info = self.max_power return true end end local dual = duality() local noise = noise() local base = color() local gray = color() local add = color() dual.h = self.min_power.dual.h + (self.max_power.dual.h - self.min_power.dual.h ) * d dual.v = self.min_power.dual.v + (self.max_power.dual.v - self.min_power.dual.v ) * d noise.grain = self.min_power.noise.grain + (self.max_power.noise.grain - self.min_power.noise.grain ) * d noise.intensity = self.min_power.noise.intensity + (self.max_power.noise.intensity - self.min_power.noise.intensity) * d noise.fps = self.min_power.noise.fps + (self.max_power.noise.fps - self.min_power.noise.fps ) * d base.r = self.min_power.color_base.r + (self.max_power.color_base.r - self.min_power.color_base.r ) * d base.g = self.min_power.color_base.g + (self.max_power.color_base.g - self.min_power.color_base.g ) * d base.b = self.min_power.color_base.b + (self.max_power.color_base.b - self.min_power.color_base.b ) * d gray.r = self.min_power.color_gray.r + (self.max_power.color_gray.r - self.min_power.color_gray.r ) * d gray.g = self.min_power.color_gray.g + (self.max_power.color_gray.g - self.min_power.color_gray.g ) * d gray.b = self.min_power.color_gray.b + (self.max_power.color_gray.b - self.min_power.color_gray.b ) * d add.r = self.min_power.color_add.r + (self.max_power.color_add.r - self.min_power.color_add.r ) * d add.g = self.min_power.color_add.g + (self.max_power.color_add.g - self.min_power.color_add.g ) * d add.b = self.min_power.color_add.b + (self.max_power.color_add.b - self.min_power.color_add.b ) * d pp.gray = self.min_power.gray + (self.max_power.gray - self.min_power.gray ) * d pp.blur = self.min_power.blur + (self.max_power.blur - self.min_power.blur ) * d pp.dual = dual pp.noise = noise pp.color_base = base pp.color_gray = gray pp.color_add = add self.info = pp return true end function pp_linear_lerp:finished() return self.stop_time < time_global() end -- -- end of postprocess for rainbow -- ---------------------------------------------------------------------------------------------------------------------- -- Evaluators ---------------------------------------------------------------------------------------------------------------------- -- зарезервированv id с номерами от 0 до 256 для создания стандартнvх эвалуаторов. --Constant evaluator class "const_evaluator" (property_evaluator) function const_evaluator:__init (name, value) super (nil, name) self.value = value end function const_evaluator:evaluate() return self.value end --Wait evaluator class "wait_evaluator" (property_evaluator) function wait_evaluator:__init (wait_time) super () self.wait_time = wait_time self.first_call = true self.current_time = 0 end function wait_evaluator:evaluate () if self.first_call == true then self.first_call = false self.current_time = device ():time_global () return false end local t = device():time_global () - self.current_time; if t > self.wait_time then return true end return false end -------------------------------------------------------------------------------- class "enabled_evaluator" (property_evaluator) function enabled_evaluator:__init (name, storage) super () self.a = storage end function enabled_evaluator:evaluate() return self.a.enabled end end -- end of editor() == false function str_split (str) local strlen = string.len (str) local parts = {{}, {}, {}, {}} local cpart = 1 for a = 1, strlen, 1 do local char = string.byte (str, a) if char ~= 95 then table.insert (parts[cpart], char) else cpart = cpart + 1 if cpart > 4 then break end end end if cpart ~= 4 then return "unknown", "stalker", 0, 0 end local str1 = string.char () local str2 = string.char () local str3 = string.char () local str4 = string.char () local ref = parts[1] for a = 1, table.getn (ref), 1 do str1 = string.format ("%s%c", str1, ref[a]) end ref = parts[2] for a = 1, table.getn (ref), 1 do str2 = string.format ("%s%c", str2, ref[a]) end ref = parts[3] for a = 1, table.getn (ref), 1 do str3 = string.format ("%s%c", str3, ref[a]) end ref = parts[4] for a = 1, table.getn (ref), 1 do str4 = string.format ("%s%c", str4, ref[a]) end printf ("%s %s %d %d", str1, str2, str3, str4) return str1, str2, (str3 + 1) - 1, (str4 + 1) - 1 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 -- ‚६п бгв®Є ў ¬б -- —гЈ © local ms_per_day = 24 * 60 * 60 * 1000 function day_time() return math.mod( game.time(), ms_per_day ) end --Time in hours function local_hours() return math.floor( math.mod( game.time()/1000, 86400 )/ 3600 ) 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 -- Ї абЁв бва®Єг ўЁ¤ "n1, n2, n3..." ў в Ў«Ёжг { n1, n2, n3, ... } Ј¤Ґ n1, n2, n3... - жҐ«лҐ зЁб« -- —гЈ © --[[function parse_nums( s ) local t = {} for entry in string.gfind( s, "([%w_\\]+)%p*" ) do table.insert( t, tonumber( entry ) ) end return t end]] -- Ї абЁв бва®Єг ўЁ¤ "n1, n2, n3..." ў в Ў«Ёжг { n1, n2, n3, ... } Ј¤Ґ n1, n2, n3... - ¤а®ЎлҐ зЁб« 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() -- if is_object_online(npc:id()) then -- return npc:clsid() -- else -- return nil -- end end -- Їа®ўҐапҐв ®аг¦ЁҐ «Ё нв® (ЇҐаҐ¤ ў вм game_object) function isWeapon(object) local id = get_clsid(object) if id == nil then return false end if id == clsid.wpn_vintorez_s then return true elseif id == clsid.wpn_ak74_s then return true elseif id == clsid.wpn_lr300_s then return true elseif id == clsid.wpn_hpsa_s then return true elseif id == clsid.wpn_pm_s then return true elseif id == clsid.wpn_shotgun_s then return true elseif id == clsid.wpn_bm16_s then return true elseif id == clsid.wpn_svd_s then return true elseif id == clsid.wpn_svu_s then return true elseif id == clsid.wpn_rpg7_s then return true elseif id == clsid.wpn_val_s then return true elseif id == clsid.wpn_walther_s then return true elseif id == clsid.wpn_usp45_s then return true elseif id == clsid.wpn_groza_s then return true elseif id == clsid.wpn_knife_s then return true elseif id == clsid.wpn_grenade_launcher then return true elseif id == clsid.wpn_grenade_f1 then return true elseif id == clsid.wpn_grenade_rpg7 then return true elseif id == clsid.wpn_grenade_rgd5 then return true elseif id == clsid.wpn_grenade_fake then return true else return false end 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 table.getn (t) > 0 do table.remove (t, table.getn (t)) end end --?бЇ®«м§гҐв ¤«п ¬®бва®ў. ‚лЎ®а в®зЄЁ, Єг¤ Ё¤вЁ ў ҐЄ®в®а®¬ а ¤ЁгᥠЁ зв®Ў в®зЄ Ўл« ¤ «миҐ а ббв®пЁЁ -- min_radius ®в ⥪г饩 Ї®§ЁжЁЁ(Ґб«Ё нв® Ї®«гзЁвбп). center_id - жҐва Ї®§ЁжЁЁ, ў®ЄагЈ Є®в®а®© ¦ЁўҐ¬, -- position_id - вгЄгй п Ї®§ЁжЁп, radius - ў Є Є®¬ а ¤ЁгᥠўлЎЁа вм в®зЄг, min_radius - ¬ЁЁ¬ «м®Ґ а ббв®пЁҐ, ®в ⥪г饩 Ї®§ЁжЁЁ ¤® ®ў®© в®зЄЁ. function new_point(center_id, position_id,radius, min_radius) local dir = vector():set(math.random(-1000, 1000)/1000.0, 0.0001, math.random(-1000, 1000)/1000.0) local pos = level.vertex_in_direction(center_id, dir, radius) local i = 1 while(level.vertex_position(position_id):distance_to(level.vertex_position(pos) ) < min_radius and i < 20) do dir = vector():set(math.random(-1000, 1000)/1000.0, 0.0001, math.random(-1000, 1000)/1000.0) pos = level.vertex_in_direction(center_id, dir, radius) i = i + 1 end return (level.vertex_position(pos)) end function stop_play_sound(obj) if obj:alive() == true then obj:set_sound_mask(-1) obj:set_sound_mask(0) end end function object_type(obj) local otype = get_clsid(obj) local type if otype == clsid.actor or otype == clsid.script_stalker or otype == clsid.script_trader then type = "stalker" elseif otype == clsid.crow or otype == clsid.zombie or otype == clsid.flesh or otype == clsid.controller or otype == clsid.bloodsucker or otype == clsid.burer or otype == clsid.chimera or otype == clsid.boar or otype == clsid.flesh_group or otype == clsid.dog_red or otype == clsid.dog_black or otype == clsid.pseudo_gigant then type = "monstr" elseif otype == clsid.wpn_fn2000 or otype == clsid.wpn_ak74 or otype == clsid.wpn_lr300 or otype == clsid.wpn_hpsa or otype == clsid.wpn_pm or otype == clsid.wpn_fort or otype == clsid.wpn_binocular or otype == clsid.wpn_shotgun or otype == clsid.wpn_svd or otype == clsid.wpn_svu or otype == clsid.wpn_rpg7 or otype == clsid.wpn_val or otype == clsid.wpn_vintorez or otype == clsid.wpn_walther or otype == clsid.wpn_usp45 or otype == clsid.wpn_groza or otype == clsid.wpn_knife or otype == clsid.wpn_scope or otype == clsid.wpn_silencer or otype == clsid.wpn_grenade_launcher or otype == clsid.obj_physic or otype == clsid.obj_breakable or otype == clsid.device_pda or otype == clsid.device_torch or otype == clsid.device_detector_simple or otype == clsid.obj_bolt or otype == clsid.obj_medkit or otype == clsid.obj_food or otype == clsid.obj_bottle or otype == clsid.obj_antirad or otype == clsid.obj_explosive or otype == clsid.obj_document or otype == clsid.obj_attachable or otype == clsid.wpn_grenade_f1 or otype == clsid.wpn_grenade_rpg7 or otype == clsid.wpn_grenade_rgd5 or otype == clsid.wpn_grenade_fake or otype == clsid.equ_scientific or otype == clsid.equ_stalker or otype == clsid.equ_military or otype == clsid.equ_exo or otype == clsid.wpn_ammo or otype == clsid.wpn_ammo_vog25 or otype == clsid.wpn_ammo_og7b or otype == clsid.wpn_ammo_m209 then type = "item" else type = "none" end -- Їа®ўҐа塞 Ґ вагЇ «Ё нв® if type == "stalker" or type == "monstr" then if obj:alive() == false then type = "corpse" end end return type end // Является ли оbj монстром function is_object_monster(obj) local otype = get_clsid(obj) if(otype == clsid.crow or otype == clsid.cat or otype == clsid.zombie or otype == clsid.flesh or otype == clsid.controller or otype == clsid.bloodsucker or otype == clsid.burer or otype == clsid.chimera or otype == clsid.boar or otype == clsid.dog_red or otype == clsid.dog_black or otype == clsid.poltergeist or otype == clsid.pseudo_gigant ) then return true end return false end --ў®§ўа й Ґв Їа®Ё§ў®«мго в®зЄг ЇгвЁ г Є®в®а®© гбв ®ў«Ґ ЎЁв function point_with_bit(patrol_path, bit, old_point) -- old_point - Ё¤ҐЄб в®зЄЁ, Є®в®аго Ґ ¤® ўлЎЁа вм, local points = {} -- Ї а ¬Ґва Ґ ®Ўп§ ⥫мл©( ЇаЁ¬Ґа ⥪г饩 в®зЄЁ ) for i = 0, patrol_path:count()-1 do --„®Ў®ў«пҐ¬ ў в Ў«Ёжг в®зЄЁ б г¦л¬ ЎЁв®¬ if( patrol_path:flag(i, bit)) then --„®Ў ў«пҐ¬ в®зЄг Ґб«Ё old_point == nil Ё«Ё ®ў п в®зЄ Ґ б®ўЇ ¤ Ґв б old_point if(old_point == nil) then table.insert(points, patrol_path:point(i)) elseif(old_point ~= i) then table.insert(points, patrol_path:point(i)) end end end local number_point = table.getn(points) if(number_point == 0) then return nil elseif(number_point == 1) then return points[1] else return points[math.random(1, number_point)] end end --ў®§ўа й Ґв Їа®Ё§ў®«мго в®зЄг ЇгвЁ г Є®в®а®© гбв ®ў«Ґ ЎЁв function point_with_bit_id(patrol_path, bit, old_point) -- old_point - Ё¤ҐЄб в®зЄЁ, Є®в®аго Ґ ¤® ўлЎЁа вм, local points = {} -- Ї а ¬Ґва Ґ ®Ўп§ ⥫мл©( ЇаЁ¬Ґа ⥪г饩 в®зЄЁ ) for i = 0, patrol_path:count()-1 do --„®Ў®ў«пҐ¬ ў в Ў«Ёжг в®зЄЁ б г¦л¬ ЎЁв®¬ if( patrol_path:flag(i, bit)) then --„®Ў ў«пҐ¬ в®зЄг Ґб«Ё old_point == nil Ё«Ё ®ў п в®зЄ Ґ б®ўЇ ¤ Ґв б old_point if(old_point == nil) then table.insert(points, i) elseif(old_point ~= i) then table.insert(points, i) end end end local number_point = table.getn(points) if(number_point == 0) then return nil elseif(number_point == 1) then return patrol_path:level_vertex_id(points[1]) else return patrol_path:level_vertex_id(points[math.random(1, number_point)]) end end --‚®§ўа й Ґв Ё¤ҐЄб б ¬®© Ў«Ё¦Ґ© в®зЄЁ ЇгвЁ б § ¤ л¬ ЎЁв®¬, ®в ⥪г饩 в®зЄЁ function near_point_with_bit(point, patrol_path, bit) local new_point = nil local index = nil local dist = 1000.0 for i = 0, patrol_path:count()-1 do if( patrol_path:flag(i, bit) ) then if(new_point == nil or patrol_path:point(i):distance_to(point) < dist) then --…б«Ё нв в®зЄ ЇҐаў п Ё§ 襤иЁебп, «ЁЎ® ®в ҐҐ Їгвм Ў«Ё¦Ґ, в® § Ї®¬Ё Ґ¬ ҐҐ new_point = patrol_path:point(i) index = i dist = new_point:distance_to(point) end end end return index 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 printf(sub.."%s:true", tostring(k)) else printf(sub.."%s:false", tostring(k)) 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 switch_online (id) if id == -1 then return end local sim = alife () if sim ~= nil then sim:set_switch_online (id, true) sim:set_switch_offline (id, false) end end ------------------------------------------------------------------------------------------- function switch_offline (npc) if npc == nil or npc:alive () == false then return end local sim = alife () if sim ~= nil then sim:set_switch_online (npc:id (), false) sim:set_switch_offline (npc:id (), true) end end ------------------------------------------------------------------------------------------- function get_actor_id() if(level.actor() == nil) then return -1 end return level.actor():id() end ------------------------------------------------------------------------------------------- function IsMonster (object, class_id) local id = class_id or get_clsid (object) if id == clsid.boar_s or id == clsid.bloodsucker_s or id == clsid.dog_s or id == clsid.flesh_s or id == clsid.pseudodog_s or id == clsid.psy_dog_s or id == clsid.burer_s or id == clsid.cat_s or id == clsid.chimera_s or id == clsid.controller_s or id == clsid.fracture_s or id == clsid.poltergeist_s or id == clsid.gigant_s or id == clsid.zombie_s or id == clsid.tushkano_s or id == clsid.snork_s then return true end return false end ------------------------------------------------------------------------------------------- function IsStalker (object, class_id) local id = class_id or get_clsid (object) if id == clsid.actor or id == clsid.script_stalker then return true end return false end ------------------------------------------------------------------------------------------- function IsHelicopter (object, class_id) local id = class_id or get_clsid (object) if id == clsid.script_heli then return true end return false end ------------------------------------------------------------------------------------------- function IsCar (object, class_id) local id = class_id or get_clsid (object) if id == clsid.car_s then return true end return false 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, ...) dbglog("!-!-!- Принудительный Вылет -!-!-!") local reason = string.format(fmt, ...) assert("ERROR: " .. reason) printf("ERROR: " .. reason) printf("%s") end function set_postprocess(name_ini_file) bind_stalker.post_process = postprocess.PostProcess(ini_file(name_ini_file)) end function remove_postprocess() bind_stalker.post_process = nil 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 --set_inactivate_input_time(timeout*60) --db.actor:actor_sleep(0, timeout) end -- проверяет целую часть числа на нечётность function odd( x ) return math.floor( x * 0.5 ) * 2 == math.floor( x ) end --' Усталость function on_actor_critical_power() if has_alife_info("esc_trader_newbie") then game.start_tutorial("part_11_weakness") end if not has_alife_info("encyclopedy_tutorial_weakness") then db.actor:give_info_portion("encyclopedy_tutorial_weakness") end end function on_actor_critical_max_power() end --' Кровотечение function on_actor_bleeding() if has_alife_info("esc_trader_newbie") then game.start_tutorial("part_8_wound") end if not has_alife_info("encyclopedy_tutorial_wound") then db.actor:give_info_portion("encyclopedy_tutorial_wound") end end function on_actor_satiety() end --' Радиация function on_actor_radiation() if has_alife_info("esc_trader_newbie") then game.start_tutorial("part_6_radiation") end if not has_alife_info("encyclopedy_tutorial_radiation") then db.actor:give_info_portion("encyclopedy_tutorial_radiation") end end --' Заклинило оружие function on_actor_weapon_jammed() if has_alife_info("esc_trader_newbie") then game.start_tutorial("part_9_weapon") end if not has_alife_info("encyclopedy_tutorial_weapon") then db.actor:give_info_portion("encyclopedy_tutorial_weapon") end end --' не может ходить изза веса function on_actor_cant_walk_weight() if has_alife_info("esc_trader_newbie") then game.start_tutorial("part_14_overload") end if not has_alife_info("encyclopedy_tutorial_overload") then db.actor:give_info_portion("encyclopedy_tutorial_overload") end end --' пси воздействие function on_actor_psy() end function set_actor_rank(rank) if rank == "novice" then db.actor:set_character_rank(0) elseif rank == "stalker" then db.actor:set_character_rank(300) elseif rank == "veteran" then db.actor:set_character_rank(600) elseif rank == "master" then db.actor:set_character_rank(900) end end function get_texture_info(id_name, id_default) if id_default == nil then id_default = id_name end local task_info = GetTextureInfo(id_name, id_default) local r = task_info:get_rect() r.x2 = r.x2 - r.x1 r.y2 = r.y2 - r.y1 return task_info:get_file_name(), r end function start_game_callback() printf ("start_game_callback called") task_manager.clear_task_manager() treasure_manager.clear_treasure_manager() xr_sound.clear_all_sound_object() dialog_manager.fill_phrase_table() mod_man.init() end ammo_section = {} ammo_section["ammo_9x18_fmj"] = true ammo_section["ammo_9x18_pbp"] = 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_7.62x54_ap"] = true ammo_section["ammo_7.62x54_7h14"] = true ammo_section["ammo_9x39_pab9"] = true ammo_section["ammo_gauss"] = true ammo_section["ammo_9x39_ap"] = true ammo_section["ammo_9x39_sp5"] = 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_dart"] = true ammo_section["ammo_12x76_zhekan"] = true quest_section = {} quest_section["gunslinger_flash"] = true quest_section["af_blood_tutorial"] = true quest_section["esc_wounded_flash"] = true quest_section["quest_case_02"] = true quest_section["dar_document1"] = true quest_section["dar_document2"] = true quest_section["dar_document3"] = true quest_section["dar_document4"] = true quest_section["dar_document5"] = true quest_section["kruglov_flash"] = true quest_section["lab_x16_documents"] = true quest_section["good_psy_helmet"] = true quest_section["bad_psy_helmet"] = true quest_section["decoder"] = true quest_section["dynamite"] = true quest_section["quest_case_01"] = true quest_section["quest_case_03"] = true quest_section["hunters_toz"] = true quest_section["bar_ecolog_flash"] = true quest_section["bar_tiran_pda"] = true quest_section["bar_lucky_pda"] = true quest_section["agr_deserter_pda"] = true quest_section["borov_flash"] = true quest_section["val_key_to_underground"] = true quest_section["dolg_arhive_documents"] = true quest_section["bar_decoding_documents"] = true quest_section["dolg_pda"] = true quest_section["crazy_flash"] = true quest_section["mil_svoboda_leader_pda"] = true quest_section["svoboda_pda"] = true quest_section["bar_sniper_pda"] = true quest_section["bar_key_to_val_underground"] = true quest_section["pri_lom_ak74"] = true quest_section["rad_jaw_zam_pda"] = true quest_section["detector_advances_tutorial"] = true quest_section["wpn_deserteagle_coll"] = true quest_section["wpn_vintorez_coll"] = true -- quest_section["outfit_monolith_m1"] = true --Убрать (Р.М.А.) quest_section["cit_doctors_key"] = true quest_section["war_final_door_key1"] = true quest_section["war_final_door_key2"] = true quest_section["war_final_door_key3"] = true quest_section["cit_leader_killer_pda"] = true quest_section["cit_killers_documents"] = true quest_section["cit_deadcity_maps"] = true quest_section["cit_vp_pda"] = true плиз, подскажите, как проблему решить! Ссылка на комментарий
Garry_Galler 7 Опубликовано 1 Октября 2010 Поделиться Опубликовано 1 Октября 2010 (изменено) Хантер, Если у тебя 20 строчка именно вот это log(string.format(fmt,...)) , то попробуй заменить функцию printf на ее аналог из Зенобиан мода: function printf(fmt,...) local arg = {...} if arg == nil then get_console():execute("Error_printf:_Arg_=_nil_value") else for a=1, table.getn(arg), 1 do if arg[a] == nil then get_console():execute(string.format("Error_printf:_Arg_#%d_=_nil_value",a)) end end end end Возможно ошибка исчезнет. Из-за дефолтной printf бывают ошибки по той причине, что метод string.format() не понимает nil, и когда в printf передается аргумент со значением nil или вообще ничего - то и получаем string expected, got no value. Хотя причина вылета может быть и не здесь зарыта :-) Изменено 1 Октября 2010 пользователем Garry_Galler Ссылка на комментарий
Министр 3 Опубликовано 1 Октября 2010 Поделиться Опубликовано 1 Октября 2010 (изменено) Garry_Galler, ну, скорее всего дело не в самом printf, а в том кто именно передает ему nil. Хантер, если Ваше сообщение удаляется, то скорей всего раньше на него уже был ответ и соответственно восстанавливать пост не надо. В Вашем случае так и было, да и к тому же Вы выложили полный лог и _G без использования спойлеров, т.е. получился непонятный ужас на полстрантицы форума. P.S. Ваш лог не о чем не говорит, да и _g скорее всего не виноват. Хотя бы расскажите что ковыряли перед появлением ошибки, иначе удалю Ваш вопрос как повторный. Изменено 1 Октября 2010 пользователем Министр Ссылка на комментарий
Хантер 0 Опубликовано 2 Октября 2010 Поделиться Опубликовано 2 Октября 2010 Garry_Galler, большое спасибо, вылет исправлен! Добавлено через 85 мин.: блин! ещё один вылет обнаружил! не поймёшь, когда вылетает. но вроде, если долго не сохранялся, а потом решил обыскать труп. FATAL ERROR [error]Expression : assertion failed [error]Function : xrServer::Process_event_reject [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp [error]Line : 12 [error]Description : e_parent && e_entity stack trace: Ссылка на комментарий
Garry_Galler 7 Опубликовано 2 Октября 2010 Поделиться Опубликовано 2 Октября 2010 (изменено) Хантер, А ты в консоль заглядывал? Или в сам лог? Загляни ради интереса - что именно там пишется из тех строк, что есть в новой printf. Вылета нет потому, что в данном варианте printf стоит ловушка на nil, но сама ошибка может идти как с оригинала, так и из мода либо твоя. И тебе было бы желательно разобраться в этом - чтобы не поиметь ошибок в будущем. --------------------------------------------------------------------------- Насчет второго лога - e_parent && e_entity - похоже на баг оригинала. Но более конкретно не скажу. Изменено 2 Октября 2010 пользователем Garry_Galler Ссылка на комментарий
Хантер 0 Опубликовано 2 Октября 2010 Поделиться Опубликовано 2 Октября 2010 (изменено) Garry_Galler, эта ошибка ( которую сейчас увидел) была у меня давно, когда добавил себе мод лутмани. япросто про неё забыл. а когда добавил функцию из зенобиана, долго тестил, и вылетов не было. потом загрузился, немного поиграл, и после обыска очередного трупа - вылет может быть, я что-то неправильно в лутмани сделал, как думаешь? Изменено 2 Октября 2010 пользователем Хантер Ссылка на комментарий
Gektor 0 Опубликовано 5 Октября 2010 Поделиться Опубликовано 5 Октября 2010 А можно ли заспавнить партикль через all.spawn чтобы он как статичный был. Ежели можно то как. Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу. Ссылка на комментарий
djslavikoz 0 Опубликовано 5 Октября 2010 Поделиться Опубликовано 5 Октября 2010 Господа скриптологи помогите пожалоста. Лог по вашей теме. Ето спавн вертольота. Как написал мне на амк форуме один товарищ.... Цытирую Надо дописать функцию в xr_effects.script, какую я не знаю, сам не делал. ! Unknown command: ERROR:object * Log file has been saved successfully! FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ....r. - shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) Ссылка на комментарий
Garry_Galler 7 Опубликовано 5 Октября 2010 Поделиться Опубликовано 5 Октября 2010 (изменено) djslavikoz Не думаю что в xr_effects.script надо что то дописывать. Этот файл в твоем случае вообще не причем(если ты его не трогал или не пытался вызывать из логики функцию, которой в нем нет - но тогда и лог был бы другой). Лог с указанием на _g.script:20 как правило говорит о том, что в твоих скриптах есть либо синтаксическая ошибка(где именно - тебе лучше знать, а в лог в данном случае это не передается), либо вызвана дефолтная функция abort для креша игры(вследствие серьезной ошибки в скриптах - об этом может быть как раз и говорит строчка ERROR:object), либо в функцию printf передается (из оригинальных скриптов) некорректный аргумент или некорректное число аргументов (так вот недальновидно разрабы написали эту функцию.) Пользуйся луа чекером для проверки скриптов на синтаксис. И хотя он не гарантирует нахождение всех ошибок - но мелкие банальные опечатки, которые нарушают правила lua, находит весьма неплохо. Разумеется ошибки связанные с неправильным использованием функций и методов игры он отследить не может - от таких ошибок спасет только грамотность и хорошее знание скриптов. ЗЫ:И прочитай мой пост на прошлых страницах: можешь заменить дефолтную функцию printf из файла _g.script на ту, что в моем посте. От твоих ошибок она не спасет. Но от ошибочных вызовов оригинала лечит. ЗЫЫ: Советую пользоваться дебаговым функционалом из модов - тестовый вывод в лог(и консоль) результатов работы своего скрипта еще никому не мешал. Изменено 5 Октября 2010 пользователем Garry_Galler Ссылка на комментарий
djslavikoz 0 Опубликовано 5 Октября 2010 Поделиться Опубликовано 5 Октября 2010 Garry_Galler, Ти понимаеш какая ситуация. Скрипт рабочий на стандартной игре, спавн получается без вопросов . С недавна я в СДК сделал новую локацию, подключил, заселил чуваками, бтрами ну всё прочее, и через алл спавн и через скрипты, дошло дело до вертоля ну не вкакую я его и так я его сяк, Мля.... Ето .... терпения нехватает сколько сделал не бросать же а без вертоля нельзя всё таки военная база. Строгое предупреждение от администратора n6260 Пишите грамотно. И без всяких "мля". Это относится к завуалированному мату. На первый раз - сутки чтения. Ссылка на комментарий
VASIok 0 Опубликовано 5 Октября 2010 Поделиться Опубликовано 5 Октября 2010 Люди помогите, я задался проблемой создания симуляции жизни такой как я хочу и в итоге пришел к выводу и у меня появилось пару вопросов. 1) Если в логике нпс прописать но_смарт то он сразуже после ухода в оффлайн замерает и некуда не идет,поправте если это не так. Ну а теперь вопрос,меня интересует как можно нпс с но_смартом заставить двигатся по левел и гайм графам в оффлайне? Лично я пришел к выводу что нужно написать скрипт сканирования окружения на графы и перемещения в сторону любого из них. Ну а вот как написать этот скрипт я незнаю) помогите пожалуйста) Ссылка на комментарий
antreg 178 Опубликовано 9 Октября 2010 Поделиться Опубликовано 9 Октября 2010 Добрый день! Возможно ли в логике отдельно взятого НПС запретить ему обыскивать трупы, когда они встречаются на его пути, чтобы он четко шел по своему маршруту, не отвлекаясь на это? Может быть, это нужно делать и не в логике, а в глобальном профиле персонажей, в файлах типа m_stalker.ltx? "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Ссылка на комментарий
=Strel()K= 0 Опубликовано 9 Октября 2010 Поделиться Опубликовано 9 Октября 2010 Здравствуйте, столкнулся я с проблемой, кто знает что делать-прошу помочь. Делаю свой мод, соответственно собрал свой ACDC, кладу туда спавн-разбираю(_unpack), появляются файлы. Ну я, допустим, правлю что мне нужно, собираю назад(_pack), когда сборка почти уже закончена появляется сообщение ошибки: importing ways... dublicate section "pri_a17_mon_amb_4_look" at stkutils/ini_file.pm line 63, <GEN72> line 4064 Ошибка говорит о повторе секции, такой секции нигде нет вообще! Что делать? Добавлено через 40 мин.: Люди помогите, я задался проблемой создания..... А ты в Alife попробуй поставить число, в котором идет жизнь относительно ГГ очень большим(там вроде всего на 150 метров от ГГ режим онлайн) Но сам понимаешь что оперативной памяти это будет убивать очень и очень много. Ссылка на комментарий
nuklia 0 Опубликовано 9 Октября 2010 Поделиться Опубликовано 9 Октября 2010 (изменено) antreg invulnerable = true - бессмертие gather_items_enabled = false - подбирать предметы(пушки) help_wounded_enabled = false - помогать раненым corpse_detection_enabled = false - обыскивать трупы Аномальный, вариант с двойным спавном может возникнуть, если помимо нормального спавна эксклюзива (олл.спавн, старт_позишн в симуляции, ф-ция create_squad в логике) воткнуть его сквад в респавн. Вообще не стоит увлекаться респавном без нужды, если внимательно посмотреть оригинальные файлы игры, респавн сталкеров прописан с определенным условием в spawn_num = {.....}X, 0 , только монстры попадаются без условий - что-бы всегда было кого отстреливать. Нельзя респавнить эксклюзивные сквады с определенной target_smart - доходит до того, что в один анимпоинт садятся по двое, как-бы один в другом. С валкером вожможно проблема с точками пути - если твой смарт называется gen_bestilia_baza то в way_xxx.ltx (all.spawn) имя точки должно быть gen_bestilia_baza_gen_bestilia_kamp4_walk(look) , а в файле логики сокращенно без имени смарта gen_bestilia_kamp4_walk(look) Изменено 9 Октября 2010 пользователем nuklia Ссылка на комментарий
Arhara 32 Опубликовано 9 Октября 2010 Поделиться Опубликовано 9 Октября 2010 antreg, вот такое можно соорудить - что к чему - разберёшься. ignore_distance = 0 ignore_distance_grenade = 0 ignore_distance_corpse = 0 ignore_distance_danger_hit = 0 ignore_distance_sound = 0 danger_inertion_time_grenade = 0 danger_inertion_time_corpse = 0 danger_inertion_time_hit = 0 danger_inertion_time_sound = 0 есть и вот такое no_loot = true Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка Ссылка на комментарий
Arhara 32 Опубликовано 9 Октября 2010 Поделиться Опубликовано 9 Октября 2010 =Strel()K=, Взять нормальный ACDC и добавлять в него то, что требуется - но по мере необходимости. Чем меньше, тем лучше. Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка Ссылка на комментарий
Gektor 0 Опубликовано 10 Октября 2010 Поделиться Опубликовано 10 Октября 2010 (изменено) Люди, наставте на путь истиный . Пытаюсь по статьям сделать смарт терейны на локациях в паке локаций для оригинала теней 1.0004. Но такая проблема - там файлы скриптов смартов тока оригинальных лок. Пробовал сделать все в файле одной йз лок(в gulag_military.script и соответствуюшем ему файле сонфигов). Но не получилось. Неписи уходият в неведомые дали. Танцую с бубном вокруг юпитера из пака. Короч не получается у меня. И точки и указания все на смарт названы правильно. В логике неписей тоже прописан именно мой смарт. Как заставить работать? Как ваще на новые локи без sdk ставить рабочие гулаги? Помогите пожайлуста. gruber спасибо большое за совет. Изменено 10 Октября 2010 пользователем Gektor Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу. Ссылка на комментарий
gruber 2 481 Опубликовано 10 Октября 2010 Поделиться Опубликовано 10 Октября 2010 Gektor, Научится бы с помощью СДК гулаги делать -вот это круто,а через алл спавн - там все просто.Если все сделал правильно,то возможно забыл разрешить респавн группировки гулага для данной локации(файл конфиг /микс смарт террейн пресест-обрати внимание на ранги если ранг нпс выше разрешенного для данной локи -под смарт не пойдет)И еще список работ гулага (файл гулаг ЖЖЖ скриптс )нужно регестрировать в хр_гулаг скриптс Ссылка на комментарий
ALEXMANLEO 1 143 Опубликовано 10 Октября 2010 Поделиться Опубликовано 10 Октября 2010 Не подскажете параметр, чтобы непись перестал реагировать на выброс? danger = danger_ignore не работает (в плане выброса). Мне "Винторез" - единственный друг, надежда, опора и сила. Уродов сегодня так много вокруг, патронов бы только хватило. (с) Официальный Discord-сервер по NS OGSR. Неофициальный филиал "У Костра", но тоже Discord-сервер. Ссылка на комментарий
stalker.odinochka 0 Опубликовано 10 Октября 2010 Поделиться Опубликовано 10 Октября 2010 (изменено) Подскажите пожалуйста скрипт, убивающий сталкера. Изменено 10 Октября 2010 пользователем stalker.odinochka Срочно ищу опытного скриптёра и модельера, нужна помощь в создании мода. Готовность мода Новый мир 85%. Мод Огнемёт для ЗП v1.0 Скачать Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти