- move sources from individual tables to a single table with searchable format

- implemented 'group by source' and most source-related filters in items.php
note: some fields are not yet set and searches against those will yield no usable result

- fixed js-error; always expecting array characters in g_user
- fixed rep gain on first login, when using external auth
- fixed wrong lootIds in ?_objects, where the field size was too small
This commit is contained in:
Sarjuuk
2014-09-02 23:35:20 +02:00
parent 5f09b7e5c5
commit 13e45827e4
20 changed files with 37622 additions and 198 deletions

View File

@@ -194,7 +194,7 @@ define('CUSTOM_HAS_VIDEO', 0x04000000);
define('CUSTOM_DISABLED', 0x08000000); define('CUSTOM_DISABLED', 0x08000000);
define('CUSTOM_SERVERSIDE', 0x10000000); define('CUSTOM_SERVERSIDE', 0x10000000);
define('CUSTOM_UNAVAILABLE', 0x20000000); define('CUSTOM_UNAVAILABLE', 0x20000000);
define('CUSTOM_EXCLUDE_FOR_LISTVIEW', 0x40000000); // will not show up in search or on listPage (override for staff) define('CUSTOM_EXCLUDE_FOR_LISTVIEW', 0x40000000); // will not show up in search or on listPage (override for staff)
// Custom Flags (per type) // Custom Flags (per type)
define('SPELL_CU_TALENT', 0x0001); // passive talent define('SPELL_CU_TALENT', 0x0001); // passive talent
@@ -223,6 +223,9 @@ define('NPC_CU_INSTANCE_BOSS', 0x01);
define('NPC_CU_DIFFICULTY_DUMMY', 0x02); define('NPC_CU_DIFFICULTY_DUMMY', 0x02);
define('NPC_CU_DUNGEON_ENCOUNTER', 0x04); define('NPC_CU_DUNGEON_ENCOUNTER', 0x04);
define('ITEM_CU_OT_ITEMLOOT', 0x01); // there are no sourceTypes for these two cases
define('ITEM_CU_OT_OBJECTLOOT', 0x02);
// as seen in wFlags // as seen in wFlags
define('QUEST_CU_REPEATABLE', 0x01); define('QUEST_CU_REPEATABLE', 0x01);
define('QUEST_CU_DAILY', 0x02); define('QUEST_CU_DAILY', 0x02);

View File

@@ -33,10 +33,10 @@ class Loot
LOOT_MILLING, // item LOOT_MILLING, // item
LOOT_CREATURE, // npc LOOT_CREATURE, // npc
LOOT_PICKPOCKET, // npc LOOT_PICKPOCKET, // npc
LOOT_SKINNING, // npc (see its flags for mining, herbing or actual skinning) LOOT_SKINNING, // npc (see its flags for mining, herbing, salvaging or actual skinning)
LOOT_FISHING, // zone LOOT_FISHING, // zone
LOOT_GAMEOBJECT, // object LOOT_GAMEOBJECT, // object (see its lockType for mining, herbing, fishing or generic looting)
LOOT_MAIL, // quest || achievement LOOT_MAIL, // quest
LOOT_SPELL // spell LOOT_SPELL // spell
); );
@@ -343,8 +343,7 @@ class Loot
['object', [], '$LANG.tab_minedfrom', 'mined-from-object', [], [], []], ['object', [], '$LANG.tab_minedfrom', 'mined-from-object', [], [], []],
['object', [], '$LANG.tab_gatheredfrom', 'gathered-from-object', [], [], []], ['object', [], '$LANG.tab_gatheredfrom', 'gathered-from-object', [], [], []],
['object', [], '$LANG.tab_fishedin', 'fished-in-object', [], [], []], ['object', [], '$LANG.tab_fishedin', 'fished-in-object', [], [], []],
['spell', [], '$LANG.tab_createdby', 'created-by', [], [], []], ['spell', [], '$LANG.tab_createdby', 'created-by', [], [], []]
['achievement', [], '$LANG.tab_rewardfrom', 'reward-from-achievemnt', [], [], []]
); );
$refResults = []; $refResults = [];
$chanceMods = []; $chanceMods = [];
@@ -520,12 +519,6 @@ class Loot
foreach ($srcObj->iterate() as $_) foreach ($srcObj->iterate() as $_)
$tabsFinal[10][1][] = array_merge($srcData[$srcObj->id], empty($result[$srcObj->id]) ? ['percent' => -1] : $result[$srcObj->id]); $tabsFinal[10][1][] = array_merge($srcData[$srcObj->id], empty($result[$srcObj->id]) ? ['percent' => -1] : $result[$srcObj->id]);
} }
/*
todo: search for achievements here
$tabsFinal[17]
*/
break; break;
case LOOT_SPELL: case LOOT_SPELL:
$conditions = ['OR', ['effect1CreateItemId', $this->entry], ['effect2CreateItemId', $this->entry], ['effect3CreateItemId', $this->entry]]; $conditions = ['OR', ['effect1CreateItemId', $this->entry], ['effect2CreateItemId', $this->entry], ['effect3CreateItemId', $this->entry]];

View File

@@ -393,6 +393,22 @@ abstract class BaseType
} }
} }
/* source More .. keys seen used
'n': name [always set]
't': type [always set]
'ti': typeId [always set]
'bd': BossDrop [0; 1] [Creature / GO]
'dd': DungeonDifficulty [-2: DungeonHC; -1: DungeonNM; 1: Raid10NM; 2:Raid25NM; 3:Raid10HM; 4: Raid25HM] [Creature / GO]
'q': cssQuality [Items]
'z': zone [set when all happens in here]
'p': PvP [pvpSourceId]
's': TYPE_TITLE: side; TYPE_SPELL: skillId (yeah, double use. Ain't life just grand)
'c': category [Spells / Quests]
'c2': subCat [Quests]
'icon': iconString
*/
public function getSourceData() {}
// should return data required to display a listview of any kind // should return data required to display a listview of any kind
// this is a rudimentary example, that will not suffice for most Types // this is a rudimentary example, that will not suffice for most Types
abstract public function getListviewData(); abstract public function getListviewData();
@@ -689,7 +705,10 @@ abstract class Filter
foreach (array_merge($this->fiData['c'], $this->fiData['v'], $override) as $k => $v) foreach (array_merge($this->fiData['c'], $this->fiData['v'], $override) as $k => $v)
{ {
if (isset($addCr[$k])) if (isset($addCr[$k]))
{
$v = $v ? array_merge((array)$v, (array)$addCr[$k]) : $addCr[$k]; $v = $v ? array_merge((array)$v, (array)$addCr[$k]) : $addCr[$k];
unset($addCr[$k]);
}
if (is_array($v) && !empty($v)) if (is_array($v) && !empty($v))
$_[$k] = $k.'='.implode(':', $v); $_[$k] = $k.'='.implode(':', $v);
@@ -697,6 +716,14 @@ abstract class Filter
$_[$k] = $k.'='.$v; $_[$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'];
}
return implode(';', $_); return implode(';', $_);
} }

View File

@@ -216,6 +216,25 @@ class CreatureList extends BaseType
return $data; return $data;
} }
public function getSourceData()
{
$data = [];
foreach ($this->iterate() as $__)
{
$data[$this->id] = array(
'n' => $this->getField('name', true),
't' => TYPE_NPC,
'ti' => $this->id,
// 'bd' => (int)($this->curTpl['cuFlags'] & NPC_CU_INSTANCE_BOSS || ($this->curTpl['typeFlags'] & 0x4 && $this->curTpl['rank']))
// 'z' where am i spawned
// 'dd' DungeonDifficulty requires 'z'
);
}
return $data;
}
public function addRewardsToJScript(&$refs) { } public function addRewardsToJScript(&$refs) { }
} }

