Skip to content

Фильтры вещей

liuch edited this page Sep 28, 2011 · 13 revisions

Фильтры вещей

Описание

Плагин способен анализировать список вещей, которые отправляет вам игровой сервер и формировать из него графическое представление этого списка с возможностью сортировки и отображения только тех вещей, которые удовлетворяют заданным правилам. Если в верхней части плагина нажать кнопку "вещи" можно увидеть этот список с вкладками. Если фильтры у вас не настроены, то у вас будет только одна вкладка - "Все вещи". Для настройки фильтров необходимо перейти в настройки и там задать как сами фильтры так и правила для них. Посмотреть список фильтров можно так же выполнив команду /things filters list в плагине.

Алгоритм работы

Прежде чем говорить об алгоритме фильтров, опишу свойства вещей, которые подлежат анализу фильтром:

  • Имя вещи. В плагине хранится как текст.
  • Тип вещи. Примеры: кинжал, меч, щит, вещь и т.д. В плагине хранится как число, поэтому проверка происходит быстро (быстрей чем операции с именем).
  • Уровень именной вещи. Если это значение равно нулю, то считается что вещь не именная. В плагине хранится как число.
  • Вещь одета или не одета. В плагине хранится как булево значение, да или нет.
  • Цена вещи. Хранится как число. Если -1, значит нет цены.
  • Количество экземпляров данной вещи.

У вещей ещё множество других свойств, которые фильтром пока не обрабатываются. Обработка этих свойств фильтром реализуется по мере необходимости.

Все фильтры состоят из цепочки (последовательности) правил. В фильтре может быть от одного до нескольких правил, которые обрабатываются последовательно. Число их не ограничено.

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

Правила задаются в настройках плагина, вкладка "Вещи" в окне настроек. Пример правила:

<Тип> <Не> <Равно> "вещь" <Не отображать>

Этим правилом анализируется свойство «тип» вещи, проверяется равенство со значением «вещь». В данном случае элемент рюкзака не будет отображаться в фильтре, если его тип не «вещь». Т.е. будут отображаться кристаллы, ветки и т.д. Еще правило:

<Одета> <Отображать>

Отображать, если вещь одета. Операнд и значение здесь опущены за не надобностью.

Несколько правил находящиеся в одном фильтре образуют цепочки. Цепочки работают следующим образом: Каждые элемент рюкзака проверяется по цепочке правил, от первого правило до последнего (как у iptables). Если правило при сравнении дало положительный результат, то к вещи применяется действие (отображать/не отображать) и дальнейших проверок по правилам в цепочке не производится. Если условие в проверке не совпало, то проверяется следующее правило в цепочке. Если правил больше нет и ни одно правило так и не подошло, то элемент рюкзака не попадает в список для отображения. Есть ещё одно действие «Следующее правило». Оно означает, что в случае положительной проверки, анализируется следующее правило, а в случае отрицательной, следующее правило, не содержащее действия «next». Это действие удобно для проверки нескольких значений и свойств с объединением «и».

Рассмотрим фильтр "Именные" с одним правилом:

<Уровень именной> <Больше> "0" <Отображать>

В нашей цепочке сейчас одно правило. Правило звучит так: если свойство «уровень именной вещи» больше нуля, то отображать данную вещь в списке вещей. Все остальные вещи, которые не прошли по этому правилу, будут проверяться в следующем правиле. А так как правил больше нет, то остальные вещи не попадут в список для отображения.

Следующий фильтр (Кристаллы и ветки):

<Тип> <Не> <Равно> "вещь" <Не отображать>
<Имя> <Содержит> "кристалл" <Отображать>
<Имя> <Содержит> "ветка" <Отображать>

Фильтр отображает список кристаллов и веток. Первое правило нам известно. Оно гласит: все что не является вещью не должно отображаться в этом списке в любом случае. И действительно, кристаллы и ветки являются «вещь». Если первое правило совпало (это не вещь). К нему применяется действие (выкинуть из списка) и далее никаких правил не применяется. Если правило не совпало (это все таки вещь) проверяется следующее правило. Второе правило из цепочки гласит, что вещь попадает в список, если в её имени содержится слово «кристалл». Если не содержится, то проверяется третье правило, которое проверяет в имени наличие слова «ветка». Если и это правило не подошло, то вещь откидывается и в список уже не попадает. В принципе, можно было бы обойтись без первого правила и сразу проверять содержимое имени элемента рюкзака. Но большая часть содержимого рюкзака обычно не вещи. Поэтому много «мусора» уберется ещё на первом фильтре. А свойство «Тип» проверяется значительно быстрей свойства «Имя».

Список поддерживаемых операций сравнения:

  • Содержит. Применяется к тексту (регистр значения не имеет). Применительно к свойствам: Имя.
  • Равно. К тексту и числу. Если сравнивается текст, то регистр значения не имеет. Применительно к свойствам: Имя, тип, уровень именной вещи, цена, количество.
  • Больше. Применительно к свойствам: Уровень именной вещи, цена, количество.
  • Меньше. Применительно к свойствам: Уровень именной вещи, цена, количество.

Список свойств и действий над ним будет расширяться. Но пока нет реальной необходимости. Фильтры и правила загружаются при необходимости, сразу же оптимизируются — все что можно «оцифровать», оцифровывается для ускорения работы фильтров. Например типы хранятся не в виде текста, а преобразовывается в числовой тип. Тоже самое и по другим свойствам.