Назначение скриптам горячих кнопок. Часть 1. Скрипт — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Назначение скриптам горячих кнопок. Часть 1. Скрипт — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(Настаящии изменения!)
(Скрипт)
 
(не показаны 32 промежуточных версий 10 участников)
Строка 1: Строка 1:
 
== Вступление ==
 
== Вступление ==
  
Поизучав мод от камрада Jeppa решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.
+
Поизучав [http://shooter-szene.4players.de/modules/PNphpBB2/files/jeppa_s_mod__v1.05__incl.vehicles_946.zip мод] от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.
''(если кто знает ссылку на первоисточник мода '''jeppa_s_mod__v1.05__incl.vehicles_946''', то поставьте ее плиз. я только ссылки на закачку находил)''
+
  
ХУЁОЧЕ положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.
+
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.
  
 
Нам понадобятся следующие распакованные (или имеющиеся) файлы:
 
Нам понадобятся следующие распакованные (или имеющиеся) файлы:
Строка 11: Строка 10:
 
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.
 
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.
  
NEO-ВОЯ МАТЬ-ХуЁОЧЕ!
+
== Скрипт ==
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам. Вот его содержание:
+
 
-- инициализация
+
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.
class "cheat" (CUIScriptWnd)
+
 
+
{| class="collapsible collapsed"
function cheat:__init(owner) super()
+
|-
self.owner = мать нео и Olegatorr-ПРАСТИТУТКА!
+
! Вот его содержание:
self:InitControls()
+
|-
self:InitCallBacks()
+
|
end
+
<code lua>-- инициализация
+
class "cheat" (CUIScriptWnd)
function cheat:__finalize() end
+
 
+
function cheat:__init(owner) super()
function cheat:InitControls()
+
self.owner = owner
-- здесь будут все контролы  
+
self:InitControls()
end
+
self:InitCallBacks()
+
end
function cheat:InitCallBacks()
+
 
-- здесь будут все каллбаки (ну или обработчики)
+
function cheat:__finalize() end
end
+
 
+
function cheat:InitControls()
-- сразу созадим ф-ию для выхода
+
-- здесь будут все контролы  
СОСИ!Пиздюк! хуёвоен меню  
+
end
if dik == DIK_keys.DIK_S then
+
 
self:OnButton_load_spawn()
+
function cheat:InitCallBacks()
elseif dik == DIK_keys.DIK_Q then
+
-- здесь будут все каллбаки (ну, или обработчики)
self:OnMessageQuitWin()
+
end
 +
 
 +
-- сразу создадим ф-ию для выхода
 +
function cheat:on_quit()
 +
local console = get_console()
 +
self:GetHolder():start_stop_menu (self.owner, true)
 +
self:GetHolder():start_stop_menu (self,true)
 +
self.owner:Show (true)
 +
-- если мы вызывались из игры, то убираем главное меню
 +
if level.present() and (db.actor ~= nil) and db.actor:alive() then
 +
console:execute("main_menu off")
 +
end
 +
end</code>
 +
|}
 +
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:
 +
<code lua>function main_menu:OnKeyboard(dik, keyboard_action)</code>
 +
Это обработчик нажатий клавиш. Используемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо
 +
<code lua>-- if dik == DIK_keys.DIK_S then
 +
-- self:OnButton_load_spawn()
 +
 +
-- else
 +
if dik == DIK_keys.DIK_Q then
 +
self:OnMessageQuitWin()
 +
end</code>
 +
мы напишем
 +
<code lua>-- раскомментируем и заодно включим убранное спавн меню
 +
if dik == DIK_keys.DIK_S then
 +
self:OnButton_load_spawn()
 +
elseif dik == DIK_keys.DIK_Q then
 +
self:OnMessageQuitWin()
 
  -- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_cheat()
 
  -- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_cheat()
 
  elseif dik == DIK_keys.DIK_F1 then
 
  elseif dik == DIK_keys.DIK_F1 then
 
  self:OnButton_cheat()
 
  self:OnButton_cheat()
 
  end
 
  end
 +
</code>
 
То есть при нажатии на '''S''' будет вызывать спавн меню, на '''Q''' - мгновенный выход из игры, ну а '''F1''' запустит функцию ''OnButton_cheat()''.  
 
То есть при нажатии на '''S''' будет вызывать спавн меню, на '''Q''' - мгновенный выход из игры, ну а '''F1''' запустит функцию ''OnButton_cheat()''.  
 
То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:
 
То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:
function main_menu:OnButton_cheat()
+
<code lua> function main_menu:OnButton_cheat()
 
  -- если еще ни разу не вызывали, то обозначим наш новый скрипт
 
  -- если еще ни разу не вызывали, то обозначим наш новый скрипт
 
  if self.cheat_dlg == nil then
 
  if self.cheat_dlg == nil then
Строка 55: Строка 84:
 
  self:Show(true)
 
  self:Show(true)
 
  end
 
  end
 +
</code>
 
Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу '''ui_cheat.script''' и сделаем там обработчик нажатий клавиш. В конец файла допишем:
 
Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу '''ui_cheat.script''' и сделаем там обработчик нажатий клавиш. В конец файла допишем:
function cheat:OnKeyboard(dik, keyboard_action)
+
<code lua> function cheat:OnKeyboard(dik, keyboard_action)
 
  CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
 
  CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
 
  if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
 
  if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
Строка 68: Строка 98:
 
  return true
 
  return true
 
  end
 
  end
 +
</code>
 
Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем '''F1''', анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем '''Esc''' и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)
 
Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем '''F1''', анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем '''Esc''' и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)
  