View File

@@ -124,6 +124,24 @@ class GameObjectList extends BaseType
return $data; return $data;
} }
public function getSourceData()
{
$data = [];
foreach ($this->iterate() as $__)
{
$data[$this->id] = array(
'n' => $this->getField('name', true),
't' => TYPE_OBJECT,
'ti' => $this->id
// 'bd' => bossdrop
// 'dd' => dungeondifficulty
);
}
return $data;
}
} }

View File

@@ -13,6 +13,8 @@ class ItemList extends BaseType
public $json = []; public $json = [];
public $itemMods = []; public $itemMods = [];
public $sources = [];
public $sourceMore = [];
public $rndEnchIds = []; public $rndEnchIds = [];
public $subItems = []; public $subItems = [];
@@ -25,7 +27,8 @@ class ItemList extends BaseType
protected $queryOpts = array( protected $queryOpts = array(
'is' => ['j' => ['?_item_stats AS `is` ON `is`.`id` = `i`.`id`', true]], 'is' => ['j' => ['?_item_stats AS `is` ON `is`.`id` = `i`.`id`', true]],
's' => ['j' => ['?_spell AS `s` ON s.effect1CreateItemId = i.id', true], 'g' => 'i.id'], 's' => ['j' => ['?_spell AS `s` ON s.effect1CreateItemId = i.id', true], 'g' => 'i.id'],
'i' => [['is'], 'o' => 'i.quality DESC, i.itemLevel DESC'] 'i' => [['is', 'src'], 'o' => 'i.quality DESC, i.itemLevel DESC'],
'src' => ['j' => ['?_source src ON type = 3 AND typeId = i.id', true], 's' => ', moreType, moreTypeId, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10, src11, src12, src13, src14, src15, src16, src17, src18, src19, src20, src21, src22, src23, src24']
); );
public function __construct($conditions = [], $miscData = null) public function __construct($conditions = [], $miscData = null)
@@ -52,6 +55,18 @@ class ItemList extends BaseType
$_ = &$_curTpl['requiredRace']; $_ = &$_curTpl['requiredRace'];
if ($_ < 0 || ($_ & RACE_MASK_ALL) == RACE_MASK_ALL) if ($_ < 0 || ($_ & RACE_MASK_ALL) == RACE_MASK_ALL)
$_ = 0; $_ = 0;
// sources
if ($_curTpl['moreType'] && $_curTpl['moreTypeId'])
$this->sourceMore[$_curTpl['moreType']][] = $_curTpl['moreTypeId'];
for ($i = 1; $i < 25; $i++)
{
if ($_ = $_curTpl['src'.$i])
$this->sources[$this->id][$i][] = $_;
unset($_curTpl['src'.$i]);
}
} }
} }
@@ -225,6 +240,8 @@ class ItemList extends BaseType
* ITEMINFO_MODEL (0x20): sameModelAs-Tab * ITEMINFO_MODEL (0x20): sameModelAs-Tab
*/ */
$data = [];
// random item is random // random item is random
if ($addInfoMask & ITEMINFO_SUBITEMS) if ($addInfoMask & ITEMINFO_SUBITEMS)
$this->initSubItems(); $this->initSubItems();
@@ -232,7 +249,11 @@ class ItemList extends BaseType
if ($addInfoMask & ITEMINFO_JSON) if ($addInfoMask & ITEMINFO_JSON)
$this->extendJsonStats(); $this->extendJsonStats();
$data = []; // gather sourceMore data
if (!($addInfoMask & ITEMINFO_MODEL)) // probably others too
foreach ($this->sourceMore as $type => $ids)
$this->sourceMore[$type] = (new Util::$typeClasses[$type](array(['id', $ids], CFG_SQL_LIMIT_NONE)))->getSourceData();
foreach ($this->iterate() as $__) foreach ($this->iterate() as $__)
{ {
foreach ($this->json[$this->id] as $k => $v) foreach ($this->json[$this->id] as $k => $v)
@@ -354,10 +375,16 @@ class ItemList extends BaseType
if ($addInfoMask & ITEMINFO_MODEL) if ($addInfoMask & ITEMINFO_MODEL)
if ($_ = $this->getField('displayId')) if ($_ = $this->getField('displayId'))
$data[$this->id]['displayid'] = $_; $data[$this->id]['displayid'] = $_;
if (!empty($this->sources[$this->id]))
{
$data[$this->id]['source'] = array_keys($this->sources[$this->id]);
if ($this->curTpl['moreType'] && $this->curTpl['moreTypeId'] && !empty($this->sourceMore[$this->curTpl['moreType']][$this->curTpl['moreTypeId']]))
$data[$this->id]['sourcemore'] = [$this->sourceMore[$this->curTpl['moreType']][$this->curTpl['moreTypeId']]];
}
} }
/* even more complicated crap /* even more complicated crap
"source":[5],"sourcemore":[{"n":"Commander Oxheart","t":1,"ti":64606,"z":5842}],
modelviewer {type:X, displayid:Y, slot:z} .. not sure, when to set modelviewer {type:X, displayid:Y, slot:z} .. not sure, when to set
*/ */
@@ -1182,6 +1209,25 @@ class ItemList extends BaseType
return $onUseStats; return $onUseStats;
} }
public function getSourceData()
{
$data = [];
foreach ($this->iterate() as $__)
{
$data[$this->id] = array(
'n' => $this->getField('name', true),
't' => TYPE_ITEM,
'ti' => $this->id,
'q' => $this->curTpl['quality'],
// 'p' => PvP [NYI]
'icon' => $this->curTpl['iconString']
);
}
return $data;
}
private function canTeachSpell() private function canTeachSpell()
{ {
// 483: learn recipe; 55884: learn mount/pet // 483: learn recipe; 55884: learn mount/pet
@@ -1467,6 +1513,7 @@ class ItemListFilter extends Filter
private $ubFilter = []; // usable-by - limit weapon/armor selection per CharClass - itemClass => available itemsubclasses private $ubFilter = []; // usable-by - limit weapon/armor selection per CharClass - itemClass => available itemsubclasses
private $extCostQuery = 'SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE %s UNION private $extCostQuery = 'SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE %s UNION
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE %1$s'; SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE %1$s';
private $otFields = [18 => 4, 68 => 15, 69 => 16, 70 => 17, 72 => 2, 73 => 19, 75 => 21, 76 => 23, 88 => 20, 92 => 5, 93 => 3, 143 => 18, 171 => 8, 172 => 12];
public $extraOpts = []; // score for statWeights public $extraOpts = []; // score for statWeights
public $wtCnd = []; public $wtCnd = [];
@@ -1485,7 +1532,7 @@ class ItemListFilter extends Filter
8 => [10656, 10658, 10660 ], 8 => [10656, 10658, 10660 ],
9 => -1, 9 => -1,
10 => [26798, 26801, 26797 ], 10 => [26798, 26801, 26797 ],
11 => [ 9788, 9787, 17041, 17040, 17039, 20219, 20222, 10656, 10658, 10660, 26798, 26801, 26797], // i know, i know .. lazy as fuck 11 => [ 9788, 9787, 17041, 17040, 17039, 20219, 20222, 10656, 10658, 10660, 26798, 26801, 26797], // i know, i know .. lazy as fuck
12 => false, 12 => false,
13 => -1, 13 => -1,
14 => -1, 14 => -1,
@@ -1509,8 +1556,31 @@ class ItemListFilter extends Filter
31099, 40619, 40620, 40621, 30245, 30246, 30247, 45650, 45651, 45652, 34167, 40634, 40635, 40636, 45653, 45654, 45655, 40637, 40638, 40639, 45656, 45657, 45658, 31099, 40619, 40620, 40621, 30245, 30246, 30247, 45650, 45651, 45652, 34167, 40634, 40635, 40636, 45653, 45654, 45655, 40637, 40638, 40639, 45656, 45657, 45658,
34170, 34192, 29763, 29764, 29762, 31101, 31103, 31102, 30248, 30249, 30250, 47557, 47558, 47559, 34233, 34234, 34202, 34195, 34209, 40622, 40623, 40624, 34193, 34170, 34192, 29763, 29764, 29762, 31101, 31103, 31102, 30248, 30249, 30250, 47557, 47558, 47559, 34233, 34234, 34202, 34195, 34209, 40622, 40623, 40624, 34193,
45659, 45660, 45661, 34212, 34351, 34215 45659, 45660, 45661, 34212, 34351, 34215
),
128 => array( // source
1 => true, // Any
2 => false, // None
3 => 1, // Crafted
4 => 2, // Drop
5 => 3, // PvP
6 => 4, // Quest
7 => 5, // Vendor
9 => 10, // Starter
10 => 11, // Event
11 => 12 // Achievement
),
126 => array( // Zones
4494, 36, 2597, 3358, 45, 331, 3790, 4277, 16, 3524, 3, 3959, 719, 1584, 25, 1583, 2677, 3702, 3522, 4, 3525, 3537, 46, 1941,
2918, 3905, 4024, 2817, 4395, 4378, 148, 393, 1657, 41, 2257, 405, 2557, 65, 4196, 1, 14, 10, 15, 139, 12, 3430, 3820, 361,
357, 3433, 721, 394, 3923, 4416, 2917, 4272, 4820, 4264, 3483, 3562, 267, 495, 4742, 3606, 210, 4812, 1537, 4710, 4080, 3457, 38, 4131,
3836, 3792, 2100, 2717, 493, 215, 3518, 3698, 3456, 3523, 2367, 2159, 1637, 4813, 4298, 2437, 722, 491, 44, 3429, 3968, 796, 2057, 51,
3607, 3791, 3789, 209, 3520, 3703, 3711, 1377, 3487, 130, 3679, 406, 1519, 4384, 33, 2017, 1477, 4075, 8, 440, 141, 3428, 3519, 3848,
17, 2366, 3840, 3713, 3847, 3775, 4100, 1581, 3557, 3845, 4500, 4809, 47, 3849, 4265, 4493, 4228, 3698, 4406, 3714, 3717, 3715, 717, 67,
3716, 457, 4415, 400, 1638, 1216, 85, 4723, 4722, 1337, 4273, 490, 1497, 206, 1196, 4603, 718, 3277, 28, 40, 11, 4197, 618, 3521,
3805, 66, 1176, 1977
) )
); );
// cr => [type, field, misc, extraCol] // cr => [type, field, misc, extraCol]
protected $genericFilter = array( // misc (bool): _NUMERIC => useFloat; _STRING => localized; _FLAG => match Value; _BOOLEAN => stringSet protected $genericFilter = array( // misc (bool): _NUMERIC => useFloat; _STRING => localized; _FLAG => match Value; _BOOLEAN => stringSet
9 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_CONJURED ], // conjureditem 9 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_CONJURED ], // conjureditem
@@ -1610,6 +1680,8 @@ class ItemListFilter extends Filter
91 => [FILTER_CR_ENUM, 'totemCategory' ], // tool 91 => [FILTER_CR_ENUM, 'totemCategory' ], // tool
176 => [FILTER_CR_STAFFFLAG, 'flags' ], // flags 176 => [FILTER_CR_STAFFFLAG, 'flags' ], // flags
177 => [FILTER_CR_STAFFFLAG, 'flagsExtra' ], // flags2 177 => [FILTER_CR_STAFFFLAG, 'flagsExtra' ], // flags2
71 => [FILTER_CR_FLAG, 'cuFlags', ITEM_CU_OT_ITEMLOOT ], // otitemopening
74 => [FILTER_CR_FLAG, 'cuFlags', ITEM_CU_OT_OBJECTLOOT ], // otobjectopening
130 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments 130 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_COMMENT ], // hascomments
113 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots 113 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_SCREENSHOT ], // hasscreenshots
167 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos 167 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_HAS_VIDEO ], // hasvideos
@@ -1819,7 +1891,7 @@ class ItemListFilter extends Filter
case 86: // craftedprof [enum] case 86: // craftedprof [enum]
$_ = @$this->enums[99][$cr[1]]; // recycled enum $_ = @$this->enums[99][$cr[1]]; // recycled enum
if (is_bool($_)) if (is_bool($_))
return ['i.source', '1:', $_ ? null : '!']; return ['src.src1', null, $_ ? '!' : null];
else if (is_int($_)) else if (is_int($_))
return ['s.skillLine1', $_]; return ['s.skillLine1', $_];
@@ -1838,32 +1910,49 @@ class ItemListFilter extends Filter
/* todo */ return [1]; /* todo */ return [1];
case 150: // dropsinheroic25 [heroicraid-any] case 150: // dropsinheroic25 [heroicraid-any]
/* todo */ return [1]; /* todo */ return [1];
case 68: // otdisenchanting [yn] case 68: // otdisenchanting [yn]
/* todo */ return [1]; case 69: // otfishing [yn]
case 69: // otfishing [yn] case 70: // otherbgathering [yn]
/* todo */ return [1]; // case 71: // otitemopening [yn] [implemented via cuFlags]
case 70: // otherbgathering [yn] case 72: // otlooting [yn]
/* todo */ return [1]; case 73: // otmining [yn]
case 71: // otitemopening [yn] // case 74: // otobjectopening [yn] [implemented via cuFlags]
/* todo */ return [1]; case 75: // otpickpocketing [yn]
case 72: // otlooting [yn] case 76: // otskinning [yn]
/* todo */ return [1]; case 88: // otprospecting [yn]
case 93: // otpvp [pvp]
case 143: // otmilling [yn] case 143: // otmilling [yn]
/* todo */ return [1];
case 73: // otmining [yn]
/* todo */ return [1];
case 74: // otobjectopening [yn]
/* todo */ return [1];
case 75: // otpickpocketing [yn]
/* todo */ return [1];
case 88: // otprospecting [yn]
/* todo */ return [1];
case 93: // otpvp [pvp]
/* todo */ return [1];
case 171: // otredemption [yn] case 171: // otredemption [yn]
/* todo */ return [1]; case 172: // rewardedbyachievement [yn]
case 76: // otskinning [yn] case 92: // soldbyvendor [yn]
/* todo */ return [1]; if ($this->int2Bool($cr[1]))
return ['src.src'.$this->otFields[$cr[0]], null, $cr[1] ? '!' : null];
break;
case 18: // rewardedbyfactionquest [side]
$field = 'src.src'.$this->otFields[$cr[0]];
switch ($cr[1])
{
case 1: // Yes
return [$field, null, '!'];
case 2: // Alliance
return [$field, 1];
case 3: // Horde
return [$field, 2];
case 4: // Both
return [$field, 3];
case 5: // No
return [$field, null];
}
break;
case 126: // rewardedbyquestin [zone-any]
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)
return ['src.src4', null, '!']; // well, this seems a bit redundant..
break;
case 158: // purchasablewithcurrency [enum] case 158: // purchasablewithcurrency [enum]
case 118: // purchasablewithitem [enum] case 118: // purchasablewithitem [enum]
if (in_array($cr[1], $this->enums[$cr[0]])) if (in_array($cr[1], $this->enums[$cr[0]]))
@@ -1894,18 +1983,29 @@ class ItemListFilter extends Filter
return ['id', $foo, $cr[1] ? null : '!']; return ['id', $foo, $cr[1] ? null : '!'];
} }
break; break;
case 18: // rewardedbyfactionquest [side]
/* todo */ return [1];
case 126: // rewardedbyquestin [zone-any]
/* todo */ return [1];
case 172: // rewardedbyachievement [yn]
/* todo */ return [1];
case 92: // soldbyvendor [yn]
/* todo */ return [1];
case 129: // soldbynpc [str-small] case 129: // soldbynpc [str-small]
/* todo */ return [1]; if (!$this->isSaneNumeric($cr[2], true))
break;
if ($iIds = DB::Aowow()->selectCol('SELECT item FROM npc_vendor WHERE entry = ?d UNION SELECT item FROM game_event_npc_vendor v JOIN creature c ON c.guid = v.guid WHERE c.id = ?d', $cr[2], $cr[2]))
return ['i.id', $iIds];
else
return [0];
case 90: // avgbuyout [op] [int] case 90: // avgbuyout [op] [int]
/* todo */ return [1]; if (!DB::isConnectable(DB_CHARACTERS))
return [1];
if (!$this->isSaneNumeric($cr[2]) || !$this->int2Op($cr[1]))
break;
/* no no no .. for each realm!
// todo (med): get the avgbuyout into the listview
if ($_ = DB::Characters()->select('SELECT ii.itemEntry AS ARRAY_KEY, AVG(ah.buyoutprice / ii.count) AS buyout FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid GROUP BY ii.itemEntry HAVING avgbuyout '.$cr[1].' ?f', $c[1]))
return ['i.id', array_keys($_)];
else
return [0];
*/
return [0];
case 65: // avgmoney [op] [int] case 65: // avgmoney [op] [int]
if (!$this->isSaneNumeric($cr[2]) || !$this->int2Op($cr[1])) if (!$this->isSaneNumeric($cr[2]) || !$this->int2Op($cr[1]))
break; break;
@@ -1921,7 +2021,7 @@ class ItemListFilter extends Filter
case 163: // disenchantsinto [disenchanting] case 163: // disenchantsinto [disenchanting]
if (!$this->isSaneNumeric($cr[1])) if (!$this->isSaneNumeric($cr[1]))
break; break;
// 35
/* todo */ return [1]; /* todo */ return [1];
case 85: // objectivequest [side] case 85: // objectivequest [side]
/* todo */ return [1]; /* todo */ return [1];
@@ -1965,6 +2065,18 @@ class ItemListFilter extends Filter
return ['startQuest', 0]; return ['startQuest', 0];
} }
break; break;
case 128: // source [enum]
$_ = @$this->enums[$cr[0]][$cr[1]];
if ($_ !== null)
{
if (is_int($_)) // specific
return ['src.src'.$_, null, '!'];
else if ($_) // any
return ['OR', ['src.src1', null, '!'], ['src.src2', null, '!'], ['src.src3', null, '!'], ['src.src4', null, '!'], ['src.src5', null, '!'], ['src.src8', null, '!']];
else if (!$_) // none
return ['AND', ['src.src1', null], ['src.src2', null], ['src.src3', null], ['src.src4', null], ['src.src5', null], ['src.src8', null]];
}
break;
} }
unset($cr); unset($cr);

