<?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=Wasly</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=Wasly"/>
		<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/Wasly"/>
		<updated>2026-04-30T04:51:33Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2._%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81</id>
		<title>Назначение скриптам горячих кнопок. Часть 2. Интерфейс</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2._%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81"/>
				<updated>2009-10-14T20:47:52Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Скрипт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Итак, нам вдруг захотелось оформить красиво ранее описанный способ запуска скриптов. Порывшись в текстурах можно подобрать понравившиеся элементы интерфейса. Сейчас попробуем сделать свое окно с рамкой, проигрывающимся видеороликом на заднем плане и несколькими кнопками.&lt;br /&gt;
&lt;br /&gt;
Способ вызова нашего скрипта останется прежним, '''Esc - F1''', но вызывать окно можно и из диалогов, и по некоторому событию, в общем простор для мододелов огромный. Я использовал уже имеющиеся текстуры и элементы управления, но никто не запрещает использовать свои. Для рамки я выбрал текстуру '''ui\ui_dg_inventory''', а кнопки брал из '''ui\ui_common'''.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Будем использовать тот же скрипт '''ui_cheat.script''', но немного видоизмененный. Я приведу его содержание полностью, а потом начнем его дополнять.&lt;br /&gt;
&lt;br /&gt;
Начало:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
-- инициализируем элементы интерфейса и каллбаки&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
	-- здесь определяем координаты левого верхнего угла и ширину-высоту&lt;br /&gt;
	self:Init(50,50,550,450)&lt;br /&gt;
&lt;br /&gt;
	-- файл-описатель наших элементов&lt;br /&gt;
	local xml = CScriptXmlInit()&lt;br /&gt;
	xml:ParseFile(&amp;quot;ui_cheat_wnd.xml&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- видео на заднем плане&lt;br /&gt;
	xml:InitStatic(&amp;quot;back_video&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	-- рамка&lt;br /&gt;
	xml:InitStatic(&amp;quot;background&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	-- кнопки&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_1&amp;quot;, self),&amp;quot;btn_1&amp;quot;)&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_2&amp;quot;, self),&amp;quot;btn_2&amp;quot;)&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_3&amp;quot;, self),&amp;quot;btn_3&amp;quot;)&lt;br /&gt;
	-- кнопка выхода&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_quit&amp;quot;, self),&amp;quot;btn_quit&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
	-- тут интерактивные элементы, при определенном действии выполняется заданная ф-ия&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_1&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat1, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_2&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat2, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_3&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat3, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_quit&amp;quot;, ui_events.BUTTON_CLICKED, self.on_quit, self)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь на имеющиеся кнопки прикрутим ф-ии, которые будут что-нибудь делать.&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
	-- колдуем СВД&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_svd_m1&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	-- патроны к ней&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_7.62x54_ap&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	-- и того, кого будем из СВД мучать&lt;br /&gt;
	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 30)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:check_game()&lt;br /&gt;
	-- возвращает true, если запущена игра&lt;br /&gt;
	local check = false&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		check = true&lt;br /&gt;
	end&lt;br /&gt;
	return check&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	-- убираем наше окно, показываем предыдущее (или возвращаемся в игру)&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
	-- скрытие главного меню только если запущена игра&lt;br /&gt;
	if self:check_game() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	-- спавним только в игре&lt;br /&gt;
	if self:check_game() then&lt;br /&gt;
		self:on_quit()&lt;br /&gt;
		local	pos = db.actor:position()&lt;br /&gt;
		local	dir = db.actor:direction()&lt;br /&gt;
		pos = pos:add(dir:mul(dist))&lt;br /&gt;
		alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Скриптовую часть закончили. Теперь надо &amp;quot;нарисовать&amp;quot; интерфейс. Инструмент для его создания пока отсутствует (по крайней мере у нас), поэтому будем делать ручками, методом проб и ошибок.&lt;br /&gt;
