<?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=178.44.233.36&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=178.44.233.36&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/178.44.233.36"/>
		<updated>2026-04-29T20:41:38Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2%D1%89%D0%B8%D0%BA_%D0%BF%D0%B0%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2_SoC</id>
		<title>Перепаковщик патронов SoC</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2%D1%89%D0%B8%D0%BA_%D0%BF%D0%B0%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2_SoC"/>
				<updated>2011-09-20T11:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;178.44.233.36: слющай, зачем кусок вирезал да?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Вступление==&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;Привет всем. Сегодня наш урок будет о том как сделать перепаковщик пачек патронов для Тени Чернобыля. Ведь когда играешь и собираешь куча патронов не получается сделать элементарную нычку какую либо, потому что патроны собранные с убитых вами сталкеров состоят из 3, 7, 10, 14 и т.д патронов в каждой пачке, а ахота чтобы все эти патроны перепаковывались в одну или несколько нормальных пачек, вот поэтому я сегодня объясню как сделать такой же перепаковщик пачек патронов как и во многих других глобальный модах.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==Действие 1==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;Заходим в (gamedata/scripts) и создаём там новый скрипт с таким названием: dunin_ammo.script и вписываем в него вот это:&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local ammo = {}&lt;br /&gt;
local inited = false&lt;br /&gt;
local repack = false &lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
-- инициализация переменных, выполняется единожды&lt;br /&gt;
--------&lt;br /&gt;
function init()&lt;br /&gt;
	local i, result, section, value&lt;br /&gt;
	-- отсюда возьмём размеры полных пачек&lt;br /&gt;
	local sys = system_ini()&lt;br /&gt;
	-- список патронов возьмём из &amp;quot;death_generic.ltx&amp;quot;&lt;br /&gt;
	local ini = ini_file(&amp;quot;misc\\death_generic.ltx&amp;quot;)&lt;br /&gt;
	local n = ini:line_count(&amp;quot;ammo_sections&amp;quot;)&lt;br /&gt;
	for i=0,n-1 do&lt;br /&gt;
		result, section, value = ini:r_line(&amp;quot;ammo_sections&amp;quot;,i,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
		ammo[section] = {}&lt;br /&gt;
		ammo[section].repack = false&lt;br /&gt;
		ammo[section].box = sys:r_u32(section, &amp;quot;box_size&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	repack = false&lt;br /&gt;
	inited = true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
-- вызывается при добавлении в инвентарь ГГ любых патрон&lt;br /&gt;
--  obj - game_object добавляемой пачки&lt;br /&gt;
-- здесь будем только ставить флажки о необходимости проверки,&lt;br /&gt;
-- саму проверку и перепаковку сделаем в апдейте актёра,&lt;br /&gt;
-- если перепаковку делать прям здесь, то будет глюк при загрузки и&lt;br /&gt;
-- при взятии из нычки кучи патрон (взять всё)&lt;br /&gt;
--------&lt;br /&gt;
function on_take(obj)&lt;br /&gt;
	if not inited then&lt;br /&gt;
		init()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local section = obj:section()&lt;br /&gt;
	--dbglog(&amp;quot;on_take('%s')&amp;quot;, section)&lt;br /&gt;
         --local msg = string.format(&amp;quot;on_take('%s')&amp;quot;, obj: name())&lt;br /&gt;
	--get_console():execute(&amp;quot;dbg:&amp;quot; .. msg)&lt;br /&gt;
&lt;br /&gt;
	if ammo[section] ~= nil and section ~= nil and ammo[section].repack == false then&lt;br /&gt;
		if get_ammo_size(obj) &amp;lt; ammo[section].box then&lt;br /&gt;
			ammo[section].repack = true&lt;br /&gt;
			repack = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
-- вызывается из апдейта актёра&lt;br /&gt;
-- проверяет наличие флажков и вызывает процедуру переупаковки&lt;br /&gt;
--------&lt;br /&gt;
function on_update()&lt;br /&gt;
	if repack then&lt;br /&gt;
		local section, data&lt;br /&gt;
		for section, data in pairs(ammo) do&lt;br /&gt;
			if data.repack then&lt;br /&gt;
				repack_ammo(section, data.box)&lt;br /&gt;
				data.repack = false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		repack = false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
-- переупаковка патронов заданного типа&lt;br /&gt;
--  section - строка, имя секции (тип патрон)&lt;br /&gt;
--  box_size - колличество патрон в полной пачке&lt;br /&gt;
-- сначало составляем список неполных пачек, затем&lt;br /&gt;
-- удаляем их и создаём нужное колличество полных&lt;br /&gt;
--------&lt;br /&gt;
function repack_ammo(section, box_size)&lt;br /&gt;
	--dbglog(&amp;quot;repack_ammo('%s')&amp;quot;, section)&lt;br /&gt;
	local s, t = enum_ammo(section, box_size)&lt;br /&gt;
	if (s &amp;gt; 0) and (table.getn(t) &amp;gt; 1) then&lt;br /&gt;
		--dbglog(&amp;quot;repacking(magazins=%d, bullets=%d)&amp;quot;, table.getn(t), s)&lt;br /&gt;
		local i, id&lt;br /&gt;
		local sim = alife()&lt;br /&gt;
		local pos = db.actor:position()&lt;br /&gt;
		local lvid = db.actor:level_vertex_id()&lt;br /&gt;
		local gvid = db.actor:game_vertex_id()&lt;br /&gt;
		local pid = db.actor:id()&lt;br /&gt;
&lt;br /&gt;
		for i, id in pairs(t) do&lt;br /&gt;
			sim:release(sim:object(id), true)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		while s &amp;gt;= box_size do&lt;br /&gt;
			sim:create_ammo(section, pos, lvid, gvid, pid, box_size)&lt;br /&gt;
			s = s - box_size&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if s &amp;gt; 0 then&lt;br /&gt;
			sim:create_ammo(section, pos, lvid, gvid, pid, s)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
-- пробегаемся по инветарю ГГ и собираем инфу о неполных пачках&lt;br /&gt;
--  section - строка, имя секции (тип патрон)&lt;br /&gt;
--  box_size - колличество патрон в полной пачке&lt;br /&gt;
-- возвращает сумарное колличество патрон в неполных пачках и массив id-шников этих пачек&lt;br /&gt;
--------&lt;br /&gt;
function enum_ammo(section, box_size)&lt;br /&gt;
	local i, obj, size&lt;br /&gt;
	local s = 0&lt;br /&gt;
	local t = {}&lt;br /&gt;
	for i=0, db.actor:object_count()-1 do&lt;br /&gt;
		obj = db.actor:object(i)&lt;br /&gt;
		if obj:section() == section then&lt;br /&gt;
			size = get_ammo_size(obj)&lt;br /&gt;
			if size &amp;lt; box_size then&lt;br /&gt;
				table.insert(t, obj:id())&lt;br /&gt;
				s = s + size&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return s, t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
-- возвращает колличество патрон в пачке&lt;br /&gt;
-- вроде подходящих функций нет, пришлось делать через net_packet&lt;br /&gt;
--------&lt;br /&gt;
function get_ammo_size(obj)&lt;br /&gt;
	local se_obj = alife():object(obj:id())&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	cse_alife_item_ammo.STATE_Write(se_obj, packet)&lt;br /&gt;
	--packet:r_advance(18)&lt;br /&gt;
	--packet:r_stringZ()&lt;br /&gt;
	--packet:r_advance(8)&lt;br /&gt;
	--packet:r_stringZ()&lt;br /&gt;
	--packet:r_advance(5)&lt;br /&gt;
	packet:r_seek(packet:w_tell() - 2)&lt;br /&gt;
	return packet:r_u16()&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
==Действие 2:==&lt;br /&gt;
Теперь нам нужно вписать наш перепаковщик патронов в bind_stalker.script, открываем его и ищем там такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;function actor_binder:on_item_take (obj)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и ставим внизу перед &amp;quot;end&amp;quot; вот такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dunin_ammo.on_take(obj)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот как должно у нас получится:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;function actor_binder:on_item_take (obj)&lt;br /&gt;
    level_tasks.proceed(self.object)&lt;br /&gt;
    --game_stats.update_take_item (obj, self.object)&lt;br /&gt;
    dunin_ammo.on_take(obj)&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее в этом же bind_stalker.script ищем функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-- апдейт звуковой схемы актера&lt;br /&gt;
	xr_sound.update_actor()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И ставим после неё функцию нашего перепаковщика:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-- перепаковщик патронов&lt;br /&gt;
        dunin_ammo.on_update()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот как должно получится:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-- апдейт звуковой схемы актера&lt;br /&gt;
	xr_sound.update_actor()&lt;br /&gt;
&lt;br /&gt;
        -- перепаковщик патронов&lt;br /&gt;
        dunin_ammo.on_update()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь также в этом же файле ищем вот такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--' Вывод сообщения о большой радиации&lt;br /&gt;
	if self.object.radiation &amp;gt;= 0.7 then&lt;br /&gt;
		local hud = get_hud()&lt;br /&gt;
		local custom_static = hud:GetCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;)&lt;br /&gt;
		if custom_static == nil then&lt;br /&gt;
			hud:AddCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;, true)&lt;br /&gt;
			hud:GetCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;):wnd():SetTextST(&amp;quot;st_radiation_danger&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local hud = get_hud()&lt;br /&gt;
		local custom_static = hud:GetCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;)&lt;br /&gt;
		if custom_static ~= nil then&lt;br /&gt;
			hud:RemoveCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И ставим после неё функцию перепаковщика:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-- dunin_ammo.on_update()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот как должно получится:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-- обновление пси-антенны&lt;br /&gt;
	if sr_psy_antenna.psy_antenna then&lt;br /&gt;
		sr_psy_antenna.psy_antenna:update(delta)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--' Вывод сообщения о большой радиации&lt;br /&gt;
	if self.object.radiation &amp;gt;= 0.7 then&lt;br /&gt;
		local hud = get_hud()&lt;br /&gt;
		local custom_static = hud:GetCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;)&lt;br /&gt;
		if custom_static == nil then&lt;br /&gt;
			hud:AddCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;, true)&lt;br /&gt;
			hud:GetCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;):wnd():SetTextST(&amp;quot;st_radiation_danger&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local hud = get_hud()&lt;br /&gt;
		local custom_static = hud:GetCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;)&lt;br /&gt;
		if custom_static ~= nil then&lt;br /&gt;
			hud:RemoveCustomStatic(&amp;quot;cs_radiation_danger&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--	dunin_ammo.on_update()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, готово, сохраняем bind_stalker.script и тестируем.&lt;br /&gt;
&lt;br /&gt;
[[Участник:VIPeRs]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:CopyPaste]]&lt;/div&gt;</summary>
		<author><name>178.44.233.36</name></author>	</entry>

	</feed>