View File

@@ -50,7 +50,11 @@ class SpellList extends BaseType
private $interactive = false; private $interactive = false;
private $charLevel = MAX_LEVEL; private $charLevel = MAX_LEVEL;
protected $queryBase = 'SELECT *, id AS ARRAY_KEY FROM ?_spell s'; protected $queryBase = 'SELECT s.*, id AS ARRAY_KEY FROM ?_spell s';
protected $queryOpts = array(
's' => [['src']], // 6: TYPE_SPELL
'src' => ['j' => ['?_source src ON type = 6 AND typeId = s.id', true], 's' => ', src1, src2, src3, src4, src5, src6, src7, src8, src9, src10, src11, src12, src13, src14, src15, src16, src17, src18, src19, src20, src21, src22, src23, src24']
);
public function __construct($conditions = []) public function __construct($conditions = [])
{ {
@@ -80,15 +84,12 @@ class SpellList extends BaseType
$this->ranks[$this->id] = $this->getField('rank', true); $this->ranks[$this->id] = $this->getField('rank', true);
// sources // sources
if (!empty($_curTpl['source'])) for ($i = 1; $i < 25; $i++)
{ {
$sources = explode(' ', $_curTpl['source']); if ($_ = $_curTpl['src'.$i])
foreach ($sources as $src) $this->sources[$this->id][$i][] = $_;
{
$src = explode(':', $src); unset($_curTpl['src'.$i]);
if ($src[0] != -3) // todo (high): sourcemore - implement after items
$this->sources[$this->id][$src[0]][] = $src[1];
}
} }
// set full masks to 0 // set full masks to 0
@@ -1695,7 +1696,7 @@ Lasts 5 min. $?$gte($pl,68)[][Cannot be used on items level 138 and higher.]
); );
// Sources // Sources
if (!empty($this->sources[$this->id]) && $s = $this->sources[$this->id]) if (!empty($this->sources[$this->id]) && ($s = $this->sources[$this->id]))
$data[$this->id]['source'] = array_keys($s); $data[$this->id]['source'] = array_keys($s);
// Proficiencies // Proficiencies
@@ -1883,6 +1884,24 @@ spells / buffspells = {
return $castingTime; return $castingTime;
} }
public function getSourceData()
{
$data = [];
foreach ($this->iterate() as $__)
{
$data[$this->id] = array(
'n' => $this->getField('name', true),
't' => TYPE_SPELL,
'ti' => $this->id,
's' => empty($this->curTpl['skillLines']) ? 0 : $this->curTpl['skillLines'][0],
'c' => $this->curTpl['typeCat'],
'icon' => $this->curTpl['iconStringAlt'] ? $this->curTpl['iconStringAlt'] : $this->curTpl['iconString'],
);
}
return $data;
}
} }
@@ -1943,14 +1962,16 @@ class SpellListFilter extends Filter
break; break;
return ['OR', ['AND', ['powerType', [1, 6]], ['powerCost', (10 * $cr[2]), $cr[1]]], ['AND', ['powerType', [1, 6], '!'], ['powerCost', $cr[2], $cr[1]]]]; return ['OR', ['AND', ['powerType', [1, 6]], ['powerCost', (10 * $cr[2]), $cr[1]]], ['AND', ['powerType', [1, 6], '!'], ['powerCost', $cr[2], $cr[1]]]];
case 9: // Source [enum] case 9: // source [enum]
$_ = @$this->enums[$cr[0]][$cr[1]]; $_ = @$this->enums[$cr[0]][$cr[1]];
if ($_ !== null) if ($_ !== null)
{ {
if (is_bool($_)) if (is_int($_)) // specific
return ['source', 0, ($_ ? '!' : null)]; return ['src.src'.$_, null, '!'];
else if (is_int($_)) else if ($_) // any
return ['source', '%'.$_.':%']; return ['OR', ['src.src1', null, '!'], ['src.src2', null, '!'], ['src.src4', null, '!'], ['src.src5', null, '!'], ['src.src6', null, '!'], ['src.src7', null, '!'], ['src.src9', null, '!']];
else if (!$_) // none
return ['AND', ['src.src1', null], ['src.src2', null], ['src.src4', null], ['src.src5', null], ['src.src6', null], ['src.src7', null], ['src.src9', null]];
} }
break; break;
case 20: // has Reagents [yn] case 20: // has Reagents [yn]