&lt;br /&gt;
== XML-описатель ==&lt;br /&gt;
&lt;br /&gt;
Так как мы уже определили файл, который будет содержать расположение элементов (''xml:ParseFile(&amp;quot;ui_cheat_wnd.xml&amp;quot;)''), то создадим его. Полный путь до файла: '''config\ui\ui_cheat_wnd.xml'''.&lt;br /&gt;
&lt;br /&gt;
Вот его содержание:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1251&amp;quot; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cheat&amp;gt;	&lt;br /&gt;
	&amp;lt;back_video x=&amp;quot;10&amp;quot; y=&amp;quot;10&amp;quot; width=&amp;quot;380&amp;quot; height=&amp;quot;320&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture&amp;gt;ui\1_hyuv_sq&amp;lt;/texture&amp;gt;&lt;br /&gt;
	&amp;lt;/back_video&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;background x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;340&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;350&amp;quot; height=&amp;quot;460&amp;quot;&amp;gt;ui\ui_dg_inventory&amp;lt;/texture&amp;gt;&lt;br /&gt;
	&amp;lt;/background&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_1 x=&amp;quot;20&amp;quot; y=&amp;quot;30&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;wpn-svd&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_2 x=&amp;quot;20&amp;quot; y=&amp;quot;60&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Патроны&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_3 x=&amp;quot;20&amp;quot; y=&amp;quot;90&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Собака&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_quit x=&amp;quot;270&amp;quot; y=&amp;quot;300&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_quit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/cheat&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Погружение ==&lt;br /&gt;
