-
Notifications
You must be signed in to change notification settings - Fork 0
Фильтры вещей
Плагин способен анализировать список вещей, которые отправляет вам игровой сервер и формировать из него графическое представление этого списка с возможностью сортировки и отображения только тех вещей, которые удовлетворяют заданным правилам. Если в верхней части плагина нажать кнопку "вещи" можно увидеть этот список с вкладками. Если фильтры у вас не настроены, то у вас будет только одна вкладка - "Все вещи". Для настройки фильтров необходимо перейти в настройки и там задать как сами фильтры так и правила для них.
Посмотреть список фильтров можно так же выполнив команду /things filters list
в плагине. Фильтры могут влиять не только на список вещей в графическом представлении но и на списки выдаваемые командой /things list x
, где x
- номер фильтра из предыдущей команды. Если команду выполнить без параметра x
или с параметром равным нулю, то будет выдан весь список вещей.
Прежде чем говорить об алгоритме фильтров, опишу свойства вещей, которые подлежат анализу фильтром:
- Имя вещи. В плагине хранится как текст.
- Тип вещи. Примеры: кинжал, меч, щит, вещь и т.д. В плагине хранится как число, поэтому проверка происходит быстро (быстрей чем операции с именем).
- Уровень именной вещи. Если это значение равно нулю, то считается что вещь не именная. В плагине хранится как число.
- Вещь одета или не одета. В плагине хранится как булево значение, да или нет.
- Цена вещи. Хранится как число. Если -1, значит нет цены.
- Количество экземпляров данной вещи.
У вещей ещё множество других свойств, которые фильтром пока не обрабатываются. Обработка этих свойств фильтром реализуется по мере необходимости.
Все фильтры состоят из цепочки (последовательности) правил. В фильтре может быть от одного до нескольких правил, которые обрабатываются последовательно. Число их не ограничено.
Теперь опишем структуру правила. Правило содержит в себе свойство вещи, вид сравнения, значение с которым сравнивать, флаг отрицания (необязательный), действие фильтра в случае успеха при сравнении.
Правила задаются в настройках плагина, вкладка "Вещи" в окне настроек. Пример правила:
<Тип> <Не> <Равно> "вещь" <Не отображать>
Этим правилом анализируется свойство «тип» вещи, проверяется равенство со значением «вещь». В данном случае элемент рюкзака не будет отображаться в фильтре, если его тип не «вещь». Т.е. будут отображаться кристаллы, ветки и т.д. Еще правило:
<Одета> <Отображать>
Отображать, если вещь одета. Операнд и значение здесь опущены за не надобностью.
Несколько правил находящиеся в одном фильтре образуют цепочки. Цепочки работают следующим образом: Каждые элемент рюкзака проверяется по цепочке правил, от первого правило до последнего (как у iptables). Если правило при сравнении дало положительный результат, то к вещи применяется действие (отображать/не отображать) и дальнейших проверок по правилам в цепочке не производится. Если условие в проверке не совпало, то проверяется следующее правило в цепочке. Если правил больше нет и ни одно правило так и не подошло, то элемент рюкзака не попадает в список для отображения. Есть ещё одно действие «Следующее правило». Оно означает, что в случае положительной проверки, анализируется следующее правило, а в случае отрицательной, следующее правило, не содержащее действия «next». Это действие удобно для проверки нескольких значений и свойств с объединением «и».
Рассмотрим фильтр "Именные" с одним правилом:
<Уровень именной> <Больше> "0" <Отображать>
В нашей цепочке сейчас одно правило. Правило звучит так: если свойство «уровень именной вещи» больше нуля, то отображать данную вещь в списке вещей. Все остальные вещи, которые не прошли по этому правилу, будут проверяться в следующем правиле. А так как правил больше нет, то остальные вещи не попадут в список для отображения.
Следующий фильтр (Кристаллы и ветки):
<Тип> <Не> <Равно> "вещь" <Не отображать>
<Имя> <Содержит> "кристалл" <Отображать>
<Имя> <Содержит> "ветка" <Отображать>
Фильтр отображает список кристаллов и веток. Первое правило нам известно. Оно гласит: все что не является вещью не должно отображаться в этом списке в любом случае. И действительно, кристаллы и ветки являются «вещь». Если первое правило совпало (это не вещь). К нему применяется действие (выкинуть из списка) и далее никаких правил не применяется. Если правило не совпало (это все таки вещь) проверяется следующее правило. Второе правило из цепочки гласит, что вещь попадает в список, если в её имени содержится слово «кристалл». Если не содержится, то проверяется третье правило, которое проверяет в имени наличие слова «ветка». Если и это правило не подошло, то вещь откидывается и в список уже не попадает. В принципе, можно было бы обойтись без первого правила и сразу проверять содержимое имени элемента рюкзака. Но большая часть содержимого рюкзака обычно не вещи. Поэтому много «мусора» уберется ещё на первом фильтре. А свойство «Тип» проверяется значительно быстрей свойства «Имя».
Список поддерживаемых операций сравнения:
-
Содержит
. Применяется к тексту (регистр значения не имеет). Применительно к свойствам: Имя. -
Равно
. К тексту и числу. Если сравнивается текст, то регистр значения не имеет. Применительно к свойствам: Имя, тип, уровень именной вещи, цена, количество. -
Больше
. Применительно к свойствам: Уровень именной вещи, цена, количество. -
Меньше
. Применительно к свойствам: Уровень именной вещи, цена, количество.
Список свойств и действий над ним будет расширяться. Но пока нет реальной необходимости. Фильтры и правила загружаются при необходимости, сразу же оптимизируются — все что можно «оцифровать», оцифровывается для ускорения работы фильтров. Например типы хранятся не в виде текста, а преобразовывается в числовой тип. Тоже самое и по другим свойствам.