- searches: reimplemented &json (compare will work again)

- compare: updated use of ItemList. random enchantments are no longer lost on export and the whol thing uses less strings
This commit is contained in:
Sarjuuk 2013-03-07 19:58:12 +01:00
parent b4afea2cda
commit fbf0e6fc64
4 changed files with 119 additions and 85 deletions

View file

@ -17,7 +17,7 @@ class ItemList extends BaseType
protected $setupQuery = 'SELECT *, i.entry AS ARRAY_KEY FROM item_template i LEFT JOIN ?_item_template_addon iX ON i.entry = iX.id LEFT JOIN locales_item l ON i.entry = l.entry WHERE [filter] [cond] GROUP BY i.entry ORDER BY i.Quality DESC';
protected $matchQuery = 'SELECT COUNT(1) FROM item_template i LEFT JOIN ?_item_template_addon iX ON i.entry = iX.id LEFT JOIN locales_item l ON i.entry = l.entry WHERE [filter] [cond]';
public function __construct($conditions)
public function __construct($conditions, $pieceToSet = null)
{
parent::__construct($conditions);
@ -28,6 +28,10 @@ class ItemList extends BaseType
$this->initScalingStats();
$this->initJsonStats();
// readdress itemset .. is wrong for virtual sets
if ($pieceToSet)
$this->json[$this->id]['itemset'] = $pieceToSet[$this->id];
}
$this->reset(); // restore 'iterator'
@ -90,30 +94,47 @@ class ItemList extends BaseType
if ($addInfoMask & ITEMINFO_JSON)
$this->extendJsonStats();
$tmp = array_merge($this->json[$this->id], array(
'id' => $this->id,
'name' => $this->names[$this->id],
'quality' => 7 - $this->curTpl['Quality'],
'reqskill' => $this->curTpl['RequiredSkill'],
'reqskillrank' => $this->curTpl['RequiredSkillRank'],
'reqspell' => $this->curTpl['requiredspell'],
'reqfaction' => $this->curTpl['RequiredReputationFaction'],
'reqrep' => $this->curTpl['RequiredReputationRank'],
'side' => Util::sideByRaceMask($this->curTpl['AllowableRace']), // FlagsExtra zur Rate ziehen? 0:Beide; 1: Horde; 2:Allianz
'heroic' => (string)($this->curTpl['Flags'] & 0x8),
'nslots' => $this->curTpl['ContainerSlots'],
'buyprice' => $this->curTpl['BuyPrice'],
'sellprice' => $this->curTpl['SellPrice']
));
$data[$this->id] = $this->json[$this->id];
if (isset($this->itemMods[$this->id])) // due to ITEMINFO_JSON
foreach ($this->itemMods[$this->id] as $k => $v)
$data[$this->id][Util::$itemMods[$k]] = $v;
if ($addInfoMask & ITEMINFO_VENDOR)
{
if ($x = $this->curTpl['BuyPrice'])
$data[$this->id]['buyprice'] = $x;
if ($x = $this->curTpl['SellPrice'])
$data[$this->id]['sellprice'] = $x;
}
// complicated data
if (!in_array($this->curTpl['AllowableRace'], [-1, 0, RACE_MASK_ALL, RACE_MASK_ALLIANCE, RACE_MASK_HORDE]))
$tmp['reqrace'] = $this->curTpl['AllowableRace'];
if ($x = $this->curTpl['RequiredSkill'])
$data[$this->id]['reqskill'] = $x;
if (!in_array($this->curTpl['AllowableClass'], [-1, 0, CLASS_MASK_ALL]))
$tmp['reqclass'] = $this->curTpl['AllowableClass']; // $tmp['classes'] ??
if ($x = $this->curTpl['RequiredSkillRank'])
$data[$this->id]['reqskillrank'] = $x;
$data[$this->id] = $tmp;
if ($x = $this->curTpl['requiredspell'])
$data[$this->id]['reqspell'] = $x;
if ($x = $this->curTpl['RequiredReputationFaction'])
$data[$this->id]['reqfaction'] = $x;
if ($x = $this->curTpl['RequiredReputationRank'])
$data[$this->id]['reqrep'] = $x;
if ($x = $this->curTpl['ContainerSlots'])
$data[$this->id]['nslots'] = $x;
if (!in_array($this->curTpl['AllowableRace'], [-1, 0]) && !$this->curTpl['AllowableRace'] & RACE_MASK_ALL == RACE_MASK_ALL &&
!$this->curTpl['AllowableRace'] & RACE_MASK_ALLIANCE == RACE_MASK_ALLIANCE && !$this->curTpl['AllowableRace'] & RACE_MASK_HORDE == RACE_MASK_HORDE)
$data[$this->id]['reqrace'] = $this->curTpl['AllowableRace'];
if (!in_array($this->curTpl['AllowableClass'], [-1, 0]) && !$this->curTpl['AllowableClass'] & CLASS_MASK_ALL == CLASS_MASK_ALL)
$data[$this->id]['reqclass'] = $this->curTpl['AllowableClass']; // $data[$this->id]['classes'] ??
}
/* even more complicated crap
@ -642,7 +663,7 @@ class ItemList extends BaseType
$reagents = new ItemList(array(['i.entry', array_keys($reagentItems)]));
$reqReag = [];
$x .= '<span class="q2">'.Lang::$item['trigger'][0].' <a href="?spell='.$this->curTpl['spellid_2'].'">'.Util::localizedString($this->curTpl, 'description').'</a></span>';
$x .= '<span class="q2">'.Lang::$item['trigger'][0].' <a href="?spell='.$this->curTpl['spellid_2'].'">'.Util::localizedString($this->curTpl, 'description').'</a></span><br />';
$xCraft = '<div><br />'.$craftItem->renderTooltip(null, $interactive).'</div><br />';
@ -778,7 +799,7 @@ class ItemList extends BaseType
return 0;
}
public function extendJsonStats($pieceAssoc = NULL)
public function extendJsonStats()
{
// convert ItemMods
for ($h = 1; $h <= 10; $h++)
@ -808,24 +829,14 @@ class ItemList extends BaseType
$eqpSplList = new SpellList(array(['id', $equipSpells]));
$stats = $eqpSplList->getStatGain();
foreach ($stats as $mId => $qty)
@$this->itemMods[$this->id][$mId] += $qty;
if ($qty > 0)
@$this->itemMods[$this->id][$mId] += $qty;
}
// fetch and add socketbonusstats
if (@$this->json[$this->id]['socketbonus'] > 0)
{
$enh = DB::Aowow()->selectRow('SELECT * FROM ?_itemenchantment WHERE Id = ?;', $this->json[$this->id]['socketbonus']);
$this->json[$this->id]['socketbonusstat'] = [];
$socketbonusstat = Util::parseItemEnchantment($enh);
foreach ($socketbonusstat as $k => $v)
$this->json[$this->id]['socketbonusstat'][] = '"'.$k.'":'.$v;
$this->json[$this->id]['socketbonusstat'] = "{".implode(',', $this->json[$this->id]['socketbonusstat'])."}";
}
// readdress itemset .. is wrong for virtual sets
if ($pieceAssoc)
$this->json[$this->id]['itemset'] = $pieceAssoc[$this->id];
if ($enh = DB::Aowow()->selectRow('SELECT * FROM ?_itemenchantment WHERE Id = ?;', $this->json[$this->id]['socketbonus']))
$this->json[$this->id]['socketbonusstat'] = Util::parseItemEnchantment($enh);
// gather random Enchantments
// todo: !important! extremly high sql-load
@ -866,23 +877,12 @@ class ItemList extends BaseType
);
}
$this->json[$this->id]['subitems'] = json_encode($this->subItems[$this->id], JSON_FORCE_OBJECT);
$this->json[$this->id]['subitems'] = $this->subItems[$this->id];
}
foreach ($this->json[$this->id] as $k => $v)
{
if (!isset($v) || $v === "false")
{
if (!isset($v) || $v === "false" || (!in_array($k, ['classs', 'subclass']) && $v == "0"))
unset($this->json[$this->id][$k]);
continue;
}
if (!in_array($k, ['classs', 'subclass', 'armor']) && $v === "0")
{
unset($this->json[$this->id][$k]);
continue;
}
}
}
private function parseRating($type, $value, $interactive = false)
@ -994,12 +994,14 @@ class ItemList extends BaseType
private function initJsonStats()
{
$json = array(
'id' => $this->id, // note to self: lowercase for js-Ids.. ALWAYS!!
'id' => $this->id,
'name' => (ITEM_QUALITY_HEIRLOOM - $this->curTpl['Quality']).$this->names[$this->id],
'icon' => $this->curTpl['icon'],
'classs' => $this->curTpl['class'],
'subclass' => $this->curTpl['subclass'],
// 'subsubclass' => $this->curTpl['subsubclass'],
'heroic' => (string)($this->curTpl['Flags'] & 0x8),
'side' => Util::sideByRaceMask($this->curTpl['AllowableRace']), // check for FlagsExtra? 0:both; 1: Horde; 2:Alliance
'slot' => $this->curTpl['InventoryType'],
'slotbak' => $this->curTpl['InventoryType'],
'level' => $this->curTpl['ItemLevel'],
@ -1054,7 +1056,7 @@ class ItemList extends BaseType
// clear zero-values afterwards
foreach ($json as $k => $v)
if (!isset($v) || $v === "false" || (!in_array($k, ['classs', 'subclass', 'armor']) && $v === "0"))
if (!isset($v) || $v === "false" || (!in_array($k, ['classs', 'subclass']) && $v == "0"))
unset($json[$k]);
$this->json[$json['id']] = $json;

View file

@ -6,8 +6,7 @@ if (!defined('AOWOW_REVISION'))
class ItemsetList extends BaseType
{
private $classes = []; // used to build g_classes
public $pieces = []; // used to build g_items and search
public $pieceToSet = [];
public $pieceToSet = []; // used to build g_items and search
protected $setupQuery = 'SELECT *, id AS ARRAY_KEY FROM ?_itemset WHERE [filter] [cond] ORDER BY maxlevel ASC';
protected $matchQuery = 'SELECT COUNT(1) FROM ?_itemset WHERE [filter] [cond]';
@ -35,7 +34,6 @@ class ItemsetList extends BaseType
{
if ($piece = $this->curTpl['item'.$i])
{
$this->pieces[] = $piece;
$this->templates[$this->id]['pieces'][] = $piece;
$this->pieceToSet[$piece] = $this->id;
}
@ -43,9 +41,7 @@ class ItemsetList extends BaseType
}
$this->reset();
$this->classes = array_unique($this->classes);
$this->pieces = array_unique($this->pieces);
$this->pieceToSet = array_unique($this->pieceToSet);
$this->classes = array_unique($this->classes);
}
public function getListviewData()
@ -78,8 +74,8 @@ class ItemsetList extends BaseType
if ($this->classes)
(new CharClassList(array(['id', $this->classes])))->addGlobalsToJscript($refs);
if ($this->pieces)
(new ItemList(array(['i.entry', $this->pieces])))->addGlobalsToJscript($refs);
if ($this->pieceToSet)
(new ItemList(array(['i.entry', array_keys($this->pieceToSet)])))->addGlobalsToJscript($refs);
}
public function addRewardsToJScript(&$ref) { }

View file

@ -30,7 +30,7 @@ if ($compareString)
while (sizeof($params) < 7)
$params[] = 0;
$outString[] = "[".implode(',', $params)."]";
$outString[] = $params;
// MATCH() AGAINST() for integers would be nice...
$res = DB::Aowow()->SelectRow(
@ -43,29 +43,23 @@ if ($compareString)
if ($res)
$piecesAssoc[(int)$params[0]] = $res['id'];
}
$outSet[] = "[".implode(',', $outString)."]";
$outSet[] = $outString;
}
$pageData['summary'] = "[".implode(',', $outSet)."]";
$pageData['summary'] = json_encode($outSet, JSON_NUMERIC_CHECK);
$iList = new ItemList(array(['i.entry', $items]));
while ($iList->iterate())
$data = $iList->getListviewData(ITEMINFO_SUBITEMS | ITEMINFO_JSON);
foreach ($data as $id => $item)
{
$iList->extendJsonStats();
$stats = [];
foreach ($iList->json[$iList->id] as $k => $v)
$stats[] = is_numeric($v) || $v[0] == "{" ? '"'.$k.'":'.$v.'' : '"'.$k.'":"'.$v.'"';
foreach ($iList->itemMods[$iList->id] as $k => $v)
if ($v)
$stats[] = '"'.Util::$itemMods[$k].'":'.$v;
while ($iList->id != $id)
$iList->iterate();
$pageData['items'][] = [
$iList->id,
Util::jsEscape($iList->names[$iList->id]),
$id,
Util::jsEscape($iList->names[$id]),
$iList->getField('Quality'),
$iList->getField('icon'),
"{".implode(",", $stats)."}"
json_encode($item, JSON_NUMERIC_CHECK)
];
}
}

View file

@ -239,7 +239,7 @@ if ($searchMask & 0x20)
'appendix' => ' (Item Set)',
'data' => $data,
'params' => ['tabs' => '$myTabs'],
'pieces' => $sets->pieces
'pcsToSet' => $sets->pieceToSet
);
}
}
@ -247,14 +247,17 @@ if ($searchMask & 0x20)
// 7 Items
if ($searchMask & 0x40)
{
if (($searchMask & SEARCH_TYPE_JSON) && $type == TYPE_ITEMSET && $found['itemset']['pieces'])
$conditions = [['i.class', [2, 4]], ['i.entry', $found['itemset']['pieces']]];
if (($searchMask & SEARCH_TYPE_JSON) && $type == TYPE_ITEMSET && isset($found['itemset']))
$conditions = [['i.entry', array_keys($found['itemset']['pcsToSet'])]];
else if (($searchMask & SEARCH_TYPE_JSON) && $type == TYPE_ITEM)
$conditions = [['i.class', [2, 4]], [User::$localeId ? 'name_loc'.User::$localeId : 'name', $query], 0];
else
$conditions = [[User::$localeId ? 'name_loc'.User::$localeId : 'name', $query], 0];
$items = new ItemList($conditions);
$items = new ItemList($conditions, @$found['itemset']['pcsToSet']);
$items->addGlobalsToJscript($jsGlobals);
if ($data = $items->getListviewData($searchMask & SEARCH_TYPE_JSON ? ITEMINFO_SUBITEMS : 0))
if ($data = $items->getListviewData($searchMask & SEARCH_TYPE_JSON ? (ITEMINFO_SUBITEMS | ITEMINFO_JSON) : 0))
{
while ($items->iterate())
{
@ -347,12 +350,51 @@ if ($searchMask & 0x10000)
// 26 Guilds
// if ($searchMask & 0x2000000)
/*
!note! dear reader, if you ever try to generate a string, that is to be evaled by JS, NEVER EVER terminate with a \n
$totalHoursWasted +=2;
*/
if ($searchMask & SEARCH_TYPE_JSON)
{
$outItems = '';
$outSets = '';
if (isset($found['item']))
{
$items = [];
foreach ($found['item']['data'] as $k => $v)
{
unset($v['param1']);
unset($v['param2']);
$items[] = json_encode($v, JSON_NUMERIC_CHECK);
}
$outItems = "\t".implode(",\n\t", $items)."\n";
}
if (isset($found['itemset']))
{
$sets = [];
foreach ($found['itemset']['data'] as $k => $v)
{
$v['name'] = $v['quality'].$v['name'];
unset($v['param1']);
unset($v['quality']);
if (!$v['heroic'])
unset($v['heroic']);
$sets[] = json_encode($v, JSON_NUMERIC_CHECK);
}
$outSets = "\t".implode(",\n\t", $sets)."\n";
}
header("Content-type: text/javascript");
echo "// not yet supported \n";
exit ("[\"".Util::jsEscape($query)."\", [\n],[\n]]\n");
die ('["'.Util::jsEscape($query)."\", [\n".$outItems."],[\n".$outSets.']]');
}
else if ($searchMask & SEARCH_TYPE_OPEN)
{
@ -421,7 +463,7 @@ else /* if ($searchMask & SEARCH_TYPE_REGULAR) */
$smarty->updatePageVars($vars);
$smarty->assign('lang', array_merge(Lang::$main, Lang::$search));
$smarty->assign('found', $found);
$smarty->assign('found', $found);
$smarty->assign('data', $jsGlobals);
$smarty->assign('search', $search);
$smarty->assign('mysql', DB::Aowow()->getStatistics());