&lt;br /&gt;
=== Видео ===&lt;br /&gt;
&lt;br /&gt;
Разберем построчно. Так как ф-ия '''cheat:InitControls()''' сначала отображает видеоролик (чтобы он оказался под всеми элементами, с него и начнем.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;back_video x=&amp;quot;10&amp;quot; y=&amp;quot;10&amp;quot; width=&amp;quot;380&amp;quot; height=&amp;quot;320&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Название элемента должно совпадать с именем, которое присутствует в '''xml:InitStatic(&amp;quot;back_video&amp;quot;, self)'''&lt;br /&gt;
&lt;br /&gt;
'''x,y''' - координаты левого верхнего угла относительно объявленного в '''self:Init'''&lt;br /&gt;
&lt;br /&gt;
'''width, height''' - ширина-высота&lt;br /&gt;
&lt;br /&gt;
'''stretch=&amp;quot;1&amp;quot;''' - указывает на необходимость растягивания элемента&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;texture&amp;gt;ui\1_hyuv_sq&amp;lt;/texture&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Используется видеоролик находящися по адресу '''textures\ui\1_hyuv_sq.ogm'''. Его исходные размеры - 512х512, поэтому нам и понадобилось растягивание, вернее так называемый стретч.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;/back_video&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
конец элемента.&lt;br /&gt;
&lt;br /&gt;
=== Бэкграунд ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;background x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;340&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
координаты, размеры, растягивание, все как и выше&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;texture x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;350&amp;quot; height=&amp;quot;460&amp;quot;&amp;gt;ui\ui_dg_inventory&amp;lt;/texture&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
а вот здесь ссылка на используемую текстуру. Мы не стали рисовать свою, а взяли уже имеющуюся, поэтому задаваемые здесь координаты и размеры означают, что нужно взять текстуру '''ui\ui_dg_inventory.dds''' и вырезать из нее нужный нам кусок. Обратите внимание, что размеры вырезанной части и определенные нами не совпадают, маловата текстура оказалась, поэтому пришлось ее растягивать ;)&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;/background&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
конец элемента.&lt;br /&gt;
&lt;br /&gt;
=== Кнопки ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;btn_1 x=&amp;quot;20&amp;quot; y=&amp;quot;30&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
координаты, размеры, без растягивания, все как и выше. Но, здесь это означает размеры интерактивной области. Если указать иные размеры, то кнопка будет реагировать только в указанной зоне. Если указать нулевые размеры, то кнопка вообще перестанет быть интерактивной.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
а вот тут уже интереснее. не пытайтесь искать текстуру с именем ui_button_ordinary_e. Она описана в другом файле, '''config\ui\ui_common.xml'''. Ссылка на этот файл входит в секцию '''[texture_desc]''' в '''system.ltx'''. То есть, если вы создали свой файл-описатель интерфейса, то нужно проставить ссылку на этот файл в вышеописанной секции.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;text&amp;gt;wpn-svd&amp;lt;/text&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
текст на кнопке. Здесь тоже не все так просто. Сначала игра ищет выражение '''wpn-svd''' в файлах заданных в секции '''[string_table]''' файла '''localization.ltx''', то есть зависит от установленного языка. В данном случае ссылка на '''wpn-svd''' есть в файле '''config\text\rus\string_table_enc_weapons.xml''', и равно&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;string id=&amp;quot;wpn-svd&amp;quot;&amp;gt;&amp;lt;text&amp;gt;СВДм 2&amp;lt;/text&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
При таком способе установки текстового значения мы не будем зависеть от языка игры и сможем создавать не привязанные к языку моды.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на вторую кнопку, то ее текстовое значение равно&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;text&amp;gt;Патроны&amp;lt;/text&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Такого значения игра не найдет и просто отобразит так как есть. Но англоязычные пользователи врядли поймут написанное. Поэтому я лично рекомендую использовать уже имеющиеся ресурсы, и минимально вмешиваться в ресурсы и добавлять новые. Но, например, файл с названиями машин ('''string_table_enc_vehicles.xml''') не входит в файл '''localization.ltx''', поэтому придется его туда подключить, либо указать конечному пользователю на необходимость добавления одной строчки в этот файл.&lt;br /&gt;
&lt;br /&gt;
Ну кнопочка &amp;quot;Выход&amp;quot; сделана вот так:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Продолжение ==&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем, запускаем игру, жмем '''Esc - F1''', и видим наше окошко. Можно понажимать на кнопки и увидеть что они какие-то неинтерактивные. То есть никак не реагируют на наведение мыши и нажатие. Но это легко поправимо. В игре все для этого есть. Достаточно оформить кнопку вот так (пример для одной, остальные аналогично):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&amp;lt;btn_quit x=&amp;quot;270&amp;quot; y=&amp;quot;300&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
	&amp;lt;texture_t&amp;gt;ui_button_ordinary_t&amp;lt;/texture_t&amp;gt;&lt;br /&gt;
	&amp;lt;texture_h&amp;gt;ui_button_ordinary_h&amp;lt;/texture_h&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/btn_quit&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Обозначения:&lt;br /&gt;
*texture_e - вид кнопки по умолчанию&lt;br /&gt;
*texture_t - вид кнопки при нажатии&lt;br /&gt;
*texture_h - вид кнопки при наведении мыши&lt;br /&gt;
есть еще одно состояние, '''texture_d''', оно означает текстуру выключенной кнопки. Можно скриптами задавать состояние кнопки (включена-выключена), но об этом в другой раз.&lt;br /&gt;
&lt;br /&gt;
Поизучайте файлик '''ui_common.xml''' на предмет других элементов, там еще много интересного.&lt;br /&gt;
&lt;br /&gt;
== Внимание ==&lt;br /&gt;
&lt;br /&gt;
Так как скрипт спавна изменен по сравнению с первой статьей (добавлен вызов '''self:on_quit()''' перед самим спавном), то функцию привязки к клавишам следует оформить следующим образом:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:OnKeyboard(dik, keyboard_action)&lt;br /&gt;
	CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
	if keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
		-- отсюда убран вызов self:on_quit()&lt;br /&gt;
		if     dik == DIK_keys.DIK_ESCAPE then self:on_quit()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD1 then	self:cheat1()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD2 then	self:cheat2()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD3 then	self:cheat3()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD5 then	self:cheat5()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD6 then	self:cheat6()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD7 then	self:cheat7()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD8 then	self:cheat8()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD9 then	self:cheat9()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[[Назначение скриптам горячих кнопок. Часть 1. Скрипт|Первая часть статьи]]&lt;br /&gt;
