<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=92.113.172.219&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=92.113.172.219&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/92.113.172.219"/>
		<updated>2026-04-29T13:41:18Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2</id>
		<title>SoC. Снятие денег с трупов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2"/>
				<updated>2010-06-25T13:07:19Z</updated>
		
		<summary type="html">&lt;p&gt;92.113.172.219: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В етой теме я напишу как сделать так что б можна было снимать деньги с трупов.&lt;br /&gt;
Нам нада файл treasure_manager.script&lt;br /&gt;
В етом файле находим такие строки&lt;br /&gt;
&lt;br /&gt;
--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
После строки --printf(&amp;quot;TREASURE USE&amp;quot;)-- пишем&lt;br /&gt;
&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
У нас далжно выйти&lt;br /&gt;
--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
Типерь создаём файл lootmoney.script&lt;br /&gt;
и в нём пишем &lt;br /&gt;
&lt;br /&gt;
function lootmoney(npc)&lt;br /&gt;
	if npc ~= nil and not string.find(npc:section(),&amp;quot;arena&amp;quot;) and npc:character_community()~=&amp;quot;arena_enemy&amp;quot; then&lt;br /&gt;
		local money = npc:money()&lt;br /&gt;
		if money ~= nil and money ~=0 then&lt;br /&gt;
				local deadmoney = money&lt;br /&gt;
&lt;br /&gt;
                                local npc_rank&lt;br /&gt;
		npc_rank = ranks.get_obj_rank_name(npc)&lt;br /&gt;
		if npc_rank ~= nil then&lt;br /&gt;
			if npc_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(25,400)    &lt;br /&gt;
			elseif npc_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=500 then deadmoney=math.random(50,500)  &lt;br /&gt;
			elseif npc_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=600 then deadmoney=math.random(100,600) &lt;br /&gt;
			elseif npc_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=700 then deadmoney=math.random(200,700)  &lt;br /&gt;
                          end&lt;br /&gt;
						  end&lt;br /&gt;
				local news_texti = &amp;quot;\\n%c[255,255,0,0]Мёртвый сталкер: %c[default]&amp;quot;..npc:character_name()..&amp;quot;\\n%c[255,255,0,0]Обнаружено денег: %c[default]&amp;quot;..game.translate_string(tostring(deadmoney)..&amp;quot;руб.&amp;quot;)&lt;br /&gt;
				db.actor:give_game_news(news_texti, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,0,83,47), 1, 4000)&lt;br /&gt;
				db.actor:give_money(deadmoney)&lt;br /&gt;
				game_stats.money_quest_update(deadmoney) &lt;br /&gt;
				npc:give_money(-money)&lt;br /&gt;
				game_stats.money_quest_update(-money)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
теперь создаем файл watcher_act.script и впишем в его&lt;br /&gt;
&lt;br /&gt;
-- Red75 (c) 2008&lt;br /&gt;
-- Marauder scheme v 1.1&lt;br /&gt;
-- Part of AMK MOD&lt;br /&gt;
&lt;br /&gt;
evid_see_stuff=6931&lt;br /&gt;
evid_near_stuff=evid_see_stuff+1&lt;br /&gt;
evid_see_body=evid_see_stuff+2&lt;br /&gt;
evid_position_corrected=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
actid_reach_item=evid_see_stuff&lt;br /&gt;
actid_grab_item=evid_see_stuff+1&lt;br /&gt;
actid_grab_body=evid_see_stuff+2&lt;br /&gt;
actid_correct_position=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
-- Вызывает closure раз в period, obj[var] хранит время следующего срабатывания&lt;br /&gt;
function timed(obj,var,period,closure)&lt;br /&gt;
	if obj[var] and obj[var]&amp;lt;time_global() then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
		closure()&lt;br /&gt;
	elseif not obj[var] then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
--		closure()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trigger_timed(obj,var)&lt;br /&gt;
	obj[var]=time_global()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local disabled_objects={}&lt;br /&gt;