View File

@@ -13,7 +13,11 @@ class TitleList extends BaseType
public $sources = []; public $sources = [];
protected $queryBase = 'SELECT *, id AS ARRAY_KEY FROM ?_titles t'; protected $queryBase = 'SELECT t.*, id AS ARRAY_KEY FROM ?_titles t';
protected $queryOpts = array(
't' => [['src']], // 11: TYPE_TITLE
'src' => ['j' => ['?_source src ON type = 11 AND typeId = t.id', true], 's' => ', src3, moreType, moreTypeId']
);
public function __construct($conditions = []) public function __construct($conditions = [])
{ {
@@ -22,19 +26,22 @@ class TitleList extends BaseType
// post processing // post processing
foreach ($this->iterate() as $id => &$_curTpl) foreach ($this->iterate() as $id => &$_curTpl)
{ {
// preparse sources // preparse sources - notice: under this system titles can't have more than one source (or two for achivements), which is enough for standard TC cases but may break custom cases
if (!empty($_curTpl['source'])) if ($_curTpl['moreType'] == TYPE_ACHIEVEMENT)
{ $this->sources[$this->id][12][] = $_curTpl['moreTypeId'];
$sources = explode(' ', $_curTpl['source']); else if ($_curTpl['moreType'] == TYPE_QUEST)
foreach ($sources as $src) $this->sources[$this->id][4][] = $_curTpl['moreTypeId'];
{ else if ($_curTpl['src3'])
if (!$src) // rogue whitespace slipped through $this->sources[$this->id][3][] = $_curTpl['src3'];
continue;
$src = explode(':', $src); // titles display up to two achievements at once
$this->sources[$id][$src[0]][] = $src[1]; if ($_curTpl['src12Ext'])
} $this->sources[$this->id][12][] = $_curTpl['src12Ext'];
}
unset($_curTpl['src12Ext']);
unset($_curTpl['moreType']);
unset($_curTpl['moreTypeId']);
unset($_curTpl['src3']);
// shorthand for more generic access // shorthand for more generic access
foreach (Util::$localeStrings as $i => $str) foreach (Util::$localeStrings as $i => $str)

View File

@@ -292,16 +292,16 @@ class User
); );
if ($newId) if ($newId)
Util::gainSiteReputation(SITEREP_ACTION_REGISTER, $newId); Util::gainSiteReputation($newId, SITEREP_ACTION_REGISTER);
return $newId; return $newId;
} }
private static function createSalt() private static function createSalt()
{ {
$algo = '$2a'; $algo = '$2a';
$strength = '$09'; $strength = '$09';
$salt = '$'.Util::createHash(22); $salt = '$'.Util::createHash(22);
return $algo.$strength.$salt; return $algo.$strength.$salt;
} }
@@ -446,9 +446,7 @@ class User
$gUser['superCommentVotes'] = self::canSupervote(); $gUser['superCommentVotes'] = self::canSupervote();
$gUser['downvoteRep'] = CFG_REP_REQ_DOWNVOTE; $gUser['downvoteRep'] = CFG_REP_REQ_DOWNVOTE;
$gUser['upvoteRep'] = CFG_REP_REQ_UPVOTE; $gUser['upvoteRep'] = CFG_REP_REQ_UPVOTE;
$gUser['characters'] = self::getCharacters();
if ($_ = self::getCharacters())
$gUser['characters'] = $_;
if ($_ = self::getProfiles()) if ($_ = self::getProfiles())
$gUser['profiles'] = $_; $gUser['profiles'] = $_;