*[[Bind_script_ui_script_2|Полный текст скрипта ui_cheats.script (нового)]]&lt;br /&gt;
*[[Bind_script_ui_xml|Полный текст ui_cheat_wnd.xml]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2._%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81</id>
		<title>Назначение скриптам горячих кнопок. Часть 2. Интерфейс</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2._%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81"/>
				<updated>2009-10-14T20:45:09Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Итак, нам вдруг захотелось оформить красиво ранее описанный способ запуска скриптов. Порывшись в текстурах можно подобрать понравившиеся элементы интерфейса. Сейчас попробуем сделать свое окно с рамкой, проигрывающимся видеороликом на заднем плане и несколькими кнопками.&lt;br /&gt;
&lt;br /&gt;
Способ вызова нашего скрипта останется прежним, '''Esc - F1''', но вызывать окно можно и из диалогов, и по некоторому событию, в общем простор для мододелов огромный. Я использовал уже имеющиеся текстуры и элементы управления, но никто не запрещает использовать свои. Для рамки я выбрал текстуру '''ui\ui_dg_inventory''', а кнопки брал из '''ui\ui_common'''.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Будем использовать тот же скрипт '''ui_cheat.script''', но немного видоизмененный. Я приведу его содержание полностью, а потом начнем его дополнять.&lt;br /&gt;
&lt;br /&gt;
Начало:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
-- инициализируем элементы интерфейса и каллбаки&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
	-- здесь определяем координаты левого верхнего угла и ширину-высоту&lt;br /&gt;
	self:Init(50,50,550,450)&lt;br /&gt;
&lt;br /&gt;
	-- файл-описатель наших элементов&lt;br /&gt;
	local xml = CScriptXmlInit()&lt;br /&gt;
	xml:ParseFile(&amp;quot;ui_cheat_wnd.xml&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- видео на заднем плане&lt;br /&gt;
	xml:InitStatic(&amp;quot;back_video&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	-- рамка&lt;br /&gt;
	xml:InitStatic(&amp;quot;background&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	-- кнопки&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_1&amp;quot;, self),&amp;quot;btn_1&amp;quot;)&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_2&amp;quot;, self),&amp;quot;btn_2&amp;quot;)&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_3&amp;quot;, self),&amp;quot;btn_3&amp;quot;)&lt;br /&gt;
	-- кнопка выхода&lt;br /&gt;
	self:Register(xml:Init3tButton(&amp;quot;btn_quit&amp;quot;, self),&amp;quot;btn_quit&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
	-- тут интерактивные элементы, при определенном действии выполняется заданная ф-ия&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_1&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat1, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_2&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat2, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_3&amp;quot;, ui_events.BUTTON_CLICKED, self.cheat3, self)&lt;br /&gt;
	self:AddCallback(&amp;quot;btn_quit&amp;quot;, ui_events.BUTTON_CLICKED, self.on_quit, self)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь на имеющиеся кнопки прикрутим ф-ии, которые будут что-нибудь делать.&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
	-- колдуем СВД&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_svd_m1&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	-- патроны к ней&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_7.62x54_ap&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	-- и того, кого будем из СВД мучать&lt;br /&gt;
	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 30)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:check_game()&lt;br /&gt;
	-- возвращает true если запущена игра&lt;br /&gt;
	local check = false&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		check = true&lt;br /&gt;
	end&lt;br /&gt;
	return check&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	-- убираем наше окно, показываем предыдущее (или возвращаемся в игру)&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
	-- скрытие главного меню только если запущена игра&lt;br /&gt;
	if self:check_game() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	-- спавним только в игре&lt;br /&gt;
	if self:check_game() then&lt;br /&gt;
		self:on_quit()&lt;br /&gt;
		local	pos = db.actor:position()&lt;br /&gt;
		local	dir = db.actor:direction()&lt;br /&gt;
		pos = pos:add(dir:mul(dist))&lt;br /&gt;
		alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Скриптовую часть закончили. Теперь надо &amp;quot;нарисовать&amp;quot; интерфейс. Инструмет для его создания пока отсутствует (по крайней мере у нас), поэтому будем делать ручками, методом проб и ошибок.&lt;br /&gt;
