['o' => 'maxlevel DESC'],
'e' => ['j' => ['?_events e ON `e`.`id` = `set`.`eventId`', true], 's' => ', e.`holidayId`'],
'src' => ['j' => ['?_source src ON `src`.`typeId` = `set`.`id` AND `src`.`type` = 4', true], 's' => ', `src1`, `src2`, `src3`, `src4`, `src5`, `src6`, `src7`, `src8`, `src9`, `src10`, `src11`, `src12`, `src13`, `src14`, `src15`, `src16`, `src17`, `src18`, `src19`, `src20`, `src21`, `src22`, `src23`, `src24`']
);
public function __construct(array $conditions = [], array $miscData = [])
{
parent::__construct($conditions, $miscData);
// post processing
foreach ($this->iterate() as &$_curTpl)
{
$_curTpl['classes'] = ChrClass::fromMask($_curTpl['classMask']);
$this->classes = array_merge($this->classes, $_curTpl['classes']);
$_curTpl['pieces'] = [];
for ($i = 1; $i < 10; $i++)
{
if ($piece = $_curTpl['item'.$i])
{
$_curTpl['pieces'][] = $piece;
$this->pieceToSet[$piece] = $this->id;
}
}
}
$this->classes = array_unique($this->classes);
}
public function getListviewData() : array
{
$data = [];
foreach ($this->iterate() as $__)
{
$data[$this->id] = array(
'id' => $this->id,
'idbak' => $this->curTpl['refSetId'],
'name' => (7 - $this->curTpl['quality']).$this->getField('name', true),
'minlevel' => $this->curTpl['minLevel'],
'maxlevel' => $this->curTpl['maxLevel'],
'note' => $this->curTpl['contentGroup'],
'type' => $this->curTpl['type'],
'reqclass' => $this->curTpl['classMask'],
'classes' => $this->curTpl['classes'],
'pieces' => $this->curTpl['pieces'],
'heroic' => $this->curTpl['heroic']
);
}
return $data;
}
public function getJSGlobals(int $addMask = GLOBALINFO_ANY) : array
{
$data = [];
if ($this->classes && ($addMask & GLOBALINFO_RELATED))
$data[Type::CHR_CLASS] = array_combine($this->classes, $this->classes);
if ($this->pieceToSet && ($addMask & GLOBALINFO_SELF))
$data[Type::ITEM] = array_combine(array_keys($this->pieceToSet), array_keys($this->pieceToSet));
if ($addMask & GLOBALINFO_SELF)
foreach ($this->iterate() as $id => $__)
$data[Type::ITEMSET][$id] = ['name' => $this->getField('name', true)];
return $data;
}
public function renderTooltip() : ?string
{
if (!$this->curTpl)
return null;
$x = '
';
$x .= ''.$this->getField('name', true).' ';
$nCl = 0;
if ($_ = $this->getField('classMask'))
{
$jsg = [];
$cl = Lang::getClassString($_, $jsg);
$nCl = count($jsg);
$x .= Util::ucFirst($nCl > 1 ? Lang::game('classes') : Lang::game('class')).Lang::main('colon').$cl.' ';
}
if ($_ = $this->getField('contentGroup'))
$x .= Lang::itemset('notes', $_).($this->getField('heroic') ? ' ('.Lang::item('heroic').')' : '').' ';
if (!$nCl || !$this->getField('type'))
$x.= Lang::itemset('types', $this->getField('type')).' ';
if ($bonuses = $this->getBonuses())
{
$x .= '';
foreach ($bonuses as $b)
$x .= ' '.$b['bonus'].' '.Lang::itemset('_pieces').Lang::main('colon').''.$b['desc'];
$x .= '';
}
$x .= ' |
';
return $x;
}
public function getBonuses() : array
{
$spells = [];
for ($i = 1; $i < 9; $i++)
{
$spl = $this->getField('spell'.$i);
$qty = $this->getField('bonus'.$i);
// cant use spell as index, would change order
if ($spl && $qty)
$spells[] = ['id' => $spl, 'bonus' => $qty];
}
// sort by required pieces ASC
usort($spells, fn(array $a, array $b) => $a['bonus'] <=> $b['bonus']);
$setSpells = new SpellList(array(['s.id', array_column($spells, 'id')]));
foreach ($setSpells->iterate() as $spellId => $__)
{
foreach ($spells as &$s)
{
if ($spellId != $s['id'])
continue;
$s['desc'] = $setSpells->parseText('description', $this->getField('reqLevel') ?: MAX_LEVEL)[0];
}
}
return $spells;
}
}
// missing filter: "Available to Players"
class ItemsetListFilter extends Filter
{
protected string $type = 'itemsets';
protected static array $enums = array(
6 => parent::ENUM_EVENT
);
protected static array $genericFilter = array(
2 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT, true], // id
3 => [parent::CR_NUMERIC, 'npieces', NUM_CAST_INT ], // pieces
4 => [parent::CR_STRING, 'bonusText', STR_LOCALIZED ], // bonustext
5 => [parent::CR_BOOLEAN, 'heroic' ], // heroic
6 => [parent::CR_ENUM, 'e.holidayId', true, true], // relatedevent
8 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments
9 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots
10 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos
12 => [parent::CR_CALLBACK, 'cbAvaliable', ] // available to players [yn]
);
protected static array $inputFields = array(
'cr' => [parent::V_RANGE, [2, 12], true ], // criteria ids
'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 424]], true ], // criteria operators
'crv' => [parent::V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiters
'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name / description - only printable chars, no delimiter
'ma' => [parent::V_EQUAL, 1, false], // match any / all filter
'qu' => [parent::V_RANGE, [0, 7], true ], // quality
'ty' => [parent::V_RANGE, [1, 12], true ], // set type
'minle' => [parent::V_RANGE, [0, 999], false], // min item level
'maxle' => [parent::V_RANGE, [0, 999], false], // max itemlevel
'minrl' => [parent::V_RANGE, [0, MAX_LEVEL], false], // min required level
'maxrl' => [parent::V_RANGE, [0, MAX_LEVEL], false], // max required level
'cl' => [parent::V_LIST, [[1, 9], 11], false], // class
'ta' => [parent::V_RANGE, [1, 30], false] // tag / content group
);
protected function createSQLForValues() : array
{
$parts = [];
$_v = &$this->values;
// name [str]
if ($_v['na'])
if ($_ = $this->tokenizeString(['name_loc'.Lang::getLocale()->value]))
$parts[] = $_;
// quality [enum]
if ($_v['qu'])
$parts[] = ['quality', $_v['qu']];
// type [enum]
if ($_v['ty'])
$parts[] = ['type', $_v['ty']];
// itemLevel min [int]
if ($_v['minle'])
$parts[] = ['minLevel', $_v['minle'], '>='];
// itemLevel max [int]
if ($_v['maxle'])
$parts[] = ['maxLevel', $_v['maxle'], '<='];
// reqLevel min [int]
if ($_v['minrl'])
$parts[] = ['reqLevel', $_v['minrl'], '>='];
// reqLevel max [int]
if ($_v['maxrl'])
$parts[] = ['reqLevel', $_v['maxrl'], '<='];
// class [enum]
if ($_v['cl'])
$parts[] = ['classMask', $this->list2Mask([$_v['cl']]), '&'];
// tag [enum]
if ($_v['ta'])
$parts[] = ['contentGroup', intVal($_v['ta'])];
return $parts;
}
protected function cbAvaliable(int $cr, int $crs, string $crv) : ?array
{
return match ($crs)
{
1 => ['src.typeId', null, '!'], // Yes
2 => ['src.typeId', null], // No
default => null
};
}
}
?>