Строка 73: Строка 104:
  
 
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):
 
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):
-- spawn_item - необходимый предмет
+
<code lua>-- spawn_item - необходимый предмет
-- dist - радиус появления (случайно)
+
-- dist - радиус появления (случайно)
function cheat:spawn_item(spawn_item, dist)
+
function cheat:spawn_item(spawn_item, dist)
local pos = db.actor:position()
+
local pos = db.actor:position()
local dir = db.actor:direction()
+
local dir = db.actor:direction()
pos = pos:add(dir:mul(dist))
+
pos = pos:add(dir:mul(dist))
-- создаем предмет в dist метрах прямо перед нами
+
-- создаем предмет в dist метрах прямо перед нами
alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())
+
alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())
end
+
end
 
+
</code>
 
{{Message_box|
 
{{Message_box|
 
id =pseudoscience|
 
id =pseudoscience|
Строка 91: Строка 122:
 
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):
 
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):
 
<pre>function cheat:spawn_item(spawn_item)
 
<pre>function cheat:spawn_item(spawn_item)
  alife():create(spawn_item, db.actor:position(),  db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
  alife():create (spawn_item, db.actor:position(),  db.actor:level_vertex_id(),
 +
db.actor:game_vertex_id(), db.actor:id())
 
  end</pre>}}
 
  end</pre>}}
 
<br clear="both" />
 
<br clear="both" />
 +
 +
<pre>Добавление от HikeR.
 +
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.
 +
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов
 +
и вызываться нужная. В С++ это называется "перегрузка" (если не ошибаюсь ;)
 +
</pre>
  
 
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:
 
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:
if dik == DIK_keys.DIK_ESCAPE then
+
<code lua>if dik == DIK_keys.DIK_ESCAPE then</code>
 
добавим следующее:
 
добавим следующее:
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()
+
<code lua>
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()
+
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()
 +
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()
 +
</code>
 
и создадим эти функции (опять добавляем в конец файла):
 
и создадим эти функции (опять добавляем в конец файла):
function cheat:cheat1()
+
<code lua>
-- колдуем грозу на расстоянии 3 метров.
+
function cheat:cheat1()
self:spawn_item("wpn_groza", 3)
+
-- колдуем грозу на расстоянии 3 метров.
end
+
self:spawn_item("wpn_groza", 3)
function cheat:cheat2()
+
end
self:spawn_item("ammo_9x39_sp5", 3)
+
function cheat:cheat2()
end
+
self:spawn_item("ammo_9x39_sp5", 3)
 +
end
 +
</code>
  
== Траспорт ==
+
== Транспорт ==
  
 
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.
 
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.
  
 
Создадим новый файл с именем cars_spawn.ltx
 
Создадим новый файл с именем cars_spawn.ltx
[ven_niva]
+
<code>
class = SCRPTCAR
+
[ven_niva]
cform           = skeleton
+
class       = SCRPTCAR
visual = physics\vehicles\niva\veh_niva_u_01.ogf
+
cform       = skeleton
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:
+
visual = physics\vehicles\niva\veh_niva_u_01.ogf
#include "models\vehicles\cars_spawn.ltx"
+
</code>
 +
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. Найдем последний include и добавим наш конфиг:
 +