&lt;br /&gt;
== XML-описатель ==&lt;br /&gt;
&lt;br /&gt;
Так как мы уже определили файл, который будет содержать расположение элементов (''xml:ParseFile(&amp;quot;ui_cheat_wnd.xml&amp;quot;)''), то создадим его. Полный путь до файла: '''config\ui\ui_cheat_wnd.xml'''.&lt;br /&gt;
&lt;br /&gt;
Вот его содержание:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1251&amp;quot; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cheat&amp;gt;	&lt;br /&gt;
	&amp;lt;back_video x=&amp;quot;10&amp;quot; y=&amp;quot;10&amp;quot; width=&amp;quot;380&amp;quot; height=&amp;quot;320&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture&amp;gt;ui\1_hyuv_sq&amp;lt;/texture&amp;gt;&lt;br /&gt;
	&amp;lt;/back_video&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;background x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;340&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;350&amp;quot; height=&amp;quot;460&amp;quot;&amp;gt;ui\ui_dg_inventory&amp;lt;/texture&amp;gt;&lt;br /&gt;
	&amp;lt;/background&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_1 x=&amp;quot;20&amp;quot; y=&amp;quot;30&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;wpn-svd&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_2 x=&amp;quot;20&amp;quot; y=&amp;quot;60&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Патроны&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_3 x=&amp;quot;20&amp;quot; y=&amp;quot;90&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Собака&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;btn_quit x=&amp;quot;270&amp;quot; y=&amp;quot;300&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/btn_quit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/cheat&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Погружение ==&lt;br /&gt;
