Как сделать спавн меню
Спаунер мобов в игре Minecraft: полный гайд
«Monster Spawner» или многим привычный «Спаунер мобов» в Minecraft представляет собой полупрозрачный блок, состоящий из решёток, где создаются разного рода мобы. При этом в центре блока присутствует огонь и мини-вариант модельки существа, которого он впоследствии спавнит. Максимальное количество заспавнившихся мобов за один раз – 4, а минимальное – 1. Кроме того, спаунер мобов не может спавнить разных мобов – он всегда производит всего лишь один тип.
Такого рода блоки, генерирующие мобов, необходимы в первую очередь для защиты и тем самым для усложнения игрового процесса. Иными словами – они усложняют доступ к некоторым предметам или ресурсам. Это, как правило, касается сокровищниц, заброшенных шахт, адских и обычных крепостей, а также полуразрушенных бастионов.
Плюс ко всему благодаря спаунеру мобов при желании можно запросто соорудить крайне эффективную и богатую ферму. И хотя существуют исключения, но обычно, поскольку спаунер нельзя добыть или же передвинуть, ловушки для фермы придётся строить сразу на том же месте, где и стоит этот блок.
Какие виды спаунеров мобов есть в игре?
Как снять спаунер в игре?
В обычной одиночной игре это сделать, к большому сожалению, невозможно. Персонаж может сделать подобное либо, если воспользоваться консолью сервера, либо сторонней модификацией. Только так спаунер можно впоследствии установить в игровом мире.
Поведение мобов
Как защититься от разных мобов при снятии спавнера
Как получить и установить спаунер в творческом режиме?
Существует два способа это сделать. Первый – это воспользоваться командой. Второй – это сделать его вручную. При этом во втором случае это будет спавнер не в привычном понимании, то есть не будет похож на то, что можно найти в подземельях, крепостях и шахтах. Это будет просто конструкция с поршнями, которая использует яйца определённых мобов. Вся суть конструкции сводится к тому, что когда они появляются, то спускаются по любому построенному туннелю (с помощью воды), где их ожидает какая-нибудь убийственная ловушка. Поэтому остаётся лишь первый вариант. Для этого нужно воспользоваться и прописать команду:
Как отключить спаунер?
Существует два варианта. Первый – сломать его. Второй – воспользоваться факелом. Во втором случаем необходимо осветить территорию вокруг этого блока так, чтобы уровень освещения поднялся до максимума. В таком случае мобы перестанут появляться, а спаунер тем самым будет заблокирован.
Спаунеры на модифицированных серверах
Как получают их?
В отличие от обычного режима игры Minecraft, на серверах используются специальные плагины, благодаря которым можно добывать спавнеры так, как обычные блоки. К примеру, с помощью модификации «TooManyItems». Однако для этого также потребуется кирка с обязательным зачарованием «Шёлковое касание».
Как переназначают животных?
Это также можно осуществить лишь на сервере, но здесь уже присутствуют некоторые отличия. К примеру, на некоторых серверах переназначение спавна животных стоит денег, то есть необходимо донатить. А где-то существует вероятность успешного переназначения. Всё строго зависит от сервера и его политики. Ну и если стоит плагин «WorldEdit», который позволяет переназначить животных.
Как защищают от кражи и гриферов?
Как правило, помогает обычный приват территории, но некоторые гриферы довольно умны и находят всё новые способы получить имущество честных игроков. И защититься от них можно лишь специальными ловушками, защитными структурами вроде обсидиановых комнат. Хотя даже в таком случае существуют способы получить имущество. Поэтому необходимо строить многоуровневые защитные комнаты, куда не получится попасть даже с помощью портала через «Нижний мир».
Секреты и советы по спаунерам
Качалки на спаунерах в игре
Их также называют мобофермами – это специальные строения, где происходит автоматический спавн враждебных существ, после чего их конструкция убивает, а персонаж получает опыт. Чтобы враждебные существа начали появляться, необходимо иметь уровень освещения ниже 7. При этом качалки делятся на три типа:
Разумеется, что для этого необходимо соблюдать некоторые условия при постройке. В первую очередь необходимо сделать огромный закрытый зал, снаружи которого будет достаточное количество освещения, чтобы мобы появлялись не снаружи, а внутри. Следом необходимо сделать проходы, через которые мобы будут транспортироваться в другое помещение, где они будут умирать от руки персонажа или ловушки.
Спаунеры – это отличная возможность не только получить огромное количество опыта, но и бесконечное число ресурсов. Особенно если эти ресурсы необходимо добыть с враждебных мобов, которых сложно убивать в большом количестве.
Как сделать спавн меню
Нам понадобятся следующие распакованные (или имеющиеся) файлы:
config\system.ltx
scripts\ui_main_menu.script
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его ui_cheat.script и положим ко всем остальным скриптам.
Вот его содержание:
— инициализация
class «cheat» (CUIScriptWnd)
function cheat:__init(owner) super()
self.owner = owner
self:InitControls()
self:InitCallBacks()
end
function cheat:__finalize() end
function cheat:InitControls()
— здесь будут все контролы
end
function cheat:InitCallBacks()
— здесь будут все каллбаки (ну или обработчики)
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
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на 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
То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:
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
Добавление от 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
Далее по накатанной дорожке. Допишем функцию вызова спавна:
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()
Предполагается, что имя скрипта sleep_manager.script, а в нем есть функция sleep_three_hours(), то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед
Спавн через скрипт
В скриптах есть одна единственная функция, отвечающая за спавн объектов:
alife():create(section,position,levelvertex,gamevertex)
Строго говоря, их две: create create_ammo но различия между ними не существенны. Imp 22:45, 23 июля 2007 (EEST)
Дальше сложнее, так как сам толком сформулировать не могу.
Начнем от простого к сложному. На каждом уровне много объектов, все объекты состоят из полигонов, у каждого полигона есть вершины – вертексы.
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex в четвертом параметре Например:
db.actor:game_vertex()
Итак, чтобы, например, заспавнить болт под ногами актора, пишем:
alife():create(«bolt»,db.actor():position(),1,db.actor:game_vertex())
Пример (спавним артефакт Медуза в инвентаре у актора):
alife():create(«af_medusa», db.actor():position(), 1, db.actor:game_vertex(), db.actor:id())
Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.
Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!
Итак, мы поймали нашего киллера по ID.
Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа «NPC», а не с серверными объектами.
Практика (часть 1)
1. Чтобы не повторяться в описании создания нового квеста, просто изучите статью по созданию квестов от Fr3nzy – лучшей статьи на эту тему я просто не видел 🙂 Мы просто свяжем все воедино и научимся спавнить объекты из скрипта.
Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – она делает спавн через файл all.spawn, что приводит к:
Невозможности совместить два мода, такой спавн использующих
Необходимости каждый раз начинать новую игру
При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохраненные игры будут работать, что не может не радовать 🙂
Итак, определимся с квестом.
Задача: после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться после прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым. я думаю, исход боя предрешен 🙂
Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру 🙂
В консоли введите команду:
rs_stats on или rs_stats 1
Тем самым мы включаем вывод информации на экран. Далее вводим еще одну команду:
demo_record 1
Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).
Добавим пятую модель.
Для этого в конце файла создадим секцию:
[zombie_ghost]:zombie_strong
Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.
Пишем дальше:
$spawn = «monsters\zombies\zombie_ghost»
visual = monsters\zombi\zombi_1_ghost
Все. Сохраняем изменения и закрываем файл.
2. Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script.
При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую 🙂
Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:
local zombie_types =
Все. Сохраняем и закрываем файл.
Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование.
Добавим в local killCountProps к монстрам строчку:
zombie_weak = 1, zombie_normal = 2, zombie_str 3
В local sect_alias строчку:
zombie_weak = «zombie_weak», zombie_normal = «zombie_normal», zombie_str «zombie_strong»
А ниже в monster_classes строчку:
[clsid.zombie_s ] = «zombie»
В функцию getNpcType(npc) добавляем конструкцию:
elseif npc:character_community() == «zombie» then
community = «zombie»
Сохраняем изменения и закрываем файл.
Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.
Expression : fatal error
Function : CInifile::r_string
File : D:\xray-svn\xrCore\Xr_ini.cpp
Line : 351
Description :
Arguments : Can’t find variable icon in [zombie_weak]
Все верно – игра не знает какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:
Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);
Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера 🙂
Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр
icon = ui_npc_monster_kontroler
Все. Вылетов не будет.
3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример статью по созданию диалогов от BAC9-FLCL.
Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:
escape_trader_talk_info_999
7770
9991
9992
9993
9994
9995
9996
escape_trader_talk_info_99922
9996
9995
escape_trader_talk_info_3121
9996
9995
escape_trader_talk_info_3131
9996
9995
escape_trader_talk_info_41
9996
9995
escape_trader_talk_info_7771
7772
7773
escape_trader_talk_info_7779
9996
9995
escape_trader_talk_info_7777
esc_zombie.zombie_story_1
9996
9995
escape_trader_talk_info_51
9996
9995
И также связанный с ним файл stable_dialogs_escape.xml. В самом начале файла пишем следующее:
Происшествий никаких не было?
Да я как-то не собирался в ту сторону.
Ну, смотри сам, все равно будь осторожен.
Ага. Сходи, проветрись. Потом зайдешь, расскажешь, что там и как.
Здесь проход воспрещён, сталкер.
Все. Можно запускать игру, идти на Кордон, после разговора с Сидоровичем, в зависимости от выбранного Меченным решения, бежим на фабрику и … смотрим сами 🙂
Готовые файлы примера
Spawn Lib
Продолжение следует…
Практика (часть 2)
Файл модели до редактирования
Файл модели после редактирования
На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. 🙂
5. Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:
[zombie_old]:zombie_normal
$spawn = «monsters\zombies\zombie_old»
visual = monsters\zombi\zombi_3
в файле esc_zombie.script изменяем массив в первой строке:
local zombie_types = <"zombie_weak", "zombie_normal", "zombie_strong", "zombie_immortal",
«zombie_old», «zombie_ghost»>
В функции spawn_zombies изменяем строку спавна:
alife():create(zombie_types[math.random(6)],new_pos,
db.actor:level_vertex_id(),db.actor:game_vertex_id())
в функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):
spawn_zombies( spawn_point, 12 )
Всё. Сохраняем и закрываем.
6. Копируем в папку gamedata\config\gameplay\ файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:
И в связанный с ним файл string_table_enc_mutants.xml в папке gamedata\config\text\rus\ добавляем:
Зомби-привидение отличается от обычного зомби лишь тем, что
воздействие Выжигателя мозгов полностью разрушило не только структуру личности, но и
тело, поэтому зомби-призрак несколько более живуч по сравнению с обычным зомби.
Воздействие Выжигателя мозгов полностью разрушает структуру личности,
оставляя только телесную оболочку.\n\n Побродив немного по Зоне, лишённые разума тела
начинают превращаться в настоящих зомби. Из рефлексов у них остаются лишь самые примитивные,
оружие и экипировка скоро приходят в негодность. В результате зомби становятся собой ни чем
иным, как медлительными полутрупами, которых наличествуют лишь два эффективных раздражителя:
еда и сон. Зомби совершенно неразборчивы в выборе пищи и питья, поэтому их тела буквально
пропитаны радиацией и токсинами. Как правило, эти существа бесцельно бродят по Зоне или,
словно трупы, валяются внутри заброшенных построек. Однако, лишь только зомби почует близкое
присутствие живого человека, он сразу же пытается атаковать. Умудрённые опытом сталкеры
стараются обходить эти неуклюжие опустошённые оболочки.
Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:
Сохраняем и закрываем.
Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.
Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку
icon = ui_npc_monster_kontroler
В секцию [zombie_ghost] добавьте строку:
icon = ui_npc_monster_zombieg
Сохраняйте изменения. Всё.
Вот готовые файлы примера. Удачи и спасибо за внимание 🙂
Спавн NPC
Эта часть статьи написана Arhet и создана на примере того, как в SRP Mod были созданы NPC группировки «Грех».
Начнем с character_desc_escape.xml. Описание что значит каждая строка писать не буду, так как все до меня уже сделано.
Тут создадим нового персонажа:
[spawn] \n
wpn_dark_colt1911 \n
ammo_11.43x23_hydro \n
#include «gameplay\character_items.xml» \n
#include «gameplay\character_drugs.xml» \n
#include «gameplay\character_food.xml»
Впишем наш код после какого-нибудь
Теперь идем в npc_profile.xml и туда вгоняем:
Теперь надо заняться spawn_sections.ltx. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:
[esc_dark_stalker_1]:stalker – имя секции для скрипта..
$spawn = «respawn\esc_dark_stalker_1»
character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC
spec_rank = regular – спец ранг
community = dark_stalker – группировка.
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.