BQL
Перевод BQL
BQL - язык запросов выборки игровых сущностей для использования в команде forall
.
Команда forall
доступна для администраторов с +QUERY и используется для выборки всех игровых сущностей, которые удовлетворяют заданным пользователем условиям. Команда выглядит так:
forall QUERY do COMMAND
Не совсем ясно, что означает "B" в BQL. Кто-то предлагал расшифровывать первую букву как "bad', "badmin" или "better"
Запросы
Запросы выбирают/отфильтровывают все игровые сущности игры по определённым заданным критериям.
Возможно задание нескольких условий для выборки. Например, взрыв всех живых существ, названных "Urist McHands":
forall alive named "Urist McHands" do invokeverb self $ID Explode
alive
- фильтр, выбирающий все живые игровые сущности;named "Urist McHands"
- фильтр, выбирающий все игровые сущности, названные "Urist McHands".
В любой игре очень много сущностей, поэтому помните:
- BQL по умолчанию применяется ГЛОБАЛЬНО. Каждый запрос начинается с выборки абсолютно всех сущностей. Если вам нужны сущности только определённой сетки, то используйте фильтры
ongrid
илиonmap
. - Не все запросы выполняются одинаково быстро. Лучше всего начинать перечисление условий выборки с фильтра
with <comp
или любого другого фильтра, который наиболее точно находит искомое (наподобиеtagged
,mindful
илиalive
), так как этим фильтрам не нужно проверять каждую сущность в игре на соответствие условиям. Будьте точны: используйте фильтры так, чтобы они выбирали как можно меньшее количество сущностей. Вы же не хотите, чтобы из-за вашей попытки сделать из каждого мыла разумное существо, сервер тормознулся на несколько секунд?
Запросы движка
Данные фильтры предоставляются RobustToolbox'ом (движок, на котором сделана ss14) и доступны во всех играх, которые сделаны на нём:
not
можно поставить перед любым запросом, если толькоnot
не инвертировано себя само;with X
выбирает все сущности с компонентом X;named X
выбирает все сущности с данным именем X с помощью регулярных выражений (^
и$
вставлены автоматически?);- ?
parentedto
выбирает все сущности, которые являются родительскими по отношению к данной сущности; - ?
rparentedto
выбирает все сущности, которые являются по отношению к данной сущности, даже если косвенно; children
выбирает все сущности, которые являются дочерними к данной;rchildren
выбирает все сущности, которые являются дочерними к данной рекурсивно;parent
выбирает все сущности, которые являются родительскими к данной;prototyped
выбирает все сущности, базирующиеся на данном прототипе;rprototyped
выбирает все сущности, базирующиеся на данном прототипе, даже если косвенно;select
выбирает N случайных сущностей или N% сущностей в зависимост от данного аргумента. Не инвертируйте этот фильтр, иначе это выберет все 100%. Считайте, что это как выборка абсолютно всех сущностей, но в кол-ве N.near
выбирает все сущности около пользователей (сущности, которые используют BQL) в данном радиусе.anchored
выбирает все сущности, которые закреплены;ongrid
выбирает все сущности на данной сетке;onmap
выбирает все сущности на данной карте;above
выбирает все сущности над данном типом тайла.
Запросы SS14
Это дополнительные фильтры, доступные в Space Station 14:
tagged
выбирает все сущности с данным тегом;mindful
выбирает все сущности, за которыми в данный момент закреплён разум;alive
выбирает все живые сущности с разумом;hasreagent
выбирает все сущности с данным реагентом внутри или где-то еще;apcpowered
выбирает все сущности, которые в данный момент запитаны от ЛКП.
Команды
Это именно то, как происходят потрясающие вещи с выбранными сущностями. Это обычные команды из консоли, которые будут запускаться 'на каждую сущность' со следующими подстановками:
$ID
- ID сущности, с которой происходят манипуляции;$NAME
- название сущности, с которой производятся манипуляции;$WX
,$WY
- глобальные координаты X и Y сущности, с которой производятся манипуляции;$LX
,$LY
- локальные (относительно родителя?) координаты X и Y сущности, с которой происходят манипуляции;- ...
Примеры
- Зарядить все батареи:
forall with Battery do setbatterypercent $ID 100
- Вернуть/реанимировать всех к жизни:
forall with Mind do rejuvenate $ID
- Выдать всему, кто зовётся "Walter White" lung cancer:
forall named "Walter White" do invokeverb self "Lung Cancer"
- Взорвать всех и каждого (не надо это делать):
forall with Body do invokeverb $ID "Explode"
- Удалить все ghost-роли:
forall with GhostTakeoverAvailable do rmcomp $ID GhostTakeoverAvailable; rmcomp $ID Mind
- День полного доступа:
forall with AccessReader do rmcomp $ID AccessReader
- Выставить всем игрокам форму мима:
forall with Mind prototyped MobHuman do setoutfit $ID MimeGear; rmcomp $ID Speech
- Объявить минуту молчания:
forall with Humanoid do addreagent $ID chemicals MuteToxin 30