&lt;br /&gt;
=== Видео ===&lt;br /&gt;
&lt;br /&gt;
Разберем построчно. Так как ф-ия '''cheat:InitControls()''' сначала отображает видеоролик (чтобы он оказался под всеми элементами, с него и начнем.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;back_video x=&amp;quot;10&amp;quot; y=&amp;quot;10&amp;quot; width=&amp;quot;380&amp;quot; height=&amp;quot;320&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Название элемента должно совпадать с именем, которое присутствует в '''xml:InitStatic(&amp;quot;back_video&amp;quot;, self)'''&lt;br /&gt;
&lt;br /&gt;
'''x,y''' - координаты левого верхнего угла относительно объявленного в '''self:Init'''&lt;br /&gt;
&lt;br /&gt;
'''width, height''' - ширина-высота&lt;br /&gt;
&lt;br /&gt;
'''stretch=&amp;quot;1&amp;quot;''' - указывает на необходимость растягивания элемента&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;texture&amp;gt;ui\1_hyuv_sq&amp;lt;/texture&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Используется видеоролик находящися по адресу '''textures\ui\1_hyuv_sq.ogm'''. Его исходные размеры - 512х512, поэтому нам и понадобилось растягивание, вернее так называемый стретч.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;/back_video&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
конец элемента.&lt;br /&gt;
&lt;br /&gt;
=== Бэкграунд ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;background x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;340&amp;quot; stretch=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
координаты, размеры, растягивание, все как и выше&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;texture x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;350&amp;quot; height=&amp;quot;460&amp;quot;&amp;gt;ui\ui_dg_inventory&amp;lt;/texture&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
а вот здесь ссылка на используемую текстуру. Мы не стали рисовать свою, а взяли уже имеющуюся, поэтому задаваемые здесь координаты и размеры означают, что нужно взять текстуру '''ui\ui_dg_inventory.dds''' и вырезать из нее нужный нам кусок. Обратите внимание, что размеры вырезанной части и определенные нами не совпадают, маловата текстура оказалась, поэтому пришлось ее растягивать ;)&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;/background&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
конец элемента.&lt;br /&gt;
&lt;br /&gt;
=== Кнопки ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;btn_1 x=&amp;quot;20&amp;quot; y=&amp;quot;30&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
координаты, размеры, без растягивания, все как и выше. Но, здесь это означает размеры интерактивной области. Если указать иные размеры, то кнопка будет реагировать только в указанной зоне. Если указать нулевые размеры, то кнопка вообще перестанет быть интерактивной.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
а вот тут уже интереснее. не пытайтесь искать текстуру с именем ui_button_ordinary_e. Она описана в другом файле, '''config\ui\ui_common.xml'''. Ссылка на этот файл входит в секцию '''[texture_desc]''' в '''system.ltx'''. То есть, если вы создали свой файл-описатель интерфейса, то нужно проставить ссылку на этот файл в вышеописанной секции.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;text&amp;gt;wpn-svd&amp;lt;/text&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
текст на кнопке. Здесь тоже не все так просто. Сначала игра ищет выражение '''wpn-svd''' в файлах заданных в секции '''[string_table]''' файла '''localization.ltx''', то есть зависит от установленного языка. В данном случае ссылка на '''wpn-svd''' есть в файле '''config\text\rus\string_table_enc_weapons.xml''', и равно&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;string id=&amp;quot;wpn-svd&amp;quot;&amp;gt;&amp;lt;text&amp;gt;СВДм 2&amp;lt;/text&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
При таком способе установки текстового значения мы не будем зависеть от языка игры и сможем создавать не привязанные к языку моды.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на вторую кнопку, то ее текстовое значение равно&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;text&amp;gt;Патроны&amp;lt;/text&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Такого значения игра не найдет и просто отобразит так как есть. Но англоязычные пользователи врядли поймут написанное. Поэтому я лично рекомендую использовать уже имеющиеся ресурсы, и минимально вмешиваться в ресурсы и добавлять новые. Но, например, файл с названиями машин ('''string_table_enc_vehicles.xml''') не входит в файл '''localization.ltx''', поэтому придется его туда подключить, либо указать конечному пользователю на необходимость добавления одной строчки в этот файл.&lt;br /&gt;
&lt;br /&gt;
Ну кнопочка &amp;quot;Выход&amp;quot; сделана вот так:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Продолжение ==&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем, запускаем игру, жмем '''Esc - F1''', и видим наше окошко. Можно понажимать на кнопки и увидеть что они какие-то неинтерактивные. То есть никак не реагируют на наведение мыши и нажатие. Но это легко поправимо. В игре все для этого есть. Достаточно оформить кнопку вот так (пример для одной, остальные аналогично):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&amp;lt;btn_quit x=&amp;quot;270&amp;quot; y=&amp;quot;300&amp;quot; width=&amp;quot;117&amp;quot; height=&amp;quot;29&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;texture_e&amp;gt;ui_button_ordinary_e&amp;lt;/texture_e&amp;gt;&lt;br /&gt;
	&amp;lt;texture_t&amp;gt;ui_button_ordinary_t&amp;lt;/texture_t&amp;gt;&lt;br /&gt;
	&amp;lt;texture_h&amp;gt;ui_button_ordinary_h&amp;lt;/texture_h&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;ui_inv_exit&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/btn_quit&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Обозначения:&lt;br /&gt;