View File

@@ -332,7 +332,7 @@ class ItemPage extends genericPage
BUTTON_WOWHEAD => true, BUTTON_WOWHEAD => true,
BUTTON_LINKS => ['color' => 'ff'.Util::$rarityColorStings[$this->subject->getField('quality')], 'linkId' => 'item:'.$this->typeId.':0:0:0:0:0:0:0:0'], BUTTON_LINKS => ['color' => 'ff'.Util::$rarityColorStings[$this->subject->getField('quality')], 'linkId' => 'item:'.$this->typeId.':0:0:0:0:0:0:0:0'],
BUTTON_VIEW3D => in_array($_slot, $_visSlots) && $_model ? ['displayId' => $this->subject->getField('displayId'), 'slot' => $_slot, 'type' => TYPE_ITEM, 'typeId' => $this->typeId] : false, BUTTON_VIEW3D => in_array($_slot, $_visSlots) && $_model ? ['displayId' => $this->subject->getField('displayId'), 'slot' => $_slot, 'type' => TYPE_ITEM, 'typeId' => $this->typeId] : false,
BUTTON_COMPARE => $_cu, // bool required BUTTON_COMPARE => $_cu,
BUTTON_EQUIP => in_array($_class, [ITEM_CLASS_WEAPON, ITEM_CLASS_ARMOR]), BUTTON_EQUIP => in_array($_class, [ITEM_CLASS_WEAPON, ITEM_CLASS_ARMOR]),
BUTTON_UPGRADE => $_cu ? ['class' => $_class, 'slot' => $_slot] : false BUTTON_UPGRADE => $_cu ? ['class' => $_class, 'slot' => $_slot] : false
); );
@@ -425,6 +425,23 @@ class ItemPage extends genericPage
} }
} }
// tab: achievement reward
$acvReward = new AchievementList(array(['ar.item', $this->typeId], ['a.itemExtra', $this->typeId], 'OR'));
if (!$acvReward->error)
{
$this->extendGlobalData($acvReward->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_REWARDS));
$this->lvTabs[] = array(
'file' => 'achievement',
'data' => $acvReward->getListviewData(),
'params' => [
'name' => '$LANG.tab_rewardfrom',
'id' => 'reward-from-achievement',
'visibleCols' => "$['category']"
]
);
}
// tabs: this item contains.. // tabs: this item contains..
$sourceFor = array( $sourceFor = array(
[LOOT_ITEM, $this->subject->id, '$LANG.tab_contains', 'contains', ['Listview.extraCols.percent'], [] , []], [LOOT_ITEM, $this->subject->id, '$LANG.tab_contains', 'contains', ['Listview.extraCols.percent'], [] , []],
@@ -467,7 +484,7 @@ class ItemPage extends genericPage
} }
} }
if ($reqIds = array_keys($reqQuest)) // apply quest-conditions as back-reference if ($reqIds = array_keys($reqQuest)) // apply quest-conditions as back-reference
{ {
$conditions = array( $conditions = array(
'OR', 'OR',
@@ -494,7 +511,7 @@ class ItemPage extends genericPage
// tab: container can contain // tab: container can contain
if ($this->subject->getField('slots') > 0) if ($this->subject->getField('slots') > 0)
{ {
$contains = new ItemList(array(['bagFamily', $_bagFamily, '&'], ['slots', 1, '<'], 0)); $contains = new ItemList(array(['bagFamily', $_bagFamily, '&'], ['slots', 1, '<'], CFG_SQL_LIMIT_NONE));
if (!$contains->error) if (!$contains->error)
{ {
$this->extendGlobalData($contains->getJSGlobals(GLOBALINFO_SELF)); $this->extendGlobalData($contains->getJSGlobals(GLOBALINFO_SELF));
@@ -518,7 +535,7 @@ class ItemPage extends genericPage
// tab: can be contained in (except keys) // tab: can be contained in (except keys)
else if ($_bagFamily != 0x0100) else if ($_bagFamily != 0x0100)
{ {
$contains = new ItemList(array(['bagFamily', $_bagFamily, '&'], ['slots', 0, '>'], 0)); $contains = new ItemList(array(['bagFamily', $_bagFamily, '&'], ['slots', 0, '>'], CFG_SQL_LIMIT_NONE));
if (!$contains->error) if (!$contains->error)
{ {
$this->extendGlobalData($contains->getJSGlobals(GLOBALINFO_SELF)); $this->extendGlobalData($contains->getJSGlobals(GLOBALINFO_SELF));
@@ -547,7 +564,7 @@ class ItemPage extends genericPage
$this->extendGlobalData($criteriaOf->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_REWARDS)); $this->extendGlobalData($criteriaOf->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_REWARDS));
$hCols = []; $hCols = [];
if (!$criteriaOf->hasSetFields(['rewardIds'])) if (!$criteriaOf->hasSetFields(['reward_loc0']))
$hCols = ['rewards']; $hCols = ['rewards'];
$this->lvTabs[] = array( $this->lvTabs[] = array(
@@ -769,6 +786,12 @@ class ItemPage extends genericPage
$currency[] = [-$id, $qty]; $currency[] = [-$id, $qty];
} }
if ($currency)
$this->extendGlobalIds(TYPE_CURRENCY, array_column($currency, 0));
if ($tokens)
$this->extendGlobalIds(TYPE_ITEM, array_column($tokens, 0));
$row['stock'] = $vendors[$k]['stock']; $row['stock'] = $vendors[$k]['stock'];
$row['cost'] = [$this->subject->getField('buyPrice')]; $row['cost'] = [$this->subject->getField('buyPrice')];
@@ -785,7 +808,7 @@ class ItemPage extends genericPage
); );
} }
if ($currency || $tokens) // fill idx:3 if required if ($currency || $tokens) // fill idx:3 if required
$row['cost'][] = $currency; $row['cost'][] = $currency;
if ($tokens) if ($tokens)
@@ -834,8 +857,6 @@ class ItemPage extends genericPage
$boughtBy = new ItemList(array(['id', $boughtBy])); $boughtBy = new ItemList(array(['id', $boughtBy]));
if (!$boughtBy->error) if (!$boughtBy->error)
{ {
$this->extendGlobalData($boughtBy->getJSGlobals(GLOBALINFO_SELF));
$iCur = new CurrencyList(array(['itemId', $this->typeId])); $iCur = new CurrencyList(array(['itemId', $this->typeId]));
$filter = $iCur->error ? [TYPE_ITEM => $this->typeId] : [TYPE_CURRENCY => $iCur->id]; $filter = $iCur->error ? [TYPE_ITEM => $this->typeId] : [TYPE_CURRENCY => $iCur->id];
@@ -848,6 +869,7 @@ class ItemPage extends genericPage
'extraCols' => "$[Listview.funcBox.createSimpleCol('stack', 'stack', '10%', 'stack'), Listview.extraCols.cost]" 'extraCols' => "$[Listview.funcBox.createSimpleCol('stack', 'stack', '10%', 'stack'), Listview.extraCols.cost]"
] ]
); );
$this->extendGlobalData($boughtBy->getJSGlobals(GLOBALINFO_ANY));
} }
} }

