rendered paste bodyif (jit == nil) then profiler.setup_hook ()endschemes = {} -- ñîîòâåòñòâèå ñõåì ìîäóëÿìstypes = {} -- òèïû ñõåì-- Çàãðóæàåò ñõåìó èç ôàéëà íà äèñêå è àêòèâèðóåò â ìîòèâàòîðå.-- Çäåñü:-- filename - èìÿ ôàéëà, â êîòîðîì ðåàëèçîâàíà ñõåìà, áåç ðàñøèðåíèÿ-- scheme - èìÿ ñõåìûfunction load_scheme(filename, scheme, stype) schemes[scheme] = filename stypes[scheme] = stypeend----------------------------------------------------------------------local printf_console = nilfunction printf( fmt, ... ) if string.find( command_line(), "-printf", 0, true ) == nil then printf = printf_nil end if fmt == nil then return -- formatless end if printf_console == nil then if get_console ~= nil then printf_console = get_console() end return end if printf_console == nil then return -- can't get console end printf = printf_main printf_main( fmt, ... )endfunction printf_main( fmt, ...) local c = select( "#", ... ) if c <= 0 then -- nothing to format printf_console:execute( ":" .. string.gsub( fmt, " ", "\160" ) ) else printf_console:execute( ":" .. string.gsub( string.format( fmt, ... ), " ", "\160" ) ) endendfunction printf_nil( ... )end----------------------------------------------------------------------if nil == time_global then time_global = function () return device():time_global() endendfunction 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 endendfunction 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 endendfunction 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)endfunction 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)endfunction round (value) local min = math.floor (value) local max = min + 1 if value - min > max - value then return max end return minendfunction 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 resendfunction debug_get_actor() local res = level.debug_actor() while res == nil do res = level.debug_actor() wait () end return resendfunction 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 Characterfunction 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())endfunction FSM:is_running() return self.machine_runningendfunction FSM:start() printf("starting FSM for %s", self.npc:name()) self.machine_running = trueendfunction 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 endend-- åäèíè÷íàÿ ïðîâåðêà FSMfunction 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-- çàïóñê áåñêîíå÷íîãî öèêëà FSMfunction 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() endend-- âçÿòèå ïîä êîíòðîëü ñêðèïòà 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)endclass "script_object"function script_object.__init(self,name,script,...) self.action = action(nil,...) self.object_name = name self.script_name = script self.object = nilendfunction 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) endend---- ³åðåäà÷à ïåðñîíàæó èíôîðìàöèè--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, ...)) endend-- +ñëè â äàíívé ìîìåíò âvïîëíÿåòñÿ êàêîå-òî äåéñòâèå, ïðåðvâàåò åãî è îòêë³÷àåò ñêðèïòîâvé ðåæèìfunction interrupt_action(who, script_name) if who:get_script() then who:script(false, script_name) endendfunction random_choice(...) local arg = {...} local r = math.random(1, table.getn(arg)) return arg[r]endfunction new_action(...) local arg = {...} local act = entity_action() for i = 1, table.getn(arg) do act:set_action(arg[i]) end return act;endobj_last_actions = {};function perform_action(obj, action_name, action) if (obj ~= nil) then obj_last_actions[obj] = action_name obj:command(act, false) endendfunction last_action(obj) return obj_last_actions[obj]endfunction if_then_else(cond, if_true, if_false) if cond then return if_true end return if_falseendfunction 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)endfunction 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)endif (editor() == false) thenclass "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_powerendfunction 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 trueendfunction 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_powerendfunction 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 trueendfunction pp_linear_lerp:finished() return self.stop_time < time_global()end---- end of postprocess for rainbow-------------------------------------------------------------------------------------------------------------------------- Evaluators------------------------------------------------------------------------------------------------------------------------ çàðåçåðâèðîâàív id ñ íîìåðàìè îò 0 äî 256 äëÿ ñîçäàíèÿ ñòàíäàðòívõ ýâàëóàòîðîâ.--Constant evaluatorclass "const_evaluator" (property_evaluator)function const_evaluator:__init (name, value) super (nil, name) self.value = valueendfunction const_evaluator:evaluate() return self.valueend--Wait evaluatorclass "wait_evaluator" (property_evaluator)function wait_evaluator:__init (wait_time) super () self.wait_time = wait_time self.first_call = true self.current_time = 0endfunction 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 falseend--------------------------------------------------------------------------------class "enabled_evaluator" (property_evaluator)function enabled_evaluator:__init (name, storage) super () self.a = storageendfunction enabled_evaluator:evaluate() return self.a.enabledendend -- end of editor() == falsefunction 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) - 1endfunction 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) endend-- ६ï áã⮪ ¢ ¬á-- 㣠©local ms_per_day = 24 * 60 * 60 * 1000function day_time() return math.mod( game.time(), ms_per_day )end--Time in hoursfunction 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 tendfunction 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 tend-- ¯ àá¨â áâப㠢¨¤ "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 tend]]-- ¯ àá¨â áâப㠢¨¤ "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 tend-- ¯à®¢¥àï¥â, ¥áâì «¨ ®¡ê¥ªâ ¢ ®« ©¥function is_object_online(obj_id) return level.object_by_id(obj_id) ~= nilendfunction 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-- endend-- ¯à®¢¥àï¥â ®à㦨¥ «¨ íâ® (¯¥à¥¤ ¢ âì 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 endend--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 ) ) )endfunction 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)endfunction 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)endfunction 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)) endend--ᯮ«ì§ã¥â ¤«ï ¬®áâ஢. ë¡®à â®çª¨, ªã¤ ¨¤â¨ ¢ ¥ª®â®à®¬ à ¤¨ãᥠ¨ ç⮡ â®çª ¡ë« ¤ «ìè¥ à ááâ®ï¨¨-- 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))endfunction stop_play_sound(obj) if obj:alive() == true then obj:set_sound_mask(-1) obj:set_sound_mask(0) endendfunction 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 typeend-- ßâëÿåòñÿ ëè îbj ìîíñòðîìfunction is_object_monster(obj) local otype = get_clsid(obj) if(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.dog_red or otype == clsid.dog_black or otype == clsid.poltergeist or otype == clsid.pseudo_gigant ) then return true end return falseend--¢®§¢à é ¥â ¯à®¨§¢®«ìãî â®çªã ¯ã⨠㠪®â®à®© ãáâ ®¢«¥ ¡¨â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)] endend--¢®§¢à é ¥â ¯à®¨§¢®«ìãî â®çªã ¯ã⨠㠪®â®à®© ãáâ ®¢«¥ ¡¨â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)]) endend--®§¢à é ¥â ¨¤¥ªá á ¬®© ¡«¨¦¥© â®çª¨ ¯ãâ¨ á § ¤ ë¬ ¡¨â®¬, ®â ⥪ã饩 â®çª¨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 indexend-- ¥ªãàᨢ ï à ᯥç ⪠⠡«¨æë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 endend-------------------------------------------------------------------------------------------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) endend-------------------------------------------------------------------------------------------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) endend-------------------------------------------------------------------------------------------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 falseend-------------------------------------------------------------------------------------------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 falseend-------------------------------------------------------------------------------------------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 nilendfunction 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 nilend-- Êðåøíóòü èãðó (ïîñëå âûâîäà ñîîáùåíèÿ îá îøèáêå â ëîã)function abort(fmt, ...) local reason = string.format(fmt, ...) assert("ERROR: " .. reason) printf("ERROR: " .. reason) printf("%s")endfunction set_postprocess(name_ini_file) bind_stalker.post_process = postprocess.PostProcess(ini_file(name_ini_file))endfunction remove_postprocess() bind_stalker.post_process = nilendfunction 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") endendfunction 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") endendfunction 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") endend--' Çàêëèíèëî îðóæèå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") endend--' íå ìîæåò õîäèòü èççà âåñà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") endend--' ïñè âîçäåéñòâèåfunction on_actor_psy()endfunction 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) endendfunction 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(), rendfunction 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() endammo_section = {}ammo_section["ammo_9x18_fmj"] = trueammo_section["ammo_9x18_pbp"] = trueammo_section["ammo_9x18_pmm"] = trueammo_section["ammo_9x19_fmj"] = trueammo_section["ammo_9x19_pbp"] = trueammo_section["ammo_5.45x39_fmj"] = trueammo_section["ammo_5.45x39_ap"] = trueammo_section["ammo_5.56x45_ss190"] = trueammo_section["ammo_5.56x45_ap"] = trueammo_section["ammo_5.7x28_fmj"] = trueammo_section["ammo_5.7x28_ap"] = trueammo_section["ammo_7.62x54_7h1"] = trueammo_section["ammo_7.62x54_ap"] = trueammo_section["ammo_7.62x54_7h14"] = trueammo_section["ammo_9x39_pab9"] = trueammo_section["ammo_gauss"] = trueammo_section["ammo_9x39_ap"] = trueammo_section["ammo_9x39_sp5"] = trueammo_section["ammo_11.43x23_fmj"] = trueammo_section["ammo_11.43x23_hydro"] = trueammo_section["ammo_12x70_buck"] = trueammo_section["ammo_12x76_dart"] = trueammo_section["ammo_12x76_zhekan"] = truequest_section = {}quest_section["gunslinger_flash"] = truequest_section["af_blood_tutorial"] = truequest_section["esc_wounded_flash"] = truequest_section["quest_case_02"] = truequest_section["dar_document1"] = truequest_section["dar_document2"] = truequest_section["dar_document3"] = truequest_section["dar_document4"] = truequest_section["dar_document5"] = truequest_section["kruglov_flash"] = truequest_section["lab_x16_documents"] = truequest_section["good_psy_helmet"] = truequest_section["bad_psy_helmet"] = truequest_section["decoder"] = truequest_section["dynamite"] = truequest_section["quest_case_01"] = truequest_section["hunters_toz"] = truequest_section["bar_ecolog_flash"] = truequest_section["bar_tiran_pda"] = truequest_section["bar_lucky_pda"] = true