*texture_e - вид кнопки по умолчанию&lt;br /&gt;
*texture_t - вид кнопки при нажатии&lt;br /&gt;
*texture_h - вид кнопки при наведении мыши&lt;br /&gt;
есть еще одно состояние, '''texture_d''', оно означает текстуру выключенной кнопки. Можно скриптами задавать состояние кнопки (включена-выключена), но об этом в другой раз.&lt;br /&gt;
&lt;br /&gt;
Поизучайте файлик '''ui_common.xml''' на предмет других элементов, там еще много интересного.&lt;br /&gt;
&lt;br /&gt;
== Внимание ==&lt;br /&gt;
&lt;br /&gt;
Так как скрипт спавна изменен по сравнению с первой статьей (добавлен вызов '''self:on_quit()''' перед самим спавном), то функцию привязки к клавишам следует оформить следующим образом:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:OnKeyboard(dik, keyboard_action)&lt;br /&gt;
	CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
	if keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
		-- отсюда убран вызов self:on_quit()&lt;br /&gt;
		if     dik == DIK_keys.DIK_ESCAPE then self:on_quit()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD1 then	self:cheat1()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD2 then	self:cheat2()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD3 then	self:cheat3()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD5 then	self:cheat5()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD6 then	self:cheat6()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD7 then	self:cheat7()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD8 then	self:cheat8()&lt;br /&gt;
		elseif dik == DIK_keys.DIK_NUMPAD9 then	self:cheat9()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[[Назначение скриптам горячих кнопок. Часть 1. Скрипт|Первая часть статьи]]&lt;br /&gt;
*[[Bind_script_ui_script_2|Полный текст скрипта ui_cheats.script (нового)]]&lt;br /&gt;
*[[Bind_script_ui_xml|Полный текст ui_cheat_wnd.xml]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:41:24Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Сон по желанию */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну, или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу создадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскомментируем и заодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. При ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class        = SCRPTCAR&lt;br /&gt;
cform        = skeleton&lt;br /&gt;
visual	= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. Найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку '''3''' на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&amp;lt;/code&amp;gt;&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&amp;lt;/code&amp;gt;&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:40:34Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Монстры */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну, или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу создадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскомментируем и заодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. При ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class        = SCRPTCAR&lt;br /&gt;
cform        = skeleton&lt;br /&gt;
visual	= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. Найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку '''3''' на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&amp;lt;/code&amp;gt;&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:40:03Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Транспорт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну, или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу создадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскомментируем и заодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. При ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class        = SCRPTCAR&lt;br /&gt;
cform        = skeleton&lt;br /&gt;
visual	= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. Найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку '''3''' на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&amp;lt;/code&amp;gt;&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:39:24Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Транспорт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну, или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу создадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскомментируем и заодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. При ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class	= SCRPTCAR&lt;br /&gt;
cform        = skeleton&lt;br /&gt;
visual	= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. Найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку '''3''' на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&amp;lt;/code&amp;gt;&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:34:53Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Монстры */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну, или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу создадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскомментируем и заодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. При ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. Найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&amp;lt;/code&amp;gt;&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:32:23Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Транспорт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну, или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу создадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскомментируем и заодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. При ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. Найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
 function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:25:43Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Скрипт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну, или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу создадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскомментируем и заодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. При ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует...&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
 function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-14T20:20:37Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Вступление */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу созадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскоментируем и заоодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует...&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
 function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-13T10:20:09Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Вступление */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу созадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскоментируем и заоодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует...&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
 function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-13T10:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Ссылки на ресурсы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав мод от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
''(если кто знает ссылку на первоисточник мода '''jeppa_s_mod__v1.05__incl.vehicles_946''', то поставьте ее плиз. я только ссылки на закачку находил)''&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу созадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскоментируем и заоодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует...&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
 function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)&amp;lt;small&amp;gt;(нем.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8281&amp;amp;sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
* [http://www.gsc-game.com/index.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=2&amp;amp;thm_id=8271&amp;amp;sec_id=17&amp;amp;page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]&amp;lt;small&amp;gt;(англ.)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-10-13T09:16:49Z</updated>
		
		<summary type="html">&lt;p&gt;Wasly: /* Скрипт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав мод от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
''(если кто знает ссылку на первоисточник мода '''jeppa_s_mod__v1.05__incl.vehicles_946''', то поставьте ее плиз. я только ссылки на закачку находил)''&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу созадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскоментируем и заоодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_ch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует...&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
 function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
[[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Wasly</name></author>	</entry>

	</feed>