<code>#include "models\vehicles\cars_spawn.ltx"</code>
 
Далее по накатанной дорожке. Допишем функцию вызова спавна:
 
Далее по накатанной дорожке. Допишем функцию вызова спавна:
function cheat:cheat3()
+
<code lua>
self:spawn_item("ven_niva", 5, 10)
+
function cheat:cheat3()
end
+
self:spawn_item("ven_niva", 5, 10)
и назначим ей кнопку 3 на цифровой клавиатуре:
+
end
elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()
+
</code>
 +
и назначим ей кнопку '''3''' на цифровой клавиатуре:
 +
<code lua>elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()</code>
 
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.
 
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.
  
 
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.
 
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.
 
Продолжение следует...
 
  
 
== Монстры ==
 
== Монстры ==
  
 
Аналогично добавляем монстров и прочую живность. Функция:
 
Аналогично добавляем монстров и прочую живность. Функция:
function cheat:cheat4()
+
<code lua>function cheat:cheat4()
 
  -- создаем монстра подальше от нас
 
  -- создаем монстра подальше от нас
 
  self:spawn_item("dog_weak", 20)
 
  self:spawn_item("dog_weak", 20)
  end
+
  end</code>
 
Обработка клавиши '''4'''
 
Обработка клавиши '''4'''
elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()
+
<code lua>elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()</code>
  
 
== Сон по желанию ==
 
== Сон по желанию ==
  
 
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.
 
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.
function cheat:cheat5()
+
<code lua>function cheat:cheat5()
 
  sleep_manager.sleep_three_hours()
 
  sleep_manager.sleep_three_hours()
  end
+
  end</code>
 
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.
 
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.
  
ХУЙ!ХУЙ ВЕЗДЕ!Гейменатор-ХУЙ!Жопы вы недоделанные))
+
 
 +
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.
 +
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.
 +
 
 +
== Внимание!!! ==
 +
 
 +
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед
 +
 
 +
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.
  
 
== Ссылки на ресурсы ==
 
== Ссылки на ресурсы ==
  
[[Bind_script_ui_script|Полный текст скрипта ui_cheats.script]]
+
* [[Скрипт ui script|Полный текст скрипта ui_cheats.script]]
 +
* [http://shooter-szene.4players.de/PNphpBB2-viewtopic-t-6216.phtml Stalker-MOD incl. Fahrzeuge] - официальный топик(обсуждение и загрузка)<small>(нем.)</small>
 +
* [http://www.gsc-game.com/index.php?t=community&s=forums&s_game_type=xr&thm_page=2&thm_id=8281&sec_id=16 Обсуждение Jeppa's Vehicle mod на gsc-game.com]<small>(англ.)</small>
 +
* [http://www.gsc-game.com/index.php?t=community&s=forums&s_game_type=xr&thm_page=2&thm_id=8271&sec_id=17&page=3 Загрузка Jeppa's Vehicle mod на gsc-game.com]<small>(англ.)</small>
  
 
== Благодарности ==
 
== Благодарности ==
Строка 161: Строка 216:
 
*'''[http://forums.ag.ru/?action=viewprofile&username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)
 
*'''[http://forums.ag.ru/?action=viewprofile&username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)
  
--[[Участник:HikeR|HikeR]] 07:30, 20 мая 2007 (MSD)
+
== Что дальше? ==
[[Категория:Незаконченные статьи]][[Категория:Скрипты]]
+
 
 +
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].
 +
 
 +
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)
 +
[[Категория:Скрипты]]

Текущая версия на 16:01, 13 февраля 2011

Вступление

Поизучав мод от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.

К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.

Нам понадобятся следующие распакованные (или имеющиеся) файлы:

config\system.ltx
scripts\ui_main_menu.script

Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.

Скрипт

Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его ui_cheat.script и положим ко всем остальным скриптам.

Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл ui_main_menu.script, идем в самый конец и ищем там такую ф-ию:

function main_menu:OnKeyboard(dik, keyboard_action)

Это обработчик нажатий клавиш. Используемые клавиши перечислены в lua_help.script (ищите строку C++ class DIK_keys). Итак, вместо

--	if dik == DIK_keys.DIK_S then
-- self:OnButton_load_spawn()
 
-- else
if dik == DIK_keys.DIK_Q then
self:OnMessageQuitWin()
end

мы напишем

-- раскомментируем и заодно включим убранное спавн меню 
if dik == DIK_keys.DIK_S then
self:OnButton_load_spawn()
elseif dik == DIK_keys.DIK_Q then
self:OnMessageQuitWin()
-- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_cheat()
elseif dik == DIK_keys.DIK_F1 then
self:OnButton_cheat()
end

То есть при нажатии на S будет вызывать спавн меню, на Q - мгновенный выход из игры, ну а F1 запустит функцию OnButton_cheat(). То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:

function main_menu:OnButton_cheat()
-- если еще ни разу не вызывали, то обозначим наш новый скрипт
if self.cheat_dlg == nil then
self.cheat_dlg = ui_cheat.cheat()
self.cheat_dlg.owner = self
end
-- останавливаем родительский элемент, запускаем свой, но родителя показываем.
self:GetHolder():start_stop_menu(self.cheat_dlg, true)
self:GetHolder():start_stop_menu(self, true)
self:Show(true)
end

Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу ui_cheat.script и сделаем там обработчик нажатий клавиш. В конец файла допишем:

function cheat:OnKeyboard(dik, keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
-- сразу же производим действия для возврата
self:on_quit()
-- на выход повесим Esc
if dik == DIK_keys.DIK_ESCAPE then
-- тут ничего не делаем
end
end
return true
end

Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем F1, анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем Esc и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)

Предметы

Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец ui_cheat.script):

-- spawn_item - необходимый предмет
-- dist - радиус появления (случайно)
function cheat:spawn_item(spawn_item, dist)
local pos = db.actor:position()
local dir = db.actor:direction()
pos = pos:add(dir:mul(dist))
-- создаем предмет в dist метрах прямо перед нами
alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())
end
Lamp.gif Можно спавнить предметы прямо в инвентарь -- Neo][
Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):
function cheat:spawn_item(spawn_item)
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),
 			db.actor:game_vertex_id(), db.actor:id())
 end