&lt;br /&gt;
local corpse_checked={} -- true - has loot, false - hasn't loot, nil - not checked&lt;br /&gt;
&lt;br /&gt;
function checkCorpse(obj)&lt;br /&gt;
	if (IsStalker(obj) or IsMonster(obj)) and obj:alive()==false then&lt;br /&gt;
		if corpse_checked[obj:id()]~=nil then&lt;br /&gt;
			return corpse_checked[obj:id()]&lt;br /&gt;
		end&lt;br /&gt;
		local cnt=0&lt;br /&gt;
		obj:iterate_inventory(function (dummy, item)&lt;br /&gt;
        if item:section()~=&amp;quot;bolt&amp;quot; then&lt;br /&gt;
          cnt=cnt+1&lt;br /&gt;
        end&lt;br /&gt;
			end, nil)&lt;br /&gt;
		corpse_checked[obj:id()]=cnt&amp;gt;0&lt;br /&gt;
		return corpse_checked[obj:id()]&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local valuable_clsid={&lt;br /&gt;
    [clsid.art_bast_artefact]=true,&lt;br /&gt;
    [clsid.art_black_drops]=true,&lt;br /&gt;
    [clsid.art_dummy]=true,&lt;br /&gt;
    [clsid.art_electric_ball]=true,&lt;br /&gt;
    [clsid.art_faded_ball]=true,&lt;br /&gt;
    [clsid.art_galantine]=true,&lt;br /&gt;
    [clsid.art_gravi]=true,&lt;br /&gt;
    [clsid.art_gravi_black]=true,&lt;br /&gt;
    [clsid.art_mercury_ball]=true,&lt;br /&gt;
    [clsid.art_needles]=true,&lt;br /&gt;
    [clsid.art_rusty_hair]=true,&lt;br /&gt;
    [clsid.art_thorn]=true,&lt;br /&gt;
    [clsid.art_zuda]=true,&lt;br /&gt;
    [clsid.artefact_s]=true,&lt;br /&gt;
    [clsid.device_detector_simple]=true,&lt;br /&gt;
    [clsid.device_pda]=true,&lt;br /&gt;
    [clsid.device_torch_s]=true,&lt;br /&gt;
    [clsid.equ_exo]=true,&lt;br /&gt;
    [clsid.equ_military]=true,&lt;br /&gt;
    [clsid.equ_scientific]=true,&lt;br /&gt;
    [clsid.equ_stalker_s]=true,&lt;br /&gt;
    [clsid.obj_antirad]=true,&lt;br /&gt;
    [clsid.obj_attachable]=true,&lt;br /&gt;
    [clsid.obj_bandage]=true,&lt;br /&gt;
    [clsid.obj_bolt]=true,&lt;br /&gt;
    [clsid.obj_bottle]=true,&lt;br /&gt;
    [clsid.obj_food]=true,&lt;br /&gt;
    [clsid.obj_medkit]=true,&lt;br /&gt;
    [clsid.wpn_ak74_s]=true,&lt;br /&gt;
    [clsid.wpn_ammo]=true,&lt;br /&gt;
    [clsid.wpn_ammo_m209]=true,&lt;br /&gt;
    [clsid.wpn_ammo_og7b]=true,&lt;br /&gt;
    [clsid.wpn_ammo_vog25]=true,&lt;br /&gt;
    [clsid.wpn_binocular_s]=true,&lt;br /&gt;
    [clsid.wpn_bm16_s]=true,&lt;br /&gt;
    [clsid.wpn_fn2000]=true,&lt;br /&gt;
    [clsid.wpn_fort]=true,&lt;br /&gt;
    [clsid.wpn_groza_s]=true,&lt;br /&gt;
    [clsid.wpn_hpsa_s]=true,&lt;br /&gt;
    [clsid.wpn_knife_s]=true,&lt;br /&gt;
    [clsid.wpn_lr300_s]=true,&lt;br /&gt;
    [clsid.wpn_pm_s]=true,&lt;br /&gt;
    [clsid.wpn_rg6_s]=true,&lt;br /&gt;
    [clsid.wpn_rpg7_s]=true,&lt;br /&gt;
    [clsid.wpn_scope_s]=true,&lt;br /&gt;
    [clsid.wpn_shotgun_s]=true,&lt;br /&gt;
    [clsid.wpn_silencer]=true,&lt;br /&gt;
    [clsid.wpn_svd_s]=true,&lt;br /&gt;
    [clsid.wpn_svu_s]=true,&lt;br /&gt;
    [clsid.wpn_usp45_s]=true,&lt;br /&gt;
    [clsid.wpn_val_s]=true,&lt;br /&gt;
    [clsid.wpn_vintorez_s]=true,&lt;br /&gt;
    [clsid.wpn_walther_s]=true,&lt;br /&gt;
    [clsid.wpn_wmagaz]=true,&lt;br /&gt;
    [clsid.wpn_wmaggl]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local obj_owner={}&lt;br /&gt;
&lt;br /&gt;
function bgwith(str,ptr)&lt;br /&gt;
	local ps=string.find(str,ptr)&lt;br /&gt;
	return ps~=nil and ps==1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isValuable(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  if sec==&amp;quot;amk_metka&amp;quot; then&lt;br /&gt;
    return false,false&lt;br /&gt;
  end&lt;br /&gt;
	if valuable_clsid[obj:clsid()] then&lt;br /&gt;
		return true, false&lt;br /&gt;
	end&lt;br /&gt;
	return bgwith(sec,&amp;quot;af_&amp;quot;) or bgwith(sec,&amp;quot;ammo_&amp;quot;) or bgwith(sec,&amp;quot;wpn_&amp;quot;) or bgwith(sec,&amp;quot;energy_&amp;quot;) or checkCorpse(obj), IsStalker(obj) or IsMonster(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function objValue(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  local multiplier=1&lt;br /&gt;
  if bgwith(sec,&amp;quot;ammo_&amp;quot;) then&lt;br /&gt;
    multiplier=30&lt;br /&gt;
  elseif sec==&amp;quot;vodka&amp;quot; then&lt;br /&gt;
    multiplier=20&lt;br /&gt;
  end&lt;br /&gt;
	if system_ini():section_exist(sec) and system_ini():line_exist(sec,&amp;quot;cost&amp;quot;) then&lt;br /&gt;
		return system_ini():r_float(sec,&amp;quot;cost&amp;quot;)*multiplier&lt;br /&gt;
	end&lt;br /&gt;
	return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function claimGObject(npc,st,obj)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
	end&lt;br /&gt;
	st.grabitemid=obj:id()&lt;br /&gt;
	obj_owner[obj:id()]=npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function freeGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
		st.grabitemid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function clearGObject(st)&lt;br /&gt;
	st.grabitemid=nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		local ret=level.object_by_id(st.grabitemid)&lt;br /&gt;
		if ret==nil then&lt;br /&gt;
			st.grabitemid=nil&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mypGObject(npc,st)&lt;br /&gt;
	return st.grabitemid~=nil and obj_owner[st.grabitemid]~=nil and obj_owner[st.grabitemid]==npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local bad_dangers={&lt;br /&gt;
  [danger_object.hit]=true,&lt;br /&gt;
  [danger_object.attacked]=true,&lt;br /&gt;
  [danger_object.bullet_ricochet]=true,&lt;br /&gt;
  [danger_object.grenade]=true,&lt;br /&gt;
  [danger_object.entity_death]=true,&lt;br /&gt;
  [danger_object.enemy_sound]=true&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
local inertion_time=30000&lt;br /&gt;
&lt;br /&gt;
function bad_danger(npc)&lt;br /&gt;
  local danger=npc:best_danger()&lt;br /&gt;
  if danger then&lt;br /&gt;
    return bad_dangers[danger:type()] and time_global()-danger:time()&amp;lt;inertion_time&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
function ev_see_stuff:evaluate()&lt;br /&gt;
	local res=getGObject(self.st)~=nil&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  local actsch=db.storage[npc:id()].active_scheme&lt;br /&gt;
  if actsch and db.actor then&lt;br /&gt;
    xr_logic.try_switch_to_another_section(npc, db.storage[npc:id()][actsch], db.actor)&lt;br /&gt;
  end&lt;br /&gt;
	local act_sec=db.storage[npc:id()].active_section or &amp;quot;&amp;quot;&lt;br /&gt;
	if (not npc:alive()) or xr_wounded.is_wounded(npc) or npc:best_enemy() or &lt;br /&gt;
      bad_danger(npc) or (actsch and db.storage[npc:id()][actsch].no_loot) then&lt;br /&gt;
		if res then&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; distracted. sect &amp;quot;..act_sec,&amp;quot;grb&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
  local dist_limit=1000&lt;br /&gt;
  if bgwith(act_sec,&amp;quot;camper&amp;quot;) then&lt;br /&gt;
    dist_limit=5&lt;br /&gt;
  end&lt;br /&gt;
	local busy=bgwith(act_sec,&amp;quot;walker&amp;quot;) or bgwith(act_sec,&amp;quot;combat&amp;quot;) or bgwith(act_sec,&amp;quot;danger&amp;quot;) -- or npc:best_danger()&lt;br /&gt;
	if res and self.st.block_search then&lt;br /&gt;
	  -- NPC собрался взять вещь. Временно прекратим поиск.&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	timed(self.st,&amp;quot;tm1&amp;quot;,5000+math.random()*10000,&lt;br /&gt;
		function ()&lt;br /&gt;
--			amk.mylog(npc:name() .. &amp;quot; is going to search stuff&amp;quot;,&amp;quot;grb&amp;quot;)&lt;br /&gt;
			local min_dist=100000&lt;br /&gt;
			local function check_item(o)&lt;br /&gt;
				local obj=o:object()&lt;br /&gt;
				if obj_owner[obj:id()] and (level.object_by_id(obj_owner[obj:id()])==nil or level.object_by_id(obj_owner[obj:id()]):alive()==false) then&lt;br /&gt;
					obj_owner[obj:id()]=nil&lt;br /&gt;
				end&lt;br /&gt;
				if (not self.st.disabled_objects[obj:id()]) and (obj:parent()==nil or not IsStalker(obj:parent())) and &lt;br /&gt;
           (obj_owner[obj:id()]==nil or obj_owner[obj:id()]==npc:id()) and npc:accessible(obj:level_vertex_id()) and&lt;br /&gt;
           (db.actor==nil or db.actor:alive()==false or db.actor:position():distance_to_sqr(obj:position())&amp;gt;6) then&lt;br /&gt;
					local valuable,corpse=isValuable(obj)&lt;br /&gt;
					if valuable then &lt;br /&gt;
						local value=3000&lt;br /&gt;
						if not corpse then&lt;br /&gt;
							value=objValue(obj)&lt;br /&gt;
						end&lt;br /&gt;
						if value&amp;lt;=0 then value=0 end&lt;br /&gt;
						local max_dist=5+math.sqrt(value)&lt;br /&gt;
						if busy then&lt;br /&gt;
							max_dist=max_dist/5&lt;br /&gt;
						end&lt;br /&gt;
						local dist=level.vertex_position(obj:level_vertex_id()):distance_to(npc:position())&lt;br /&gt;
            local corrected_dist=dist&lt;br /&gt;
            if dist&amp;gt;5 then&lt;br /&gt;
              corrected_dist=5+(dist-5)/math.sqrt(value)&lt;br /&gt;
            end&lt;br /&gt;
						if dist&amp;lt;max_dist and corrected_dist&amp;lt;min_dist and dist&amp;lt;dist_limit then&lt;br /&gt;
              min_dist=corrected_dist&lt;br /&gt;
							claimGObject(npc,self.st,obj)&lt;br /&gt;
							res=true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end -- function check_item&lt;br /&gt;
			for o in npc:memory_visible_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
			for o in npc:memory_sound_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
--			for o in npc:not_yet_visible_objects() do&lt;br /&gt;
--				check_item(o)&lt;br /&gt;
--			end&lt;br /&gt;
			if res then &lt;br /&gt;
				amk.mylog(npc:name() .. &amp;quot; claimed &amp;quot;..getGObject(self.st):name()..&amp;quot; cact &amp;quot;..tostring(npc:motivation_action_manager():current_action_id()),&amp;quot;grb&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	return res -- false -- res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_near_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if gi then&lt;br /&gt;
    if self.st.dest_lvid then&lt;br /&gt;
      return npc:level_vertex_id()==self.st.dest_lvid&lt;br /&gt;
    end&lt;br /&gt;
    return level.vertex_position(gi:level_vertex_id()):distance_to_sqr(npc:position())&amp;lt;1&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_body&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:__init(st) super(nil, &amp;quot;ev_see_body&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi then&lt;br /&gt;
    return IsStalker(gi) or IsMonster(gi)&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_position_corrected&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:__init(st) super(nil, &amp;quot;ev_position_corrected&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  return self.st.position_corrected==true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	npc:set_item(object.idle,nil)&lt;br /&gt;
	npc:set_movement_type(move.walk)&lt;br /&gt;
	npc:set_mental_state(anim.danger)&lt;br /&gt;
	npc:set_body_state(move.crouch)&lt;br /&gt;
  npc:movement_enabled(true)&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
--	if gi then npc:set_sight(gi,true,true) end&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab item&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
    if(IsStalker(gi) or IsMonster(gi)) then&lt;br /&gt;
  		self.tt=time_global()+3000&lt;br /&gt;
  	else&lt;br /&gt;
  		self.tt=time_global()+1000&lt;br /&gt;
    	utils.send_to_nearest_accessible_vertex(npc,gi:level_vertex_id())&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	end&lt;br /&gt;
	--npc:set_dest_level_vertex_id(1)&lt;br /&gt;
	self.force=vector():set(0,0,0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
			gi:transfer_item(gi,npc)&lt;br /&gt;
			npc:enable_memory_object(gi,false)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_body&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:__init (st) super (nil, &amp;quot;act_grab_body&amp;quot;)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab body&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
 		self.tt=time_global()+6000&lt;br /&gt;
    state_mgr.set_state(npc,&amp;quot;search&amp;quot;,nil,nil,{look_object=gi})&lt;br /&gt;
  else&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
      gi:iterate_inventory(function (d,item)&lt;br /&gt;
          if item:section()~=&amp;quot;bolt&amp;quot; then &lt;br /&gt;
            gi:transfer_item(item,npc)&lt;br /&gt;
          end&lt;br /&gt;
        end, nil)&lt;br /&gt;
		local num=gi:money() &lt;br /&gt;
		if num and num &amp;gt;0 then &lt;br /&gt;
				local deadmoney = num&lt;br /&gt;
				local gi_rank&lt;br /&gt;
		gi_rank = ranks.get_obj_rank_name(gi)&lt;br /&gt;
		if gi_rank ~= nil then&lt;br /&gt;
			if gi_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=100 then deadmoney=math.random(25,100)    &lt;br /&gt;
			elseif gi_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=200 then deadmoney=math.random(50,200)  &lt;br /&gt;
			elseif gi_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=300 then deadmoney=math.random(100,300) &lt;br /&gt;
			elseif gi_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(200,400)  &lt;br /&gt;
		end&lt;br /&gt;
		end&lt;br /&gt;
		npc:give_money(deadmoney) &lt;br /&gt;
		game_stats.money_quest_update(deadmoney) &lt;br /&gt;
		gi:give_money(-num) &lt;br /&gt;
		game_stats.money_quest_update(-num) &lt;br /&gt;
		end&lt;br /&gt;
      corpse_checked[gi:id()]=false&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function correct_position(gi,npc)&lt;br /&gt;
  if IsStalker(gi) then&lt;br /&gt;
    -- Вычисляем вектор разницы между координатами кости и level vertex. Пытаемся найти level vertex наиболее близкий к кости&lt;br /&gt;
    local diff=gi:bone_position(&amp;quot;bip01_head&amp;quot;):sub(level.vertex_position(gi:level_vertex_id()))&lt;br /&gt;
    local len=diff:magnitude()&lt;br /&gt;
    local diffp=vector():set(diff.z,0,-diff.x):mul(0.5)&lt;br /&gt;
    -- Сдвигаем целевую точку вбок, чтобы непись не залазил ногами в труп&lt;br /&gt;
    diff:add(diffp)&lt;br /&gt;
    return npc:vertex_in_direction(gi:level_vertex_id(),diff,len)&lt;br /&gt;
  else&lt;br /&gt;
    return gi:level_vertex_id()&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_reach_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  self.st.dest_lvid=nil&lt;br /&gt;
  self.tgt_lvid=0&lt;br /&gt;
	if gi then&lt;br /&gt;
		if npc:accessible(gi:level_vertex_id()) then&lt;br /&gt;
		  npc:set_detail_path_type(move.curve)&lt;br /&gt;
		  npc:set_path_type(game_object.level_path)&lt;br /&gt;
      if npc:best_danger() and time_global()-npc:best_danger():time()&amp;lt;inertion_time then&lt;br /&gt;
        npc:set_mental_state(anim.danger)&lt;br /&gt;
        npc:set_body_state(move.crouch)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
--        npc:set_sight(gi,true,true)&lt;br /&gt;
      else&lt;br /&gt;
        npc:set_body_state(move.standing)&lt;br /&gt;
        npc:set_mental_state(anim.free)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
      end&lt;br /&gt;
      npc:movement_enabled(true)&lt;br /&gt;
      if npc:best_weapon() and isWeapon(npc:best_weapon()) then&lt;br /&gt;
--        npc:set_item(object.idle,npc:best_weapon())&lt;br /&gt;
      end&lt;br /&gt;
--			npc:set_dest_level_vertex_id(gi:level_vertex_id())&lt;br /&gt;
			npc:set_sight(look.danger,nil,0)&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) --gi:level_vertex_id()&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
		else&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	self.ct=time_global()&lt;br /&gt;
	self.clvid=npc:level_vertex_id()&lt;br /&gt;
  self.st.position_corrected=false&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to reach item&amp;quot;,&amp;quot;stmt&amp;quot;)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi and gi:parent()~=nil then&lt;br /&gt;
		-- ГГ забрал вкусность. Можно добавить наезд на ГГ.&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
		freeGObject(self.st)&lt;br /&gt;
	elseif gi then&lt;br /&gt;
		if self.clvid==npc:level_vertex_id() then&lt;br /&gt;
			if time_global()-self.ct&amp;gt;10000 then&lt;br /&gt;
			-- не можем добраться до нняки&lt;br /&gt;
				self.st.disabled_objects[gi:id()]=true&lt;br /&gt;
        self.st.dest_lvid=nil&lt;br /&gt;
				freeGObject(self.st)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			self.clvid=npc:level_vertex_id()&lt;br /&gt;
			self.ct=time_global()&lt;br /&gt;
		end&lt;br /&gt;
    if self.tgt_lvid~=gi:level_vertex_id() then&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) -- gi:level_vertex_id()&lt;br /&gt;
			npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
    end&lt;br /&gt;
				--npc:set_sight(gi)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_to_binder(object, char_ini, scheme, section, st)&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	local npc=object&lt;br /&gt;
	st.disabled_objects={}&lt;br /&gt;
  local manager = object:motivation_action_manager()&lt;br /&gt;
&lt;br /&gt;
  local zombi=npc:character_community()==&amp;quot;zombied&amp;quot; or npc:character_community()==&amp;quot;trader&amp;quot; or&lt;br /&gt;
          npc:character_community()==&amp;quot;arena_enemy&amp;quot; or npc:name()==&amp;quot;mil_stalker0012&amp;quot; or npc:name()==&amp;quot;yantar_ecolog_general&amp;quot; or -- сумашедший на милитари и Сахаров&lt;br /&gt;
          npc:name()==&amp;quot;mil_freedom_member0021&amp;quot; -- Скрягу в зомби!&lt;br /&gt;
	&lt;br /&gt;
	local prop_idlecombat=xr_evaluators_id.state_mgr + 3&lt;br /&gt;
  local prop_contact=xr_evaluators_id.stohe_meet_base + 1&lt;br /&gt;
  -- Evaluators&lt;br /&gt;
	if npc:story_id()~=4294967296 or zombi then&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, property_evaluator_const(false))&lt;br /&gt;
	else&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, ev_see_stuff(st,&amp;quot;ev_see_stuff&amp;quot;))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, ev_see_body(st))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, ev_position_corrected(st))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, ev_near_stuff(st,&amp;quot;ev_near_stuff&amp;quot;))&lt;br /&gt;
	  -- Actions&lt;br /&gt;
	  local action = act_grab_item(&amp;quot;act_grab_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true)) -- отключим стэйт менеджер&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,true)) -- для переключения на обыск трупа&lt;br /&gt;
	  manager:add_action (actid_grab_item, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_grab_body(st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
--	  action:add_precondition(world_property(evid_position_corrected,true))&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,false)) -- переключаемся на подъём вещички&lt;br /&gt;
	  manager:add_action (actid_grab_body, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_reach_item(&amp;quot;act_reach_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_contact,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true))&lt;br /&gt;
	  action:add_effect (world_property(evid_near_stuff, true))&lt;br /&gt;
	  manager:add_action (actid_reach_item, action)&lt;br /&gt;
		&lt;br /&gt;
	  action = manager:action(xr_actions_id.alife) &lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
    action = manager:action(stalker_ids.action_danger_planner)&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--    action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 3) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
		&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_meet_base+1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))	&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb end &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_scheme(npc, ini, scheme, section)&lt;br /&gt;
