<?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=91.124.42.80&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=91.124.42.80&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/91.124.42.80"/>
		<updated>2026-04-30T23:55:10Z</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_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>2007-05-21T12:26:09Z</updated>
		
		<summary type="html">&lt;p&gt;91.124.42.80: /* Вступление */&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;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&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
 function main_menu:OnKeyboard(dik, keyboard_action)&lt;br /&gt;
Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&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&lt;br /&gt;
мы напишем&lt;br /&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_cheat()&lt;br /&gt;
 elseif 	dik == DIK_keys.DIK_F1 then&lt;br /&gt;
 	self:OnButton_cheat()&lt;br /&gt;
 end&lt;br /&gt;
То есть при нажатии на '''S''' будет вызывать спавн меню, на '''Q''' - мгновенный выход из игры, ну а '''F1''' запустит функцию ''OnButton_cheat()''. &lt;br /&gt;
То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:&lt;br /&gt;
 function main_menu:OnButton_cheat()&lt;br /&gt;
 -- если еще ни разу не вызывали, то обозначим наш новый скрипт&lt;br /&gt;
 	if self.cheat_dlg == nil then&lt;br /&gt;
 		self.cheat_dlg = ui_cheat.cheat()&lt;br /&gt;
 		self.cheat_dlg.owner = self&lt;br /&gt;
 	end&lt;br /&gt;
 -- останавливаем родительский элемент, запускаем свой, но родителя показываем.&lt;br /&gt;
 	self:GetHolder():start_stop_menu(self.cheat_dlg, true)&lt;br /&gt;
 	self:GetHolder():start_stop_menu(self, true)&lt;br /&gt;
 	self:Show(true)&lt;br /&gt;
 end&lt;br /&gt;
Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу '''ui_cheat.script''' и сделаем там обработчик нажатий клавиш. В конец файла допишем:&lt;br /&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;
 -- сразу же производим действия для возврата&lt;br /&gt;
 		self:on_quit()&lt;br /&gt;
 -- на выход повесим Esc&lt;br /&gt;
 		if dik == DIK_keys.DIK_ESCAPE then&lt;br /&gt;
 -- тут ничего не делаем&lt;br /&gt;
 		end&lt;br /&gt;
 	end&lt;br /&gt;
 	return true&lt;br /&gt;
 end&lt;br /&gt;
Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем '''F1''', анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем '''Esc''' и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&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;
&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;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
 if dik == DIK_keys.DIK_ESCAPE then&lt;br /&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;
и создадим эти функции (опять добавляем в конец файла):&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;
&lt;br /&gt;
== Траспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&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;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:&lt;br /&gt;
 #include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&lt;br /&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;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&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;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
[[Bind_script_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;
А дальше плавно переходим к облагораживание, иначе говоря - к [[Bind_script_2|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Незаконченные статьи]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>91.124.42.80</name></author>	</entry>

	</feed>