-
Notifications
You must be signed in to change notification settings - Fork 0
Home RU
This page is available in English
Движок имеет возможность добавлять оутпуты прямо на ходу через инпут AddOutput. Этой фичей активно пользовались мапперы мультиплеерных карт в таких играх, как Counter-Strike: Source, Synergy, Obsidian Conflict и т.д. Я делал подобные карты для мода Obsidian Conflict в период 2010-2012 годов. С помощью AddOutput можно было заниматься костыльным "программированием" - создавать игровые режимы, экономику, инвентарь на игроках, особых нпс, специальные энтити. А ведь в то время еще даже не существовало VScript!
Эта система хоть и гибкая, но очень неудобная и громоздкая. То что описано выше было невероятным безумием из миллиона энтитей в Hammer, похожее на прародитель Blueprints From Hell. Но даже сейчас, чтобы сделать простейшую логику лифта с кнопками, приходится создавать несколько логических энтитей, а потом все это связывать. Чтобы исправить какую-либо логическую ошибку, приходится полностью перекомпилировать карту.
В какой-то момент мне это надоело, я решил удалить всю логику из Hammer и перенести ее в Lua, чтобы нам не пришлось ради одной кнопки перекомпилировать всю карту. Или еще один отстойны вариант - создавать собственную скриптовую энтить кнопки/двери/лифта.
Map Logic Controller (MapLogic
) позволяет настраивать логику Инпутов/Оутпутов на карте из Lua.
Если вы не понимаете о чем речь, пожалуйста обратитесь к официальной документации Valve Developer Wiki.
Контроллер использует AddOutput инпут для добавления новых оутпутов энтитям: https://developer.valvesoftware.com/wiki/AddOutput
Чтобы ловить эти оутпуты на Lua стороне, контроллер использует метод ENTITY:AcceptInput
:
https://wiki.facepunch.com/gmod/ENTITY:AcceptInput
Контроллер представляет из себя серверную point энтить, которая дает возможность создавать оутпуты на стороне Lua для энтитей на карте. Благодаря этому вы можете с легкостью настраивать сложную логику механизмов, лифтов, дверей, кодовых замков, поездов - всего, что в Hammer превращается в сущий ад из десятков логических энтитей, миллионов оутпутов, и часто является невыполнимой задачей.
Технически map_logic_controller распознает инпуты и вызывает забинденные вами Lua функции.
Эти инпуты являются обратным вызовом от оутпутов, добавленных с помощью AddOutput.
Оутпуты добавляются в коде через объект MetaTarget в хуке OnMapLogicInitialized
.
Дополнительно не пропустите:
-
Консольная команда
map_logic_reload
- Удаляет старый контроллер и создает новый. Заставляет снова инициализировать всю логику карты. Пожалуйста, не используйте это слишком много раз (см. ниже). -
Консольная переменная
map_logic_override ""
- Переопределяет имя карты, для которой контроллер инициализирует логику. Таким образом, можно делать несколько пресетов для одной карты. Значение переменной не сохраняется, поэтому вам нужно выставлять ее при старте сервера вautoexec.cfg
илиserver.cfg
.
-
Не создавайте контроллер слишком часто. Каждая инициализация логики добавляет оутпуты для нового контроллера. Если контроллер удален, то оутпуты летят в пустоту - в этом нет ничего плохого, но если оутпутов станет сотни или тысячи, это вызовет серьезное падение производительности внутри движка. Вы можете очистить карту
gmod_admin_cleanup
или вручную удалять оутпуты с помощью Entity:ClearAllOutputs, однако централизованное удаление не может быть реализовано. -
Не создавайте несколько контроллеров одновременно. В любом случае код написан так что будет работать только один из них, однако вызывать будет первый, а функции будут перезаписаны последним, я не могу предсказать как это себя может повести.
-
Контроллер создается при старте карты в хуке
InitPostEntity
под названиемMapLogicSpawn
, и при очистке карты в хукеPostCleanupMap
под названиемMapLogicSpawn
, вам не нужно его спавнить. Если вы хотите пересоздать контроллер, то сначала удалите старый, либо используйте консольную командуmap_logic_reload
.
-
Разблокируйте все двери лифтов в Hammer, чтобы не писать дополнительный код.
-
Звуки кнопок лифта удобней воспроизводить в Lua, так можно определить работает ли ваш скрипт.
-
Замкните путь лифта из path_track в кольцо для быстрой перезагрузки скриптов. Иначе ваш лифт может застрять.
Важно понимать, что я не отвечаю за скрипты, который люди делают для своих карт. Эта энтить не является альтернативой lua_run
, она не запускает код и не создается из Hammer. Эта энтить призвана дать легкий контроль над логикой карты со стороны Lua скриптов, но все что напишет автор скрипта лежит на его совести.
Не пытайтесь вшить скрипт внутрь карты или как-то спрятать его, или еще хуже обфусцировать/шифровать его. Вы можете распространять свой скрипт в аддоне с картой или отдельным аддоном. В один аддон можно класть сразу множество пресетов логики, в том числе и для разных карт.
На Lua вы можете делать все что угодно, начиная от простой шалости, заканчивая серьезными вопросами безопасности. Не пытайтесь создавать секретные кнопки, которые дают игроку некоторые вещи или админ-доступ. Это схоже с тем, что если бы вы использовали lua_run
для веселья, не делайте так! Обратите внимание, что плохим тоном будет проверять доступ по SteamID в секретные комнаты. Пожалуйста, не кикайте и не баньте игроков на своих картах, это очень плохая вещь.
В общем случае, с этим аддоном вы можете с легкостью создавать логические вещи, которые получаются слишком громоздкие в Hammer. Лифт из func_tracktrain на 5 этажей? Легко! Как обычно создайте лифт, его путь из path_track, 5 кнопок в лифте и по каждой на этаже. Дайте им всем имя, больше в Hammer ничего не нужно. Теперь просто получите эти энтити в коде, и напишите всю логику на Lua - добавьте нужные оутпуты и вызывайте инпуты через Entity:Fire
чтобы открывать двери и запускать/останавливать лифт. Вам даже не нужно настраивать звуки в Hammer, ведь их можно воспроизводить прямо из Lua!
Для РП карт вы можете, к примеру, заприватить кнопки для определенных профессий. Можно настроить логику для разных игровых режимов, ивентов, погод или времен года, и переключать их с помощью map_logic_override
. Можно изменять или исправлять логику на существующих картах, вы можете удалять оутпуты с помощью Entity:ClearAllOutputs. Если переименовать нужные энтити, это полностью заглушит инпуты, однако это не сработает на оутпутах с ключевыми словами Keywords !activator
, !self
, !player
. Альтернативно, вы можете заглушить их все через GM:AcceptInput
.
Для gamemode специфичных карт вы можете делать такие вещи, как починка механизмов, интерактивный запуск генератора в зомби-режимах, электронные кодовые замки. Можно, к примеру, дать возможность сломать лифт, и затем его починить, либо отключить определенные этажи. Все это невозможно в Hammer, но в своих скриптах вы можете контролировать это как угодно, любой баг всегда можно исправить.
Для кооп-карт или карт на прохождение вы можете настроить логику спавна NPC, контролировать волны врагов и спавн боссов. Запускать сложные сцены по триггерам и кнопкам, давать игрокам боеприпасы и оружие без уродливых манипуляций с Hammer энтитями! Вы с легкостью можете использовать все преимущества Lua, создавать таймеры, логические if else, switch-case, математические операции, вычисление интегралов, получение времени компьютера... Возможности применения этого аддона ограничены лишь вашей фантазией.