--	amk.mylog(&amp;quot;set scheme &amp;quot;..npc:name()..&amp;quot; story_id &amp;quot;..npc:story_id(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
  local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)&lt;br /&gt;
  st.ini=ini&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Теперь осталось содать скрипт amk.script --у кого есть ненадо--&lt;br /&gt;
и вписываем в него&lt;br /&gt;
&lt;br /&gt;
local npc_spawner={}  --служебный массив, работает автоматически - не трогать шаловливыми русками&lt;br /&gt;
&lt;br /&gt;
local timers={}   --хранит реал-тайм таймеры&lt;br /&gt;
local g_timers={} --хранит таймеры в игровом времени&lt;br /&gt;
local markers={}  --хранит маркеры на карте&lt;br /&gt;
local x_objs={}     --хранит ИДшники объектов&lt;br /&gt;
local timer_trigger=nil&lt;br /&gt;
convert_npc={}&lt;br /&gt;
g_kick=false&lt;br /&gt;
&lt;br /&gt;
is_debug = false&lt;br /&gt;
ver = &amp;quot;0&amp;quot;&lt;br /&gt;
oau_watchdog=0&lt;br /&gt;
oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
--переменные для типсов&lt;br /&gt;
pda_news = xr_sound.get_safe_sound_object([[device\pda\pda_news]])&lt;br /&gt;
pda_tips = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])&lt;br /&gt;
pda_task = xr_sound.get_safe_sound_object([[device\pda\pda_objective]])&lt;br /&gt;
&lt;br /&gt;
tips_icons = {&lt;br /&gt;
  default  = { 0, 658},&lt;br /&gt;
  trader   = { 332, 893},&lt;br /&gt;
  dolg     = { 0, 658},&lt;br /&gt;
  freedom  = { 0, 658},&lt;br /&gt;
  ecolog   = { 498, 0},&lt;br /&gt;
  arena    = { 332, 141},&lt;br /&gt;
  stalker  = { 0, 658},&lt;br /&gt;
  krot     = { 332, 47},&lt;br /&gt;
  barman   = { 332, 235},&lt;br /&gt;
  wolf   = { 332, 940},&lt;br /&gt;
  o_soznanie = { 498, 893},&lt;br /&gt;
  monolith = { 0, 658},&lt;br /&gt;
    saharov  = { 332, 470},&lt;br /&gt;
    prizrak  = { 0, 658},&lt;br /&gt;
    killer   = { 0, 658},&lt;br /&gt;
  death     = { 0, 752},&lt;br /&gt;
  gen_info  = { 0, 658},&lt;br /&gt;
	trade 		= { 0, 0},&lt;br /&gt;
  uniq  =  {  498, 47}    --{ 498, 188}&lt;br /&gt;
}&lt;br /&gt;
----------------&lt;br /&gt;
local bufferedmessages={}&lt;br /&gt;
&lt;br /&gt;
function logct(msg,tag)&lt;br /&gt;
	if true and (tag and (tag==&amp;quot;mcbt&amp;quot; or tag==&amp;quot;temp&amp;quot;)) then --(tag==&amp;quot;dram&amp;quot;)) then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))		&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rep(npc,msg,tag)&lt;br /&gt;
	if string.find(npc:name(),&amp;quot;gar_dm&amp;quot;) then&lt;br /&gt;
		logct(msg,tag)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mylog(msg)&lt;br /&gt;
  if is_debug then &lt;br /&gt;
	  if msg==nil then&lt;br /&gt;
	    return &lt;br /&gt;
	  end&lt;br /&gt;
	  if db and db.actor then&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      for k,v in ipairs(bufferedmessages) do&lt;br /&gt;
	        db.actor:give_game_news(v, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	      end&lt;br /&gt;
	      bufferedmessages=nil&lt;br /&gt;
	    end&lt;br /&gt;
	  db.actor:give_game_news(msg, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	  else&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      table.insert(bufferedmessages,msg)&lt;br /&gt;
	    end&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	  if get_console() then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))&lt;br /&gt;
	    get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--показываем типс&lt;br /&gt;
function send_tip(news_text, header, timeout, showtime, sender, sound)&lt;br /&gt;
  if news_text==nil then return end&lt;br /&gt;
  if header==nil then header=game.translate_string(&amp;quot;st_tip&amp;quot;) end&lt;br /&gt;
  if timeout == nil then timeout = 0 end&lt;br /&gt;
  if showtime == nil then showtime = 5 end&lt;br /&gt;
  &lt;br /&gt;
  local player&lt;br /&gt;
  if sound==&amp;quot;news&amp;quot; then&lt;br /&gt;
    player=pda_news&lt;br /&gt;
  elseif sound==&amp;quot;task&amp;quot; then&lt;br /&gt;
    player=pda_task&lt;br /&gt;
  else&lt;br /&gt;
    player=pda_tips&lt;br /&gt;
  end   &lt;br /&gt;
  &lt;br /&gt;
  --' Играем дефолтный звук&lt;br /&gt;
  player:play(db.actor, timeout, sound_object.s2d)&lt;br /&gt;
  &lt;br /&gt;
  if sender == nil then&lt;br /&gt;
    sender = &amp;quot;default&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
  local x = tips_icons[sender][1]&lt;br /&gt;
  local y = tips_icons[sender][2]&lt;br /&gt;
  &lt;br /&gt;
  local news_text = &amp;quot;%c[255,160,160,160]&amp;quot;..header..&amp;quot;\\n&amp;quot;..&amp;quot;%c[default]&amp;quot;..news_text&lt;br /&gt;
  db.actor:give_game_news(news_text, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(x,y,83,47), timeout*1000, showtime*1000)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_spot_on_map(obj_id,type,text)&lt;br /&gt;
  --возможные типы type смотри в ui\map_spots.xml &lt;br /&gt;
  if obj_id then&lt;br /&gt;
    if text==nil then text=&amp;quot; &amp;quot; end&lt;br /&gt;
    -- Ставим метку на серверный объект чтобы её не пришлось обновлять&lt;br /&gt;
    level.map_add_object_spot_ser(obj_id, type, text)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id, type)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id, text)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function remove_spot_from_map(obj_id,type)&lt;br /&gt;
  if obj_id and level.map_has_object_spot(obj_id, type)~= 0 then&lt;br /&gt;
    level.map_remove_object_spot(obj_id, type)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в реальном времени&lt;br /&gt;