View File

@@ -210,15 +210,14 @@ class ItemsPage extends GenericPage
); );
$groups = []; $groups = [];
$nameSource = []; $nameSource = [];
$gbField = ''; $grouping = @$this->filter['gb'];
$extraOpts = []; $extraOpts = [];
$maxResults = CFG_SQL_LIMIT_DEFAULT; $maxResults = CFG_SQL_LIMIT_DEFAULT;
switch (@$this->filter['gb']) switch ($grouping)
{ {
// slot: (try to limit the lookups by class grouping and intersecting with preselected slots) // slot: (try to limit the lookups by class grouping and intersecting with preselected slots)
// if intersect yields an empty array no lookups will occur // if intersect yields an empty array no lookups will occur
case 3: // todo(med): source .. well .. no, not at the moment .. the database doesn't event have a field for that, so reroute to slots
case 1: case 1:
if (isset($this->category[0]) && $this->category[0] == ITEM_CLASS_ARMOR) if (isset($this->category[0]) && $this->category[0] == ITEM_CLASS_ARMOR)
$groups = $availableSlots[ITEM_CLASS_ARMOR]; $groups = $availableSlots[ITEM_CLASS_ARMOR];
@@ -237,7 +236,6 @@ class ItemsPage extends GenericPage
{ {
$nameSource = Lang::$item['inventoryType']; $nameSource = Lang::$item['inventoryType'];
$this->forceTabs = true; $this->forceTabs = true;
$gbField = 'slot';
} }
break; break;
@@ -263,23 +261,18 @@ class ItemsPage extends GenericPage
$extraOpts = ['i' => ['o' => ['itemlevel DESC']]]; $extraOpts = ['i' => ['o' => ['itemlevel DESC']]];
$nameSource[$l] = Lang::$item['tabOther']; $nameSource[$l] = Lang::$item['tabOther'];
$this->forceTabs = true; $this->forceTabs = true;
$gbField = 'itemlevel';
} }
break; break;
case 3: case 3: // source
$groups = array_filter(array_keys(Lang::$game['sources'])); $groups = [0, 1, 2, 3, 4, 5, 10, 11, 12];
array_walk($groups, function (&$v, $k) {
$v = $v.':';
});
$nameSource = Lang::$game['sources']; $nameSource = Lang::$game['sources'];
$this->forceTabs = true; $this->forceTabs = true;
$gbField = 'source';
break; break;
// none // none
default: default:
$grouping = 0;
$groups[0] = null; $groups[0] = null;
} }
@@ -289,7 +282,20 @@ class ItemsPage extends GenericPage
foreach ($groups as $group) foreach ($groups as $group)
{ {
$finalCnd = $gbField ? array_merge($conditions, [[$gbField, abs($group), $group > 0 ? null : '<'], $maxResults]) : $conditions; switch ($grouping)
{
case 1:
$finalCnd = array_merge($conditions, [['slot', $group], $maxResults]);
break;
case 2:
$finalCnd = array_merge($conditions, [['itemlevel', abs($group), $group > 0 ? null : '<'], $maxResults]);
break;
case 3:
$finalCnd = array_merge($conditions, [$group ? ['src.src'.$group, null, '!'] : ['src.typeId', null], $maxResults]);
break;
default:
$finalCnd = $conditions;
}
$items = new ItemList($finalCnd, ['extraOpts' => array_merge($extraOpts, $this->filterObj->extraOpts)]); $items = new ItemList($finalCnd, ['extraOpts' => array_merge($extraOpts, $this->filterObj->extraOpts)]);
@@ -306,7 +312,7 @@ class ItemsPage extends GenericPage
$upg = []; $upg = [];
if ($upgItemData) if ($upgItemData)
{ {
if ($gbField == 'slot') // match upgradeItem to slot if ($grouping == 1) // slot: match upgradeItem to slot
{ {
$upg = array_keys(array_filter($this->filter['upg'], function ($v) use ($group) { $upg = array_keys(array_filter($this->filter['upg'], function ($v) use ($group) {
return $v == $group; return $v == $group;
@@ -318,7 +324,7 @@ class ItemsPage extends GenericPage
if ($upg) if ($upg)
$tab['params']['_upgradeIds'] = '$'.json_encode($upg, JSON_NUMERIC_CHECK); $tab['params']['_upgradeIds'] = '$'.json_encode($upg, JSON_NUMERIC_CHECK);
} }
else if ($gbField) else if ($grouping)
{ {
$upg = array_keys($this->filter['upg']); $upg = array_keys($this->filter['upg']);
$tab['params']['_upgradeIds'] = '$'.json_encode($upg, JSON_NUMERIC_CHECK); $tab['params']['_upgradeIds'] = '$'.json_encode($upg, JSON_NUMERIC_CHECK);
@@ -327,9 +333,21 @@ class ItemsPage extends GenericPage
} }
} }
if ($gbField) if ($grouping)
{ {
$tab['params']['id'] = $group > 0 ? $gbField.'-'.$group : 'other'; switch ($grouping)
{
case 1:
$tab['params']['id'] = 'slot-'.$group;
break;
case 2:
$tab['params']['id'] = $group > 0 ? 'level-'.$group : 'other';
break;
case 3:
$tab['params']['id'] = $group ? 'source-'.$group : 'unknown';
break;
}
$tab['params']['name'] = $nameSource[$group]; $tab['params']['name'] = $nameSource[$group];
$tab['params']['tabs'] = '$tabsGroups'; $tab['params']['tabs'] = '$tabsGroups';
} }
@@ -343,39 +361,34 @@ class ItemsPage extends GenericPage
{ {
$tab['params']['_truncated'] = 1; $tab['params']['_truncated'] = 1;
$addCr = []; $cls = isset($this->category[0]) ? '='.$this->category[0] : '';
if ($gbField == 'slot') $override = ['gb' => ''];
{
$note = 'lvnote_viewmoreslot';
$override = ['sl' => $group, 'gb' => ''];
}
else if ($gbField == 'itemlevel')
{
$note = 'lvnote_viewmorelevel';
if ($group > 0)
$override = ['minle' => $group, 'maxle' => $group, 'gb' => ''];
else
$override = ['maxle' => abs($group) - 1, 'gb' => ''];
}
else if ($gbField == 'source')
{
if ($_ = @[null, 3, 4, 5, 6, 7, 8][$group])
{
$note = 'lvnote_viewmoresource';
$addCr = ['cr' => 128, 'crs' => $_, 'crv' => 0];
}
$override = ['gb' => ''];
}
if ($upg) if ($upg)
$override['upg'] = implode(':', $upg); $override['upg'] = implode(':', $upg);
$cls = isset($this->category[0]) ? '='.$this->category[0] : ''; switch ($grouping)
$this->filterUrl = $this->filterObj->urlize($override, $addCr); {
case 1:
$override['sl'] = $group;
$tab['params']['note'] = '$$WH.sprintf(LANG.lvnote_viewmoreslot, \''.$cls.'\', \''.$this->filterObj->urlize($override).'\')';
break;
case 2:
if ($group > 0)
{
$override['minle'] = $group;
$override['maxle'] = $group;
}
else
$override['maxle'] = abs($group) - 1;
if ($note) $tab['params']['note'] = '$$WH.sprintf(LANG.lvnote_viewmorelevel, \''.$cls.'\', \''.$this->filterObj->urlize($override).'\')';
$tab['params']['note'] = '$$WH.sprintf(LANG.'.$note.', \''.$cls.'\', \''.$this->filterUrl.'\')'; break;
case 3:
if ($_ = [null, 3, 4, 5, 6, 7, 9, 10, 11][$group])
$tab['params']['note'] = '$$WH.sprintf(LANG.lvnote_viewmoresource, \''.$cls.'\', \''.$this->filterObj->urlize($override, ['cr' => 128, 'crs' => $_, 'crv' => 0]).'\')';
break;
}
} }
else if ($items->getMatches() > $maxResults) else if ($items->getMatches() > $maxResults)
{ {
@@ -393,7 +406,7 @@ class ItemsPage extends GenericPage
if (!$p) if (!$p)
unset($tab['params'][$k]); unset($tab['params'][$k]);
if ($gbField) if ($grouping)
$tab['params']['hideCount'] = '$1'; $tab['params']['hideCount'] = '$1';
$this->lvTabs[] = $tab; $this->lvTabs[] = $tab;
@@ -405,7 +418,10 @@ class ItemsPage extends GenericPage
// whoops, we have no data? create emergency content // whoops, we have no data? create emergency content
if (empty($this->lvTabs)) if (empty($this->lvTabs))
$this->lvTabs[] = ['file' => 'item', 'data' => [], 'params' => []]; {
$this->forceTabs = false;
$this->lvTabs[] = ['file' => 'item', 'data' => [], 'params' => []];
}
// sort for dropdown-menus // sort for dropdown-menus
asort(Lang::$game['ra']); asort(Lang::$game['ra']);

View File

@@ -1361,7 +1361,7 @@ class SearchPage extends GenericPage
if ($data = $misc->getListviewData()) if ($data = $misc->getListviewData())
{ {
if ($this->searchMask & SEARCH_TYPE_REGULAR) if ($this->searchMask & SEARCH_TYPE_REGULAR)
$this->extendGlobalData($misc->getJSGlobals(GLOBALINFO_SELF)); $this->extendGlobalData($misc->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_RELATED));
if ($this->searchMask & SEARCH_TYPE_OPEN) if ($this->searchMask & SEARCH_TYPE_OPEN)
foreach ($misc->iterate() as $__) foreach ($misc->iterate() as $__)

View File

@@ -86,47 +86,40 @@ class TitlePage extends GenericPage
/* Extra Tabs */ /* Extra Tabs */
/**************/ /**************/
// tab: sources // tab: quest source
if (!empty($this->subject->sources[$this->typeId])) $quests = new QuestList(array(['rewardTitleId', $this->typeId]));
if (!$quests->error)
{ {
foreach ($this->subject->sources[$this->typeId] as $type => $entries) $this->extendGlobalData($quests->getJSGlobals(GLOBALINFO_REWARDS));
{
switch ($type)
{
case 4:
$quests = new QuestList(array(['id', $entries]));
$this->extendGlobalData($quests->getJSGlobals(GLOBALINFO_REWARDS));
$this->lvTabs[] = array( $this->lvTabs[] = array(
'file' => 'quest', 'file' => 'quest',
'data' => $quests->getListviewData(), 'data' => $quests->getListviewData(),
'params' => array( 'params' => array(
'id' => 'reward-from-quest', 'id' => 'reward-from-quest',
'name' => '$LANG.tab_rewardfrom', 'name' => '$LANG.tab_rewardfrom',
'hiddenCols' => "$['experience', 'money']", 'hiddenCols' => "$['experience', 'money']",
'visibleCols' => "$['category']" 'visibleCols' => "$['category']"
) )
); );
break; }
case 12:
$acvs = new AchievementList(array(['id', $entries]));
$this->extendGlobalData($acvs->getJSGlobals());
$this->lvTabs[] = array( // tab: achievement source
'file' => 'achievement', $acvs = new AchievementList(array(['ar.title_A', $this->typeId], ['ar.title_H', $this->typeId], 'OR'));
'data' => $acvs->getListviewData(), if (!$acvs->error)
'params' => array( {
'id' => 'reward-from-achievement', $this->extendGlobalData($acvs->getJSGlobals());
'name' => '$LANG.tab_rewardfrom',
'visibleCols' => "$['category']", $this->lvTabs[] = array(
'sort' => "$['reqlevel', 'name']" 'file' => 'achievement',
) 'data' => $acvs->getListviewData(),
); 'params' => array(
break; 'id' => 'reward-from-achievement',
// case 13: 'name' => '$LANG.tab_rewardfrom',
// not displayed 'visibleCols' => "$['category']",
} 'sort' => "$['reqlevel', 'name']"
} )
);
} }
// tab: criteria of (to be added by TC) // tab: criteria of (to be added by TC)

37139
setup/updates/04_sources.sql Normal file

File diff suppressed because one or more lines are too long

View File

@@ -490,7 +490,7 @@ var PageTemplate = new function()
menu.push(userPage); menu.push(userPage);
// Settings // Settings
var settings = ['settings', LANG.settings, 'https://' + window.location.hostname + '?account', null, {icon: g_staticUrl + '/images/icons/cog.gif', checkedUrl: /account/i}]; var settings = ['settings', LANG.settings, 'http://' + window.location.hostname + '?account', null, {icon: g_staticUrl + '/images/icons/cog.gif', checkedUrl: /account/i}];
menu.push(settings); menu.push(settings);
// Reputation // Reputation

View File

@@ -1592,7 +1592,18 @@ var g_sources = {
9: 'Talent', 9: 'Talent',
10: 'Startausrüstung', 10: 'Startausrüstung',
11: 'Ereignis', 11: 'Ereignis',
12: 'Erfolg' 12: 'Erfolg',
14: 'Schwarzmarkt',
15: 'Entzaubert',
16: 'Geangelt',
17: 'Gesammelt',
18: 'Gemahlen',
19: 'Abgebaut',
20: 'Sondiert',
21: 'Aus Taschendiebstahl',
22: 'Geborgen',
23: 'Gehäutet',
24: 'In-Game-Store'
}; };
var g_sources_pvp = { var g_sources_pvp = {
@@ -3415,8 +3426,8 @@ var LANG = {
[10, "Talent"], [8, "Lehrer"], [7, "Händler"], [2, "Nichts"] [10, "Talent"], [8, "Lehrer"], [7, "Händler"], [2, "Nichts"]
], ],
itemsource: [ itemsource: [
[1, "Beliebig"], [3, "Hergestellt"], [4, "Drop"], [5, "PvP"], [6, "Quest"], [1, "Beliebig"], [11, "Erfolg"], [3, "Hergestellt"], [4, "Drop"], [10, "Ereignis"],
[8, "Einlösung"], [7, "Händler"], [2, "Nichts"] [5, "PvP"], [6, "Quest"], [9, "Startausrüstung"], [7, "Händler"], [2, "Nichts"]
], ],
glyphtype: [[ 1, "Erhebliche"], [2, "Geringe"] ], glyphtype: [[ 1, "Erhebliche"], [2, "Geringe"] ],
classs: [ classs: [

View File

@@ -1637,7 +1637,19 @@ var g_sources = {
9: 'Talent', 9: 'Talent',
10: 'Starter', 10: 'Starter',
11: 'Event', 11: 'Event',
12: 'Achievement' 12: 'Achievement',
// sarjuuk: 13 is string from serverside table, used by titles
14: 'Black Market',
15: 'Disenchanted',
16: 'Fished',
17: 'Gathered',
18: 'Milled',
19: 'Mined',
20: 'Prospected',
21: 'Pickpocketed',
22: 'Salvaged',
23: 'Skinned',
24: 'In-Game Store'
}; };
var g_sources_pvp = { var g_sources_pvp = {
@@ -3460,8 +3472,8 @@ var LANG = {
[10, "Talent"], [8, "Trainer"], [7, "Vendor"], [2, "None"] [10, "Talent"], [8, "Trainer"], [7, "Vendor"], [2, "None"]
], ],
itemsource: [ itemsource: [
[1, "Any"], [3, "Crafted"], [4, "Drop"], [5, "PvP"], [6, "Quest"], [1, "Any"], [11, "Achievement"], [3, "Crafted"], [4, "Drop"], [10, "Event"],
[8, "Redemption"], [7, "Vendor"], [2, "None"] [5, "PvP"], [6, "Quest"], [9, "Starter"], [7, "Vendor"], [2, "None"]
], ],
glyphtype: [ [1, "Major"], [2, "Minor"] ], glyphtype: [ [1, "Major"], [2, "Minor"] ],
classs: [ classs: [

View File

@@ -1593,7 +1593,18 @@ var g_sources = {
9: 'Talento', 9: 'Talento',
10: 'Habilidad Inicial', 10: 'Habilidad Inicial',
11: 'Evento', 11: 'Evento',
12: 'Logro' 12: 'Logro',
14: 'Mercado negro',
15: 'Desencantado',
16: 'Pescado',
17: 'Recolectado',
18: 'Molido',
19: 'Minado',
20: 'Prospectar',
21: 'Robado',
22: 'Rescatado',
23: 'Despellejado',
24: 'Tienda del juego'
}; };
var g_sources_pvp = { var g_sources_pvp = {
@@ -3418,8 +3429,8 @@ var LANG = {
[10, "Talento"], [8, "Entrenador"], [7, "Vendedor"], [2, "Ninguno"] [10, "Talento"], [8, "Entrenador"], [7, "Vendedor"], [2, "Ninguno"]
], ],
itemsource: [ itemsource: [
[1, "Cualquiera"], [3, "Creado"], [4, "Encontrado"], [5, "JcJ"], [6, "Misión"], [1, "Cualquiera"], [11, "Logro"], [3, "Creado"], [4, "Encontrado"], [10, "Evento"],
[8, "Redención"], [7, "Vendedor"], [2, "Ninguno"] [5, "JcJ"], [6, "Misión"], [9, "Habilidad Inicial"], [7, "Vendedor"], [2, "Ninguno"]
], ],
glyphtype: [ [1, "Sublime"], [2, "Menor"] ], glyphtype: [ [1, "Sublime"], [2, "Menor"] ],
classs: [ classs: [

View File

@@ -1581,7 +1581,18 @@ var g_sources = {
9: 'Talent', 9: 'Talent',
10: 'Débutant', 10: 'Débutant',
11: 'Événement', 11: 'Événement',
12: 'Haut fait' 12: 'Haut fait',
14: 'Marché Noir',
15: 'Désenchanté',
16: 'Pêché',
17: 'Cueilli',
18: 'Moulu',
19: 'Miné',
20: 'Prospecté',
21: 'Subtilisé (pickpocket)',
22: 'Ferraillé',
23: 'Dépecé',
24: 'Boutique en jeu'
}; };
var g_sources_pvp = { var g_sources_pvp = {
@@ -3406,8 +3417,8 @@ var LANG = {
[10, "Talent"], [8, "Maître"], [7, "Vendeur"], [2, "Aucun"] [10, "Talent"], [8, "Maître"], [7, "Vendeur"], [2, "Aucun"]
], ],
itemsource: [ itemsource: [
[1, "N'importe quelle"], [3, "Fabriqué"], [4, "Butin"], [5, "JcJ"], [6, "Quête"], [1, "N'importe quelle"], [11, "Haut fait"], [3, "Fabriqué"], [4, "Butin"], [10, "Événement"],
[8, "Échange d'un code"], [7, "Vendeur"], [2, "Aucun"] [5, "JcJ"], [6, "Quête"], [9, "Débutant"], [7, "Vendeur"], [2, "Aucun"]
], ],
glyphtype: [ [1, "Majeur"], [2, "Mineur"] ], glyphtype: [ [1, "Majeur"], [2, "Mineur"] ],
classs: [ classs: [

View File

@@ -1581,7 +1581,18 @@ var g_sources = {
9: 'Талант', 9: 'Талант',
10: 'Начальное заклинание', 10: 'Начальное заклинание',
11: 'Мероприятие', 11: 'Мероприятие',
12: 'Достижение' 12: 'Достижение',
14: 'Черный Рынок',
15: 'Распылено',
16: 'Вылавливается',
17: 'Собрано',
18: '[Milled]',
19: 'Выкапывается',
20: 'Просеивается',
21: 'Можно украсть',
22: 'Разобрано',
23: 'Собирается при снятии шкуры',
24: 'Внутриигровой магазин'
}; };
var g_sources_pvp = { var g_sources_pvp = {
@@ -3406,8 +3417,8 @@ var LANG = {
[10, "Талант"], [8, "Тренер"], [7, "Продавец"], [2, "Нет"] [10, "Талант"], [8, "Тренер"], [7, "Продавец"], [2, "Нет"]
], ],
itemsource: [ itemsource: [
[1, "Все"], [3, "Ремесло"], [4, "Добыча"], [5, "PvP"], [6, "Задание"], [1, "Все"], [11, "Достижение"], [3, "Ремесло"], [4, "Добыча"], [10, "Мероприятие"],
[8, "Рекламная акция"], [7, "Продавец"], [2, "Нет"] [5, "PvP"], [6, "Задание"], [9, "Начальное заклинание"], [7, "Продавец"], [2, "Нет"]
], ],
glyphtype: [ [1, "Большой"], [2, "Малый"] ], glyphtype: [ [1, "Большой"], [2, "Малый"] ],
classs: [ classs: [