diff --git a/includes/basetype.class.php b/includes/basetype.class.php index 5f65f5bf..394b1653 100644 --- a/includes/basetype.class.php +++ b/includes/basetype.class.php @@ -609,7 +609,7 @@ trait spawnHelper return; if (User::isInGroup(U_GROUP_MODERATOR)) - if ($guids = array_column(array_filter($spawns, function ($x) { return $x['guid'] > 0 || $x['type'] != Type::NPC; }), 'guid')) + if ($guids = array_column(array_filter($spawns, fn($x) => $x['guid'] > 0 || $x['type'] != Type::NPC), 'guid')) $worldPos = Game::getWorldPosForGUID(self::$type, ...$guids); foreach ($spawns as $s) @@ -910,37 +910,23 @@ abstract class Filter { private static $wCards = ['*' => '%', '?' => '_']; - public $error = false; // erronous search fields + public const CR_BOOLEAN = 1; + public const CR_FLAG = 2; + public const CR_NUMERIC = 3; + public const CR_STRING = 4; + public const CR_ENUM = 5; + public const CR_STAFFFLAG = 6; + public const CR_CALLBACK = 7; + public const CR_NYI_PH = 999; - private $cndSet = []; + public const V_EQUAL = 8; + public const V_RANGE = 9; + public const V_LIST = 10; + public const V_CALLBACK = 11; + public const V_REGEX = 12; - /* genericFilter: [FILTER_TYPE, colOrFnName, param1, param2] - [FILTER_CR_BOOLEAN, , , null] - [FILTER_CR_FLAG, , , ] # default param2: matchExact - [FILTER_CR_NUMERIC, , , ] - [FILTER_CR_STRING, , , null] - [FILTER_CR_ENUM, , , ] # param3 ? cr[2] is val in enum : key in enum - [FILTER_CR_STAFFFLAG, , null, null] - [FILTER_CR_CALLBACK, , , ] - [FILTER_CR_NYI_PH, null, , param2] # mostly 1: to ignore this criterium; 0: to fail the whole query - */ - protected $genericFilter = []; - - protected $enums = []; // criteriumID => [validOptionList] - - /* - fieldId => [checkType, checkValue[, fieldIsArray]] - */ - protected $inputFields = []; // list of input fields defined per page - protected $parentCats = []; // used to validate ty-filter - protected $fiData = ['c' => [], 'v' =>[]]; - protected $formData = array( // data to fill form fields - 'form' => [], // base form - unsanitized - 'setCriteria' => [], // dynamic criteria list - index checked - 'setWeights' => [], // dynamic weights list - index checked - 'extraCols' => [], // extra columns for LV - added as required - 'reputationCols' => [] // simlar and exclusive to extraCols - added as required - ); + protected const ENUM_ANY = -2323; + protected const ENUM_NONE = -2324; protected const PATTERN_NAME = '/[\p{C};%\\\\]/ui'; protected const PATTERN_CRV = '/[\p{C};:%\\\\]/ui'; @@ -972,8 +958,40 @@ abstract class Filter protected const ENUM_RACE = array( null, 1, 2, 3, 4, 5, 6, 7, 8, null, 10, 11, true, false); protected const ENUM_PROFESSION = array( null, 171, 164, 185, 333, 202, 129, 755, 165, 186, 197, true, false, 356, 182, 773); + public $error = false; // erronous search fields + + private $cndSet = []; + + /* genericFilter: [FILTER_TYPE, colOrFnName, param1, param2] + [self::CR_BOOLEAN, , , null] + [self::CR_FLAG, , , ] # default param2: matchExact + [self::CR_NUMERIC, , , ] + [self::CR_STRING, , , null] + [self::CR_ENUM, , , ] # param3 ? crv is val in enum : key in enum + [self::CR_STAFFFLAG, , null, null] + [self::CR_CALLBACK, , , ] + [self::CR_NYI_PH, null, , param2] # mostly 1: to ignore this criterium; 0: to fail the whole query + */ + protected $genericFilter = []; + + protected $enums = []; // criteriumID => [validOptionList] + + /* + fieldId => [checkType, checkValue[, fieldIsArray]] + */ + protected $inputFields = []; // list of input fields defined per page + protected $parentCats = []; // used to validate ty-filter + protected $fiData = ['c' => [], 'v' =>[]]; + protected $formData = array( // data to fill form fields + 'form' => [], // base form - unsanitized + 'setCriteria' => [], // dynamic criteria list - index checked + 'setWeights' => [], // dynamic weights list - index checked + 'extraCols' => [], // extra columns for LV - added as required + 'reputationCols' => [] // simlar and exclusive to extraCols - added as required + ); + // parse the provided request into a usable format - public function __construct($fromPOST = false, $opts = []) + public function __construct(bool $fromPOST = false, array $opts = []) { if (!empty($opts['parentCats'])) $this->parentCats = $opts['parentCats']; @@ -999,13 +1017,13 @@ abstract class Filter return ['formData']; } - public function mergeCat(&$cats) + public function mergeCat(&$cats) : void { foreach ($this->parentCats as $idx => $cat) $cats[$idx] = $cat; } - private function &criteriaIterator() + private function &criteriaIterator() : Generator { if (!$this->fiData['c']) return; @@ -1025,7 +1043,7 @@ abstract class Filter public function getFilterString(array $override = [], array $addCr = []) : string { - $_ = []; + $filterURL = []; foreach (array_merge($this->fiData['c'], $this->fiData['v'], $override) as $k => $v) { if (isset($addCr[$k])) @@ -1035,42 +1053,47 @@ abstract class Filter } if (is_array($v) && !empty($v)) - $_[$k] = $k.'='.implode(':', $v); + $filterURL[$k] = $k.'='.implode(':', $v); else if ($v !== '') - $_[$k] = $k.'='.$v; + $filterURL[$k] = $k.'='.$v; } // no criteria were set, so no merge occured .. append if ($addCr) { - $_['cr'] = 'cr='.$addCr['cr']; - $_['crs'] = 'crs='.$addCr['crs']; - $_['crv'] = 'crv='.$addCr['crv']; + $filterURL['cr'] = 'cr='.$addCr['cr']; + $filterURL['crs'] = 'crs='.$addCr['crs']; + $filterURL['crv'] = 'crv='.$addCr['crv']; } - return implode(';', $_); + return implode(';', $filterURL); } + // [ExtraCol, ...] public function getExtraCols() : array { return array_unique($this->formData['extraCols']); } + // ['cr' => Criterium, 'crs' => CriteriumSign, 'crv' => CriteriumValue] public function getSetCriteria() : array { return $this->formData['setCriteria']; } + // [WeightID, WeightValue] public function getSetWeights() : array { return $this->formData['setWeights']; } + // [ExtraCol, ...] public function getReputationCols() : array { return $this->formData['reputationCols']; } + // [inputField => FieldValue, ...] public function getForm() : array { return $this->formData['form']; @@ -1085,7 +1108,7 @@ abstract class Filter // criteria foreach ($this->criteriaIterator() as &$_cr) - if ($cnd = $this->createSQLForCriterium($_cr)) + if ($cnd = $this->createSQLForCriterium(...$_cr)) $this->cndSet[] = $cnd; if ($this->cndSet) @@ -1148,7 +1171,6 @@ abstract class Filter $post[$_[0]] = $_[1]; } - $cr = $crs = $crv = []; foreach ($this->inputFields as $inp => [$type, $valid, $asArray]) { if (!isset($post[$inp]) || $post[$inp] === '') @@ -1228,19 +1250,19 @@ abstract class Filter $gf = $this->genericFilter[$_cr[$i]]; switch ($gf[0]) { - case FILTER_CR_NUMERIC: + case self::CR_NUMERIC: $_ = $_crs[$i]; if (!Util::checkNumeric($_crv[$i], $gf[2]) || !$this->int2Op($_)) $unsetme = true; break; - case FILTER_CR_BOOLEAN: - case FILTER_CR_FLAG: - case FILTER_CR_STAFFFLAG: + case self::CR_BOOLEAN: + case self::CR_FLAG: + case self::CR_STAFFFLAG: $_ = $_crs[$i]; if (!$this->int2Bool($_)) $unsetme = true; break; - case FILTER_CR_ENUM: + case self::CR_ENUM: if (!Util::checkNumeric($_crs[$i], NUM_CAST_INT)) $unsetme = true; break; @@ -1300,11 +1322,11 @@ abstract class Filter $this->formData['setWeights'] = [$_wt, $_wtv]; } - protected function checkInput($type, $valid, &$val, $recursive = false) + protected function checkInput(int $type, mixed $valid, mixed &$val, bool $recursive = false) : bool { switch ($type) { - case FILTER_V_EQUAL: + case self::V_EQUAL: if (gettype($valid) == 'integer') $val = intval($val); else if (gettype($valid) == 'double') @@ -1316,7 +1338,7 @@ abstract class Filter return true; break; - case FILTER_V_LIST: + case self::V_LIST: if (!Util::checkNumeric($val, NUM_CAST_INT)) return false; @@ -1325,7 +1347,7 @@ abstract class Filter if (gettype($v) != 'array') continue; - if ($this->checkInput(FILTER_V_RANGE, $v, $val, true)) + if ($this->checkInput(self::V_RANGE, $v, $val, true)) return true; unset($valid[$k]); @@ -1335,17 +1357,17 @@ abstract class Filter return true; break; - case FILTER_V_RANGE: + case self::V_RANGE: if (Util::checkNumeric($val, NUM_CAST_INT) && $val >= $valid[0] && $val <= $valid[1]) return true; break; - case FILTER_V_CALLBACK: + case self::V_CALLBACK: if ($this->$valid($val)) return true; break; - case FILTER_V_REGEX: + case self::V_REGEX: if (!preg_match($valid, $val)) return true; @@ -1364,7 +1386,7 @@ abstract class Filter $string = str_replace('_', '\\_', $string); // now replace search wildcards with sql wildcards - $string = strtr($string, Filter::$wCards); + $string = strtr($string, self::$wCards); return sprintf($exact ? '%s' : '%%%s%%', $string); } @@ -1409,7 +1431,7 @@ abstract class Filter return $qry; } - protected function int2Op(&$op) + protected function int2Op(mixed &$op) : bool { switch ($op) { @@ -1423,7 +1445,7 @@ abstract class Filter } } - protected function int2Bool(&$op) + protected function int2Bool(mixed &$op) : bool { switch ($op) { @@ -1433,7 +1455,7 @@ abstract class Filter } } - protected function list2Mask(array $list, $noOffset = false) + protected function list2Mask(array $list, bool $noOffset = false) : int { $mask = 0x0; $o = $noOffset ? 0 : 1; // schoolMask requires this..? @@ -1450,7 +1472,7 @@ abstract class Filter /* generic criteria */ /**************************/ - private function genericBoolean($field, $op, $isString) + private function genericBoolean($field, $op, bool $isString) : ?array { if ($this->int2Bool($op)) { @@ -1463,7 +1485,7 @@ abstract class Filter return null; } - private function genericBooleanFlags($field, $value, $op, $matchAny = false) + private function genericBooleanFlags($field, $value, $op, ?bool $matchAny = false) : ?array { if (!$this->int2Bool($op)) return null; @@ -1476,7 +1498,7 @@ abstract class Filter return [[$field, $value, '&'], $value]; } - private function genericString($field, $value, $strFlags) + private function genericString($field, $value, $strFlags) : ?array { if ($strFlags & STR_LOCALIZED) $field .= '_loc'.Lang::getLocale()->value; @@ -1484,7 +1506,7 @@ abstract class Filter return $this->modularizeString([$field], (string)$value, $strFlags & STR_MATCH_EXACT, $strFlags & STR_ALLOW_SHORT); } - private function genericNumeric($field, &$value, $op, $typeCast) + private function genericNumeric($field, $value, $op, $typeCast) : ?array { if (!Util::checkNumeric($value, $typeCast)) return null; @@ -1495,13 +1517,13 @@ abstract class Filter return null; } - private function genericEnum($field, $value) + private function genericEnum($field, $value) : ?array { if (is_bool($value)) return [$field, 0, ($value ? '>' : '<=')]; - else if ($value == FILTER_ENUM_ANY) // any + else if ($value == self::ENUM_ANY) // any return [$field, 0, '!']; - else if ($value == FILTER_ENUM_NONE) // none + else if ($value == self::ENUM_NONE) // none return [$field, 0]; else if ($value !== null) return [$field, $value]; @@ -1509,58 +1531,58 @@ abstract class Filter return null; } - protected function genericCriterion(&$cr) + protected function genericCriterion(int $cr, int $crs, string $crv) : ?array { - $gen = array_pad($this->genericFilter[$cr[0]], 4, null); + [$crType, $colOrFn, $param1, $param2] = array_pad($this->genericFilter[$cr], 4, null); $result = null; - switch ($gen[0]) + switch ($crType) { - case FILTER_CR_NUMERIC: - $result = $this->genericNumeric($gen[1], $cr[2], $cr[1], $gen[2]); + case self::CR_NUMERIC: + $result = $this->genericNumeric($colOrFn, $crv, $crs, $param1); break; - case FILTER_CR_FLAG: - $result = $this->genericBooleanFlags($gen[1], $gen[2], $cr[1], $gen[3]); + case self::CR_FLAG: + $result = $this->genericBooleanFlags($colOrFn, $param1, $crs, $param2); break; - case FILTER_CR_STAFFFLAG: - if (User::isInGroup(U_GROUP_EMPLOYEE) && $cr[1] >= 0) - $result = $this->genericBooleanFlags($gen[1], (1 << $cr[1]), true); + case self::CR_STAFFFLAG: + if (User::isInGroup(U_GROUP_EMPLOYEE) && $crs >= 0) + $result = $this->genericBooleanFlags($colOrFn, (1 << $crs), true); break; - case FILTER_CR_BOOLEAN: - $result = $this->genericBoolean($gen[1], $cr[1], !empty($gen[2])); + case self::CR_BOOLEAN: + $result = $this->genericBoolean($colOrFn, $crs, !empty($param1)); break; - case FILTER_CR_STRING: - $result = $this->genericString($gen[1], $cr[2], $gen[2]); + case self::CR_STRING: + $result = $this->genericString($colOrFn, $crv, $param1); break; - case FILTER_CR_ENUM: - if (!$gen[3] && isset($this->enums[$cr[0]][$cr[1]])) - $result = $this->genericEnum($gen[1], $this->enums[$cr[0]][$cr[1]]); - if ($gen[3] && in_array($cr[1], $this->enums[$cr[0]])) - $result = $this->genericEnum($gen[1], $cr[1]); - else if ($gen[2] && ($cr[1] == FILTER_ENUM_ANY || $cr[1] == FILTER_ENUM_NONE)) - $result = $this->genericEnum($gen[1], $cr[1]); + case self::CR_ENUM: + if (!$param2 && isset($this->enums[$cr][$crs])) + $result = $this->genericEnum($colOrFn, $this->enums[$cr][$crs]); + if ($param2 && in_array($crs, $this->enums[$cr])) + $result = $this->genericEnum($colOrFn, $crs); + else if ($param1 && ($crs == self::ENUM_ANY || $crs == self::ENUM_NONE)) + $result = $this->genericEnum($colOrFn, $crs); break; - case FILTER_CR_CALLBACK: - $result = $this->{$gen[1]}($cr, $gen[2], $gen[3]); + case self::CR_CALLBACK: + $result = $this->{$colOrFn}([$cr, $crs, $crv], $param1, $param2); break; - case FILTER_CR_NYI_PH: // do not limit with not implemented filters - if (is_int($gen[2])) - return [$gen[2]]; + case self::CR_NYI_PH: // do not limit with not implemented filters + if (is_int($param1)) + return [$param1]; // for nonsensical values; compare against 0 - if ($this->int2Op($cr[1]) && Util::checkNumeric($cr[2])) + if ($this->int2Op($crs) && Util::checkNumeric($crv)) { - if ($cr[1] == '=') - $cr[1] = '=='; + if ($crs == '=') + $crs = '=='; - return eval('return ('.$cr[2].' '.$cr[1].' 0);') ? [1] : [0]; + return eval('return ('.$crv.' '.$crs.' 0);') ? [1] : [0]; } else return [0]; } - if ($result && $gen[0] == FILTER_CR_NUMERIC && !empty($gen[3])) - $this->formData['extraCols'][] = $cr[0]; + if ($result && $crType == self::CR_NUMERIC && !empty($param2)) + $this->formData['extraCols'][] = $cr; return $result; } @@ -1571,19 +1593,19 @@ abstract class Filter /* non-generic values and criteria */ /***********************************/ - protected function createSQLForCriterium(array &$cr) : array + protected function createSQLForCriterium(int &$cr, int &$crs, string &$crv) : array { if (!$this->genericFilter) // criteria not in use - no error return []; - if (in_array($cr[0], array_keys($this->genericFilter))) - if ($genCr = $this->genericCriterion($cr)) + if (in_array($cr, array_keys($this->genericFilter))) + if ($genCr = $this->genericCriterion($cr, $crs, $crv)) return $genCr; $this->error = true; - trigger_error('Filter::createSQLForCriterium - received unhandled criterium: ["'.$cr[0].'", "'.$cr[1].'", "'.$cr[2].'"]', E_USER_WARNING); + trigger_error('Filter::createSQLForCriterium - received unhandled criterium: ["'.$cr.'", "'.$crs.'", "'.$crv.'"]', E_USER_WARNING); - unset($cr); + unset($cr, $crs, $crv); return []; } diff --git a/includes/defines.php b/includes/defines.php index 00f21947..6a9b5e21 100644 --- a/includes/defines.php +++ b/includes/defines.php @@ -155,24 +155,6 @@ define('BUTTON_GUIDE_NEW', 11); define('BUTTON_GUIDE_EDIT', 12); define('BUTTON_GUIDE_LOG', 13); -// generic filter handler -define('FILTER_CR_BOOLEAN', 1); -define('FILTER_CR_FLAG', 2); -define('FILTER_CR_NUMERIC', 3); -define('FILTER_CR_STRING', 4); -define('FILTER_CR_ENUM', 5); -define('FILTER_CR_STAFFFLAG', 6); -define('FILTER_CR_CALLBACK', 7); -define('FILTER_CR_NYI_PH', 999); -define('FILTER_V_EQUAL', 8); -define('FILTER_V_RANGE', 9); -define('FILTER_V_LIST', 10); -define('FILTER_V_CALLBACK', 11); -define('FILTER_V_REGEX', 12); - -define('FILTER_ENUM_ANY', -2323); -define('FILTER_ENUM_NONE', -2324); - // conditional information in template define('GLOBALINFO_SELF', 0x1); // id, name, icon define('GLOBALINFO_RELATED', 0x2); // spells used by pet, classes/races required by spell, ect diff --git a/includes/types/achievement.class.php b/includes/types/achievement.class.php index 329d9b33..2652de40 100644 --- a/includes/types/achievement.class.php +++ b/includes/types/achievement.class.php @@ -296,8 +296,8 @@ class AchievementListFilter extends Filter 141 => 156, // Feast of Winter Veil 409 => -3456, // Day of the Dead 398 => -3457, // Pirates' Day - FILTER_ENUM_ANY => true, - FILTER_ENUM_NONE => false, + parent::ENUM_ANY => true, + parent::ENUM_NONE => false, 283 => -1, // valid events without achievements 285 => -1, 353 => -1, 420 => -1, 400 => -1, 284 => -1, 374 => -1, @@ -306,31 +306,31 @@ class AchievementListFilter extends Filter ); protected $genericFilter = array( - 2 => [FILTER_CR_BOOLEAN, 'reward_loc0', true ], // givesreward - 3 => [FILTER_CR_STRING, 'reward', STR_LOCALIZED ], // rewardtext - 4 => [FILTER_CR_NYI_PH, null, 1, ], // location [enum] - 5 => [FILTER_CR_CALLBACK, 'cbSeries', ACHIEVEMENT_CU_FIRST_SERIES, null], // first in series [yn] - 6 => [FILTER_CR_CALLBACK, 'cbSeries', ACHIEVEMENT_CU_LAST_SERIES, null], // last in series [yn] - 7 => [FILTER_CR_BOOLEAN, 'chainId', ], // partseries - 9 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT, true], // id - 10 => [FILTER_CR_STRING, 'ic.name', ], // icon - 11 => [FILTER_CR_CALLBACK, 'cbRelEvent', null, null], // related event [enum] - 14 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 15 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 16 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 18 => [FILTER_CR_STAFFFLAG, 'flags', ] // flags + 2 => [parent::CR_BOOLEAN, 'reward_loc0', true ], // givesreward + 3 => [parent::CR_STRING, 'reward', STR_LOCALIZED ], // rewardtext + 4 => [parent::CR_NYI_PH, null, 1, ], // location [enum] + 5 => [parent::CR_CALLBACK, 'cbSeries', ACHIEVEMENT_CU_FIRST_SERIES, null], // first in series [yn] + 6 => [parent::CR_CALLBACK, 'cbSeries', ACHIEVEMENT_CU_LAST_SERIES, null], // last in series [yn] + 7 => [parent::CR_BOOLEAN, 'chainId', ], // partseries + 9 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT, true], // id + 10 => [parent::CR_STRING, 'ic.name', ], // icon + 11 => [parent::CR_CALLBACK, 'cbRelEvent', null, null], // related event [enum] + 14 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments + 15 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots + 16 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos + 18 => [parent::CR_STAFFFLAG, 'flags', ] // flags ); protected $inputFields = array( - 'cr' => [FILTER_V_RANGE, [2, 18], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 99999]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiters - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name / description - only printable chars, no delimiter - 'ex' => [FILTER_V_EQUAL, 'on', false], // extended name search - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'si' => [FILTER_V_LIST, [1, 2, 3, -1, -2], false], // side - 'minpt' => [FILTER_V_RANGE, [1, 99], false], // required level min - 'maxpt' => [FILTER_V_RANGE, [1, 99], false] // required level max + 'cr' => [parent::V_RANGE, [2, 18], true ], // criteria ids + 'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 99999]], 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 + 'ex' => [parent::V_EQUAL, 'on', false], // extended name search + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'si' => [parent::V_LIST, [SIDE_ALLIANCE, SIDE_HORDE, SIDE_BOTH, -SIDE_ALLIANCE, -SIDE_HORDE], false], // side + 'minpt' => [parent::V_RANGE, [1, 99], false], // required level min + 'maxpt' => [parent::V_RANGE, [1, 99], false] // required level max ); protected function createSQLForValues() @@ -364,13 +364,13 @@ class AchievementListFilter extends Filter { switch ($_v['si']) { - case -1: // faction, exclusive both - case -2: + case -SIDE_ALLIANCE: // equals faction + case -SIDE_HORDE: $parts[] = ['faction', -$_v['si']]; break; - case 1: // faction, inclusive both - case 2: - case 3: // both + case SIDE_ALLIANCE: // includes faction + case SIDE_HORDE: + case SIDE_BOTH: $parts[] = ['faction', $_v['si'], '&']; break; } @@ -389,7 +389,7 @@ class AchievementListFilter extends Filter return ($_ > 0) ? ['category', $_] : ['id', abs($_)]; else { - $ids = array_filter($this->enums[$cr[0]], function($x) { return is_int($x) && $x > 0; }); + $ids = array_filter($this->enums[$cr[0]], fn($x) => is_int($x) && $x > 0); return ['category', $ids, $_ ? null : '!']; } diff --git a/includes/types/areatrigger.class.php b/includes/types/areatrigger.class.php index 8b23beef..28c6388a 100644 --- a/includes/types/areatrigger.class.php +++ b/includes/types/areatrigger.class.php @@ -58,17 +58,17 @@ class AreaTriggerList extends BaseType class AreaTriggerListFilter extends Filter { protected $genericFilter = array( - 2 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT] // id + 2 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT] // id ); // fieldId => [checkType, checkValue[, fieldIsArray]] protected $inputFields = array( - 'cr' => [FILTER_V_LIST, [2], true ], // criteria ids - 'crs' => [FILTER_V_RANGE, [1, 6], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_INT, true ], // criteria values - all criteria are numeric here - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'ty' => [FILTER_V_RANGE, [0, 5], true ] // types + 'cr' => [parent::V_LIST, [2], true ], // criteria ids + 'crs' => [parent::V_RANGE, [1, 6], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_INT, true ], // criteria values - all criteria are numeric here + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'ty' => [parent::V_RANGE, [0, 5], true ] // types ); protected function createSQLForValues() diff --git a/includes/types/arenateam.class.php b/includes/types/arenateam.class.php index dac45849..926c4ba8 100644 --- a/includes/types/arenateam.class.php +++ b/includes/types/arenateam.class.php @@ -48,13 +48,13 @@ class ArenaTeamListFilter extends Filter protected $genericFilter = []; protected $inputFields = array( - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'ex' => [FILTER_V_EQUAL, 'on', false], // only match exact - 'si' => [FILTER_V_LIST, [1, 2], false], // side - 'sz' => [FILTER_V_LIST, [2, 3, 5], false], // tema size - 'rg' => [FILTER_V_CALLBACK, 'cbRegionCheck', false], // region - 'sv' => [FILTER_V_CALLBACK, 'cbServerCheck', false], // server + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'ex' => [parent::V_EQUAL, 'on', false], // only match exact + 'si' => [parent::V_LIST, [1, 2], false], // side + 'sz' => [parent::V_LIST, [2, 3, 5], false], // tema size + 'rg' => [parent::V_CALLBACK, 'cbRegionCheck', false], // region + 'sv' => [parent::V_CALLBACK, 'cbServerCheck', false], // server ); protected function createSQLForValues() @@ -72,9 +72,9 @@ class ArenaTeamListFilter extends Filter // side [list] if (!empty($_v['si'])) { - if ($_v['si'] == 1) + if ($_v['si'] == SIDE_ALLIANCE) $parts[] = ['c.race', [1, 3, 4, 7, 11]]; - else if ($_v['si'] == 2) + else if ($_v['si'] == SIDE_HORDE) $parts[] = ['c.race', [2, 5, 6, 8, 10]]; } diff --git a/includes/types/creature.class.php b/includes/types/creature.class.php index 63ff9126..36753129 100644 --- a/includes/types/creature.class.php +++ b/includes/types/creature.class.php @@ -290,57 +290,57 @@ class CreatureListFilter extends Filter ); protected $genericFilter = array( - 1 => [FILTER_CR_CALLBACK, 'cbHealthMana', 'healthMax', 'healthMin'], // health [num] - 2 => [FILTER_CR_CALLBACK, 'cbHealthMana', 'manaMin', 'manaMax' ], // mana [num] - 3 => [FILTER_CR_CALLBACK, 'cbFaction', null, null ], // faction [enum] - 5 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_REPAIRER ], // canrepair - 6 => [FILTER_CR_ENUM, 's.areaId', false, true ], // foundin - 7 => [FILTER_CR_CALLBACK, 'cbQuestRelation', 'startsQuests', 0x1 ], // startsquest [enum] - 8 => [FILTER_CR_CALLBACK, 'cbQuestRelation', 'endsQuests', 0x2 ], // endsquest [enum] - 9 => [FILTER_CR_BOOLEAN, 'lootId', ], // lootable - 10 => [FILTER_CR_CALLBACK, 'cbRegularSkinLoot', NPC_TYPEFLAG_SPECIALLOOT ], // skinnable [yn] - 11 => [FILTER_CR_BOOLEAN, 'pickpocketLootId', ], // pickpocketable - 12 => [FILTER_CR_CALLBACK, 'cbMoneyDrop', null, null ], // averagemoneydropped [op] [int] - 15 => [FILTER_CR_CALLBACK, 'cbSpecialSkinLoot', NPC_TYPEFLAG_HERBLOOT, null ], // gatherable [yn] - 16 => [FILTER_CR_CALLBACK, 'cbSpecialSkinLoot', NPC_TYPEFLAG_MININGLOOT, null ], // minable [yn] - 18 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_AUCTIONEER ], // auctioneer - 19 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_BANKER ], // banker - 20 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_BATTLEMASTER ], // battlemaster - 21 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_FLIGHT_MASTER ], // flightmaster - 22 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_GUILD_MASTER ], // guildmaster - 23 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_INNKEEPER ], // innkeeper - 24 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_CLASS_TRAINER ], // talentunlearner - 25 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_GUILD_MASTER ], // tabardvendor - 27 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_STABLE_MASTER ], // stablemaster - 28 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_TRAINER ], // trainer - 29 => [FILTER_CR_FLAG, 'npcflag', NPC_FLAG_VENDOR ], // vendor - 31 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 32 => [FILTER_CR_FLAG, 'cuFlags', NPC_CU_INSTANCE_BOSS ], // instanceboss - 33 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 34 => [FILTER_CR_STRING, 'modelId', STR_MATCH_EXACT | STR_ALLOW_SHORT ], // usemodel [str] (wants int in string fmt <_<) - 35 => [FILTER_CR_STRING, 'textureString' ], // useskin [str] - 37 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT, true ], // id - 38 => [FILTER_CR_CALLBACK, 'cbRelEvent', null, null ], // relatedevent [enum] - 40 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 41 => [FILTER_CR_NYI_PH, 1, null ], // haslocation [yn] [staff] - 42 => [FILTER_CR_CALLBACK, 'cbReputation', '>', null ], // increasesrepwith [enum] - 43 => [FILTER_CR_CALLBACK, 'cbReputation', '<', null ], // decreasesrepwith [enum] - 44 => [FILTER_CR_CALLBACK, 'cbSpecialSkinLoot', NPC_TYPEFLAG_ENGINEERLOOT, null ] // salvageable [yn] + 1 => [parent::CR_CALLBACK, 'cbHealthMana', 'healthMax', 'healthMin'], // health [num] + 2 => [parent::CR_CALLBACK, 'cbHealthMana', 'manaMin', 'manaMax' ], // mana [num] + 3 => [parent::CR_CALLBACK, 'cbFaction', null, null ], // faction [enum] + 5 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_REPAIRER ], // canrepair + 6 => [parent::CR_ENUM, 's.areaId', false, true ], // foundin + 7 => [parent::CR_CALLBACK, 'cbQuestRelation', 'startsQuests', 0x1 ], // startsquest [enum] + 8 => [parent::CR_CALLBACK, 'cbQuestRelation', 'endsQuests', 0x2 ], // endsquest [enum] + 9 => [parent::CR_BOOLEAN, 'lootId', ], // lootable + 10 => [parent::CR_CALLBACK, 'cbRegularSkinLoot', NPC_TYPEFLAG_SPECIALLOOT ], // skinnable [yn] + 11 => [parent::CR_BOOLEAN, 'pickpocketLootId', ], // pickpocketable + 12 => [parent::CR_CALLBACK, 'cbMoneyDrop', null, null ], // averagemoneydropped [op] [int] + 15 => [parent::CR_CALLBACK, 'cbSpecialSkinLoot', NPC_TYPEFLAG_HERBLOOT, null ], // gatherable [yn] + 16 => [parent::CR_CALLBACK, 'cbSpecialSkinLoot', NPC_TYPEFLAG_MININGLOOT, null ], // minable [yn] + 18 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_AUCTIONEER ], // auctioneer + 19 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_BANKER ], // banker + 20 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_BATTLEMASTER ], // battlemaster + 21 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_FLIGHT_MASTER ], // flightmaster + 22 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_GUILD_MASTER ], // guildmaster + 23 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_INNKEEPER ], // innkeeper + 24 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_CLASS_TRAINER ], // talentunlearner + 25 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_GUILD_MASTER ], // tabardvendor + 27 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_STABLE_MASTER ], // stablemaster + 28 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_TRAINER ], // trainer + 29 => [parent::CR_FLAG, 'npcflag', NPC_FLAG_VENDOR ], // vendor + 31 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots + 32 => [parent::CR_FLAG, 'cuFlags', NPC_CU_INSTANCE_BOSS ], // instanceboss + 33 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments + 34 => [parent::CR_STRING, 'modelId', STR_MATCH_EXACT | STR_ALLOW_SHORT ], // usemodel [str] (wants int in string fmt <_<) + 35 => [parent::CR_STRING, 'textureString' ], // useskin [str] + 37 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT, true ], // id + 38 => [parent::CR_CALLBACK, 'cbRelEvent', null, null ], // relatedevent [enum] + 40 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos + 41 => [parent::CR_NYI_PH, 1, null ], // haslocation [yn] [staff] + 42 => [parent::CR_CALLBACK, 'cbReputation', '>', null ], // increasesrepwith [enum] + 43 => [parent::CR_CALLBACK, 'cbReputation', '<', null ], // decreasesrepwith [enum] + 44 => [parent::CR_CALLBACK, 'cbSpecialSkinLoot', NPC_TYPEFLAG_ENGINEERLOOT, null ] // salvageable [yn] ); protected $inputFields = array( - 'cr' => [FILTER_V_LIST, [[1, 3],[5, 12], 15, 16, [18, 25], [27, 29], [31, 35], 37, 38, [40, 44]], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 9999]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiter - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name / subname - only printable chars, no delimiter - 'ex' => [FILTER_V_EQUAL, 'on', false], // also match subname - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'fa' => [FILTER_V_CALLBACK, 'cbPetFamily', true ], // pet family [list] - cat[0] == 1 - 'minle' => [FILTER_V_RANGE, [1, 99], false], // min level [int] - 'maxle' => [FILTER_V_RANGE, [1, 99], false], // max level [int] - 'cl' => [FILTER_V_RANGE, [0, 4], true ], // classification [list] - 'ra' => [FILTER_V_LIST, [-1, 0, 1], false], // react alliance [int] - 'rh' => [FILTER_V_LIST, [-1, 0, 1], false] // react horde [int] + 'cr' => [parent::V_LIST, [[1, 3],[5, 12], 15, 16, [18, 25], [27, 29], [31, 35], 37, 38, [40, 44]], true ], // criteria ids + 'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 9999]], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiter + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name / subname - only printable chars, no delimiter + 'ex' => [parent::V_EQUAL, 'on', false], // also match subname + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'fa' => [parent::V_CALLBACK, 'cbPetFamily', true ], // pet family [list] - cat[0] == 1 + 'minle' => [parent::V_RANGE, [1, 99], false], // min level [int] + 'maxle' => [parent::V_RANGE, [1, 99], false], // max level [int] + 'cl' => [parent::V_RANGE, [0, 4], true ], // classification [list] + 'ra' => [parent::V_LIST, [-1, 0, 1], false], // react alliance [int] + 'rh' => [parent::V_LIST, [-1, 0, 1], false] // react horde [int] ); protected function createSQLForValues() @@ -396,7 +396,7 @@ class CreatureListFilter extends Filter if (!Util::checkNumeric($val, NUM_CAST_INT)) return false; - $type = FILTER_V_LIST; + $type = parent::V_LIST; $valid = [[1, 9], 11, 12, 20, 21, [24, 27], [30, 35], [37, 39], [41, 46]]; return $this->checkInput($type, $valid, $val); @@ -404,22 +404,26 @@ class CreatureListFilter extends Filter protected function cbRelEvent($cr) { - if ($cr[1] == FILTER_ENUM_ANY) + if ($cr[1] == parent::ENUM_ANY) { - $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); - $cGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_creature WHERE eventEntry IN (?a)', $eventIds); - return ['s.guid', $cGuids]; + if ($eventIds = DB::Aowow()->selectCol('SELECT `id` FROM ?_events WHERE `holidayId` <> 0')) + if ($cGuids = DB::World()->selectCol('SELECT DISTINCT `guid` FROM game_event_creature WHERE `eventEntry` IN (?a)', $eventIds)) + return ['s.guid', $cGuids]; + + return [0]; } - else if ($cr[1] == FILTER_ENUM_NONE) + else if ($cr[1] == parent::ENUM_NONE) { - $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); - $cGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_creature WHERE eventEntry IN (?a)', $eventIds); - return ['s.guid', $cGuids, '!']; + if ($eventIds = DB::Aowow()->selectCol('SELECT `id` FROM ?_events WHERE `holidayId` <> 0')) + if ($cGuids = DB::World()->selectCol('SELECT DISTINCT `guid` FROM game_event_creature WHERE `eventEntry` IN (?a)', $eventIds)) + return ['s.guid', $cGuids, '!']; + + return [0]; } else if (in_array($cr[1], $this->enums[$cr[0]])) { - if ($eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId = ?d', $cr[1])) - if ($cGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_creature WHERE eventEntry IN (?a)', $eventIds)) + if ($eventIds = DB::Aowow()->selectCol('SELECT `id` FROM ?_events WHERE `holidayId` = ?d', $cr[1])) + if ($cGuids = DB::World()->selectCol('SELECT DISTINCT `guid` FROM `game_event_creature` WHERE `eventEntry` IN (?a)', $eventIds)) return ['s.guid', $cGuids]; return [0]; @@ -507,7 +511,7 @@ class CreatureListFilter extends Filter if (!in_array($cr[1], $this->enums[$cr[0]])) return false; - if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_factions WHERE id = ?d', $cr[1])) + if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_factions WHERE `id` = ?d', $cr[1])) $this->formData['reputationCols'][] = [$cr[1], Util::localizedString($_, 'name')]; if ($cIds = DB::World()->selectCol('SELECT creature_id FROM creature_onkill_reputation WHERE (RewOnKillRepFaction1 = ?d AND RewOnKillRepValue1 '.$op.' 0) OR (RewOnKillRepFaction2 = ?d AND RewOnKillRepValue2 '.$op.' 0)', $cr[1], $cr[1])) diff --git a/includes/types/enchantment.class.php b/includes/types/enchantment.class.php index aaad7e95..178994ba 100644 --- a/includes/types/enchantment.class.php +++ b/includes/types/enchantment.class.php @@ -166,74 +166,74 @@ class EnchantmentListFilter extends Filter ); protected $genericFilter = array( - 2 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT, true], // id - 3 => [FILTER_CR_ENUM, 'skillLine' ], // requiresprof - 4 => [FILTER_CR_NUMERIC, 'skillLevel', NUM_CAST_INT ], // reqskillrank - 5 => [FILTER_CR_BOOLEAN, 'conditionId' ], // hascondition - 10 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 11 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 12 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 20 => [FILTER_CR_NUMERIC, 'is.str', NUM_CAST_INT, true], // str - 21 => [FILTER_CR_NUMERIC, 'is.agi', NUM_CAST_INT, true], // agi - 22 => [FILTER_CR_NUMERIC, 'is.sta', NUM_CAST_INT, true], // sta - 23 => [FILTER_CR_NUMERIC, 'is.int', NUM_CAST_INT, true], // int - 24 => [FILTER_CR_NUMERIC, 'is.spi', NUM_CAST_INT, true], // spi - 25 => [FILTER_CR_NUMERIC, 'is.arcres', NUM_CAST_INT, true], // arcres - 26 => [FILTER_CR_NUMERIC, 'is.firres', NUM_CAST_INT, true], // firres - 27 => [FILTER_CR_NUMERIC, 'is.natres', NUM_CAST_INT, true], // natres - 28 => [FILTER_CR_NUMERIC, 'is.frores', NUM_CAST_INT, true], // frores - 29 => [FILTER_CR_NUMERIC, 'is.shares', NUM_CAST_INT, true], // shares - 30 => [FILTER_CR_NUMERIC, 'is.holres', NUM_CAST_INT, true], // holres - 32 => [FILTER_CR_NUMERIC, 'is.dps', NUM_CAST_FLOAT, true], // dps - 34 => [FILTER_CR_NUMERIC, 'is.dmg', NUM_CAST_FLOAT, true], // dmg - 37 => [FILTER_CR_NUMERIC, 'is.mleatkpwr', NUM_CAST_INT, true], // mleatkpwr - 38 => [FILTER_CR_NUMERIC, 'is.rgdatkpwr', NUM_CAST_INT, true], // rgdatkpwr - 39 => [FILTER_CR_NUMERIC, 'is.rgdhitrtng', NUM_CAST_INT, true], // rgdhitrtng - 40 => [FILTER_CR_NUMERIC, 'is.rgdcritstrkrtng', NUM_CAST_INT, true], // rgdcritstrkrtng - 41 => [FILTER_CR_NUMERIC, 'is.armor', NUM_CAST_INT, true], // armor - 42 => [FILTER_CR_NUMERIC, 'is.defrtng', NUM_CAST_INT, true], // defrtng - 43 => [FILTER_CR_NUMERIC, 'is.block', NUM_CAST_INT, true], // block - 44 => [FILTER_CR_NUMERIC, 'is.blockrtng', NUM_CAST_INT, true], // blockrtng - 45 => [FILTER_CR_NUMERIC, 'is.dodgertng', NUM_CAST_INT, true], // dodgertng - 46 => [FILTER_CR_NUMERIC, 'is.parryrtng', NUM_CAST_INT, true], // parryrtng - 48 => [FILTER_CR_NUMERIC, 'is.splhitrtng', NUM_CAST_INT, true], // splhitrtng - 49 => [FILTER_CR_NUMERIC, 'is.splcritstrkrtng', NUM_CAST_INT, true], // splcritstrkrtng - 50 => [FILTER_CR_NUMERIC, 'is.splheal', NUM_CAST_INT, true], // splheal - 51 => [FILTER_CR_NUMERIC, 'is.spldmg', NUM_CAST_INT, true], // spldmg - 52 => [FILTER_CR_NUMERIC, 'is.arcsplpwr', NUM_CAST_INT, true], // arcsplpwr - 53 => [FILTER_CR_NUMERIC, 'is.firsplpwr', NUM_CAST_INT, true], // firsplpwr - 54 => [FILTER_CR_NUMERIC, 'is.frosplpwr', NUM_CAST_INT, true], // frosplpwr - 55 => [FILTER_CR_NUMERIC, 'is.holsplpwr', NUM_CAST_INT, true], // holsplpwr - 56 => [FILTER_CR_NUMERIC, 'is.natsplpwr', NUM_CAST_INT, true], // natsplpwr - 57 => [FILTER_CR_NUMERIC, 'is.shasplpwr', NUM_CAST_INT, true], // shasplpwr - 60 => [FILTER_CR_NUMERIC, 'is.healthrgn', NUM_CAST_INT, true], // healthrgn - 61 => [FILTER_CR_NUMERIC, 'is.manargn', NUM_CAST_INT, true], // manargn - 77 => [FILTER_CR_NUMERIC, 'is.atkpwr', NUM_CAST_INT, true], // atkpwr - 78 => [FILTER_CR_NUMERIC, 'is.mlehastertng', NUM_CAST_INT, true], // mlehastertng - 79 => [FILTER_CR_NUMERIC, 'is.resirtng', NUM_CAST_INT, true], // resirtng - 84 => [FILTER_CR_NUMERIC, 'is.mlecritstrkrtng', NUM_CAST_INT, true], // mlecritstrkrtng - 94 => [FILTER_CR_NUMERIC, 'is.splpen', NUM_CAST_INT, true], // splpen - 95 => [FILTER_CR_NUMERIC, 'is.mlehitrtng', NUM_CAST_INT, true], // mlehitrtng - 96 => [FILTER_CR_NUMERIC, 'is.critstrkrtng', NUM_CAST_INT, true], // critstrkrtng - 97 => [FILTER_CR_NUMERIC, 'is.feratkpwr', NUM_CAST_INT, true], // feratkpwr - 101 => [FILTER_CR_NUMERIC, 'is.rgdhastertng', NUM_CAST_INT, true], // rgdhastertng - 102 => [FILTER_CR_NUMERIC, 'is.splhastertng', NUM_CAST_INT, true], // splhastertng - 103 => [FILTER_CR_NUMERIC, 'is.hastertng', NUM_CAST_INT, true], // hastertng - 114 => [FILTER_CR_NUMERIC, 'is.armorpenrtng', NUM_CAST_INT, true], // armorpenrtng - 115 => [FILTER_CR_NUMERIC, 'is.health', NUM_CAST_INT, true], // health - 116 => [FILTER_CR_NUMERIC, 'is.mana', NUM_CAST_INT, true], // mana - 117 => [FILTER_CR_NUMERIC, 'is.exprtng', NUM_CAST_INT, true], // exprtng - 119 => [FILTER_CR_NUMERIC, 'is.hitrtng', NUM_CAST_INT, true], // hitrtng - 123 => [FILTER_CR_NUMERIC, 'is.splpwr', NUM_CAST_INT, true] // splpwr + 2 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT, true], // id + 3 => [parent::CR_ENUM, 'skillLine' ], // requiresprof + 4 => [parent::CR_NUMERIC, 'skillLevel', NUM_CAST_INT ], // reqskillrank + 5 => [parent::CR_BOOLEAN, 'conditionId' ], // hascondition + 10 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments + 11 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots + 12 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos + 20 => [parent::CR_NUMERIC, 'is.str', NUM_CAST_INT, true], // str + 21 => [parent::CR_NUMERIC, 'is.agi', NUM_CAST_INT, true], // agi + 22 => [parent::CR_NUMERIC, 'is.sta', NUM_CAST_INT, true], // sta + 23 => [parent::CR_NUMERIC, 'is.int', NUM_CAST_INT, true], // int + 24 => [parent::CR_NUMERIC, 'is.spi', NUM_CAST_INT, true], // spi + 25 => [parent::CR_NUMERIC, 'is.arcres', NUM_CAST_INT, true], // arcres + 26 => [parent::CR_NUMERIC, 'is.firres', NUM_CAST_INT, true], // firres + 27 => [parent::CR_NUMERIC, 'is.natres', NUM_CAST_INT, true], // natres + 28 => [parent::CR_NUMERIC, 'is.frores', NUM_CAST_INT, true], // frores + 29 => [parent::CR_NUMERIC, 'is.shares', NUM_CAST_INT, true], // shares + 30 => [parent::CR_NUMERIC, 'is.holres', NUM_CAST_INT, true], // holres + 32 => [parent::CR_NUMERIC, 'is.dps', NUM_CAST_FLOAT, true], // dps + 34 => [parent::CR_NUMERIC, 'is.dmg', NUM_CAST_FLOAT, true], // dmg + 37 => [parent::CR_NUMERIC, 'is.mleatkpwr', NUM_CAST_INT, true], // mleatkpwr + 38 => [parent::CR_NUMERIC, 'is.rgdatkpwr', NUM_CAST_INT, true], // rgdatkpwr + 39 => [parent::CR_NUMERIC, 'is.rgdhitrtng', NUM_CAST_INT, true], // rgdhitrtng + 40 => [parent::CR_NUMERIC, 'is.rgdcritstrkrtng', NUM_CAST_INT, true], // rgdcritstrkrtng + 41 => [parent::CR_NUMERIC, 'is.armor', NUM_CAST_INT, true], // armor + 42 => [parent::CR_NUMERIC, 'is.defrtng', NUM_CAST_INT, true], // defrtng + 43 => [parent::CR_NUMERIC, 'is.block', NUM_CAST_INT, true], // block + 44 => [parent::CR_NUMERIC, 'is.blockrtng', NUM_CAST_INT, true], // blockrtng + 45 => [parent::CR_NUMERIC, 'is.dodgertng', NUM_CAST_INT, true], // dodgertng + 46 => [parent::CR_NUMERIC, 'is.parryrtng', NUM_CAST_INT, true], // parryrtng + 48 => [parent::CR_NUMERIC, 'is.splhitrtng', NUM_CAST_INT, true], // splhitrtng + 49 => [parent::CR_NUMERIC, 'is.splcritstrkrtng', NUM_CAST_INT, true], // splcritstrkrtng + 50 => [parent::CR_NUMERIC, 'is.splheal', NUM_CAST_INT, true], // splheal + 51 => [parent::CR_NUMERIC, 'is.spldmg', NUM_CAST_INT, true], // spldmg + 52 => [parent::CR_NUMERIC, 'is.arcsplpwr', NUM_CAST_INT, true], // arcsplpwr + 53 => [parent::CR_NUMERIC, 'is.firsplpwr', NUM_CAST_INT, true], // firsplpwr + 54 => [parent::CR_NUMERIC, 'is.frosplpwr', NUM_CAST_INT, true], // frosplpwr + 55 => [parent::CR_NUMERIC, 'is.holsplpwr', NUM_CAST_INT, true], // holsplpwr + 56 => [parent::CR_NUMERIC, 'is.natsplpwr', NUM_CAST_INT, true], // natsplpwr + 57 => [parent::CR_NUMERIC, 'is.shasplpwr', NUM_CAST_INT, true], // shasplpwr + 60 => [parent::CR_NUMERIC, 'is.healthrgn', NUM_CAST_INT, true], // healthrgn + 61 => [parent::CR_NUMERIC, 'is.manargn', NUM_CAST_INT, true], // manargn + 77 => [parent::CR_NUMERIC, 'is.atkpwr', NUM_CAST_INT, true], // atkpwr + 78 => [parent::CR_NUMERIC, 'is.mlehastertng', NUM_CAST_INT, true], // mlehastertng + 79 => [parent::CR_NUMERIC, 'is.resirtng', NUM_CAST_INT, true], // resirtng + 84 => [parent::CR_NUMERIC, 'is.mlecritstrkrtng', NUM_CAST_INT, true], // mlecritstrkrtng + 94 => [parent::CR_NUMERIC, 'is.splpen', NUM_CAST_INT, true], // splpen + 95 => [parent::CR_NUMERIC, 'is.mlehitrtng', NUM_CAST_INT, true], // mlehitrtng + 96 => [parent::CR_NUMERIC, 'is.critstrkrtng', NUM_CAST_INT, true], // critstrkrtng + 97 => [parent::CR_NUMERIC, 'is.feratkpwr', NUM_CAST_INT, true], // feratkpwr + 101 => [parent::CR_NUMERIC, 'is.rgdhastertng', NUM_CAST_INT, true], // rgdhastertng + 102 => [parent::CR_NUMERIC, 'is.splhastertng', NUM_CAST_INT, true], // splhastertng + 103 => [parent::CR_NUMERIC, 'is.hastertng', NUM_CAST_INT, true], // hastertng + 114 => [parent::CR_NUMERIC, 'is.armorpenrtng', NUM_CAST_INT, true], // armorpenrtng + 115 => [parent::CR_NUMERIC, 'is.health', NUM_CAST_INT, true], // health + 116 => [parent::CR_NUMERIC, 'is.mana', NUM_CAST_INT, true], // mana + 117 => [parent::CR_NUMERIC, 'is.exprtng', NUM_CAST_INT, true], // exprtng + 119 => [parent::CR_NUMERIC, 'is.hitrtng', NUM_CAST_INT, true], // hitrtng + 123 => [parent::CR_NUMERIC, 'is.splpwr', NUM_CAST_INT, true] // splpwr ); protected $inputFields = array( - 'cr' => [FILTER_V_RANGE, [2, 123], true ], // criteria ids - 'crs' => [FILTER_V_RANGE, [1, 15], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_INT, true ], // criteria values - only numerals - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'ty' => [FILTER_V_RANGE, [1, 8], true ] // types + 'cr' => [parent::V_RANGE, [2, 123], true ], // criteria ids + 'crs' => [parent::V_RANGE, [1, 15], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_INT, true ], // criteria values - only numerals + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'ty' => [parent::V_RANGE, [1, 8], true ] // types ); protected function createSQLForValues() diff --git a/includes/types/gameobject.class.php b/includes/types/gameobject.class.php index 38bfc97d..f3f34c5e 100644 --- a/includes/types/gameobject.class.php +++ b/includes/types/gameobject.class.php @@ -151,26 +151,26 @@ class GameObjectListFilter extends Filter ); protected $genericFilter = array( - 1 => [FILTER_CR_ENUM, 's.areaId', false, true], // foundin - 2 => [FILTER_CR_CALLBACK, 'cbQuestRelation', 'startsQuests', 0x1 ], // startsquest [side] - 3 => [FILTER_CR_CALLBACK, 'cbQuestRelation', 'endsQuests', 0x2 ], // endsquest [side] - 4 => [FILTER_CR_CALLBACK, 'cbOpenable', null, null], // openable [yn] - 5 => [FILTER_CR_NYI_PH, null, 0 ], // averagemoneycontained [op] [int] - GOs don't contain money, match against 0 - 7 => [FILTER_CR_NUMERIC, 'reqSkill', NUM_CAST_INT ], // requiredskilllevel - 11 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 13 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 15 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT ], // id - 16 => [FILTER_CR_CALLBACK, 'cbRelEvent', null, null], // relatedevent (ignore removed by event) - 18 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 50 => [FILTER_CR_ENUM, 'spellFocusId', true, true], // spellfocus + 1 => [parent::CR_ENUM, 's.areaId', false, true], // foundin + 2 => [parent::CR_CALLBACK, 'cbQuestRelation', 'startsQuests', 0x1 ], // startsquest [side] + 3 => [parent::CR_CALLBACK, 'cbQuestRelation', 'endsQuests', 0x2 ], // endsquest [side] + 4 => [parent::CR_CALLBACK, 'cbOpenable', null, null], // openable [yn] + 5 => [parent::CR_NYI_PH, null, 0 ], // averagemoneycontained [op] [int] - GOs don't contain money, match against 0 + 7 => [parent::CR_NUMERIC, 'reqSkill', NUM_CAST_INT ], // requiredskilllevel + 11 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots + 13 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments + 15 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT ], // id + 16 => [parent::CR_CALLBACK, 'cbRelEvent', null, null], // relatedevent (ignore removed by event) + 18 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos + 50 => [parent::CR_ENUM, 'spellFocusId', true, true], // spellfocus ); protected $inputFields = array( - 'cr' => [FILTER_V_LIST, [[1, 5], 7, 11, 13, 15, 16, 18, 50], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 5000]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_INT, true ], // criteria values - only numeric input values expected - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false] // match any / all filter + 'cr' => [parent::V_LIST, [[1, 5], 7, 11, 13, 15, 16, 18, 50], true ], // criteria ids + 'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 5000]], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_INT, true ], // criteria values - only numeric input values expected + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false] // match any / all filter ); protected function createSQLForValues() @@ -216,22 +216,26 @@ class GameObjectListFilter extends Filter protected function cbRelEvent($cr) { - if ($cr[1] == FILTER_ENUM_ANY) + if ($cr[1] == parent::ENUM_ANY) { - $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); - $goGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_gameobject WHERE eventEntry IN (?a)', $eventIds); - return ['s.guid', $goGuids]; + if ($eventIds = DB::Aowow()->selectCol('SELECT `id` FROM ?_events WHERE `holidayId` <> 0')) + if ($goGuids = DB::World()->selectCol('SELECT DISTINCT `guid` FROM game_event_gameobject WHERE `eventEntry` IN (?a)', $eventIds)) + return ['s.guid', $goGuids]; + + return [0]; } - else if ($cr[1] == FILTER_ENUM_NONE) + else if ($cr[1] == parent::ENUM_NONE) { - $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); - $goGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_gameobject WHERE eventEntry IN (?a)', $eventIds); - return ['s.guid', $goGuids, '!']; + if ($eventIds = DB::Aowow()->selectCol('SELECT `id` FROM ?_events WHERE `holidayId` <> 0')) + if ($goGuids = DB::World()->selectCol('SELECT DISTINCT `guid` FROM game_event_gameobject WHERE `eventEntry` IN (?a)', $eventIds)) + return ['s.guid', $goGuids, '!']; + + return [0]; } else if (in_array($cr[1], $this->enums[$cr[0]])) { - if ($eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId = ?d', $cr[1])) - if ($goGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_gameobject WHERE eventEntry IN (?a)', $eventIds)) + if ($eventIds = DB::Aowow()->selectCol('SELECT `id` FROM ?_events WHERE `holidayId` = ?d', $cr[1])) + if ($goGuids = DB::World()->selectCol('SELECT DISTINCT `guid` FROM game_event_gameobject WHERE `eventEntry` IN (?a)', $eventIds)) return ['s.guid', $goGuids]; return [0]; diff --git a/includes/types/guild.class.php b/includes/types/guild.class.php index 872a0541..e8192b18 100644 --- a/includes/types/guild.class.php +++ b/includes/types/guild.class.php @@ -46,7 +46,7 @@ class GuildList extends BaseType if (!$guilds) return; - $stats = DB::Aowow()->select('SELECT guild AS ARRAY_KEY, id AS ARRAY_KEY2, level, gearscore, achievementpoints, IF(cuFlags & ?d, 0, 1) AS synced FROM ?_profiler_profiles WHERE guild IN (?a) ORDER BY gearscore DESC', PROFILER_CU_NEEDS_RESYNC, $guilds); + $stats = DB::Aowow()->select('SELECT `guild` AS ARRAY_KEY, `id` AS ARRAY_KEY2, `level`, `gearscore`, `achievementpoints`, IF(`cuFlags` & ?d, 0, 1) AS "synced" FROM ?_profiler_profiles WHERE `guild` IN (?a) ORDER BY `gearscore` DESC', PROFILER_CU_NEEDS_RESYNC, $guilds); foreach ($this->iterate() as &$_curTpl) { $id = $_curTpl['id']; @@ -91,12 +91,12 @@ class GuildListFilter extends Filter protected $genericFilter = []; protected $inputFields = array( - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'ex' => [FILTER_V_EQUAL, 'on', false], // only match exact - 'si' => [FILTER_V_LIST, [1, 2], false], // side - 'rg' => [FILTER_V_CALLBACK, 'cbRegionCheck', false], // region - 'sv' => [FILTER_V_CALLBACK, 'cbServerCheck', false], // server + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'ex' => [parent::V_EQUAL, 'on', false], // only match exact + 'si' => [parent::V_LIST, [SIDE_ALLIANCE, SIDE_HORDE], false], // side + 'rg' => [parent::V_CALLBACK, 'cbRegionCheck', false], // region + 'sv' => [parent::V_CALLBACK, 'cbServerCheck', false], // server ); protected function createSQLForValues() @@ -114,9 +114,9 @@ class GuildListFilter extends Filter // side [list] if (!empty($_v['si'])) { - if ($_v['si'] == 1) + if ($_v['si'] == SIDE_ALLIANCE) $parts[] = ['c.race', [1, 3, 4, 7, 11]]; - else if ($_v['si'] == 2) + else if ($_v['si'] == SIDE_HORDE) $parts[] = ['c.race', [2, 5, 6, 8, 10]]; } diff --git a/includes/types/icon.class.php b/includes/types/icon.class.php index 42589f55..290c9357 100644 --- a/includes/types/icon.class.php +++ b/includes/types/icon.class.php @@ -13,7 +13,7 @@ class IconList extends BaseType public static $dataTable = '?_icons'; public static $contribute = CONTRIBUTE_CO; - private $pseudoQry = 'SELECT iconId AS ARRAY_KEY, COUNT(*) FROM ?# WHERE iconId IN (?a) GROUP BY iconId'; + private $pseudoQry = 'SELECT `iconId` AS ARRAY_KEY, COUNT(*) FROM ?# WHERE `iconId` IN (?a) GROUP BY `iconId`'; private $pseudoJoin = array( 'nItems' => '?_items', 'nSpells' => '?_spell', @@ -53,7 +53,7 @@ class IconList extends BaseType // use if you JUST need the name public static function getName($id) { - $n = DB::Aowow()->SelectRow('SELECT name FROM ?_icons WHERE id = ?d', $id ); + $n = DB::Aowow()->SelectRow('SELECT `name` FROM ?_icons WHERE `id` = ?d', $id ); return Util::localizedString($n, 'name'); } // end static use @@ -120,21 +120,21 @@ class IconListFilter extends Filter private $totalUses = []; protected $genericFilter = array( - 1 => [FILTER_CR_CALLBACK, 'cbUseAny' ], // items [num] - 2 => [FILTER_CR_CALLBACK, 'cbUseAny' ], // spells [num] - 3 => [FILTER_CR_CALLBACK, 'cbUseAny' ], // achievements [num] - 6 => [FILTER_CR_CALLBACK, 'cbUseAny' ], // currencies [num] - 9 => [FILTER_CR_CALLBACK, 'cbUseAny' ], // hunterpets [num] - 11 => [FILTER_CR_NYI_PH, null, 0], // classes [num] - 13 => [FILTER_CR_CALLBACK, 'cbUseAll' ] // used [num] + 1 => [parent::CR_CALLBACK, 'cbUseAny' ], // items [num] + 2 => [parent::CR_CALLBACK, 'cbUseAny' ], // spells [num] + 3 => [parent::CR_CALLBACK, 'cbUseAny' ], // achievements [num] + 6 => [parent::CR_CALLBACK, 'cbUseAny' ], // currencies [num] + 9 => [parent::CR_CALLBACK, 'cbUseAny' ], // hunterpets [num] + 11 => [parent::CR_NYI_PH, null, 0], // classes [num] + 13 => [parent::CR_CALLBACK, 'cbUseAll' ] // used [num] ); protected $inputFields = array( - 'cr' => [FILTER_V_LIST, [1, 2, 3, 6, 9, 11, 13], true ], // criteria ids - 'crs' => [FILTER_V_RANGE, [1, 6], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_INT, true ], // criteria values - all criteria are numeric here - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false] // match any / all filter + 'cr' => [parent::V_LIST, [1, 2, 3, 6, 9, 11, 13], true ], // criteria ids + 'crs' => [parent::V_RANGE, [1, 6], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_INT, true ], // criteria values - all criteria are numeric here + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false] // match any / all filter ); private function _getCnd($op, $val, $tbl) @@ -144,7 +144,7 @@ class IconListFilter extends Filter case '>': case '>=': case '=': - $ids = DB::Aowow()->selectCol('SELECT iconId AS ARRAY_KEY, COUNT(*) AS n FROM ?# GROUP BY iconId HAVING n '.$op.' '.$val, $tbl); + $ids = DB::Aowow()->selectCol('SELECT `iconId` AS ARRAY_KEY, COUNT(*) AS "n" FROM ?# GROUP BY `iconId` HAVING n '.$op.' '.$val, $tbl); return $ids ? ['id', array_keys($ids)] : [1]; case '<=': if ($val) @@ -160,7 +160,7 @@ class IconListFilter extends Filter break; } - $ids = DB::Aowow()->selectCol('SELECT iconId AS ARRAY_KEY, COUNT(*) AS n FROM ?# GROUP BY iconId HAVING n '.$op.' '.$val, $tbl); + $ids = DB::Aowow()->selectCol('SELECT `iconId` AS ARRAY_KEY, COUNT(*) AS "n" FROM ?# GROUP BY `iconId` HAVING n '.$op.' '.$val, $tbl); return $ids ? ['id', array_keys($ids), '!'] : [1]; } @@ -197,7 +197,7 @@ class IconListFilter extends Filter if (!$tbl) continue; - $res = DB::Aowow()->selectCol('SELECT iconId AS ARRAY_KEY, COUNT(*) AS n FROM ?# GROUP BY iconId', $tbl); + $res = DB::Aowow()->selectCol('SELECT `iconId` AS ARRAY_KEY, COUNT(*) AS "n" FROM ?# GROUP BY `iconId`', $tbl); Util::arraySumByKey($this->totalUses, $res); } } @@ -212,7 +212,7 @@ class IconListFilter extends Filter $op = '>='; else if ($cr[1] == '!=' && $cr[2]) $op = '=='; - $ids = array_filter($this->totalUses, function ($x) use ($op, $cr) { return eval('return '.$x.' '.$op.' '.$cr[2].';'); }); + $ids = array_filter($this->totalUses, fn($x) => eval('return '.$x.' '.$op.' '.$cr[2].';')); if ($cr[1] != $op) return $ids ? ['id', array_keys($ids), '!'] : [1]; diff --git a/includes/types/item.class.php b/includes/types/item.class.php index 5e6e1248..276ce641 100644 --- a/includes/types/item.class.php +++ b/includes/types/item.class.php @@ -1836,185 +1836,185 @@ class ItemListFilter extends Filter ); protected $genericFilter = array( - 2 => [FILTER_CR_CALLBACK, 'cbFieldHasVal', 'bonding', 1 ], // bindonpickup [yn] - 3 => [FILTER_CR_CALLBACK, 'cbFieldHasVal', 'bonding', 2 ], // bindonequip [yn] - 4 => [FILTER_CR_CALLBACK, 'cbFieldHasVal', 'bonding', 3 ], // bindonuse [yn] - 5 => [FILTER_CR_CALLBACK, 'cbFieldHasVal', 'bonding', [4, 5] ], // questitem [yn] - 6 => [FILTER_CR_CALLBACK, 'cbQuestRelation', null, null ], // startsquest [side] - 7 => [FILTER_CR_BOOLEAN, 'description_loc0', true ], // hasflavortext - 8 => [FILTER_CR_BOOLEAN, 'requiredDisenchantSkill' ], // disenchantable - 9 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_CONJURED ], // conjureditem - 10 => [FILTER_CR_BOOLEAN, 'lockId' ], // locked - 11 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_OPENABLE ], // openable - 12 => [FILTER_CR_BOOLEAN, 'itemset' ], // partofset - 13 => [FILTER_CR_BOOLEAN, 'randomEnchant' ], // randomlyenchanted - 14 => [FILTER_CR_BOOLEAN, 'pageTextId' ], // readable - 15 => [FILTER_CR_CALLBACK, 'cbFieldHasVal', 'maxCount', 1 ], // unique [yn] - 16 => [FILTER_CR_CALLBACK, 'cbDropsInZone', null, null ], // dropsin [zone] - 17 => [FILTER_CR_ENUM, 'requiredFaction', true, true ], // requiresrepwith - 18 => [FILTER_CR_CALLBACK, 'cbFactionQuestReward', null, null ], // rewardedbyfactionquest [side] - 20 => [FILTER_CR_NUMERIC, 'is.str', NUM_CAST_INT, true ], // str - 21 => [FILTER_CR_NUMERIC, 'is.agi', NUM_CAST_INT, true ], // agi - 22 => [FILTER_CR_NUMERIC, 'is.sta', NUM_CAST_INT, true ], // sta - 23 => [FILTER_CR_NUMERIC, 'is.int', NUM_CAST_INT, true ], // int - 24 => [FILTER_CR_NUMERIC, 'is.spi', NUM_CAST_INT, true ], // spi - 25 => [FILTER_CR_NUMERIC, 'is.arcres', NUM_CAST_INT, true ], // arcres - 26 => [FILTER_CR_NUMERIC, 'is.firres', NUM_CAST_INT, true ], // firres - 27 => [FILTER_CR_NUMERIC, 'is.natres', NUM_CAST_INT, true ], // natres - 28 => [FILTER_CR_NUMERIC, 'is.frores', NUM_CAST_INT, true ], // frores - 29 => [FILTER_CR_NUMERIC, 'is.shares', NUM_CAST_INT, true ], // shares - 30 => [FILTER_CR_NUMERIC, 'is.holres', NUM_CAST_INT, true ], // holres - 32 => [FILTER_CR_NUMERIC, 'is.dps', NUM_CAST_FLOAT, true ], // dps - 33 => [FILTER_CR_NUMERIC, 'is.dmgmin1', NUM_CAST_INT, true ], // dmgmin1 - 34 => [FILTER_CR_NUMERIC, 'is.dmgmax1', NUM_CAST_INT, true ], // dmgmax1 - 35 => [FILTER_CR_CALLBACK, 'cbDamageType', null, null ], // damagetype [enum] - 36 => [FILTER_CR_NUMERIC, 'is.speed', NUM_CAST_FLOAT, true ], // speed - 37 => [FILTER_CR_NUMERIC, 'is.mleatkpwr', NUM_CAST_INT, true ], // mleatkpwr - 38 => [FILTER_CR_NUMERIC, 'is.rgdatkpwr', NUM_CAST_INT, true ], // rgdatkpwr - 39 => [FILTER_CR_NUMERIC, 'is.rgdhitrtng', NUM_CAST_INT, true ], // rgdhitrtng - 40 => [FILTER_CR_NUMERIC, 'is.rgdcritstrkrtng', NUM_CAST_INT, true ], // rgdcritstrkrtng - 41 => [FILTER_CR_NUMERIC, 'is.armor', NUM_CAST_INT, true ], // armor - 42 => [FILTER_CR_NUMERIC, 'is.defrtng', NUM_CAST_INT, true ], // defrtng - 43 => [FILTER_CR_NUMERIC, 'is.block', NUM_CAST_INT, true ], // block - 44 => [FILTER_CR_NUMERIC, 'is.blockrtng', NUM_CAST_INT, true ], // blockrtng - 45 => [FILTER_CR_NUMERIC, 'is.dodgertng', NUM_CAST_INT, true ], // dodgertng - 46 => [FILTER_CR_NUMERIC, 'is.parryrtng', NUM_CAST_INT, true ], // parryrtng - 48 => [FILTER_CR_NUMERIC, 'is.splhitrtng', NUM_CAST_INT, true ], // splhitrtng - 49 => [FILTER_CR_NUMERIC, 'is.splcritstrkrtng', NUM_CAST_INT, true ], // splcritstrkrtng - 50 => [FILTER_CR_NUMERIC, 'is.splheal', NUM_CAST_INT, true ], // splheal - 51 => [FILTER_CR_NUMERIC, 'is.spldmg', NUM_CAST_INT, true ], // spldmg - 52 => [FILTER_CR_NUMERIC, 'is.arcsplpwr', NUM_CAST_INT, true ], // arcsplpwr - 53 => [FILTER_CR_NUMERIC, 'is.firsplpwr', NUM_CAST_INT, true ], // firsplpwr - 54 => [FILTER_CR_NUMERIC, 'is.frosplpwr', NUM_CAST_INT, true ], // frosplpwr - 55 => [FILTER_CR_NUMERIC, 'is.holsplpwr', NUM_CAST_INT, true ], // holsplpwr - 56 => [FILTER_CR_NUMERIC, 'is.natsplpwr', NUM_CAST_INT, true ], // natsplpwr - 57 => [FILTER_CR_NUMERIC, 'is.shasplpwr', NUM_CAST_INT, true ], // shasplpwr - 59 => [FILTER_CR_NUMERIC, 'durability', NUM_CAST_INT, true ], // dura - 60 => [FILTER_CR_NUMERIC, 'is.healthrgn', NUM_CAST_INT, true ], // healthrgn - 61 => [FILTER_CR_NUMERIC, 'is.manargn', NUM_CAST_INT, true ], // manargn - 62 => [FILTER_CR_CALLBACK, 'cbCooldown', null, null ], // cooldown [op] [int] - 63 => [FILTER_CR_NUMERIC, 'buyPrice', NUM_CAST_INT, true ], // buyprice - 64 => [FILTER_CR_NUMERIC, 'sellPrice', NUM_CAST_INT, true ], // sellprice - 65 => [FILTER_CR_CALLBACK, 'cbAvgMoneyContent', null, null ], // avgmoney [op] [int] - 66 => [FILTER_CR_ENUM, 'requiredSpell' ], // requiresprofspec - 68 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 15, null ], // otdisenchanting [yn] - 69 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 16, null ], // otfishing [yn] - 70 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 17, null ], // otherbgathering [yn] - 71 => [FILTER_CR_FLAG, 'cuFlags', ITEM_CU_OT_ITEMLOOT ], // otitemopening [yn] - 72 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 2, null ], // otlooting [yn] - 73 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 19, null ], // otmining [yn] - 74 => [FILTER_CR_FLAG, 'cuFlags', ITEM_CU_OT_OBJECTLOOT ], // otobjectopening [yn] - 75 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 21, null ], // otpickpocketing [yn] - 76 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 23, null ], // otskinning [yn] - 77 => [FILTER_CR_NUMERIC, 'is.atkpwr', NUM_CAST_INT, true ], // atkpwr - 78 => [FILTER_CR_NUMERIC, 'is.mlehastertng', NUM_CAST_INT, true ], // mlehastertng - 79 => [FILTER_CR_NUMERIC, 'is.resirtng', NUM_CAST_INT, true ], // resirtng - 80 => [FILTER_CR_CALLBACK, 'cbHasSockets', null, null ], // has sockets [enum] - 81 => [FILTER_CR_CALLBACK, 'cbFitsGemSlot', null, null ], // fits gem slot [enum] - 83 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_UNIQUEEQUIPPED ], // uniqueequipped - 84 => [FILTER_CR_NUMERIC, 'is.mlecritstrkrtng', NUM_CAST_INT, true ], // mlecritstrkrtng - 85 => [FILTER_CR_CALLBACK, 'cbObjectiveOfQuest', null, null ], // objectivequest [side] - 86 => [FILTER_CR_CALLBACK, 'cbCraftedByProf', null, null ], // craftedprof [enum] - 87 => [FILTER_CR_CALLBACK, 'cbReagentForAbility', null, null ], // reagentforability [enum] - 88 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 20, null ], // otprospecting [yn] - 89 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_PROSPECTABLE ], // prospectable - 90 => [FILTER_CR_CALLBACK, 'cbAvgBuyout', null, null ], // avgbuyout [op] [int] - 91 => [FILTER_CR_ENUM, 'totemCategory', false, true ], // tool - 92 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 5, null ], // soldbyvendor [yn] - 93 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 3, null ], // otpvp [pvp] - 94 => [FILTER_CR_NUMERIC, 'is.splpen', NUM_CAST_INT, true ], // splpen - 95 => [FILTER_CR_NUMERIC, 'is.mlehitrtng', NUM_CAST_INT, true ], // mlehitrtng - 96 => [FILTER_CR_NUMERIC, 'is.critstrkrtng', NUM_CAST_INT, true ], // critstrkrtng - 97 => [FILTER_CR_NUMERIC, 'is.feratkpwr', NUM_CAST_INT, true ], // feratkpwr - 98 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_PARTYLOOT ], // partyloot - 99 => [FILTER_CR_ENUM, 'requiredSkill' ], // requiresprof - 100 => [FILTER_CR_NUMERIC, 'is.nsockets', NUM_CAST_INT ], // nsockets - 101 => [FILTER_CR_NUMERIC, 'is.rgdhastertng', NUM_CAST_INT, true ], // rgdhastertng - 102 => [FILTER_CR_NUMERIC, 'is.splhastertng', NUM_CAST_INT, true ], // splhastertng - 103 => [FILTER_CR_NUMERIC, 'is.hastertng', NUM_CAST_INT, true ], // hastertng - 104 => [FILTER_CR_STRING, 'description', STR_LOCALIZED ], // flavortext - 105 => [FILTER_CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_DUNGEON_DROP, 1 ], // dropsinnormal [heroicdungeon-any] - 106 => [FILTER_CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_DUNGEON_DROP, 2 ], // dropsinheroic [heroicdungeon-any] - 107 => [FILTER_CR_NYI_PH, null, 1, ], // effecttext [str] not yet parsed ['effectsParsed_loc'.Lang::getLocale()->value, $cr[2]] - 109 => [FILTER_CR_CALLBACK, 'cbArmorBonus', null, null ], // armorbonus [op] [int] - 111 => [FILTER_CR_NUMERIC, 'requiredSkillRank', NUM_CAST_INT, true ], // reqskillrank - 113 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 114 => [FILTER_CR_NUMERIC, 'is.armorpenrtng', NUM_CAST_INT, true ], // armorpenrtng - 115 => [FILTER_CR_NUMERIC, 'is.health', NUM_CAST_INT, true ], // health - 116 => [FILTER_CR_NUMERIC, 'is.mana', NUM_CAST_INT, true ], // mana - 117 => [FILTER_CR_NUMERIC, 'is.exprtng', NUM_CAST_INT, true ], // exprtng - 118 => [FILTER_CR_CALLBACK, 'cbPurchasableWith', null, null ], // purchasablewithitem [enum] - 119 => [FILTER_CR_NUMERIC, 'is.hitrtng', NUM_CAST_INT, true ], // hitrtng - 123 => [FILTER_CR_NUMERIC, 'is.splpwr', NUM_CAST_INT, true ], // splpwr - 124 => [FILTER_CR_CALLBACK, 'cbHasRandEnchant', null, null ], // randomenchants [str] - 125 => [FILTER_CR_CALLBACK, 'cbReqArenaRating', null, null ], // reqarenartng [op] [int] todo (low): 'find out, why "IN (W, X, Y) AND IN (X, Y, Z)" doesn't result in "(X, Y)" - 126 => [FILTER_CR_CALLBACK, 'cbQuestRewardIn', null, null ], // rewardedbyquestin [zone-any] - 128 => [FILTER_CR_CALLBACK, 'cbSource', null, null ], // source [enum] - 129 => [FILTER_CR_CALLBACK, 'cbSoldByNPC', null, null ], // soldbynpc [str-small] - 130 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 132 => [FILTER_CR_CALLBACK, 'cbGlyphType', null, null ], // glyphtype [enum] - 133 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_ACCOUNTBOUND ], // accountbound - 134 => [FILTER_CR_NUMERIC, 'is.mledps', NUM_CAST_FLOAT, true ], // mledps - 135 => [FILTER_CR_NUMERIC, 'is.mledmgmin', NUM_CAST_INT, true ], // mledmgmin - 136 => [FILTER_CR_NUMERIC, 'is.mledmgmax', NUM_CAST_INT, true ], // mledmgmax - 137 => [FILTER_CR_NUMERIC, 'is.mlespeed', NUM_CAST_FLOAT, true ], // mlespeed - 138 => [FILTER_CR_NUMERIC, 'is.rgddps', NUM_CAST_FLOAT, true ], // rgddps - 139 => [FILTER_CR_NUMERIC, 'is.rgddmgmin', NUM_CAST_INT, true ], // rgddmgmin - 140 => [FILTER_CR_NUMERIC, 'is.rgddmgmax', NUM_CAST_INT, true ], // rgddmgmax - 141 => [FILTER_CR_NUMERIC, 'is.rgdspeed', NUM_CAST_FLOAT, true ], // rgdspeed - 142 => [FILTER_CR_STRING, 'ic.name' ], // icon - 143 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 18, null ], // otmilling [yn] - 144 => [FILTER_CR_CALLBACK, 'cbPvpPurchasable', 'reqHonorPoints', null ], // purchasablewithhonor [yn] - 145 => [FILTER_CR_CALLBACK, 'cbPvpPurchasable', 'reqArenaPoints', null ], // purchasablewitharena [yn] - 146 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_HEROIC ], // heroic - 147 => [FILTER_CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 1, ], // dropsinnormal10 [multimoderaid-any] - 148 => [FILTER_CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 2, ], // dropsinnormal25 [multimoderaid-any] - 149 => [FILTER_CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 4, ], // dropsinheroic10 [heroicraid-any] - 150 => [FILTER_CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 8, ], // dropsinheroic25 [heroicraid-any] - 151 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT, true ], // id - 152 => [FILTER_CR_CALLBACK, 'cbClassRaceSpec', 'requiredClass', CLASS_MASK_ALL], // classspecific [enum] - 153 => [FILTER_CR_CALLBACK, 'cbClassRaceSpec', 'requiredRace', RACE_MASK_ALL ], // racespecific [enum] - 154 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_REFUNDABLE ], // refundable - 155 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_USABLE_ARENA ], // usableinarenas - 156 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_USABLE_SHAPED ], // usablewhenshapeshifted - 157 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_SMARTLOOT ], // smartloot - 158 => [FILTER_CR_CALLBACK, 'cbPurchasableWith', null, null ], // purchasablewithcurrency [enum] - 159 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_MILLABLE ], // millable - 160 => [FILTER_CR_NYI_PH, null, 1, ], // relatedevent [enum] like 169 .. crawl though npc_vendor and loot_templates of event-related spawns - 161 => [FILTER_CR_CALLBACK, 'cbAvailable', null, null ], // availabletoplayers [yn] - 162 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_DEPRECATED ], // deprecated - 163 => [FILTER_CR_CALLBACK, 'cbDisenchantsInto', null, null ], // disenchantsinto [disenchanting] - 165 => [FILTER_CR_NUMERIC, 'repairPrice', NUM_CAST_INT, true ], // repaircost - 167 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 168 => [FILTER_CR_CALLBACK, 'cbFieldHasVal', 'spellId1', LEARN_SPELLS ], // teachesspell [yn] - 169 => [FILTER_CR_ENUM, 'e.holidayId', true, true ], // requiresevent - 171 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 8, null ], // otredemption [yn] - 172 => [FILTER_CR_CALLBACK, 'cbObtainedBy', 12, null ], // rewardedbyachievement [yn] - 176 => [FILTER_CR_STAFFFLAG, 'flags' ], // flags - 177 => [FILTER_CR_STAFFFLAG, 'flagsExtra' ], // flags2 + 2 => [parent::CR_CALLBACK, 'cbFieldHasVal', 'bonding', 1 ], // bindonpickup [yn] + 3 => [parent::CR_CALLBACK, 'cbFieldHasVal', 'bonding', 2 ], // bindonequip [yn] + 4 => [parent::CR_CALLBACK, 'cbFieldHasVal', 'bonding', 3 ], // bindonuse [yn] + 5 => [parent::CR_CALLBACK, 'cbFieldHasVal', 'bonding', [4, 5] ], // questitem [yn] + 6 => [parent::CR_CALLBACK, 'cbQuestRelation', null, null ], // startsquest [side] + 7 => [parent::CR_BOOLEAN, 'description_loc0', true ], // hasflavortext + 8 => [parent::CR_BOOLEAN, 'requiredDisenchantSkill' ], // disenchantable + 9 => [parent::CR_FLAG, 'flags', ITEM_FLAG_CONJURED ], // conjureditem + 10 => [parent::CR_BOOLEAN, 'lockId' ], // locked + 11 => [parent::CR_FLAG, 'flags', ITEM_FLAG_OPENABLE ], // openable + 12 => [parent::CR_BOOLEAN, 'itemset' ], // partofset + 13 => [parent::CR_BOOLEAN, 'randomEnchant' ], // randomlyenchanted + 14 => [parent::CR_BOOLEAN, 'pageTextId' ], // readable + 15 => [parent::CR_CALLBACK, 'cbFieldHasVal', 'maxCount', 1 ], // unique [yn] + 16 => [parent::CR_CALLBACK, 'cbDropsInZone', null, null ], // dropsin [zone] + 17 => [parent::CR_ENUM, 'requiredFaction', true, true ], // requiresrepwith + 18 => [parent::CR_CALLBACK, 'cbFactionQuestReward', null, null ], // rewardedbyfactionquest [side] + 20 => [parent::CR_NUMERIC, 'is.str', NUM_CAST_INT, true ], // str + 21 => [parent::CR_NUMERIC, 'is.agi', NUM_CAST_INT, true ], // agi + 22 => [parent::CR_NUMERIC, 'is.sta', NUM_CAST_INT, true ], // sta + 23 => [parent::CR_NUMERIC, 'is.int', NUM_CAST_INT, true ], // int + 24 => [parent::CR_NUMERIC, 'is.spi', NUM_CAST_INT, true ], // spi + 25 => [parent::CR_NUMERIC, 'is.arcres', NUM_CAST_INT, true ], // arcres + 26 => [parent::CR_NUMERIC, 'is.firres', NUM_CAST_INT, true ], // firres + 27 => [parent::CR_NUMERIC, 'is.natres', NUM_CAST_INT, true ], // natres + 28 => [parent::CR_NUMERIC, 'is.frores', NUM_CAST_INT, true ], // frores + 29 => [parent::CR_NUMERIC, 'is.shares', NUM_CAST_INT, true ], // shares + 30 => [parent::CR_NUMERIC, 'is.holres', NUM_CAST_INT, true ], // holres + 32 => [parent::CR_NUMERIC, 'is.dps', NUM_CAST_FLOAT, true ], // dps + 33 => [parent::CR_NUMERIC, 'is.dmgmin1', NUM_CAST_INT, true ], // dmgmin1 + 34 => [parent::CR_NUMERIC, 'is.dmgmax1', NUM_CAST_INT, true ], // dmgmax1 + 35 => [parent::CR_CALLBACK, 'cbDamageType', null, null ], // damagetype [enum] + 36 => [parent::CR_NUMERIC, 'is.speed', NUM_CAST_FLOAT, true ], // speed + 37 => [parent::CR_NUMERIC, 'is.mleatkpwr', NUM_CAST_INT, true ], // mleatkpwr + 38 => [parent::CR_NUMERIC, 'is.rgdatkpwr', NUM_CAST_INT, true ], // rgdatkpwr + 39 => [parent::CR_NUMERIC, 'is.rgdhitrtng', NUM_CAST_INT, true ], // rgdhitrtng + 40 => [parent::CR_NUMERIC, 'is.rgdcritstrkrtng', NUM_CAST_INT, true ], // rgdcritstrkrtng + 41 => [parent::CR_NUMERIC, 'is.armor', NUM_CAST_INT, true ], // armor + 42 => [parent::CR_NUMERIC, 'is.defrtng', NUM_CAST_INT, true ], // defrtng + 43 => [parent::CR_NUMERIC, 'is.block', NUM_CAST_INT, true ], // block + 44 => [parent::CR_NUMERIC, 'is.blockrtng', NUM_CAST_INT, true ], // blockrtng + 45 => [parent::CR_NUMERIC, 'is.dodgertng', NUM_CAST_INT, true ], // dodgertng + 46 => [parent::CR_NUMERIC, 'is.parryrtng', NUM_CAST_INT, true ], // parryrtng + 48 => [parent::CR_NUMERIC, 'is.splhitrtng', NUM_CAST_INT, true ], // splhitrtng + 49 => [parent::CR_NUMERIC, 'is.splcritstrkrtng', NUM_CAST_INT, true ], // splcritstrkrtng + 50 => [parent::CR_NUMERIC, 'is.splheal', NUM_CAST_INT, true ], // splheal + 51 => [parent::CR_NUMERIC, 'is.spldmg', NUM_CAST_INT, true ], // spldmg + 52 => [parent::CR_NUMERIC, 'is.arcsplpwr', NUM_CAST_INT, true ], // arcsplpwr + 53 => [parent::CR_NUMERIC, 'is.firsplpwr', NUM_CAST_INT, true ], // firsplpwr + 54 => [parent::CR_NUMERIC, 'is.frosplpwr', NUM_CAST_INT, true ], // frosplpwr + 55 => [parent::CR_NUMERIC, 'is.holsplpwr', NUM_CAST_INT, true ], // holsplpwr + 56 => [parent::CR_NUMERIC, 'is.natsplpwr', NUM_CAST_INT, true ], // natsplpwr + 57 => [parent::CR_NUMERIC, 'is.shasplpwr', NUM_CAST_INT, true ], // shasplpwr + 59 => [parent::CR_NUMERIC, 'durability', NUM_CAST_INT, true ], // dura + 60 => [parent::CR_NUMERIC, 'is.healthrgn', NUM_CAST_INT, true ], // healthrgn + 61 => [parent::CR_NUMERIC, 'is.manargn', NUM_CAST_INT, true ], // manargn + 62 => [parent::CR_CALLBACK, 'cbCooldown', null, null ], // cooldown [op] [int] + 63 => [parent::CR_NUMERIC, 'buyPrice', NUM_CAST_INT, true ], // buyprice + 64 => [parent::CR_NUMERIC, 'sellPrice', NUM_CAST_INT, true ], // sellprice + 65 => [parent::CR_CALLBACK, 'cbAvgMoneyContent', null, null ], // avgmoney [op] [int] + 66 => [parent::CR_ENUM, 'requiredSpell' ], // requiresprofspec + 68 => [parent::CR_CALLBACK, 'cbObtainedBy', 15, null ], // otdisenchanting [yn] + 69 => [parent::CR_CALLBACK, 'cbObtainedBy', 16, null ], // otfishing [yn] + 70 => [parent::CR_CALLBACK, 'cbObtainedBy', 17, null ], // otherbgathering [yn] + 71 => [parent::CR_FLAG, 'cuFlags', ITEM_CU_OT_ITEMLOOT ], // otitemopening [yn] + 72 => [parent::CR_CALLBACK, 'cbObtainedBy', 2, null ], // otlooting [yn] + 73 => [parent::CR_CALLBACK, 'cbObtainedBy', 19, null ], // otmining [yn] + 74 => [parent::CR_FLAG, 'cuFlags', ITEM_CU_OT_OBJECTLOOT ], // otobjectopening [yn] + 75 => [parent::CR_CALLBACK, 'cbObtainedBy', 21, null ], // otpickpocketing [yn] + 76 => [parent::CR_CALLBACK, 'cbObtainedBy', 23, null ], // otskinning [yn] + 77 => [parent::CR_NUMERIC, 'is.atkpwr', NUM_CAST_INT, true ], // atkpwr + 78 => [parent::CR_NUMERIC, 'is.mlehastertng', NUM_CAST_INT, true ], // mlehastertng + 79 => [parent::CR_NUMERIC, 'is.resirtng', NUM_CAST_INT, true ], // resirtng + 80 => [parent::CR_CALLBACK, 'cbHasSockets', null, null ], // has sockets [enum] + 81 => [parent::CR_CALLBACK, 'cbFitsGemSlot', null, null ], // fits gem slot [enum] + 83 => [parent::CR_FLAG, 'flags', ITEM_FLAG_UNIQUEEQUIPPED ], // uniqueequipped + 84 => [parent::CR_NUMERIC, 'is.mlecritstrkrtng', NUM_CAST_INT, true ], // mlecritstrkrtng + 85 => [parent::CR_CALLBACK, 'cbObjectiveOfQuest', null, null ], // objectivequest [side] + 86 => [parent::CR_CALLBACK, 'cbCraftedByProf', null, null ], // craftedprof [enum] + 87 => [parent::CR_CALLBACK, 'cbReagentForAbility', null, null ], // reagentforability [enum] + 88 => [parent::CR_CALLBACK, 'cbObtainedBy', 20, null ], // otprospecting [yn] + 89 => [parent::CR_FLAG, 'flags', ITEM_FLAG_PROSPECTABLE ], // prospectable + 90 => [parent::CR_CALLBACK, 'cbAvgBuyout', null, null ], // avgbuyout [op] [int] + 91 => [parent::CR_ENUM, 'totemCategory', false, true ], // tool + 92 => [parent::CR_CALLBACK, 'cbObtainedBy', 5, null ], // soldbyvendor [yn] + 93 => [parent::CR_CALLBACK, 'cbObtainedBy', 3, null ], // otpvp [pvp] + 94 => [parent::CR_NUMERIC, 'is.splpen', NUM_CAST_INT, true ], // splpen + 95 => [parent::CR_NUMERIC, 'is.mlehitrtng', NUM_CAST_INT, true ], // mlehitrtng + 96 => [parent::CR_NUMERIC, 'is.critstrkrtng', NUM_CAST_INT, true ], // critstrkrtng + 97 => [parent::CR_NUMERIC, 'is.feratkpwr', NUM_CAST_INT, true ], // feratkpwr + 98 => [parent::CR_FLAG, 'flags', ITEM_FLAG_PARTYLOOT ], // partyloot + 99 => [parent::CR_ENUM, 'requiredSkill' ], // requiresprof + 100 => [parent::CR_NUMERIC, 'is.nsockets', NUM_CAST_INT ], // nsockets + 101 => [parent::CR_NUMERIC, 'is.rgdhastertng', NUM_CAST_INT, true ], // rgdhastertng + 102 => [parent::CR_NUMERIC, 'is.splhastertng', NUM_CAST_INT, true ], // splhastertng + 103 => [parent::CR_NUMERIC, 'is.hastertng', NUM_CAST_INT, true ], // hastertng + 104 => [parent::CR_STRING, 'description', STR_LOCALIZED ], // flavortext + 105 => [parent::CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_DUNGEON_DROP, 1 ], // dropsinnormal [heroicdungeon-any] + 106 => [parent::CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_DUNGEON_DROP, 2 ], // dropsinheroic [heroicdungeon-any] + 107 => [parent::CR_NYI_PH, null, 1, ], // effecttext [str] not yet parsed ['effectsParsed_loc'.Lang::getLocale()->value, $cr[2]] + 109 => [parent::CR_CALLBACK, 'cbArmorBonus', null, null ], // armorbonus [op] [int] + 111 => [parent::CR_NUMERIC, 'requiredSkillRank', NUM_CAST_INT, true ], // reqskillrank + 113 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots + 114 => [parent::CR_NUMERIC, 'is.armorpenrtng', NUM_CAST_INT, true ], // armorpenrtng + 115 => [parent::CR_NUMERIC, 'is.health', NUM_CAST_INT, true ], // health + 116 => [parent::CR_NUMERIC, 'is.mana', NUM_CAST_INT, true ], // mana + 117 => [parent::CR_NUMERIC, 'is.exprtng', NUM_CAST_INT, true ], // exprtng + 118 => [parent::CR_CALLBACK, 'cbPurchasableWith', null, null ], // purchasablewithitem [enum] + 119 => [parent::CR_NUMERIC, 'is.hitrtng', NUM_CAST_INT, true ], // hitrtng + 123 => [parent::CR_NUMERIC, 'is.splpwr', NUM_CAST_INT, true ], // splpwr + 124 => [parent::CR_CALLBACK, 'cbHasRandEnchant', null, null ], // randomenchants [str] + 125 => [parent::CR_CALLBACK, 'cbReqArenaRating', null, null ], // reqarenartng [op] [int] todo (low): 'find out, why "IN (W, X, Y) AND IN (X, Y, Z)" doesn't result in "(X, Y)" + 126 => [parent::CR_CALLBACK, 'cbQuestRewardIn', null, null ], // rewardedbyquestin [zone-any] + 128 => [parent::CR_CALLBACK, 'cbSource', null, null ], // source [enum] + 129 => [parent::CR_CALLBACK, 'cbSoldByNPC', null, null ], // soldbynpc [str-small] + 130 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments + 132 => [parent::CR_CALLBACK, 'cbGlyphType', null, null ], // glyphtype [enum] + 133 => [parent::CR_FLAG, 'flags', ITEM_FLAG_ACCOUNTBOUND ], // accountbound + 134 => [parent::CR_NUMERIC, 'is.mledps', NUM_CAST_FLOAT, true ], // mledps + 135 => [parent::CR_NUMERIC, 'is.mledmgmin', NUM_CAST_INT, true ], // mledmgmin + 136 => [parent::CR_NUMERIC, 'is.mledmgmax', NUM_CAST_INT, true ], // mledmgmax + 137 => [parent::CR_NUMERIC, 'is.mlespeed', NUM_CAST_FLOAT, true ], // mlespeed + 138 => [parent::CR_NUMERIC, 'is.rgddps', NUM_CAST_FLOAT, true ], // rgddps + 139 => [parent::CR_NUMERIC, 'is.rgddmgmin', NUM_CAST_INT, true ], // rgddmgmin + 140 => [parent::CR_NUMERIC, 'is.rgddmgmax', NUM_CAST_INT, true ], // rgddmgmax + 141 => [parent::CR_NUMERIC, 'is.rgdspeed', NUM_CAST_FLOAT, true ], // rgdspeed + 142 => [parent::CR_STRING, 'ic.name' ], // icon + 143 => [parent::CR_CALLBACK, 'cbObtainedBy', 18, null ], // otmilling [yn] + 144 => [parent::CR_CALLBACK, 'cbPvpPurchasable', 'reqHonorPoints', null ], // purchasablewithhonor [yn] + 145 => [parent::CR_CALLBACK, 'cbPvpPurchasable', 'reqArenaPoints', null ], // purchasablewitharena [yn] + 146 => [parent::CR_FLAG, 'flags', ITEM_FLAG_HEROIC ], // heroic + 147 => [parent::CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 1, ], // dropsinnormal10 [multimoderaid-any] + 148 => [parent::CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 2, ], // dropsinnormal25 [multimoderaid-any] + 149 => [parent::CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 4, ], // dropsinheroic10 [heroicraid-any] + 150 => [parent::CR_CALLBACK, 'cbDropsInInstance', SRC_FLAG_RAID_DROP, 8, ], // dropsinheroic25 [heroicraid-any] + 151 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT, true ], // id + 152 => [parent::CR_CALLBACK, 'cbClassRaceSpec', 'requiredClass', CLASS_MASK_ALL], // classspecific [enum] + 153 => [parent::CR_CALLBACK, 'cbClassRaceSpec', 'requiredRace', RACE_MASK_ALL ], // racespecific [enum] + 154 => [parent::CR_FLAG, 'flags', ITEM_FLAG_REFUNDABLE ], // refundable + 155 => [parent::CR_FLAG, 'flags', ITEM_FLAG_USABLE_ARENA ], // usableinarenas + 156 => [parent::CR_FLAG, 'flags', ITEM_FLAG_USABLE_SHAPED ], // usablewhenshapeshifted + 157 => [parent::CR_FLAG, 'flags', ITEM_FLAG_SMARTLOOT ], // smartloot + 158 => [parent::CR_CALLBACK, 'cbPurchasableWith', null, null ], // purchasablewithcurrency [enum] + 159 => [parent::CR_FLAG, 'flags', ITEM_FLAG_MILLABLE ], // millable + 160 => [parent::CR_NYI_PH, null, 1, ], // relatedevent [enum] like 169 .. crawl though npc_vendor and loot_templates of event-related spawns + 161 => [parent::CR_CALLBACK, 'cbAvailable', null, null ], // availabletoplayers [yn] + 162 => [parent::CR_FLAG, 'flags', ITEM_FLAG_DEPRECATED ], // deprecated + 163 => [parent::CR_CALLBACK, 'cbDisenchantsInto', null, null ], // disenchantsinto [disenchanting] + 165 => [parent::CR_NUMERIC, 'repairPrice', NUM_CAST_INT, true ], // repaircost + 167 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos + 168 => [parent::CR_CALLBACK, 'cbFieldHasVal', 'spellId1', LEARN_SPELLS ], // teachesspell [yn] + 169 => [parent::CR_ENUM, 'e.holidayId', true, true ], // requiresevent + 171 => [parent::CR_CALLBACK, 'cbObtainedBy', 8, null ], // otredemption [yn] + 172 => [parent::CR_CALLBACK, 'cbObtainedBy', 12, null ], // rewardedbyachievement [yn] + 176 => [parent::CR_STAFFFLAG, 'flags' ], // flags + 177 => [parent::CR_STAFFFLAG, 'flagsExtra' ], // flags2 ); protected $inputFields = array( - 'wt' => [FILTER_V_CALLBACK, 'cbWeightKeyCheck', true ], // weight keys - 'wtv' => [FILTER_V_RANGE, [1, 999], true ], // weight values - 'jc' => [FILTER_V_LIST, [1], false], // use jewelcrafter gems for weight calculation - 'gm' => [FILTER_V_LIST, [2, 3, 4], false], // gem rarity for weight calculation - 'cr' => [FILTER_V_RANGE, [1, 177], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 99999]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiters - 'upg' => [FILTER_V_REGEX, '/[^\d:]/ui', false], // upgrade item ids - 'gb' => [FILTER_V_LIST, [0, 1, 2, 3], false], // search result grouping - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'ub' => [FILTER_V_LIST, [[1, 9], 11], false], // usable by classId - 'qu' => [FILTER_V_RANGE, [0, 7], true ], // quality ids - 'ty' => [FILTER_V_CALLBACK, 'cbTypeCheck', true ], // item type - dynamic by current group - 'sl' => [FILTER_V_CALLBACK, 'cbSlotCheck', true ], // item slot - dynamic by current group - 'si' => [FILTER_V_LIST, [1, 2, 3, -1, -2], false], // side - 'minle' => [FILTER_V_RANGE, [1, 999], false], // item level min - 'maxle' => [FILTER_V_RANGE, [1, 999], false], // item level max - 'minrl' => [FILTER_V_RANGE, [1, MAX_LEVEL], false], // required level min - 'maxrl' => [FILTER_V_RANGE, [1, MAX_LEVEL], false] // required level max + 'wt' => [parent::V_CALLBACK, 'cbWeightKeyCheck', true ], // weight keys + 'wtv' => [parent::V_RANGE, [1, 999], true ], // weight values + 'jc' => [parent::V_LIST, [1], false], // use jewelcrafter gems for weight calculation + 'gm' => [parent::V_LIST, [2, 3, 4], false], // gem rarity for weight calculation + 'cr' => [parent::V_RANGE, [1, 177], true ], // criteria ids + 'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 99999]], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiters + 'upg' => [parent::V_REGEX, '/[^\d:]/ui', false], // upgrade item ids + 'gb' => [parent::V_LIST, [0, 1, 2, 3], false], // search result grouping + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'ub' => [parent::V_LIST, [[1, 9], 11], false], // usable by classId + 'qu' => [parent::V_RANGE, [0, 7], true ], // quality ids + 'ty' => [parent::V_CALLBACK, 'cbTypeCheck', true ], // item type - dynamic by current group + 'sl' => [parent::V_CALLBACK, 'cbSlotCheck', true ], // item slot - dynamic by current group + 'si' => [parent::V_LIST, [1, 2, 3, -1, -2], false], // side + 'minle' => [parent::V_RANGE, [1, 999], false], // item level min + 'maxle' => [parent::V_RANGE, [1, 999], false], // item level max + 'minrl' => [parent::V_RANGE, [1, MAX_LEVEL], false], // required level min + 'maxrl' => [parent::V_RANGE, [1, MAX_LEVEL], false] // required level max ); public function __construct($fromPOST = false, $opts = []) @@ -2274,7 +2274,7 @@ class ItemListFilter extends Filter protected function cbHasRandEnchant($cr) : mixed { - $n = preg_replace(Filter::PATTERN_NAME, '', $cr[2]); + $n = preg_replace(parent::PATTERN_NAME, '', $cr[2]); $n = $this->transformString($n, false); $randIds = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, ABS(`id`) AS `id`, name_loc?d, `name_loc0` FROM ?_itemrandomenchant WHERE name_loc?d LIKE ?', Lang::getLocale()->value, Lang::getLocale()->value, $n); @@ -2332,7 +2332,7 @@ class ItemListFilter extends Filter protected function cbDamageType($cr) : mixed { - if (!$this->checkInput(FILTER_V_RANGE, [0, 6], $cr[1])) + if (!$this->checkInput(parent::V_RANGE, [0, 6], $cr[1])) return false; return ['OR', ['dmgType1', $cr[1]], ['dmgType2', $cr[1]]]; @@ -2365,7 +2365,7 @@ class ItemListFilter extends Filter { if (in_array($cr[1], $this->enums[$cr[0]])) return ['AND', ['src.src4', null, '!'], ['src.moreZoneId', $cr[1]]]; - else if ($cr[1] == FILTER_ENUM_ANY) + else if ($cr[1] == parent::ENUM_ANY) return ['src.src4', null, '!']; // well, this seems a bit redundant.. return false; @@ -2375,7 +2375,7 @@ class ItemListFilter extends Filter { if (in_array($cr[1], $this->enums[$cr[0]])) return ['AND', ['src.src2', null, '!'], ['src.moreZoneId', $cr[1]]]; - else if ($cr[1] == FILTER_ENUM_ANY) + else if ($cr[1] == parent::ENUM_ANY) return ['src.src2', null, '!']; // well, this seems a bit redundant.. return false; @@ -2385,7 +2385,7 @@ class ItemListFilter extends Filter { if (in_array($cr[1], $this->enums[$cr[0]])) return ['AND', ['src.src2', $modeBit, '&'], ['src.moreMask', $moreFlag, '&'], ['src.moreZoneId', $cr[1]]]; - else if ($cr[1] == FILTER_ENUM_ANY) + else if ($cr[1] == parent::ENUM_ANY) return ['AND', ['src.src2', $modeBit, '&'], ['src.moreMask', $moreFlag, '&']]; return false; @@ -2395,7 +2395,7 @@ class ItemListFilter extends Filter { if (in_array($cr[1], $this->enums[$cr[0]])) $_ = (array)$cr[1]; - else if ($cr[1] == FILTER_ENUM_ANY) + else if ($cr[1] == parent::ENUM_ANY) $_ = $this->enums[$cr[0]]; else return false; diff --git a/includes/types/itemset.class.php b/includes/types/itemset.class.php index 2c8255d9..43ed3a3e 100644 --- a/includes/types/itemset.class.php +++ b/includes/types/itemset.class.php @@ -177,31 +177,31 @@ class ItemsetListFilter extends Filter ); protected $genericFilter = array( - 2 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT, true], // id - 3 => [FILTER_CR_NUMERIC, 'npieces', NUM_CAST_INT ], // pieces - 4 => [FILTER_CR_STRING, 'bonusText', STR_LOCALIZED ], // bonustext - 5 => [FILTER_CR_BOOLEAN, 'heroic' ], // heroic - 6 => [FILTER_CR_ENUM, 'e.holidayId', true, true], // relatedevent - 8 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 9 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 10 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 12 => [FILTER_CR_CALLBACK, 'cbAvaliable', ] // available to players [yn] + 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 $inputFields = array( - 'cr' => [FILTER_V_RANGE, [2, 12], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 424]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiters - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name / description - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'qu' => [FILTER_V_RANGE, [0, 7], true ], // quality - 'ty' => [FILTER_V_RANGE, [1, 12], true ], // set type - 'minle' => [FILTER_V_RANGE, [1, 999], false], // min item level - 'maxle' => [FILTER_V_RANGE, [1, 999], false], // max itemlevel - 'minrl' => [FILTER_V_RANGE, [1, MAX_LEVEL], false], // min required level - 'maxrl' => [FILTER_V_RANGE, [1, MAX_LEVEL], false], // max required level - 'cl' => [FILTER_V_LIST, [[1, 9], 11], false], // class - 'ta' => [FILTER_V_RANGE, [1, 30], false] // tag / content group + '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, [1, 999], false], // min item level + 'maxle' => [parent::V_RANGE, [1, 999], false], // max itemlevel + 'minrl' => [parent::V_RANGE, [1, MAX_LEVEL], false], // min required level + 'maxrl' => [parent::V_RANGE, [1, 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() diff --git a/includes/types/profile.class.php b/includes/types/profile.class.php index e522810c..075b4dd9 100644 --- a/includes/types/profile.class.php +++ b/includes/types/profile.class.php @@ -243,52 +243,52 @@ class ProfileListFilter extends Filter private $realms = []; protected $genericFilter = array( - 2 => [FILTER_CR_NUMERIC, 'gearscore', NUM_CAST_INT ], // gearscore [num] - 3 => [FILTER_CR_CALLBACK, 'cbAchievs', null, null], // achievementpoints [num] - 5 => [FILTER_CR_NUMERIC, 'talenttree1', NUM_CAST_INT ], // talenttree1 [num] - 6 => [FILTER_CR_NUMERIC, 'talenttree2', NUM_CAST_INT ], // talenttree2 [num] - 7 => [FILTER_CR_NUMERIC, 'talenttree3', NUM_CAST_INT ], // talenttree3 [num] - 9 => [FILTER_CR_STRING, 'g.name' ], // guildname - 10 => [FILTER_CR_CALLBACK, 'cbHasGuildRank', null, null], // guildrank - 12 => [FILTER_CR_CALLBACK, 'cbTeamName', 2, null], // teamname2v2 - 15 => [FILTER_CR_CALLBACK, 'cbTeamName', 3, null], // teamname3v3 - 18 => [FILTER_CR_CALLBACK, 'cbTeamName', 5, null], // teamname5v5 - 13 => [FILTER_CR_CALLBACK, 'cbTeamRating', 2, null], // teamrtng2v2 - 16 => [FILTER_CR_CALLBACK, 'cbTeamRating', 3, null], // teamrtng3v3 - 19 => [FILTER_CR_CALLBACK, 'cbTeamRating', 5, null], // teamrtng5v5 - 14 => [FILTER_CR_NYI_PH, null, 0 /* 2 */ ], // teamcontrib2v2 [num] - 17 => [FILTER_CR_NYI_PH, null, 0 /* 3 */ ], // teamcontrib3v3 [num] - 20 => [FILTER_CR_NYI_PH, null, 0 /* 5 */ ], // teamcontrib5v5 [num] - 21 => [FILTER_CR_CALLBACK, 'cbWearsItems', null, null], // wearingitem [str] - 23 => [FILTER_CR_CALLBACK, 'cbCompletedAcv', null, null], // completedachievement - 25 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_ALCHEMY, null], // alchemy [num] - 26 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_BLACKSMITHING, null], // blacksmithing [num] - 27 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_ENCHANTING, null], // enchanting [num] - 28 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_ENGINEERING, null], // engineering [num] - 29 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_HERBALISM, null], // herbalism [num] - 30 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_INSCRIPTION, null], // inscription [num] - 31 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_JEWELCRAFTING, null], // jewelcrafting [num] - 32 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_LEATHERWORKING, null], // leatherworking [num] - 33 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_MINING, null], // mining [num] - 34 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_SKINNING, null], // skinning [num] - 35 => [FILTER_CR_CALLBACK, 'cbProfession', SKILL_TAILORING, null], // tailoring [num] - 36 => [FILTER_CR_CALLBACK, 'cbHasGuild', null, null] // hasguild [yn] + 2 => [parent::CR_NUMERIC, 'gearscore', NUM_CAST_INT ], // gearscore [num] + 3 => [parent::CR_CALLBACK, 'cbAchievs', null, null], // achievementpoints [num] + 5 => [parent::CR_NUMERIC, 'talenttree1', NUM_CAST_INT ], // talenttree1 [num] + 6 => [parent::CR_NUMERIC, 'talenttree2', NUM_CAST_INT ], // talenttree2 [num] + 7 => [parent::CR_NUMERIC, 'talenttree3', NUM_CAST_INT ], // talenttree3 [num] + 9 => [parent::CR_STRING, 'g.name' ], // guildname + 10 => [parent::CR_CALLBACK, 'cbHasGuildRank', null, null], // guildrank + 12 => [parent::CR_CALLBACK, 'cbTeamName', 2, null], // teamname2v2 + 15 => [parent::CR_CALLBACK, 'cbTeamName', 3, null], // teamname3v3 + 18 => [parent::CR_CALLBACK, 'cbTeamName', 5, null], // teamname5v5 + 13 => [parent::CR_CALLBACK, 'cbTeamRating', 2, null], // teamrtng2v2 + 16 => [parent::CR_CALLBACK, 'cbTeamRating', 3, null], // teamrtng3v3 + 19 => [parent::CR_CALLBACK, 'cbTeamRating', 5, null], // teamrtng5v5 + 14 => [parent::CR_NYI_PH, null, 0 /* 2 */ ], // teamcontrib2v2 [num] + 17 => [parent::CR_NYI_PH, null, 0 /* 3 */ ], // teamcontrib3v3 [num] + 20 => [parent::CR_NYI_PH, null, 0 /* 5 */ ], // teamcontrib5v5 [num] + 21 => [parent::CR_CALLBACK, 'cbWearsItems', null, null], // wearingitem [str] + 23 => [parent::CR_CALLBACK, 'cbCompletedAcv', null, null], // completedachievement + 25 => [parent::CR_CALLBACK, 'cbProfession', SKILL_ALCHEMY, null], // alchemy [num] + 26 => [parent::CR_CALLBACK, 'cbProfession', SKILL_BLACKSMITHING, null], // blacksmithing [num] + 27 => [parent::CR_CALLBACK, 'cbProfession', SKILL_ENCHANTING, null], // enchanting [num] + 28 => [parent::CR_CALLBACK, 'cbProfession', SKILL_ENGINEERING, null], // engineering [num] + 29 => [parent::CR_CALLBACK, 'cbProfession', SKILL_HERBALISM, null], // herbalism [num] + 30 => [parent::CR_CALLBACK, 'cbProfession', SKILL_INSCRIPTION, null], // inscription [num] + 31 => [parent::CR_CALLBACK, 'cbProfession', SKILL_JEWELCRAFTING, null], // jewelcrafting [num] + 32 => [parent::CR_CALLBACK, 'cbProfession', SKILL_LEATHERWORKING, null], // leatherworking [num] + 33 => [parent::CR_CALLBACK, 'cbProfession', SKILL_MINING, null], // mining [num] + 34 => [parent::CR_CALLBACK, 'cbProfession', SKILL_SKINNING, null], // skinning [num] + 35 => [parent::CR_CALLBACK, 'cbProfession', SKILL_TAILORING, null], // tailoring [num] + 36 => [parent::CR_CALLBACK, 'cbHasGuild', null, null] // hasguild [yn] ); protected $inputFields = array( - 'cr' => [FILTER_V_RANGE, [1, 36], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 5000]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_CRV, true ], // criteria values - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'ex' => [FILTER_V_EQUAL, 'on', false], // only match exact - 'si' => [FILTER_V_LIST, [1, 2], false], // side - 'ra' => [FILTER_V_LIST, [[1, 8], 10, 11], true ], // race - 'cl' => [FILTER_V_LIST, [[1, 9], 11], true ], // class - 'minle' => [FILTER_V_RANGE, [1, MAX_LEVEL], false], // min level - 'maxle' => [FILTER_V_RANGE, [1, MAX_LEVEL], false], // max level - 'rg' => [FILTER_V_CALLBACK, 'cbRegionCheck', false], // region - 'sv' => [FILTER_V_CALLBACK, 'cbServerCheck', false], // server + 'cr' => [parent::V_RANGE, [1, 36], true ], // criteria ids + 'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 5000]], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_CRV, true ], // criteria values + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'ex' => [parent::V_EQUAL, 'on', false], // only match exact + 'si' => [parent::V_LIST, [SIDE_ALLIANCE, SIDE_HORDE], false], // side + 'ra' => [parent::V_LIST, [[1, 8], 10, 11], true ], // race + 'cl' => [parent::V_LIST, [[1, 9], 11], true ], // class + 'minle' => [parent::V_RANGE, [1, MAX_LEVEL], false], // min level + 'maxle' => [parent::V_RANGE, [1, MAX_LEVEL], false], // max level + 'rg' => [parent::V_CALLBACK, 'cbRegionCheck', false], // region + 'sv' => [parent::V_CALLBACK, 'cbServerCheck', false], // server ); /* heads up! @@ -332,9 +332,9 @@ class ProfileListFilter extends Filter // side [list] if (!empty($_v['si'])) { - if ($_v['si'] == 1) + if ($_v['si'] == SIDE_ALLIANCE) $parts[] = [$k.'.race', [1, 3, 4, 7, 11]]; - else if ($_v['si'] == 2) + else if ($_v['si'] == SIDE_HORDE) $parts[] = [$k.'.race', [2, 5, 6, 8, 10]]; } @@ -417,7 +417,7 @@ class ProfileListFilter extends Filter if (!Util::checkNumeric($cr[2], NUM_CAST_INT)) return false; - if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_achievement WHERE id = ?d', $cr[2])) + if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_achievement WHERE `id` = ?d', $cr[2])) return false; $k = 'acv_'.Util::createHash(12); diff --git a/includes/types/quest.class.php b/includes/types/quest.class.php index 4355e673..bf58cd08 100644 --- a/includes/types/quest.class.php +++ b/includes/types/quest.class.php @@ -439,53 +439,53 @@ class QuestListFilter extends Filter ); protected $genericFilter = array( - 1 => [FILTER_CR_CALLBACK, 'cbReputation', '>', null], // increasesrepwith - 2 => [FILTER_CR_NUMERIC, 'rewardXP', NUM_CAST_INT ], // experiencegained - 3 => [FILTER_CR_NUMERIC, 'rewardOrReqMoney', NUM_CAST_INT ], // moneyrewarded - 4 => [FILTER_CR_CALLBACK, 'cbSpellRewards', null, null], // spellrewarded [yn] - 5 => [FILTER_CR_FLAG, 'flags', QUEST_FLAG_SHARABLE ], // sharable - 6 => [FILTER_CR_NUMERIC, 'timeLimit', NUM_CAST_INT ], // timer - 7 => [FILTER_CR_NYI_PH, null, 1 ], // firstquestseries - 9 => [FILTER_CR_CALLBACK, 'cbEarnReputation', null, null], // objectiveearnrepwith [enum] - 10 => [FILTER_CR_CALLBACK, 'cbReputation', '<', null], // decreasesrepwith - 11 => [FILTER_CR_NUMERIC, 'suggestedPlayers', NUM_CAST_INT ], // suggestedplayers - 15 => [FILTER_CR_NYI_PH, null, 1 ], // lastquestseries - 16 => [FILTER_CR_NYI_PH, null, 1 ], // partseries - 18 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 19 => [FILTER_CR_CALLBACK, 'cbQuestRelation', 0x1, null], // startsfrom [enum] - 21 => [FILTER_CR_CALLBACK, 'cbQuestRelation', 0x2, null], // endsat [enum] - 22 => [FILTER_CR_CALLBACK, 'cbItemRewards', null, null], // itemrewards [op] [int] - 23 => [FILTER_CR_CALLBACK, 'cbItemChoices', null, null], // itemchoices [op] [int] - 24 => [FILTER_CR_CALLBACK, 'cbLacksStartEnd', null, null], // lacksstartend [yn] - 25 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 27 => [FILTER_CR_FLAG, 'flags', QUEST_FLAG_DAILY ], // daily - 28 => [FILTER_CR_FLAG, 'flags', QUEST_FLAG_WEEKLY ], // weekly - 29 => [FILTER_CR_CALLBACK, 'cbRepeatable', null ], // repeatable - 30 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT, true], // id - 33 => [FILTER_CR_ENUM, 'e.holidayId', true, true], // relatedevent - 34 => [FILTER_CR_CALLBACK, 'cbAvailable', null, null], // availabletoplayers [yn] - 36 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 37 => [FILTER_CR_CALLBACK, 'cbClassSpec', null, null], // classspecific [enum] - 38 => [FILTER_CR_CALLBACK, 'cbRaceSpec', null, null], // racespecific [enum] - 42 => [FILTER_CR_STAFFFLAG, 'flags' ], // flags - 43 => [FILTER_CR_CALLBACK, 'cbCurrencyReward', null, null], // currencyrewarded [enum] - 44 => [FILTER_CR_CALLBACK, 'cbLoremaster', null, null], // countsforloremaster_stc [yn] - 45 => [FILTER_CR_BOOLEAN, 'rewardTitleId' ] // titlerewarded + 1 => [parent::CR_CALLBACK, 'cbReputation', '>', null], // increasesrepwith + 2 => [parent::CR_NUMERIC, 'rewardXP', NUM_CAST_INT ], // experiencegained + 3 => [parent::CR_NUMERIC, 'rewardOrReqMoney', NUM_CAST_INT ], // moneyrewarded + 4 => [parent::CR_CALLBACK, 'cbSpellRewards', null, null], // spellrewarded [yn] + 5 => [parent::CR_FLAG, 'flags', QUEST_FLAG_SHARABLE ], // sharable + 6 => [parent::CR_NUMERIC, 'timeLimit', NUM_CAST_INT ], // timer + 7 => [parent::CR_NYI_PH, null, 1 ], // firstquestseries + 9 => [parent::CR_CALLBACK, 'cbEarnReputation', null, null], // objectiveearnrepwith [enum] + 10 => [parent::CR_CALLBACK, 'cbReputation', '<', null], // decreasesrepwith + 11 => [parent::CR_NUMERIC, 'suggestedPlayers', NUM_CAST_INT ], // suggestedplayers + 15 => [parent::CR_NYI_PH, null, 1 ], // lastquestseries + 16 => [parent::CR_NYI_PH, null, 1 ], // partseries + 18 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots + 19 => [parent::CR_CALLBACK, 'cbQuestRelation', 0x1, null], // startsfrom [enum] + 21 => [parent::CR_CALLBACK, 'cbQuestRelation', 0x2, null], // endsat [enum] + 22 => [parent::CR_CALLBACK, 'cbItemRewards', null, null], // itemrewards [op] [int] + 23 => [parent::CR_CALLBACK, 'cbItemChoices', null, null], // itemchoices [op] [int] + 24 => [parent::CR_CALLBACK, 'cbLacksStartEnd', null, null], // lacksstartend [yn] + 25 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments + 27 => [parent::CR_FLAG, 'flags', QUEST_FLAG_DAILY ], // daily + 28 => [parent::CR_FLAG, 'flags', QUEST_FLAG_WEEKLY ], // weekly + 29 => [parent::CR_CALLBACK, 'cbRepeatable', null ], // repeatable + 30 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT, true], // id + 33 => [parent::CR_ENUM, 'e.holidayId', true, true], // relatedevent + 34 => [parent::CR_CALLBACK, 'cbAvailable', null, null], // availabletoplayers [yn] + 36 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos + 37 => [parent::CR_CALLBACK, 'cbClassSpec', null, null], // classspecific [enum] + 38 => [parent::CR_CALLBACK, 'cbRaceSpec', null, null], // racespecific [enum] + 42 => [parent::CR_STAFFFLAG, 'flags' ], // flags + 43 => [parent::CR_CALLBACK, 'cbCurrencyReward', null, null], // currencyrewarded [enum] + 44 => [parent::CR_CALLBACK, 'cbLoremaster', null, null], // countsforloremaster_stc [yn] + 45 => [parent::CR_BOOLEAN, 'rewardTitleId' ] // titlerewarded ); protected $inputFields = array( - 'cr' => [FILTER_V_RANGE, [1, 45], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 99999]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_INT, true ], // criteria values - only numerals - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name / text - only printable chars, no delimiter - 'ex' => [FILTER_V_EQUAL, 'on', false], // also match subname - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'minle' => [FILTER_V_RANGE, [1, 99], false], // min quest level - 'maxle' => [FILTER_V_RANGE, [1, 99], false], // max quest level - 'minrl' => [FILTER_V_RANGE, [1, 99], false], // min required level - 'maxrl' => [FILTER_V_RANGE, [1, 99], false], // max required level - 'si' => [FILTER_V_LIST, [-2, -1, 1, 2, 3], false], // siede - 'ty' => [FILTER_V_LIST, [0, 1, 21, 41, 62, [81, 85], 88, 89], true ] // type + 'cr' => [parent::V_RANGE, [1, 45], true ], // criteria ids + 'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 99999]], true ], // criteria operators + 'crv' => [parent::V_REGEX, parent::PATTERN_INT, true ], // criteria values - only numerals + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name / text - only printable chars, no delimiter + 'ex' => [parent::V_EQUAL, 'on', false], // also match subname + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'minle' => [parent::V_RANGE, [1, 99], false], // min quest level + 'maxle' => [parent::V_RANGE, [1, 99], false], // max quest level + 'minrl' => [parent::V_RANGE, [1, 99], false], // min required level + 'maxrl' => [parent::V_RANGE, [1, 99], false], // max required level + 'si' => [parent::V_LIST, [-SIDE_HORDE, -SIDE_ALLIANCE, SIDE_ALLIANCE, SIDE_HORDE, SIDE_BOTH], false], // side + 'ty' => [parent::V_LIST, [0, 1, 21, 41, 62, [81, 85], 88, 89], true ] // type ); protected function createSQLForValues() @@ -530,19 +530,19 @@ class QuestListFilter extends Filter switch ($_v['si']) { - case 3: + case SIDE_BOTH: $parts[] = $notEx; break; - case 2: + case SIDE_HORDE: $parts[] = ['OR', $notEx, ['reqRaceMask', RACE_MASK_HORDE, '&']]; break; - case -2: + case -SIDE_HORDE: $parts[] = ['AND', $ex, ['reqRaceMask', RACE_MASK_HORDE, '&']]; break; - case 1: + case SIDE_ALLIANCE: $parts[] = ['OR', $notEx, ['reqRaceMask', RACE_MASK_ALLIANCE, '&']]; break; - case -1: + case -SIDE_ALLIANCE: $parts[] = ['AND', $ex, ['reqRaceMask', RACE_MASK_ALLIANCE, '&']]; break; } @@ -563,7 +563,7 @@ class QuestListFilter extends Filter if (!in_array($cr[1], $this->enums[$cr[0]])) return false; - if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_factions WHERE id = ?d', $cr[1])) + if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_factions WHERE `id` = ?d', $cr[1])) $this->formData['reputationCols'][] = [$cr[1], Util::localizedString($_, 'name')]; return [ @@ -578,17 +578,13 @@ class QuestListFilter extends Filter protected function cbQuestRelation($cr, $flags) { - switch ($cr[1]) + return match($cr[1]) { - case 1: // npc - return ['AND', ['qse.type', Type::NPC], ['qse.method', $flags, '&']]; - case 2: // object - return ['AND', ['qse.type', Type::OBJECT], ['qse.method', $flags, '&']]; - case 3: // item - return ['AND', ['qse.type', Type::ITEM], ['qse.method', $flags, '&']]; - } - - return false; + Type::NPC, + Type::OBJECT, + Type::ITEM => ['AND', ['qse.type', $cr[1]], ['qse.method', $flags, '&']], + default => false + }; } protected function cbCurrencyReward($cr) @@ -675,9 +671,9 @@ class QuestListFilter extends Filter if (!Util::checkNumeric($cr[1], NUM_CAST_INT)) return false; - if ($cr[1] == FILTER_ENUM_ANY) // any + if ($cr[1] == parent::ENUM_ANY) // any return ['OR', ['reqFactionId1', 0, '>'], ['reqFactionId2', 0, '>']]; - else if ($cr[1] == FILTER_ENUM_NONE) // none + else if ($cr[1] == parent::ENUM_NONE) // none return ['AND', ['reqFactionId1', 0], ['reqFactionId2', 0]]; else if (in_array($cr[1], $this->enums[$cr[0]])) return ['OR', ['reqFactionId1', $cr[1]], ['reqFactionId2', $cr[1]]]; @@ -722,7 +718,7 @@ class QuestListFilter extends Filter if (!$this->int2Bool($cr[1])) return false; - $missing = DB::Aowow()->selectCol('SELECT questId, max(method) a, min(method) b FROM ?_quests_startend GROUP BY questId HAVING (a | b) <> 3'); + $missing = DB::Aowow()->selectCol('SELECT `questId`, BIT_OR(`method`) AS "se" FROM ?_quests_startend GROUP BY `questId` HAVING "se" <> 3'); if ($cr[1]) return ['id', $missing]; else diff --git a/includes/types/sound.class.php b/includes/types/sound.class.php index 535cb5e6..1a0cc281 100644 --- a/includes/types/sound.class.php +++ b/includes/types/sound.class.php @@ -43,12 +43,12 @@ class SoundList extends BaseType if ($this->fileBuffer) { - $files = DB::Aowow()->select('SELECT id AS ARRAY_KEY, `id`, `file` AS title, CAST(`type` AS UNSIGNED) AS type, `path` FROM ?_sounds_files sf WHERE id IN (?a)', array_keys($this->fileBuffer)); + $files = DB::Aowow()->select('SELECT `id` AS ARRAY_KEY, `id`, `file` AS "title", CAST(`type` AS UNSIGNED) AS "type", `path` FROM ?_sounds_files sf WHERE `id` IN (?a)', array_keys($this->fileBuffer)); foreach ($files as $id => $data) { // 3.3.5 bandaid - need fullpath to play via wow API, remove for cata and later $data['path'] = str_replace('\\', '\\\\', $data['path'] ? $data['path'] . '\\' . $data['title'] : $data['title']); - // skipp file extension + // skip file extension $data['title'] = substr($data['title'], 0, -4); // enum to string $data['type'] = self::$fileTypes[$data['type']]; @@ -97,8 +97,8 @@ class SoundList extends BaseType class SoundListFilter extends Filter { protected $inputFields = array( - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter - 'ty' => [FILTER_V_LIST, [[1, 4], 6, 9, 10, 12, 13, 14, 16, 17, [19, 23], [25, 31], 50, 52, 53], true ] // type + 'na' => [parent::V_REGEX, parent::PATTERN_NAME, false], // name - only printable chars, no delimiter + 'ty' => [parent::V_LIST, [[1, 4], 6, 9, 10, 12, 13, 14, 16, 17, [19, 23], [25, 31], 50, 52, 53], true ] // type ); protected function createSQLForValues() diff --git a/includes/types/spell.class.php b/includes/types/spell.class.php index d6ec6e42..e8338bc7 100644 --- a/includes/types/spell.class.php +++ b/includes/types/spell.class.php @@ -2321,124 +2321,124 @@ class SpellListFilter extends Filter ); protected $genericFilter = array( - 1 => [FILTER_CR_CALLBACK, 'cbCost', ], // costAbs [op] [int] - 2 => [FILTER_CR_NUMERIC, 'powerCostPercent', NUM_CAST_INT ], // prcntbasemanarequired - 3 => [FILTER_CR_BOOLEAN, 'spellFocusObject' ], // requiresnearbyobject - 4 => [FILTER_CR_NUMERIC, 'trainingcost', NUM_CAST_INT ], // trainingcost - 5 => [FILTER_CR_BOOLEAN, 'reqSpellId' ], // requiresprofspec - 8 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots - 9 => [FILTER_CR_CALLBACK, 'cbSource', ], // source [enum] - 10 => [FILTER_CR_FLAG, 'cuFlags', SPELL_CU_FIRST_RANK ], // firstrank - 11 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments - 12 => [FILTER_CR_FLAG, 'cuFlags', SPELL_CU_LAST_RANK ], // lastrank - 13 => [FILTER_CR_NUMERIC, 'rankNo', NUM_CAST_INT ], // rankno - 14 => [FILTER_CR_NUMERIC, 'id', NUM_CAST_INT, true ], // id - 15 => [FILTER_CR_STRING, 'ic.name', ], // icon - 17 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos - 19 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION ], // scaling - 20 => [FILTER_CR_CALLBACK, 'cbReagents', ], // has Reagents [yn] - // 22 => [FILTER_CR_NYI_PH, null, null, null ], // proficiencytype [proficiencytype] pointless - 25 => [FILTER_CR_BOOLEAN, 'skillLevelYellow' ], // rewardsskillups - 27 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_CHANNELED_1, true ], // channeled [yn] - 28 => [FILTER_CR_NUMERIC, 'castTime', NUM_CAST_FLOAT ], // casttime [num] - 29 => [FILTER_CR_CALLBACK, 'cbAuraNames', ], // appliesaura [effectauranames] - // 31 => [FILTER_CR_NYI_PH, null, null, null ], // usablewhenshapeshifted [yn] pointless - 33 => [FILTER_CR_CALLBACK, 'cbInverseFlag', 'attributes0', SPELL_ATTR0_CANT_USED_IN_COMBAT], // combatcastable [yn] - 34 => [FILTER_CR_CALLBACK, 'cbInverseFlag', 'attributes2', SPELL_ATTR2_CANT_CRIT ], // chancetocrit [yn] - 35 => [FILTER_CR_CALLBACK, 'cbInverseFlag', 'attributes3', SPELL_ATTR3_IGNORE_HIT_RESULT ], // chancetomiss [yn] - 36 => [FILTER_CR_FLAG, 'attributes3', SPELL_ATTR3_DEATH_PERSISTENT ], // persiststhroughdeath [yn] - 38 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_ONLY_STEALTHED ], // requiresstealth [yn] - 39 => [FILTER_CR_CALLBACK, 'cbSpellstealable', 'attributes4', SPELL_ATTR4_NOT_STEALABLE ], // spellstealable [yn] - 40 => [FILTER_CR_ENUM, 'damageClass' ], // damagetype [damagetype] - 41 => [FILTER_CR_FLAG, 'stanceMask', (1 << (22 - 1)) ], // requiresmetamorphosis [yn] - 42 => [FILTER_CR_FLAG, 'attributes5', SPELL_ATTR5_USABLE_WHILE_STUNNED ], // usablewhenstunned [yn] - 44 => [FILTER_CR_CALLBACK, 'cbUsableInArena' ], // usableinarenas [yn] - 45 => [FILTER_CR_ENUM, 'powerType' ], // resourcetype [resourcetype] - // 46 => [FILTER_CR_NYI_PH, null, null, null ], // disregardimmunity [yn] - 47 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE ], // disregardschoolimmunity [yn] - 48 => [FILTER_CR_CALLBACK, 'cbEquippedWeapon', 0x0004000C, false ], // reqrangedweapon [yn] - 49 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_ON_NEXT_SWING ], // onnextswingplayers [yn] - 50 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_PASSIVE ], // passivespell [yn] - 51 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR ], // hiddenaura [yn] - 52 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_ON_NEXT_SWING_2 ], // onnextswingnpcs [yn] - 53 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_DAYTIME_ONLY ], // daytimeonly [yn] - 54 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_NIGHT_ONLY ], // nighttimeonly [yn] - 55 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_INDOORS_ONLY ], // indoorsonly [yn] - 56 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_OUTDOORS_ONLY ], // outdoorsonly [yn] - 57 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_CANT_CANCEL ], // uncancellableaura [yn] - 58 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION ], // damagedependsonlevel [yn] - 59 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_STOP_ATTACK_TARGET ], // stopsautoattack [yn] - 60 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK ], // cannotavoid [yn] - 61 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_CASTABLE_WHILE_DEAD ], // usabledead [yn] - 62 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_CASTABLE_WHILE_MOUNTED ], // usablemounted [yn] - 63 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_DISABLED_WHILE_ACTIVE ], // delayedrecoverystarttime [yn] - 64 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_CASTABLE_WHILE_SITTING ], // usablesitting [yn] - 65 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_DRAIN_ALL_POWER ], // usesallpower [yn] - 66 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_CHANNELED_2, true ], // channeled [yn] - 67 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_CANT_BE_REFLECTED ], // cannotreflect [yn] - 68 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_NOT_BREAK_STEALTH ], // usablestealthed [yn] - 69 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_NEGATIVE_1 ], // harmful [yn] - 70 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_CANT_TARGET_IN_COMBAT ], // targetnotincombat [yn] - 71 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_NO_THREAT ], // nothreat [yn] - 72 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_IS_PICKPOCKET ], // pickpocket [yn] - 73 => [FILTER_CR_FLAG, 'attributes1', SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY ], // dispelauraonimmunity [yn] - 74 => [FILTER_CR_CALLBACK, 'cbEquippedWeapon', 0x00100000, false ], // reqfishingpole [yn] - 75 => [FILTER_CR_FLAG, 'attributes2', SPELL_ATTR2_CANT_TARGET_TAPPED ], // requntappedtarget [yn] - // 76 => [FILTER_CR_NYI_PH, null, null, null ], // targetownitem [yn] // the flag for this has to be somewhere.... - 77 => [FILTER_CR_FLAG, 'attributes2', SPELL_ATTR2_NOT_NEED_SHAPESHIFT ], // doesntreqshapeshift [yn] - 78 => [FILTER_CR_FLAG, 'attributes2', SPELL_ATTR2_FOOD_BUFF ], // foodbuff [yn] - 79 => [FILTER_CR_FLAG, 'attributes3', SPELL_ATTR3_ONLY_TARGET_PLAYERS ], // targetonlyplayer [yn] - 80 => [FILTER_CR_CALLBACK, 'cbEquippedWeapon', 1 << INVTYPE_WEAPONMAINHAND, true ], // reqmainhand [yn] - 81 => [FILTER_CR_FLAG, 'attributes3', SPELL_ATTR3_NO_INITIAL_AGGRO ], // doesntengagetarget [yn] - 82 => [FILTER_CR_CALLBACK, 'cbEquippedWeapon', 0x00080000, false ], // reqwand [yn] - 83 => [FILTER_CR_CALLBACK, 'cbEquippedWeapon', 1 << INVTYPE_WEAPONOFFHAND, true ], // reqoffhand [yn] - 84 => [FILTER_CR_FLAG, 'attributes0', SPELL_ATTR0_HIDE_IN_COMBAT_LOG ], // nolog [yn] - 85 => [FILTER_CR_FLAG, 'attributes4', SPELL_ATTR4_FADES_WHILE_LOGGED_OUT ], // auratickswhileloggedout [yn] - 87 => [FILTER_CR_FLAG, 'attributes5', SPELL_ATTR5_START_PERIODIC_AT_APPLY ], // startstickingatapplication [yn] - 88 => [FILTER_CR_FLAG, 'attributes5', SPELL_ATTR5_USABLE_WHILE_CONFUSED ], // usableconfused [yn] - 89 => [FILTER_CR_FLAG, 'attributes5', SPELL_ATTR5_USABLE_WHILE_FEARED ], // usablefeared [yn] - 90 => [FILTER_CR_FLAG, 'attributes6', SPELL_ATTR6_ONLY_IN_ARENA ], // onlyarena [yn] - 91 => [FILTER_CR_FLAG, 'attributes6', SPELL_ATTR6_NOT_IN_RAID_INSTANCE ], // notinraid [yn] - 92 => [FILTER_CR_FLAG, 'attributes7', SPELL_ATTR7_REACTIVATE_AT_RESURRECT ], // paladinaura [yn] - 93 => [FILTER_CR_FLAG, 'attributes7', SPELL_ATTR7_SUMMON_PLAYER_TOTEM ], // totemspell [yn] - 95 => [FILTER_CR_CALLBACK, 'cbBandageSpell' ], // bandagespell [yn] ...don't ask - 96 => [FILTER_CR_STAFFFLAG, 'attributes0' ], // flags1 [flags] - 97 => [FILTER_CR_STAFFFLAG, 'attributes1' ], // flags2 [flags] - 98 => [FILTER_CR_STAFFFLAG, 'attributes2' ], // flags3 [flags] - 99 => [FILTER_CR_STAFFFLAG, 'attributes3' ], // flags4 [flags] - 100 => [FILTER_CR_STAFFFLAG, 'attributes4' ], // flags5 [flags] - 101 => [FILTER_CR_STAFFFLAG, 'attributes5' ], // flags6 [flags] - 102 => [FILTER_CR_STAFFFLAG, 'attributes6' ], // flags7 [flags] - 103 => [FILTER_CR_STAFFFLAG, 'attributes7' ], // flags8 [flags] - 104 => [FILTER_CR_STAFFFLAG, 'targets' ], // flags9 [flags] - 105 => [FILTER_CR_STAFFFLAG, 'stanceMaskNot' ], // flags10 [flags] - 106 => [FILTER_CR_STAFFFLAG, 'spellFamilyFlags1' ], // flags11 [flags] - 107 => [FILTER_CR_STAFFFLAG, 'spellFamilyFlags2' ], // flags12 [flags] - 108 => [FILTER_CR_STAFFFLAG, 'spellFamilyFlags3' ], // flags13 [flags] - 109 => [FILTER_CR_CALLBACK, 'cbEffectNames', ], // effecttype [effecttype] - // 110 => [FILTER_CR_NYI_PH, null, null, null ], // scalingap [yn] // unreasonably complex for now - // 111 => [FILTER_CR_NYI_PH, null, null, null ], // scalingsp [yn] // unreasonably complex for now - 114 => [FILTER_CR_CALLBACK, 'cbReqFaction' ], // requiresfaction [side] - 116 => [FILTER_CR_BOOLEAN, 'startRecoveryTime' ] // onGlobalCooldown [yn] + 1 => [parent::CR_CALLBACK, 'cbCost', ], // costAbs [op] [int] + 2 => [parent::CR_NUMERIC, 'powerCostPercent', NUM_CAST_INT ], // prcntbasemanarequired + 3 => [parent::CR_BOOLEAN, 'spellFocusObject' ], // requiresnearbyobject + 4 => [parent::CR_NUMERIC, 'trainingcost', NUM_CAST_INT ], // trainingcost + 5 => [parent::CR_BOOLEAN, 'reqSpellId' ], // requiresprofspec + 8 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots + 9 => [parent::CR_CALLBACK, 'cbSource', ], // source [enum] + 10 => [parent::CR_FLAG, 'cuFlags', SPELL_CU_FIRST_RANK ], // firstrank + 11 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments + 12 => [parent::CR_FLAG, 'cuFlags', SPELL_CU_LAST_RANK ], // lastrank + 13 => [parent::CR_NUMERIC, 'rankNo', NUM_CAST_INT ], // rankno + 14 => [parent::CR_NUMERIC, 'id', NUM_CAST_INT, true ], // id + 15 => [parent::CR_STRING, 'ic.name', ], // icon + 17 => [parent::CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos + 19 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION ], // scaling + 20 => [parent::CR_CALLBACK, 'cbReagents', ], // has Reagents [yn] + // 22 => [parent::CR_NYI_PH, null, null, null ], // proficiencytype [proficiencytype] pointless + 25 => [parent::CR_BOOLEAN, 'skillLevelYellow' ], // rewardsskillups + 27 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_CHANNELED_1, true ], // channeled [yn] + 28 => [parent::CR_NUMERIC, 'castTime', NUM_CAST_FLOAT ], // casttime [num] + 29 => [parent::CR_CALLBACK, 'cbAuraNames', ], // appliesaura [effectauranames] + // 31 => [parent::CR_NYI_PH, null, null, null ], // usablewhenshapeshifted [yn] pointless + 33 => [parent::CR_CALLBACK, 'cbInverseFlag', 'attributes0', SPELL_ATTR0_CANT_USED_IN_COMBAT], // combatcastable [yn] + 34 => [parent::CR_CALLBACK, 'cbInverseFlag', 'attributes2', SPELL_ATTR2_CANT_CRIT ], // chancetocrit [yn] + 35 => [parent::CR_CALLBACK, 'cbInverseFlag', 'attributes3', SPELL_ATTR3_IGNORE_HIT_RESULT ], // chancetomiss [yn] + 36 => [parent::CR_FLAG, 'attributes3', SPELL_ATTR3_DEATH_PERSISTENT ], // persiststhroughdeath [yn] + 38 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_ONLY_STEALTHED ], // requiresstealth [yn] + 39 => [parent::CR_CALLBACK, 'cbSpellstealable', 'attributes4', SPELL_ATTR4_NOT_STEALABLE ], // spellstealable [yn] + 40 => [parent::CR_ENUM, 'damageClass' ], // damagetype [damagetype] + 41 => [parent::CR_FLAG, 'stanceMask', (1 << (22 - 1)) ], // requiresmetamorphosis [yn] + 42 => [parent::CR_FLAG, 'attributes5', SPELL_ATTR5_USABLE_WHILE_STUNNED ], // usablewhenstunned [yn] + 44 => [parent::CR_CALLBACK, 'cbUsableInArena' ], // usableinarenas [yn] + 45 => [parent::CR_ENUM, 'powerType' ], // resourcetype [resourcetype] + // 46 => [parent::CR_NYI_PH, null, null, null ], // disregardimmunity [yn] + 47 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE ], // disregardschoolimmunity [yn] + 48 => [parent::CR_CALLBACK, 'cbEquippedWeapon', 0x0004000C, false ], // reqrangedweapon [yn] + 49 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_ON_NEXT_SWING ], // onnextswingplayers [yn] + 50 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_PASSIVE ], // passivespell [yn] + 51 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR ], // hiddenaura [yn] + 52 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_ON_NEXT_SWING_2 ], // onnextswingnpcs [yn] + 53 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_DAYTIME_ONLY ], // daytimeonly [yn] + 54 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_NIGHT_ONLY ], // nighttimeonly [yn] + 55 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_INDOORS_ONLY ], // indoorsonly [yn] + 56 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_OUTDOORS_ONLY ], // outdoorsonly [yn] + 57 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_CANT_CANCEL ], // uncancellableaura [yn] + 58 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION ], // damagedependsonlevel [yn] + 59 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_STOP_ATTACK_TARGET ], // stopsautoattack [yn] + 60 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK ], // cannotavoid [yn] + 61 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_CASTABLE_WHILE_DEAD ], // usabledead [yn] + 62 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_CASTABLE_WHILE_MOUNTED ], // usablemounted [yn] + 63 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_DISABLED_WHILE_ACTIVE ], // delayedrecoverystarttime [yn] + 64 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_CASTABLE_WHILE_SITTING ], // usablesitting [yn] + 65 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_DRAIN_ALL_POWER ], // usesallpower [yn] + 66 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_CHANNELED_2, true ], // channeled [yn] + 67 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_CANT_BE_REFLECTED ], // cannotreflect [yn] + 68 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_NOT_BREAK_STEALTH ], // usablestealthed [yn] + 69 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_NEGATIVE_1 ], // harmful [yn] + 70 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_CANT_TARGET_IN_COMBAT ], // targetnotincombat [yn] + 71 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_NO_THREAT ], // nothreat [yn] + 72 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_IS_PICKPOCKET ], // pickpocket [yn] + 73 => [parent::CR_FLAG, 'attributes1', SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY ], // dispelauraonimmunity [yn] + 74 => [parent::CR_CALLBACK, 'cbEquippedWeapon', 0x00100000, false ], // reqfishingpole [yn] + 75 => [parent::CR_FLAG, 'attributes2', SPELL_ATTR2_CANT_TARGET_TAPPED ], // requntappedtarget [yn] + // 76 => [parent::CR_NYI_PH, null, null, null ], // targetownitem [yn] // the flag for this has to be somewhere.... + 77 => [parent::CR_FLAG, 'attributes2', SPELL_ATTR2_NOT_NEED_SHAPESHIFT ], // doesntreqshapeshift [yn] + 78 => [parent::CR_FLAG, 'attributes2', SPELL_ATTR2_FOOD_BUFF ], // foodbuff [yn] + 79 => [parent::CR_FLAG, 'attributes3', SPELL_ATTR3_ONLY_TARGET_PLAYERS ], // targetonlyplayer [yn] + 80 => [parent::CR_CALLBACK, 'cbEquippedWeapon', 1 << INVTYPE_WEAPONMAINHAND, true ], // reqmainhand [yn] + 81 => [parent::CR_FLAG, 'attributes3', SPELL_ATTR3_NO_INITIAL_AGGRO ], // doesntengagetarget [yn] + 82 => [parent::CR_CALLBACK, 'cbEquippedWeapon', 0x00080000, false ], // reqwand [yn] + 83 => [parent::CR_CALLBACK, 'cbEquippedWeapon', 1 << INVTYPE_WEAPONOFFHAND, true ], // reqoffhand [yn] + 84 => [parent::CR_FLAG, 'attributes0', SPELL_ATTR0_HIDE_IN_COMBAT_LOG ], // nolog [yn] + 85 => [parent::CR_FLAG, 'attributes4', SPELL_ATTR4_FADES_WHILE_LOGGED_OUT ], // auratickswhileloggedout [yn] + 87 => [parent::CR_FLAG, 'attributes5', SPELL_ATTR5_START_PERIODIC_AT_APPLY ], // startstickingatapplication [yn] + 88 => [parent::CR_FLAG, 'attributes5', SPELL_ATTR5_USABLE_WHILE_CONFUSED ], // usableconfused [yn] + 89 => [parent::CR_FLAG, 'attributes5', SPELL_ATTR5_USABLE_WHILE_FEARED ], // usablefeared [yn] + 90 => [parent::CR_FLAG, 'attributes6', SPELL_ATTR6_ONLY_IN_ARENA ], // onlyarena [yn] + 91 => [parent::CR_FLAG, 'attributes6', SPELL_ATTR6_NOT_IN_RAID_INSTANCE ], // notinraid [yn] + 92 => [parent::CR_FLAG, 'attributes7', SPELL_ATTR7_REACTIVATE_AT_RESURRECT ], // paladinaura [yn] + 93 => [parent::CR_FLAG, 'attributes7', SPELL_ATTR7_SUMMON_PLAYER_TOTEM ], // totemspell [yn] + 95 => [parent::CR_CALLBACK, 'cbBandageSpell' ], // bandagespell [yn] ...don't ask + 96 => [parent::CR_STAFFFLAG, 'attributes0' ], // flags1 [flags] + 97 => [parent::CR_STAFFFLAG, 'attributes1' ], // flags2 [flags] + 98 => [parent::CR_STAFFFLAG, 'attributes2' ], // flags3 [flags] + 99 => [parent::CR_STAFFFLAG, 'attributes3' ], // flags4 [flags] + 100 => [parent::CR_STAFFFLAG, 'attributes4' ], // flags5 [flags] + 101 => [parent::CR_STAFFFLAG, 'attributes5' ], // flags6 [flags] + 102 => [parent::CR_STAFFFLAG, 'attributes6' ], // flags7 [flags] + 103 => [parent::CR_STAFFFLAG, 'attributes7' ], // flags8 [flags] + 104 => [parent::CR_STAFFFLAG, 'targets' ], // flags9 [flags] + 105 => [parent::CR_STAFFFLAG, 'stanceMaskNot' ], // flags10 [flags] + 106 => [parent::CR_STAFFFLAG, 'spellFamilyFlags1' ], // flags11 [flags] + 107 => [parent::CR_STAFFFLAG, 'spellFamilyFlags2' ], // flags12 [flags] + 108 => [parent::CR_STAFFFLAG, 'spellFamilyFlags3' ], // flags13 [flags] + 109 => [parent::CR_CALLBACK, 'cbEffectNames', ], // effecttype [effecttype] + // 110 => [parent::CR_NYI_PH, null, null, null ], // scalingap [yn] // unreasonably complex for now + // 111 => [parent::CR_NYI_PH, null, null, null ], // scalingsp [yn] // unreasonably complex for now + 114 => [parent::CR_CALLBACK, 'cbReqFaction' ], // requiresfaction [side] + 116 => [parent::CR_BOOLEAN, 'startRecoveryTime' ] // onGlobalCooldown [yn] ); protected $inputFields = array( - 'cr' => [FILTER_V_RANGE, [1, 116], true ], // criteria ids - 'crs' => [FILTER_V_LIST, [FILTER_ENUM_NONE, FILTER_ENUM_ANY, [0, 99999]], true ], // criteria operators - 'crv' => [FILTER_V_REGEX, parent::PATTERN_CRV, true ], // criteria values - only printable chars, no delimiters - 'na' => [FILTER_V_REGEX, parent::PATTERN_NAME, false], // name / text - only printable chars, no delimiter - 'ex' => [FILTER_V_EQUAL, 'on', false], // extended name search - 'ma' => [FILTER_V_EQUAL, 1, false], // match any / all filter - 'minle' => [FILTER_V_RANGE, [1, 99], false], // spell level min - 'maxle' => [FILTER_V_RANGE, [1, 99], false], // spell level max - 'minrs' => [FILTER_V_RANGE, [1, 999], false], // required skill level min - 'maxrs' => [FILTER_V_RANGE, [1, 999], false], // required skill level max - 'ra' => [FILTER_V_LIST, [[1, 8], 10, 11], false], // races - 'cl' => [FILTER_V_CALLBACK, 'cbClasses', true ], // classes - 'gl' => [FILTER_V_CALLBACK, 'cbGlyphs', true ], // glyph type - 'sc' => [FILTER_V_RANGE, [0, 6], true ], // magic schools - 'dt' => [FILTER_V_LIST, [[1, 6], 9], false], // dispel types - 'me' => [FILTER_V_RANGE, [1, 31], false] // mechanics + 'cr' => [parent::V_RANGE, [1, 116], true ], // criteria ids + 'crs' => [parent::V_LIST, [parent::ENUM_NONE, parent::ENUM_ANY, [0, 99999]], 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 / text - only printable chars, no delimiter + 'ex' => [parent::V_EQUAL, 'on', false], // extended name search + 'ma' => [parent::V_EQUAL, 1, false], // match any / all filter + 'minle' => [parent::V_RANGE, [1, 99], false], // spell level min + 'maxle' => [parent::V_RANGE, [1, 99], false], // spell level max + 'minrs' => [parent::V_RANGE, [1, 999], false], // required skill level min + 'maxrs' => [parent::V_RANGE, [1, 999], false], // required skill level max + 'ra' => [parent::V_LIST, [[1, 8], 10, 11], false], // races + 'cl' => [parent::V_CALLBACK, 'cbClasses', true ], // classes + 'gl' => [parent::V_CALLBACK, 'cbGlyphs', true ], // glyph type + 'sc' => [parent::V_RANGE, [0, 6], true ], // magic schools + 'dt' => [parent::V_LIST, [[1, 6], 9], false], // dispel types + 'me' => [parent::V_RANGE, [1, 31], false] // mechanics ); protected function createSQLForValues() @@ -2515,7 +2515,7 @@ class SpellListFilter extends Filter if (!Util::checkNumeric($val, NUM_CAST_INT)) return false; - $type = FILTER_V_LIST; + $type = parent::V_LIST; $valid = [[1, 9], 11]; return $this->checkInput($type, $valid, $val); @@ -2529,7 +2529,7 @@ class SpellListFilter extends Filter if (!Util::checkNumeric($val, NUM_CAST_INT)) return false; - $type = FILTER_V_LIST; + $type = parent::V_LIST; $valid = [1, 2]; return $this->checkInput($type, $valid, $val); @@ -2575,7 +2575,7 @@ class SpellListFilter extends Filter protected function cbAuraNames($cr) { - if (!$this->checkInput(FILTER_V_RANGE, [1, self::MAX_SPELL_AURA], $cr[1])) + if (!$this->checkInput(parent::V_RANGE, [1, self::MAX_SPELL_AURA], $cr[1])) return false; return ['OR', ['effect1AuraId', $cr[1]], ['effect2AuraId', $cr[1]], ['effect3AuraId', $cr[1]]]; @@ -2583,7 +2583,7 @@ class SpellListFilter extends Filter protected function cbEffectNames($cr) { - if (!$this->checkInput(FILTER_V_RANGE, [1, self::MAX_SPELL_EFFECT], $cr[1])) + if (!$this->checkInput(parent::V_RANGE, [1, self::MAX_SPELL_EFFECT], $cr[1])) return false; return ['OR', ['effect1Id', $cr[1]], ['effect2Id', $cr[1]], ['effect3Id', $cr[1]]]; @@ -2606,9 +2606,9 @@ class SpellListFilter extends Filter return false; if ($cr[1]) - return ['AND', [[$field, $flag, '&'], 0], ['dispelType', 1]]; + return ['AND', [[$field, $flag, '&'], 0], ['dispelType', SPELL_DAMAGE_CLASS_MAGIC]]; else - return ['OR', [$field, $flag, '&'], ['dispelType', 1, '!']]; + return ['OR', [$field, $flag, '&'], ['dispelType', SPELL_DAMAGE_CLASS_MAGIC, '!']]; } protected function cbReqFaction($cr) diff --git a/includes/utilities.php b/includes/utilities.php index 7186e146..e3a05a3e 100644 --- a/includes/utilities.php +++ b/includes/utilities.php @@ -966,7 +966,7 @@ abstract class Util } // doesn't handle scientific notation .. why would you input 3e3 for 3000..? - public static function checkNumeric(&$data, $typeCast = NUM_ANY) : bool + public static function checkNumeric(mixed &$data, int $typeCast = NUM_ANY) : bool { if ($data === null) return false; @@ -1770,7 +1770,7 @@ abstract class Type public static function getJSGlobalTemplate(int $type) : array { - if (!self::exists($type)) + if (!self::exists($type) || !self::$data[$type][self::IDX_JSG_TPL]) return []; // [key, [data], [extraData]] diff --git a/pages/spell.php b/pages/spell.php index eca3c2b4..8d37e94f 100644 --- a/pages/spell.php +++ b/pages/spell.php @@ -2288,7 +2288,7 @@ class SpellPage extends GenericPage { $cbBandageSpell = function() { - return ($this->subject->getField('attributes1') & 0x00004044) && ($this->subject->getField('effect1ImplicitTargetA') == 21); + return ($this->subject->getField('attributes1') & (SPELL_ATTR1_CHANNELED_1 | SPELL_ATTR1_CHANNELED_2 | SPELL_ATTR1_CHANNEL_TRACK_TARGET)) && ($this->subject->getField('effect1ImplicitTargetA') == 21); }; $cbInverseFlag = function($field, $flag) @@ -2305,7 +2305,7 @@ class SpellPage extends GenericPage $cbSpellstealable = function($field, $flag) { - return !($this->subject->getField($field) & $flag) && ($this->subject->getField('dispelType') == 1); + return !($this->subject->getField($field) & $flag) && ($this->subject->getField('dispelType') == SPELL_DAMAGE_CLASS_MAGIC); }; $list = []; @@ -2314,14 +2314,14 @@ class SpellPage extends GenericPage { if ($cr = $fi->getGenericFilter($idx)) { - if ($cr[0] == FILTER_CR_CALLBACK) + if ($cr[0] == Filter::CR_CALLBACK) { if (!isset($cr[1])) trigger_error('SpellDetailPage::createAttributesList - callback handler '.$cr[1].' not defined for IDX #'.$idx, E_USER_WARNING); else if (${$cr[1]}($cr[2] ?? null, $cr[3] ?? null)) $list[] = $idx; } - else if ($cr[0] == FILTER_CR_FLAG) + else if ($cr[0] == Filter::CR_FLAG) { if ($this->subject->getField($cr[1]) & $cr[2]) $list[] = $idx;