Добавление от HikeR.
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов
и вызываться нужная. В С++ это называется "перегрузка" (если не ошибаюсь ;)

Теперь необходимо вызвать эту функцию. Привяжем кнопки 1 и 2 на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию cheat:OnKeyboard после строки:

if dik == DIK_keys.DIK_ESCAPE then

добавим следующее:

elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()

и создадим эти функции (опять добавляем в конец файла):

function cheat:cheat1()
-- колдуем грозу на расстоянии 3 метров.
self:spawn_item("wpn_groza", 3)
end
function cheat:cheat2()
self:spawn_item("ammo_9x39_sp5", 3)
end

Транспорт

Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.

Создадим новый файл с именем cars_spawn.ltx

[ven_niva]
class = SCRPTCAR
cform = skeleton
visual = physics\vehicles\niva\veh_niva_u_01.ogf

Сохраним его к остальным конфигам транспорта, то есть в config\models\vehicles. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем system.ltx. В начале файла есть множество команд #include ..., они подключают конфиги. Найдем последний include и добавим наш конфиг:

#include "models\vehicles\cars_spawn.ltx"

Далее по накатанной дорожке. Допишем функцию вызова спавна:

function cheat:cheat3()
self:spawn_item("ven_niva", 5, 10)
end

и назначим ей кнопку 3 на цифровой клавиатуре:

elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()

Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.

Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.

Монстры

Аналогично добавляем монстров и прочую живность. Функция:

function cheat:cheat4()
-- создаем монстра подальше от нас
self:spawn_item("dog_weak", 20)
end

Обработка клавиши 4

elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()

Сон по желанию

Если у Вас установлен Dream mod, то можно и его повесить на кнопку.

function cheat:cheat5()
sleep_manager.sleep_three_hours()
end

Предполагается, что имя скрипта sleep_manager.script, а в нем есть функция sleep_three_hours(), то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.


Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело. Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.

Внимание!!!

При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед

Желательно выбирать ровную поверхность, либо поверхность с наклоном от игрока. Если спавнить в гору - то предмет вообще не появится, вернее он появится, но провалится под уровень.

Ссылки на ресурсы

Благодарности

  • Jeppa - за толчок в сторону изучения этой стороны скриптинга
  • Red75 - за расчет координат спавна (появление прямо перед нами)

Что дальше?

А дальше плавно переходим к облагораживанию, иначе говоря - к интерфейсу.

--HikeR 23:37, 20 мая 2007 (MSD)

Другие места
LANGUAGE