<?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=Armageddon</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=Armageddon"/>
		<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/Armageddon"/>
		<updated>2026-04-30T01:51:01Z</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>2011-02-13T16:01:23Z</updated>
		
		<summary type="html">&lt;p&gt;Armageddon: /* Скрипт */&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_cheat()&lt;br /&gt;
 elseif 	dik == DIK_keys.DIK_F1 then&lt;br /&gt;
 	self:OnButton_cheat()&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
То есть при нажатии на '''S''' будет вызывать спавн меню, на '''Q''' - мгновенный выход из игры, ну а '''F1''' запустит функцию ''OnButton_cheat()''. &lt;br /&gt;
То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:&lt;br /&gt;
&amp;lt;code lua&amp;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;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу '''ui_cheat.script''' и сделаем там обработчик нажатий клавиш. В конец файла допишем:&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;
 -- сразу же производим действия для возврата&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;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем '''F1''', анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем '''Esc''' и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)&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>Armageddon</name></author>	</entry>

	</feed>