function start_timer(name,delay,action)&lt;br /&gt;
  if not delay then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if not action then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;xt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;xt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;xd&amp;quot;..a, time+delay*1000*system_ini():r_float(&amp;quot;alife&amp;quot;,&amp;quot;time_factor&amp;quot;))&lt;br /&gt;
  save_variable(&amp;quot;xp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в игровом времени&lt;br /&gt;
function g_start_timer(name,delay_d,delay_h,delay_m,action)&lt;br /&gt;
    local time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  if delay_d==nil or delay_h==nil or delay_m==nil then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if action==nil then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;gt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  save_variable(&amp;quot;gt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;gd&amp;quot;..a, time+delay_d*60*24+delay_h*60+delay_m)&lt;br /&gt;
  save_variable(&amp;quot;gp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_g_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Временное хранилище для переменных удалённых из pstor&lt;br /&gt;
local emerg_store&lt;br /&gt;
-- Удаляем переменные из pstor. Чтобы не переполнить буфер&lt;br /&gt;
function emergency_cleanup()&lt;br /&gt;
  emerg_store={}&lt;br /&gt;
  if load_variable(&amp;quot;zombied&amp;quot;,false) then&lt;br /&gt;
    emerg_store.zombied=load_table(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
    del_variable(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  for i=1,100,1 do&lt;br /&gt;
    if load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
      emerg_store[i]={}&lt;br /&gt;
      emerg_store[i].gt=load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gd=load_variable(&amp;quot;gd&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gp=load_variable(&amp;quot;gp&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      del_variable(&amp;quot;gt&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gd&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gp&amp;quot;..i)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;emerg&amp;quot;,true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Восстанавливаем удалённые переменные&lt;br /&gt;
function emergency_restore()&lt;br /&gt;
  for k,v in pairs(emerg_store) do&lt;br /&gt;
    if k==&amp;quot;zombied&amp;quot; then&lt;br /&gt;
      save_table(k,v)&lt;br /&gt;
    else&lt;br /&gt;
      save_variable(&amp;quot;gt&amp;quot;..k,v.gt)&lt;br /&gt;
      save_variable(&amp;quot;gd&amp;quot;..k,v.gd)&lt;br /&gt;
      save_variable(&amp;quot;gp&amp;quot;..k,v.gp)      &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  del_variable(&amp;quot;emerg&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function convert_timers()&lt;br /&gt;
  if load_variable(&amp;quot;tmcv&amp;quot;,true) then&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_timer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;xt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;xd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;xp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_gtimer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;gt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;gd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;gp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    save_variable(&amp;quot;tmcv&amp;quot;,false)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--проверка таймеров, использует 3 следующие за ним функции для выбора действия&lt;br /&gt;
function check_timers()&lt;br /&gt;
  local tmp&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __g_timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __timer_found(idx)&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;xd&amp;quot;..idx, nil)&amp;lt;=time then&lt;br /&gt;
    name=load_variable(&amp;quot;xt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;xp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;xt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __g_timer_found(idx)&lt;br /&gt;
    local gtime = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;gd&amp;quot;..idx, nil)&amp;lt;=gtime then&lt;br /&gt;
    name=load_variable(&amp;quot;gt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;gp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;gt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __do_timer_action(select_string,params_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
  if select_string==&amp;quot;show_news&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;show_news&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;gg_need_sleep&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_nrg&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_nrg&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
--[[&lt;br /&gt;
if select_string==&amp;quot;sleep_med&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_med&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
 ]]--&lt;br /&gt;
  if select_string==&amp;quot;sleep_matras&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_matras&amp;quot;,params_string)&lt;br /&gt;
  end &lt;br /&gt;
  if select_string==&amp;quot;sleep_tr_item&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_tr_item&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_notebook&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_notebook&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;block_sleep_menu&amp;quot; then&lt;br /&gt;
    save_variable(&amp;quot;block_sleep_menu&amp;quot;,0)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;radar_fix&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;radar_fix&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;af_transform_end&amp;quot;,unpack_array_from_string(params_string))&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;amk_freeplay&amp;quot; then&lt;br /&gt;
    if amk.load_variable(&amp;quot;freeplay&amp;quot;,0)==1 and level.name()==&amp;quot;l12_stancia_2&amp;quot; then&lt;br /&gt;
      xr_effects.game_credits()&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Blowout_pp&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;test&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout_ss&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;blowout_scary_sounds&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blow_shift&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_repbox&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;repbox_cond&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;after_repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;collect_anomalies_info&amp;quot; then&lt;br /&gt;
    amk_anoms.collect_info()&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;news_check&amp;quot; then&lt;br /&gt;
    if (news_main and news_main.check_news) then&lt;br /&gt;
		news_main.check_news()&lt;br /&gt;
	end&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
end&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--спавним объекты на карту&lt;br /&gt;
--для спавна неписей смотрим config\creatures\spawn_sections.ltx - там написаны имена секций для разных типов неписей&lt;br /&gt;
function spawn_item(spawn_item, pos, gv,lv)&lt;br /&gt;
  if gv==nil then gv=db.actor:game_vertex_id() end&lt;br /&gt;
  if lv==nil then lv=db.actor:level_vertex_id() end&lt;br /&gt;
  return alife():create(spawn_item, pos, lv, gv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для спавна патронов используем spawn_ammo_in_inv&lt;br /&gt;
function spawn_item_in_inv(spawn_item,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  return alife():create(spawn_item, &lt;br /&gt;
      npc:position(),&lt;br /&gt;
      npc:level_vertex_id(),  &lt;br /&gt;
      npc:game_vertex_id(),&lt;br /&gt;
      npc:id())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--используем для спавна патронов&lt;br /&gt;
function spawn_ammo_in_inv(spawn_item,number,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  if number &amp;gt; 0 then&lt;br /&gt;
    return se_respawn.create_ammo(spawn_item, &lt;br /&gt;
        npc:position(),&lt;br /&gt;
        npc:level_vertex_id(),  &lt;br /&gt;
        npc:game_vertex_id(),&lt;br /&gt;
        npc:id(),&lt;br /&gt;
        number)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- удаляем объект из игры&lt;br /&gt;
function remove_item(remove_item)&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выбрасываем объект из инвентаря, применимо к ГГ&lt;br /&gt;
function drop_item(npc,item)&lt;br /&gt;
  if item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(item)&lt;br /&gt;
    npc:drop_item(item)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--убиваем непися&lt;br /&gt;
function make_suicide(npc)&lt;br /&gt;
  npc:kill(npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--узнаем отношение одного непися к другому&lt;br /&gt;
function get_npc_relation(obj,target)&lt;br /&gt;
  local rel = obj:relation(target)&lt;br /&gt;
  local relation&lt;br /&gt;
  if rel==game_object.neutral then&lt;br /&gt;
    relation=&amp;quot;neutral&amp;quot;&lt;br /&gt;
  elseif rel==game_object.friend then&lt;br /&gt;
    relation=&amp;quot;friend&amp;quot;&lt;br /&gt;
  elseif rel==game_object.enemy then&lt;br /&gt;
    relation=&amp;quot;enemy&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  return relation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--задаем отношение одного непися к другому&lt;br /&gt;
function set_npc_relation(obj,target,relation)&lt;br /&gt;
  local rel&lt;br /&gt;
  if relation==&amp;quot;neutral&amp;quot; then&lt;br /&gt;
    rel=game_object.neutral&lt;br /&gt;
  elseif relation==&amp;quot;friend&amp;quot; then&lt;br /&gt;
    rel=game_object.friend&lt;br /&gt;
  elseif relation==&amp;quot;enemy&amp;quot; then&lt;br /&gt;
    rel=game_object.enemy&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end &lt;br /&gt;
  obj:set_relation(rel,target)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- узнаем группировку непися, применимо к ГГ, только ОНЛАЙН&lt;br /&gt;
function get_npc_community(npc)&lt;br /&gt;
  return npc:character_community()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выставляем группировку непися, можно ГГ, только ОНЛАЙН&lt;br /&gt;
function set_npc_community(npc,community_string)&lt;br /&gt;
  --значения для community_string можно узнать в config\creatures\game_relations.ltx&lt;br /&gt;
  return npc:set_character_community(community_string, 0, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря по имени&lt;br /&gt;
function remove_item_from_inventory_by_name(remove_item_name,npc)&lt;br /&gt;
  return remove_item_from_inventory(npc:object(remove_item_name),npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря&lt;br /&gt;
function remove_item_from_inventory(remove_item,npc)&lt;br /&gt;
  if npc==nil then npc=db.actor end&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(remove_item)&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--создаем &amp;quot;ожидатели&amp;quot; для неписей нужно для корректной работы с объектами, созданными внутри скрипта&lt;br /&gt;
function create_waiter_for_npc(npc,select_string)--неписи&lt;br /&gt;
  npc_spawner[npc.id]=select_string&lt;br /&gt;
  save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
end&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--очищаем инвентарь непися, можно ГГ, использует следующую фунцию для удаления предмета&lt;br /&gt;
function clear_npc_inventory(npc)&lt;br /&gt;
    npc:iterate_inventory(__del_item, npc)&lt;br /&gt;
end&lt;br /&gt;
function __del_item(npc, item)&lt;br /&gt;
    local section = item:section()&lt;br /&gt;
&lt;br /&gt;
    if section == &amp;quot;bolt&amp;quot; or section == &amp;quot;device_torch&amp;quot; then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
--    npc:mark_item_dropped(item)&lt;br /&gt;
    alife():release(alife():object(item:id()), true)&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
--проверка запущена ли игра&lt;br /&gt;
function check_game()&lt;br /&gt;
  if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем переменную&lt;br /&gt;
function save_variable(variable_name, value)&lt;br /&gt;
  if value==nil then&lt;br /&gt;
    amk.mylog(&amp;quot;saving nil into &amp;quot;..variable_name)&lt;br /&gt;
    del_variable(variable_name)&lt;br /&gt;
  else&lt;br /&gt;
    local vn=compress_name(variable_name)&lt;br /&gt;
    xr_logic.pstor_store(db.actor, vn, value)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем переменную&lt;br /&gt;
function load_variable(variable_name, value_if_not_found)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  return xr_logic.pstor_retrieve(db.actor, vn, value_if_not_found)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем переменную&lt;br /&gt;
function del_variable(variable_name)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  if db.storage[db.actor:id()].pstor[vn] then&lt;br /&gt;
    db.storage[db.actor:id()].pstor[vn] = nil&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица компрессии имён&lt;br /&gt;
local compress_table={&lt;br /&gt;
}&lt;br /&gt;
local checked=false&lt;br /&gt;
&lt;br /&gt;
-- Преобразует имя переменной в короткое&lt;br /&gt;
function compress_name(name)&lt;br /&gt;
  return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--определяем находится ли ГГ в определенной зоне&lt;br /&gt;
function check_npc_in_box(npc, p1,p2,p3)&lt;br /&gt;
  local pos&lt;br /&gt;
  if npc.name then pos=npc:position() else pos=npc end&lt;br /&gt;
  if p3==nil then&lt;br /&gt;
    if is_point_inside_interval(pos.x,p1.x,p2.x) and&lt;br /&gt;
      is_point_inside_interval(pos.y,p1.y,p2.y) and&lt;br /&gt;
      is_point_inside_interval(pos.z,p1.z,p2.z) then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false  &lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    local v1,v2,r,proj1,proj2,dv1,dv2&lt;br /&gt;
    v1=sub(p2,p1)&lt;br /&gt;
    v2=sub(p3,p2)&lt;br /&gt;
    v1.y=0 &lt;br /&gt;
    v2.y=0&lt;br /&gt;
    dv1=v1:magnitude()&lt;br /&gt;
    dv2=v2:magnitude()&lt;br /&gt;
    v1:normalize() &lt;br /&gt;
    v2:normalize()&lt;br /&gt;
    r=sub(pos,p1)&lt;br /&gt;
    local v1p=vector():set(v1.z,0,-v1.x)&lt;br /&gt;
    proj2=v1p:dotproduct(r)/v1p:dotproduct(v2)&lt;br /&gt;
    proj1=v1:dotproduct(r)-v1:dotproduct(v2)*proj2&lt;br /&gt;
    if proj1&amp;gt;0 and proj1&amp;lt;dv1 and proj2&amp;gt;0 and proj2&amp;lt;dv2 and pos.y&amp;gt;p1.y and pos.y&amp;lt;p3.y then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function is_point_inside_interval(x,p1,p2)&lt;br /&gt;
  if p1&amp;gt;p2 then &lt;br /&gt;
    p1,p2 = p2,p1 &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if x&amp;gt;p1 and x&amp;lt;p2 then &lt;br /&gt;
    return true&lt;br /&gt;
  else &lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sub(v1,v2)&lt;br /&gt;
  local newvec = vector()&lt;br /&gt;
  newvec.x = v1.x-v2.x&lt;br /&gt;
  newvec.y = v1.y-v2.y&lt;br /&gt;
  newvec.z = v1.z-v2.z&lt;br /&gt;
  return newvec&lt;br /&gt;
end&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
--инвентарное название объекта&lt;br /&gt;
function get_inv_name(section)&lt;br /&gt;
  return system_ini():r_string(section,&amp;quot;inv_name&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Внимание! Строки в структуре не должны содержать символов с кодами 0-31.&lt;br /&gt;
function pack_array_to_string(array)&lt;br /&gt;
  return string.char(1)..pack_new(array)&lt;br /&gt;
  -- local str=&amp;quot;&amp;quot;&lt;br /&gt;
  -- local key&lt;br /&gt;
  -- for key0,value in pairs(array) do&lt;br /&gt;
    -- if type(key0)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      -- key='&amp;quot;'..key0..'&amp;quot;'&lt;br /&gt;
    -- else&lt;br /&gt;
      -- key=key0&lt;br /&gt;
    -- end&lt;br /&gt;
    -- if type(value)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      -- local substr=pack_array_to_string(value)&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;{&amp;quot;..substr..&amp;quot;}|&amp;quot;&lt;br /&gt;
    -- elseif type(value)==&amp;quot;customdata&amp;quot; or type(value)==&amp;quot;function&amp;quot; then&lt;br /&gt;
      -- mylog(&amp;quot;Custom data and function isn't supported&amp;quot;)&lt;br /&gt;
    -- elseif type(value)==&amp;quot;boolean&amp;quot; or type(value)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;&amp;quot;..tostring(value)..&amp;quot;|&amp;quot;&lt;br /&gt;
    -- else&lt;br /&gt;
      -- str=str..key..'=&amp;gt;&amp;quot;'..value..'&amp;quot;|'&lt;br /&gt;
    -- end&lt;br /&gt;
  -- end&lt;br /&gt;
  -- return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function unpack_array_from_string(str)&lt;br /&gt;
  if str==nil or str==&amp;quot;&amp;quot; then return {} end&lt;br /&gt;
  if string.sub(str,1,1)~=string.char(1) then&lt;br /&gt;
    -- Старый формат упаковки&lt;br /&gt;
    return _parse(str)&lt;br /&gt;
  else&lt;br /&gt;
    -- новый формат упаковки тэгирован символом c кодом 1.&lt;br /&gt;
    return parse_new(string.sub(str,2,-1))&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _assign(tbl,key,val)&lt;br /&gt;
  local key0=string.match(key,'&amp;quot;(.*)&amp;quot;')&lt;br /&gt;
  if key0 then&lt;br /&gt;
    tbl[key0]=val&lt;br /&gt;
  else&lt;br /&gt;
    tbl[key+0]=val&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pack_type_num=1&lt;br /&gt;
local pack_type_string=2&lt;br /&gt;
local pack_type_bool=3&lt;br /&gt;
local pack_type_table=4&lt;br /&gt;
local pack_val_endtable=5&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
 Новый формат упаковки: &lt;br /&gt;
 table ::= subtable&lt;br /&gt;
 subtable ::= keytype key valuetype ( value | subtable 0x5 )&lt;br /&gt;
 keytype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
 valuetype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
]]&lt;br /&gt;
function pack_new(tbl)&lt;br /&gt;
  local ret=&amp;quot;&amp;quot;&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(k)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..k&lt;br /&gt;
    elseif type(k)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..k&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..type(k))&lt;br /&gt;
    end&lt;br /&gt;
    if type(v)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_bool)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_table)..pack_new(v)..string.char(pack_val_endtable)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_new(str,idx)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  idx=idx or 1&lt;br /&gt;
  while true do&lt;br /&gt;
    local key,value&lt;br /&gt;
    if idx&amp;gt;string.len(str) then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      key,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      key,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_val_endtable then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      value,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      value,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_bool then&lt;br /&gt;
      value,idx=get_bool(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_table then&lt;br /&gt;
      value,idx=parse_new(str,idx)&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    ret[key]=value&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_byte(str,idx)&lt;br /&gt;
  return string.byte(string.sub(str,idx,idx)),idx+1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_string(str,idx)&lt;br /&gt;
  local idx1=string.len(str)+1&lt;br /&gt;
  for i=idx,string.len(str),1 do&lt;br /&gt;
    if string.byte(string.sub(str,i,i))&amp;lt;32 then&lt;br /&gt;
      idx1=i&lt;br /&gt;
      break&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return string.sub(str,idx,idx1-1),idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_num(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st+0,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_bool(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st==&amp;quot;1&amp;quot;,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function _parse(str)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  while str and str~=&amp;quot;&amp;quot; do&lt;br /&gt;
    local i1,i2,key=string.find(str,'(.-)=&amp;gt;')&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
    i1,i2,val=string.find(str,'&amp;quot;(.-)&amp;quot;|')&lt;br /&gt;
    if val and i1==1 then&lt;br /&gt;
      -- строка&lt;br /&gt;
      _assign(ret,key,val)&lt;br /&gt;
    else&lt;br /&gt;
      i1,i2,val=string.find(str,'(%b{})|')&lt;br /&gt;
      if val and i1==1 then&lt;br /&gt;
        -- таблица&lt;br /&gt;
        _assign(ret,key,_parse(string.sub(val,2,-2)))&lt;br /&gt;
      else&lt;br /&gt;
        i1,i2,val=string.find(str,'(.-)|')&lt;br /&gt;
        -- число или булево значение&lt;br /&gt;
        if val==&amp;quot;true&amp;quot; then&lt;br /&gt;
          _assign(ret,key,true)&lt;br /&gt;
        elseif val==&amp;quot;false&amp;quot; then&lt;br /&gt;
          _assign(ret,key,false)&lt;br /&gt;
        else&lt;br /&gt;
          _assign(ret,key,val+0)&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
--callback section&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на получение инфопоршена&lt;br /&gt;
function on_info(npc, info_id)&lt;br /&gt;
	if (news_main and news_main.on_info) then&lt;br /&gt;
		news_main.on_info(info_id)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ&lt;br /&gt;
function on_item_take(obj)&lt;br /&gt;
	escape_dialog.have_a_art()&lt;br /&gt;
	flamethrower.have_a_fire_kolobok()&lt;br /&gt;
	flamethrower.have_a_trubki()&lt;br /&gt;
	flamethrower.have_a_manometr()&lt;br /&gt;
	flamethrower.have_a_vodko()&lt;br /&gt;
	flamethrower.have_a_gorelka()&lt;br /&gt;
	&lt;br /&gt;
	remove_spot_from_map(obj:id(),&amp;quot;red_location&amp;quot;)&lt;br /&gt;
	mod_call(&amp;quot;check_usable_item&amp;quot;,obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ из ящика&lt;br /&gt;
function on_item_take_from_box(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на потерю предмета из инвентаря ГГ&lt;br /&gt;
function on_item_drop(obj)&lt;br /&gt;
  mod_call(&amp;quot;check_for_af_drop&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_sleep_item&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_beacon_drop&amp;quot;,obj)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
  amk_alcohol.drink_vodka(obj)&lt;br /&gt;
  --&lt;br /&gt;
flamethrower.have_a_fire_kolobok()&lt;br /&gt;
flamethrower.have_a_trubki()&lt;br /&gt;
flamethrower.have_a_manometr()&lt;br /&gt;
flamethrower.have_a_vodko()&lt;br /&gt;
flamethrower.have_a_gorelka()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local prev_health=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--колбэк на апдейт ГГ (удобно для проверки условий, так как вызывается постоянно, нельзя перегружать, а то будут лаги)&lt;br /&gt;
function on_actor_upade(delta)&lt;br /&gt;
	oau_watchdog=100&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade begin&amp;quot;)&lt;br /&gt;
 --не удалять! библиотечная конструкция&lt;br /&gt;
  if not timer_trigger then &lt;br /&gt;
    timer_trigger=game.time() &lt;br /&gt;
  end&lt;br /&gt;
  if timer_trigger&amp;lt;=game.time() then&lt;br /&gt;
    timer_trigger=game.time()+1000&lt;br /&gt;
    check_timers()&lt;br /&gt;
  end&lt;br /&gt;
	--user area &lt;br /&gt;
	oau_watchdog=99&lt;br /&gt;
  mod_call(&amp;quot;blowout_phantoms&amp;quot;)&lt;br /&gt;
	oau_watchdog=98&lt;br /&gt;
  mod_call(&amp;quot;check_radar_off&amp;quot;)&lt;br /&gt;
	oau_watchdog=97&lt;br /&gt;
  mod_call(&amp;quot;check_metka&amp;quot;)&lt;br /&gt;
	oau_watchdog=96&lt;br /&gt;
  mod_call(&amp;quot;check_hud&amp;quot;)&lt;br /&gt;
	oau_watchdog=95&lt;br /&gt;
  mod_call(&amp;quot;weather_manager&amp;quot;)&lt;br /&gt;
	oau_watchdog=94&lt;br /&gt;
  mod_call(&amp;quot;check_armor&amp;quot;)&lt;br /&gt;
	oau_watchdog=93&lt;br /&gt;
  mod_call(&amp;quot;firebat_ammo&amp;quot;)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
	oau_watchdog=931&lt;br /&gt;
  amk_alcohol.check_alcohol()&lt;br /&gt;
	oau_watchdog=92&lt;br /&gt;
  amk_mod.on_blowout_hit_actor()&lt;br /&gt;
	oau_watchdog=91&lt;br /&gt;
  if amk_target then amk_target.update() end&lt;br /&gt;
  --&lt;br /&gt;
  for k,v in pairs(convert_npc) do&lt;br /&gt;
    local obj=level.object_by_id(k)&lt;br /&gt;
		local sobj=alife():object(k)&lt;br /&gt;
		if sobj then&lt;br /&gt;
	    if obj==nil and v==true then&lt;br /&gt;
	      convert_npc[k]=false&lt;br /&gt;
	      switch_online(k)&lt;br /&gt;
      elseif obj and v==false then&lt;br /&gt;
        convert_npc[k]=nil&lt;br /&gt;
	    elseif v==1 and obj then -- тайник не перешёл в оффлайн попытаемся его туда запихнуть.&lt;br /&gt;
       alife():set_switch_online(k, false)&lt;br /&gt;
       alife():set_switch_offline(k, true)&lt;br /&gt;
      elseif v==1 then -- тайник в оффлайне. выталкиваем.&lt;br /&gt;
	      convert_npc[k]=nil&lt;br /&gt;
	      switch_online(k)      &lt;br /&gt;
			else&lt;br /&gt;
--				convert_npc[k]=nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			convert_npc[k]=nil&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
	oau_watchdog=90&lt;br /&gt;
&lt;br /&gt;
	if gg_kick then	&lt;br /&gt;
		if prev_health&amp;gt;db.actor.health+0.05 then&lt;br /&gt;
			level.add_pp_effector(&amp;quot;amk_shoot.ppe&amp;quot;, 2011, false)&lt;br /&gt;
			level.set_pp_effector_factor(2011, (prev_health-db.actor.health)*100)  &lt;br /&gt;
			&lt;br /&gt;
			if prev_health&amp;gt;db.actor.health+0.30 then&lt;br /&gt;
				level.add_cam_effector(&amp;quot;camera_effects\\fusker.anm&amp;quot;, 999, false, &amp;quot;&amp;quot;)	&lt;br /&gt;
				local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])&lt;br /&gt;
				snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)&lt;br /&gt;
				if math.random()&amp;lt;0.20 then&lt;br /&gt;
					local active_item = db.actor:active_item()&lt;br /&gt;
					if active_item and active_item:section()~= &amp;quot;bolt&amp;quot; and active_item:section()~= &amp;quot;wpn_knife&amp;quot; then&lt;br /&gt;
						db.actor:drop_item(active_item)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
		prev_health = db.actor.health&lt;br /&gt;
	end&lt;br /&gt;
	oau_watchdog=89&lt;br /&gt;
	&lt;br /&gt;
	if (amk_offline_alife) then&lt;br /&gt;
      amk_offline_alife.update()&lt;br /&gt;
    end&lt;br /&gt;
	oau_watchdog=88&lt;br /&gt;
	if (amk_corpses) then&lt;br /&gt;
		for a=1, 3 do&lt;br /&gt;
			amk_corpses.update()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	amk_anoms.update()&lt;br /&gt;
	oau_watchdog=0&lt;br /&gt;
	oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--хех, определяем тип патронов в стволе...	&lt;br /&gt;
	--[[&lt;br /&gt;
	local weapon = db.actor:item_in_slot(2)&lt;br /&gt;
	&lt;br /&gt;
	if db.actor:active_slot()==2 and weapon then&lt;br /&gt;
		local t = get_weapon_data(alife():object(weapon:id()))&lt;br /&gt;
		mylog(t.ammo_type)&lt;br /&gt;
	end&lt;br /&gt;
	]]&lt;br /&gt;
-----------&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на создание непися (точнее на его переход в онлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_spawn(npc)&lt;br /&gt;
  if npc == nil then return end&lt;br /&gt;
	if (news_main and news_main.on_spawn) then&lt;br /&gt;
		news_main.on_spawn(npc)&lt;br /&gt;
	end&lt;br /&gt;
  for k,v in pairs(npc_spawner) do&lt;br /&gt;
    if k==npc:id() then &lt;br /&gt;
      __npc_spawn_case(npc,v)&lt;br /&gt;
      npc_spawner[k]=nil&lt;br /&gt;
    save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
      return&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __npc_spawn_case(npc,select_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
-----------&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
function on_net_spawn(obj)&lt;br /&gt;
	amk_mod.build_btrs_table(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на удаление непися (точнее на его переход в оффлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_go_offline(npc)&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
	if amk_offline_alife then&lt;br /&gt;
		if check_game()==true then&lt;br /&gt;
		local sobj = alife():object(npc:id())&lt;br /&gt;
		if sobj then&lt;br /&gt;
			amk_offline_alife.process_trade(sobj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_go_offline(npc)&lt;br /&gt;
--	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на юзание объекта&lt;br /&gt;
function on_use(victim, who)&lt;br /&gt;
  if db.actor and who and who:id()==db.actor:id() then&lt;br /&gt;
    mod_call(&amp;quot;check_usable_item&amp;quot;,victim)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на смерть непися&lt;br /&gt;
function on_death(victim, who)&lt;br /&gt;
if (news_main and news_main.on_death) then&lt;br /&gt;
	news_main.on_death(victim, who)&lt;br /&gt;
end&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(victim)&lt;br /&gt;
  mod_call(&amp;quot;generate_recipe&amp;quot;,victim,who)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, victim, 1, nil, who, 14)&lt;br /&gt;
	mod_call(&amp;quot;zomby_blow&amp;quot;,victim)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_npc_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_ph_obj_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- проверка на видимость производится раз в секунду&lt;br /&gt;
function enemy_see_actor(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function actor_see_enemy(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- непись стрелял в гг&lt;br /&gt;
function npc_shot_actor(obj) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем все переменные, которые нужно, вызывается загрузке игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_load()&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load begin&amp;quot;)&lt;br /&gt;
	amk.mylog(&amp;quot;object 2972 is &amp;quot;..((alife():object(2972) and alife():object(2972):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
	amk.mylog(&amp;quot;object 2975 is &amp;quot;..((alife():object(2975) and alife():object(2975):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  if db.storage[db.actor:id()].pstor == nil then&lt;br /&gt;
    db.storage[db.actor:id()].pstor = {}&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  npc_spawner=unpack_array_from_string(load_variable(&amp;quot;x_npc_spawner&amp;quot;,&amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  mod_call(&amp;quot;first_run&amp;quot;)&lt;br /&gt;
  convert_timers() -- исправим старые названия таймеров&lt;br /&gt;
-- Метки теперь ставятся на серверные объекты. Обновлять их не нужно&lt;br /&gt;
--[[&lt;br /&gt;
  local tmp,tmp1&lt;br /&gt;
  for a=1,65534,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;x_marker_type_&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      tmp1=load_variable(&amp;quot;x_marker_text_&amp;quot;..a,nil)&lt;br /&gt;
      level.map_add_object_spot(a, tmp, tmp1)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
]]&lt;br /&gt;
  &lt;br /&gt;
--user area &lt;br /&gt;
	if system_ini():r_float(&amp;quot;gg_kick&amp;quot;,&amp;quot;enabled&amp;quot;)&amp;gt;0.0 then gg_kick=true else gg_kick=false end&lt;br /&gt;
  mod_call(&amp;quot;test_sleep_pp&amp;quot;)&lt;br /&gt;
  mod_call(&amp;quot;check_spawn&amp;quot;)&lt;br /&gt;
--  local str=string&lt;br /&gt;
  if has_alife_info(&amp;quot;val_actor_has_borov_key&amp;quot;) and not has_alife_info(&amp;quot;val_borov_dead&amp;quot;) then&lt;br /&gt;
    db.actor:give_info_portion(&amp;quot;val_borov_dead&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
-----------&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем все переменные, которые нужно, вызывается присохранении игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_save() &lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Эта функция вызывается самой первой. Онлайновые объекты недоступны! db.actor недоступен!&lt;br /&gt;
function on_game_start()&lt;br /&gt;
  mod_call(&amp;quot;on_game_start&amp;quot;)&lt;br /&gt;
	ver = get_ver()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------- user function section---------------&lt;br /&gt;
function mod_call(i,...)&lt;br /&gt;
  if not amk_mod[i] then&lt;br /&gt;
    amk_mod.f=function () loadstring(amk.decode(c))() end&lt;br /&gt;
    setfenv(amk_mod.f,amk_mod)&lt;br /&gt;
    amk_mod.f()&lt;br /&gt;
  end&lt;br /&gt;
  amk_mod[i](...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function load_table(name)&lt;br /&gt;
  local var=load_variable(name)&lt;br /&gt;
  return (var==nil and {}) or unpack_array_from_string(var)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function save_table(name,tbl)&lt;br /&gt;
  save_variable(name,pack_array_to_string(tbl))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function update_table(name,id,val)&lt;br /&gt;
  local tbl=load_table(name)&lt;br /&gt;
  tbl[id]=val&lt;br /&gt;
  save_table(name,tbl)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sixbit(char) local byte = string.byte(char) local result = nil if (byte == 61) then result = 0 elseif (byte == 45 or byte == 43) then result = 62 elseif (byte == 95 or byte == 47) then result = 63 elseif (byte &amp;lt;= 57) then result = byte + 4 elseif (byte &amp;lt;= 90) then result = byte - 65 elseif (byte &amp;lt;= 122) then result = byte - 71 end return result end function decodeblock(block) local sixbits = {} local result = &amp;quot;&amp;quot; for counter=1,4 do sixbits[counter] = sixbit(string.sub(block,counter,counter)) end result = string.char(sixbits[1]*4 + math.floor(sixbits[2] / 16)) if (string.sub(block,3,3) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[2] % 16)*16 + math.floor(sixbits[3] / 4)) end if (string.sub(block,4,4) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[3] % 4) * 64 + sixbits[4]) end return result end function decode(data) local result = &amp;quot;&amp;quot; local str={string.byte(&amp;quot;CheckForCheat&amp;quot;,1,1000)} local strl=table.getn(str) for c=1,string.len(data),4 do result=result..decodeblock(string.sub(data,c,c+3)) end local result1=&amp;quot;&amp;quot; for c=1,string.len(result),1 do local sl=string.byte(string.sub(result,c)) sl=bit_xor(sl,str[1+(c-1)%strl]) result1 = result1 .. string.char(sl) end return result1 end&lt;br /&gt;
&lt;br /&gt;
function bind_lc(obj)&lt;br /&gt;
  if obj:name()==&amp;quot;exit_to_sarcofag_01&amp;quot; and level.name()==&amp;quot;l12_stancia&amp;quot; and amk.load_variable(&amp;quot;freeplay&amp;quot;,0)&amp;gt;0 then&lt;br /&gt;
    local sobj=alife():object(obj:id())&lt;br /&gt;
    if sobj then&lt;br /&gt;
      alife():release(sobj,true)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=8&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u16(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u16())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u8(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8u8(pk,v)&lt;br /&gt;
  local len=8 --table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u16(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u16(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.gvid=stpk:r_u16()&lt;br /&gt;
  ret.obf32u1=stpk:r_float()&lt;br /&gt;
  ret.obs32u2=stpk:r_s32()&lt;br /&gt;
  ret.lvid=stpk:r_s32()&lt;br /&gt;
  ret.oflags=stpk:r_s32()&lt;br /&gt;
  ret.custom=stpk:r_stringZ()&lt;br /&gt;
  ret.sid=stpk:r_s32()&lt;br /&gt;
  ret.obs32u3=stpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.gvid)&lt;br /&gt;
  stpk:w_float(ret.obf32u1)&lt;br /&gt;
  stpk:w_s32(ret.obs32u2)&lt;br /&gt;
  stpk:w_s32(ret.lvid)&lt;br /&gt;
  stpk:w_s32(ret.oflags)&lt;br /&gt;
  stpk:w_stringZ(ret.custom)&lt;br /&gt;
  stpk:w_s32(ret.sid)&lt;br /&gt;
  stpk:w_s32(ret.obs32u3)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.visual=stpk:r_stringZ()&lt;br /&gt;
  ret.vsu8u1=stpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.visual)&lt;br /&gt;
  stpk:w_u8(ret.vsu8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  ret.team=stpk:r_u8()&lt;br /&gt;
  ret.squad=stpk:r_u8()&lt;br /&gt;
  ret.group=stpk:r_u8()&lt;br /&gt;
  ret.health=stpk:r_float()&lt;br /&gt;
  ret.crvu32u16u1=readvu32u16(stpk)&lt;br /&gt;
  ret.crvu32u16u2=readvu32u16(stpk)  &lt;br /&gt;
  ret.killerid=stpk:r_u16()&lt;br /&gt;
  ret.game_death_time=readvu8u8(stpk)&lt;br /&gt;
&lt;br /&gt;
  ret.updhealth=updpk:r_float()&lt;br /&gt;
  ret.upds32u1=updpk:r_s32()&lt;br /&gt;
  ret.updu8u2=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
  ret.updmodel=updpk:r_float()&lt;br /&gt;
  ret.upddir={}&lt;br /&gt;
  ret.upddir.x=updpk:r_float()&lt;br /&gt;
  ret.upddir.y=updpk:r_float()&lt;br /&gt;
  ret.upddir.z=updpk:r_float()&lt;br /&gt;
  ret.updteam=updpk:r_u8()&lt;br /&gt;
  ret.updsquad=updpk:r_u8()&lt;br /&gt;
  ret.updgroup=updpk:r_u8()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u8(ret.team)&lt;br /&gt;
  stpk:w_u8(ret.squad)&lt;br /&gt;
  stpk:w_u8(ret.group)&lt;br /&gt;
  stpk:w_float(ret.health)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u1)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u2)  &lt;br /&gt;
  stpk:w_u16(ret.killerid)&lt;br /&gt;
  writevu8u8(stpk,ret.game_death_time)&lt;br /&gt;
&lt;br /&gt;
  updpk:w_float(ret.updhealth)&lt;br /&gt;
  updpk:w_s32(ret.upds32u1)&lt;br /&gt;
  updpk:w_u8(ret.updu8u2)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
  updpk:w_float(ret.updmodel)&lt;br /&gt;
  updpk:w_float(ret.upddir.x)&lt;br /&gt;
  updpk:w_float(ret.upddir.y)&lt;br /&gt;
  updpk:w_float(ret.upddir.z)&lt;br /&gt;
  updpk:w_u8(ret.updteam)&lt;br /&gt;
  updpk:w_u8(ret.updsquad)&lt;br /&gt;
  updpk:w_u8(ret.updgroup)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.baseoutr=stpk:r_stringZ()&lt;br /&gt;
  ret.baseinr=stpk:r_stringZ()&lt;br /&gt;
  ret.smtrid=stpk:r_u16()&lt;br /&gt;
  ret.smtrtaskactive=stpk:r_u8()&lt;br /&gt;
  &lt;br /&gt;
  ret.updu16u1=updpk:r_u16()&lt;br /&gt;
  ret.updu16u2=updpk:r_u16()&lt;br /&gt;
  ret.upds32u3=updpk:r_s32()&lt;br /&gt;
  ret.upds32u4=updpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.baseoutr)&lt;br /&gt;
  stpk:w_stringZ(ret.baseinr)&lt;br /&gt;
  stpk:w_u16(ret.smtrid)&lt;br /&gt;
  stpk:w_u8(ret.smtrtaskactive)&lt;br /&gt;
  &lt;br /&gt;
  updpk:w_u16(ret.updu16u1)&lt;br /&gt;
  updpk:w_u16(ret.updu16u2)&lt;br /&gt;
  updpk:w_s32(ret.upds32u3)&lt;br /&gt;
  updpk:w_s32(ret.upds32u4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.money=stpk:r_s32()&lt;br /&gt;
  ret.profile=stpk:r_stringZ()&lt;br /&gt;
  ret.infammo=stpk:r_s32()&lt;br /&gt;
  ret.class=stpk:r_stringZ()&lt;br /&gt;
  ret.communityid=stpk:r_s32()&lt;br /&gt;
  ret.rank=stpk:r_s32()&lt;br /&gt;
  ret.reputation=stpk:r_s32()&lt;br /&gt;
  ret.charname=stpk:r_stringZ()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_s32(ret.money)&lt;br /&gt;
  stpk:w_stringZ(ret.profile)&lt;br /&gt;
  stpk:w_s32(ret.infammo)&lt;br /&gt;
  stpk:w_stringZ(ret.class)&lt;br /&gt;
  stpk:w_s32(ret.communityid)&lt;br /&gt;
  stpk:w_s32(ret.rank)&lt;br /&gt;
  stpk:w_s32(ret.reputation)&lt;br /&gt;
  stpk:w_stringZ(ret.charname)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.huvu32u8u1=readvu32u8(stpk)&lt;br /&gt;
  ret.huvu32u8u2=readvu32u8(stpk)  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u1)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.skeleton=stpk:r_stringZ()&lt;br /&gt;
  ret.skeleton_flags=stpk:r_u8()&lt;br /&gt;
  ret.source_id=stpk:r_u16()&lt;br /&gt;
  &lt;br /&gt;
--  ret.updsku8u1=updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.skeleton)&lt;br /&gt;
  stpk:w_u8(ret.skeleton_flags)&lt;br /&gt;
  stpk:w_u16(ret.source_id)&lt;br /&gt;
  &lt;br /&gt;
--  updpk:w_u8(ret.updsku8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_stalker_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.hellodlg=updpk:r_stringZ()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_stalker_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  updpk:w_stringZ(ret.hellodlg)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_se_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk,size)&lt;br /&gt;
  ret.spec_obj_id=stpk:r_u16()&lt;br /&gt;
  ret.job_online=stpk:r_u8()&lt;br /&gt;
	if ret.job_online&amp;gt;3 then&lt;br /&gt;
		ret.state=true&lt;br /&gt;
		ret.job_online=ret.job_online-4&lt;br /&gt;
	else&lt;br /&gt;
		ret.state=false&lt;br /&gt;
	end&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    ret.job_online_condlist=stpk:r_stringZ()&lt;br /&gt;
  end&lt;br /&gt;
  ret.was_in_smtr=stpk:r_u8()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_se_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.spec_obj_id)&lt;br /&gt;
	local st=0&lt;br /&gt;
	if ret.state then&lt;br /&gt;
		st=4&lt;br /&gt;
	end&lt;br /&gt;
  stpk:w_u8(ret.job_online+st)&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    stpk:w_stringZ(ret.job_online_condlist)&lt;br /&gt;
  end&lt;br /&gt;
  stpk:w_u8(ret.was_in_smtr)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dump_table(tbl)&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;)&lt;br /&gt;
      dump_table(v)&lt;br /&gt;
    else&lt;br /&gt;
      str=&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;..tostring(v)&lt;br /&gt;
      if string.len(str)&amp;gt;200 then&lt;br /&gt;
        str=string.sub(str,1,200)&lt;br /&gt;
      end&lt;br /&gt;
      get_console():execute(str)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- серверный объект на входе&lt;br /&gt;
function read_stalker_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_stalker_packet({},stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function read_monster_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_se_monster_packet({},stpk,uppk,size)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица параметров и серверный объект на входе&lt;br /&gt;
function write_stalker_params(tbl,sobj,noconvert)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_stalker_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  if npc and (not noconvert) then&lt;br /&gt;
    amk.convert_npc[sobj.id]=true&lt;br /&gt;
		npc:stop_talk()&lt;br /&gt;
    switch_offline(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function write_monster_params(tbl,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_se_monster_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  -- local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  -- if npc then&lt;br /&gt;
    -- amk.convert_npc[sobj.id]=true&lt;br /&gt;
    -- switch_offline(npc)&lt;br /&gt;
  -- end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_anomaly_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.max_power = stpk:r_float()&lt;br /&gt;
	t.owner_id = stpk:r_s32()&lt;br /&gt;
	t.enabled_time = stpk:r_s32()&lt;br /&gt;
	t.disabled_time = stpk:r_s32()&lt;br /&gt;
	t.start_time_shift = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.offline_interactive_radius = stpk:r_float()&lt;br /&gt;
	t.artefact_spawn_count = stpk:r_u16()&lt;br /&gt;
	t.artefact_position_offset = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.last_spawn_time_present = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	if stpk:r_elapsed() ~= 0 then&lt;br /&gt;
--		abort(&amp;quot;left=%d&amp;quot;, stpk:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_anomaly_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.max_power)&lt;br /&gt;
	stpk:w_s32(t.owner_id)&lt;br /&gt;
	stpk:w_s32(t.enabled_time)&lt;br /&gt;
	stpk:w_s32(t.disabled_time)&lt;br /&gt;
	stpk:w_s32(t.start_time_shift)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.offline_interactive_radius)&lt;br /&gt;
	stpk:w_u16(t.artefact_spawn_count)&lt;br /&gt;
	stpk:w_s32(t.artefact_position_offset)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_u8(t.last_spawn_time_present)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для правильного парсинга запрещены комментарии!!!&lt;br /&gt;
function parse_custom_data(str)&lt;br /&gt;
	local t={}&lt;br /&gt;
	if str then&lt;br /&gt;
		for section, section_data in string.gfind(str,&amp;quot;%s*%[([^%]]*)%]%s*([^%[%z]*)%s*&amp;quot;) do&lt;br /&gt;
			section = trim(section)&lt;br /&gt;
			t[section]={}&lt;br /&gt;
			for line in string.gfind(trim(section_data), &amp;quot;([^\n]*)\n*&amp;quot;) do&lt;br /&gt;
				if string.find(line,&amp;quot;=&amp;quot;)~=nil then&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;([^=]-)%s*=%s*(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' and v~=nil then &lt;br /&gt;
							t[section][k]=trim(v) &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' then&lt;br /&gt;
							t[section][k]=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trim (s)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gen_custom_data(tbl)&lt;br /&gt;
	local str=''&lt;br /&gt;
	for key, value in pairs(tbl) do&lt;br /&gt;
		str = str..&amp;quot;\n[&amp;quot;..key..&amp;quot;]\n&amp;quot;&lt;br /&gt;
		for k, v in pairs(value) do&lt;br /&gt;
			if v~=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; then&lt;br /&gt;
				str=str..k..&amp;quot; = &amp;quot;..v..&amp;quot;\n&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				str=str..k..&amp;quot;\n&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
function get_lc_data(obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t = amk.parse_shape_packet(t,packet)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = packet:r_u8()&lt;br /&gt;
	t.dest_game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.dest_level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.dest_position = packet:r_vec3()&lt;br /&gt;
	t.dest_direction = packet:r_vec3()&lt;br /&gt;
	t.dest_level_name = packet:r_stringZ()&lt;br /&gt;
	t.dest_graph_point = packet:r_stringZ()&lt;br /&gt;
	t.silent_mode = packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_lc_data(t,obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	&lt;br /&gt;
	amk.fill_shape_packet(t,packet)&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(t.restrictor_type)&lt;br /&gt;
	packet:w_u16(t.dest_game_vertex_id)&lt;br /&gt;
	packet:w_s32(t.dest_level_vertex_id)&lt;br /&gt;
	packet:w_vec3(t.dest_position)&lt;br /&gt;
	packet:w_vec3(t.dest_direction)&lt;br /&gt;
	packet:w_stringZ(t.dest_level_name)&lt;br /&gt;
	packet:w_stringZ(t.dest_graph_point)&lt;br /&gt;
	packet:w_u8(t.silent_mode)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function point_in_poly (pts, x,y)&lt;br /&gt;
	local cnt,k,j&lt;br /&gt;
	local ret = false&lt;br /&gt;
	cnt = table.getn(pts)&lt;br /&gt;
	j = cnt&lt;br /&gt;
	for k = 1,cnt do&lt;br /&gt;
		if ((pts[k].y &amp;lt;=y) and (y &amp;lt; pts[j].y)) or ((pts[j].y &amp;lt;=y) and (y &amp;lt; pts[k].y)) then&lt;br /&gt;
			if (x &amp;lt; (pts[j].x - pts[k].x) * (y - pts[k].y) / (pts[j].y - pts[k].y) + pts[k].x) then&lt;br /&gt;
				ret = not ret&lt;br /&gt;
			end&lt;br /&gt;
			j = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.physic_type=stpk:r_s32()&lt;br /&gt;
	ret.mass=stpk:r_float()&lt;br /&gt;
	ret.fixed_bones=stpk:r_stringZ()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_s32(ret.physic_type)&lt;br /&gt;
	stpk:w_float(ret.mass)&lt;br /&gt;
	stpk:w_stringZ(ret.fixed_bones)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_breakable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.visual_name = packet:r_stringZ()&lt;br /&gt;
	t.visual_flags = packet:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.health = packet:r_float()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_breakable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	packet:w_stringZ(t.visual_name)&lt;br /&gt;
	packet:w_u8(t.visual_flags)&lt;br /&gt;
	packet:w_float(t.health)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_REspawn(obj,respawner)&lt;br /&gt;
	if obj and respawner then&lt;br /&gt;
		mod_call(&amp;quot;respawned&amp;quot;,obj,respawner)&lt;br /&gt;
		if IsMonster(obj) then&lt;br /&gt;
			if respawner.spawned_goes_online==true then mod_call(&amp;quot;switch_monster_online&amp;quot;,obj) &lt;br /&gt;
			elseif respawner.spawned_goes_online==false then mod_call(&amp;quot;switch_monster_offline&amp;quot;,obj) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (obj) then&lt;br /&gt;
		if (news_main and news_main.on_spawn) then&lt;br /&gt;
			news_main.on_spawn(obj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_spawner_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	t.spawned_obj_count = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_spawner_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	stpk:w_u8(t.spawned_obj_count)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_shape_packet(t,stpk,uppk)&lt;br /&gt;
	local shape_count = stpk:r_u8()&lt;br /&gt;
	t.shapes={}&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		local shape_type = stpk:r_u8()&lt;br /&gt;
		t.shapes[i]={}&lt;br /&gt;
		t.shapes[i].shtype=shape_type&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			-- sphere&lt;br /&gt;
			t.shapes[i].center = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].radius = stpk:r_float()&lt;br /&gt;
		else&lt;br /&gt;
			-- box&lt;br /&gt;
			t.shapes[i].v1 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v2 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v3 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].offset = stpk:r_vec3()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_shape_packet(t,stpk,updpk)&lt;br /&gt;
	stpk:w_u8(table.getn(t.shapes))&lt;br /&gt;
	for i=1,table.getn(t.shapes) do&lt;br /&gt;
		stpk:w_u8(t.shapes[i].shtype)&lt;br /&gt;
		if t.shapes[i].shtype == 0 then&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].center)&lt;br /&gt;
			stpk:w_float(t.shapes[i].radius)&lt;br /&gt;
		else&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v1)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v2)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v3)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].offset)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_ini_section_to_array(ini,section)&lt;br /&gt;
	local tmp={}&lt;br /&gt;
	if ini:section_exist(section) then&lt;br /&gt;
		local result, id, value = nil, nil, nil&lt;br /&gt;
		for a=0,ini:line_count(section)-1 do&lt;br /&gt;
			result, id, value = ini:r_line(section,a,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
			if id~=nil and trim(id)~=&amp;quot;&amp;quot; and trim(id)~=nil then&lt;br /&gt;
				tmp[trim(id)]=trim(value)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tmp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function str_explode(div,str,clear)&lt;br /&gt;
	local t={}&lt;br /&gt;
	local cpt = string.find (str, div, 1, true)&lt;br /&gt;
	if cpt then&lt;br /&gt;
		repeat&lt;br /&gt;
			if clear then&lt;br /&gt;
				table.insert( t, trim(string.sub(str, 1, cpt-1)) )&lt;br /&gt;
			else&lt;br /&gt;
				table.insert( t, string.sub(str, 1, cpt-1) )&lt;br /&gt;
			end&lt;br /&gt;
			str = string.sub( str, cpt+string.len(div) )&lt;br /&gt;
			cpt = string.find (str, div, 1, true)&lt;br /&gt;
		until cpt==nil&lt;br /&gt;
	end&lt;br /&gt;
	if clear then&lt;br /&gt;
		table.insert(t, trim(str))&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(t, str)&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function quotemeta(str)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;[%^%$%(%)%%%.%[%]%*%+%-%?]&amp;quot;, &amp;quot;%%%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function add(v1,v2)&lt;br /&gt;
	local nv=vector()&lt;br /&gt;
	nv.x=v1.x+v2.x&lt;br /&gt;
	nv.y=v1.y+v2.y&lt;br /&gt;
	nv.z=v1.z+v2.z&lt;br /&gt;
	return nv&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_len(v,num)&lt;br /&gt;
	local cl = math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z)&lt;br /&gt;
	cl = num/cl&lt;br /&gt;
	v.x= v.x*cl&lt;br /&gt;
	v.y= v.y*cl&lt;br /&gt;
	v.z= v.z*cl&lt;br /&gt;
	return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_restrictor_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_restrictor_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_trader_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_trader_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_trader_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_trader_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_invbox_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_invbox_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8uN(packet,n)&lt;br /&gt;
  local v={}&lt;br /&gt;
  for i=1,n,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8uN(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.condition=stpk:r_float()&lt;br /&gt;
	ret.updnum_items=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
	ret.updcse_alife_item__unk1_q8v4=readvu8uN(updpk,4)&lt;br /&gt;
	ret.updcse_alife_item__unk2_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
	ret.updcse_alife_item__unk3_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_float(ret.condition)&lt;br /&gt;
	updpk:w_u8(ret.updnum_items)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk1_q8v4)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk2_q8v3)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk3_q8v3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_left=stpk:r_u16()&lt;br /&gt;
	ret.updammo_left=updpk:r_u16()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_left)&lt;br /&gt;
	updpk:w_u16(ret.updammo_left)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ammo_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_ammo_packet(t,stpk,uppk,size)&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_ammo_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_ammo_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cfg_get_string(ini,sect,name,def)&lt;br /&gt;
	if ini and ini:line_exist(sect,name) then&lt;br /&gt;
		return ini:r_string(sect,name)&lt;br /&gt;
	end&lt;br /&gt;
	return def&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_destroyable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_skeleton_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_destroyable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_skeleton_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_weapon_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
  amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_weapon_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_weapon_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_weapon_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_current = stpk:r_u16()&lt;br /&gt;
	ret.ammo_elapsed = stpk:r_u16()&lt;br /&gt;
	ret.weapon_state = stpk:r_u8()&lt;br /&gt;
	ret.addon_flags = stpk:r_u8()&lt;br /&gt;
	ret.ammo_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	ret.updcondition = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_elapsed = updpk:r_u16()&lt;br /&gt;
	ret.updaddon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_type = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_state = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_zoom = updpk:r_u8()&lt;br /&gt;
	ret.updcurrent_fire_mode = updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_current)&lt;br /&gt;
	stpk:w_u16(ret.ammo_elapsed)&lt;br /&gt;
	stpk:w_u8(ret.weapon_state)&lt;br /&gt;
	stpk:w_u8(ret.addon_flags)&lt;br /&gt;
	stpk:w_u8(ret.ammo_type)&lt;br /&gt;
	&lt;br /&gt;
	updpk:w_u8(ret.updcondition)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_flags)&lt;br /&gt;
	updpk:w_u16(ret.updammo_elapsed)&lt;br /&gt;
	updpk:w_u8(ret.updaddon_flags)&lt;br /&gt;
	updpk:w_u8(ret.updammo_type)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_state)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_zoom)&lt;br /&gt;
	updpk:w_u8(ret.updcurrent_fire_mode)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ver()&lt;br /&gt;
	local ver = &amp;quot;0&amp;quot;&lt;br /&gt;
	local mm = _G.main_menu.get_main_menu()&lt;br /&gt;
	if mm then ver = mm:GetGSVer() end&lt;br /&gt;
	return ver&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
всё заходим в игру и пробуем :-)&lt;/div&gt;</summary>
		<author><name>92.113.172.219</name></author>	</entry>

	</feed>