Skip to content

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

liuch edited this page Sep 16, 2011 · 13 revisions

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

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

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

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

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

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

Правила задаются в настройках плагина, вкладка "Вещи" в окне настроек. Пример правила: <Тип> <Не> <Равно> "вещь" <Правило "нет">. Этим правилом анализируется свойство «тип» вещи, проверяется равенство со значением «вещь». В данном случае элемент рюкзака не будет отображаться в фильтре, если его тип не «вещь». Т.е. будут отображаться кристаллы, ветки и т.д. Еще правило: Отображать, если вещь одета. Операнд и значение здесь опущены за не надобностью. Цепочки работают следующим образом: Каждые элемент рюкзака проверяется по цепочке правил, от первого правило до последнего (как у iptables). Если правило при сравнении дало положительный результат, то к вещи применяется действие (отображать/не отображать) и дальнейших проверок по правилам в цепочке не производится. Если условие в проверке не совпало, то проверяется следующее правило в цепочке. Если правил нет, то элемент рюкзака не попадает в список фильтра. Есть еще одно действие «next». Оно означает, что в случае положительной проверки, анализируется следующее правило, а в случае отрицательной, следующее правило, не содержащее действия «next». Это правило удобно для проверки нескольких значений и свойств с объединением «и». Теперь рассмотрим фильтр: Это обычный xml документ. Из первой строчки понятно, что это фильтр с именем «Именные», индекс фильтра означает позицию таба в списке вещей (пока не используется). Вторая строчка объявляет элемент с цепочкой правил. В нашей цепочке сейчас одно правило. В третьей строчке само правило. Само правило звучит так: если свойство «уровень именной вещи» больше нуля, то отображать данную вещь в списке вещей. Все остальные вещи, которые не прошли по этому правилу, будут проверяться в следующем правиле. А так как правил больше нет, то остальные вещи не попадут в список этого фильтра. Следующий фильтр: Фильтр отображает список кристаллов и веток. Первое правило нам известно. Оно гласит: все что не является вещью не должно отображаться в этом списке в любом случае. И действительно, кристаллы и ветки являются «вещь». Если первое правило совпало (это не вещь). К нему применяется действие (выкинуть из списка) и далее никаких правил не применяется. Если правило не совпало (это все таки вещь) проверяется следующее правило. Второе правило из цепочки гласит, что вещь попадает в список, если в ее имени содержится фраза «кристалл». Если не содержится, то проверяется третье правило, которое проверяет в имени наличие фразы «ветка». Если и это правило не подошло, то вещь откидывается и в список уже не попадает. В принципе, можно было бы обойтись без первого правила и сразу проверять содержимое имени элемента рюкзака. Но большая часть содержимого рюкзака обычно не вещи. Поэтому много «мусора» уберется еще на первом фильтре. А свойство «type» проверяется значительно быстрей свойства «name». Список поддерживаемых операций сравнения: contains — содержит. Применяется к тексту (регистр значения не имеет). Применительно к свойствам: Имя. equal — равно. К тексту и числу. Если сравнивается текст, то регистр значения не имеет. Применительно к свойствам: Имя, тип, уровень именной вещи. above — больше. Применительно к свойствам: Уровень именной вещи, цена. low — меньше. Применительно к свойствам: Уровень именной вещи, цена. Список свойств и действий над ним будет расширяться. Например планируется добавить количество вещей, их цену, урон защиту и т.д. Но пока не вижу реальной необходимости. Фильтры и правила загружаются при необходимости, сразу же оптимизируются — все что можно «оцифровать», оцифровывается для ускорения работы фильтров. Например типы хранятся не в виде текста, а преобразовывается в числовой тип. Тоже самое и по другим свойствам.