- BaseType: skip empty arrays in condition

- BaseFilter: defined selectAll / selectNone magic numbers
- Item:
   * fixed formating error for required arena rating
   * filters for purchasablewith -item; -currency; -honor; -arena; reqarenarating
- Zone:
   * removed extra escape for globals
   * token changes to ZoneList... still not really usable
- Events: prevent selecting arbitrary related events on empty list
- Factions:
   * added filter-links to relTabs
   * added relTab for factionspecific GameObjects
- Spell:
   * parse information for aura:forceReaction
   * added relTab Zones to display info from spell_area
- JS:
   * added display of subzones to listview-template: zone
   * reworked condition to display multiple conditions
   * added race and gender conditions

typos.. they are never entirely gone
This commit is contained in:
Sarjuuk
2014-04-20 11:59:47 +02:00
parent d34838ea2c
commit 48cec63e1d
22 changed files with 552 additions and 198 deletions

View File

@@ -239,7 +239,7 @@ class AjaxHandler
*/
private function handleComment()
{
switch ($this->param[0])
switch ($this->params[0])
{
case 'rating':
return '{"success":true,"error":"","up":7,"down":9}';
@@ -252,7 +252,7 @@ class AjaxHandler
private function handleLocale() // not sure if this should be here..
{
User::setLocale($this->param[0]);
User::setLocale($this->params[0]);
User::writeCookie();
header('Location: '.(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '.'));
}

View File

@@ -106,6 +106,9 @@ define('FILTER_CR_STRING', 4);
define('FILTER_CR_ENUM', 5);
define('FILTER_CR_STAFFFLAG', 6);
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

View File

@@ -256,8 +256,8 @@ class AchievementListFilter extends Filter
141 => 156, // Feast of Winter Veil
409 => -3456, // Day of the Dead
398 => -3457, // Pirates' Day
-2323 => true,
-2324 => false,
FILTER_ENUM_ANY => true,
FILTER_ENUM_NONE => false,
283 => -1, // valid events without achievements
285 => -1, 353 => -1, 420 => -1,
400 => -1, 284 => -1, 374 => -1,

View File

@@ -152,10 +152,10 @@ abstract class BaseType
else
return null;
if (is_array($c[1]))
if (is_array($c[1]) && !empty($c[1]))
{
array_walk($c[1], function(&$item, $key) {
$item = Util::checkNumeric($item) ? $item : DB::Aowow()->escape($item);
$item = Util::checkNumeric($item) ? $item : DB::Aowow()->escape($item);
});
$op = (isset($c[2]) && $c[2] == '!') ? 'NOT IN' : 'IN';
@@ -897,9 +897,9 @@ abstract class Filter
{
if (is_bool($value))
return [$field, 0, ($value ? '>' : '<=')];
else if ($value == -2323) // any
else if ($value == FILTER_ENUM_ANY) // any
return [$field, 0, '>'];
else if ($value == -2324) // none
else if ($value == FILTER_ENUM_NONE) // none
return [$field, 0, '<='];
else if ($value !== null)
return [$field, $value];

View File

@@ -175,9 +175,9 @@ class ItemList extends BaseType
$tok = @$filter[TYPE_ITEM];
$cur = @$filter[TYPE_CURRENCY];
$reqRating = -1;
foreach ($result as $itemId => $data)
foreach ($result as $itemId => &$data)
{
$reqRating = 0;
foreach ($data as $npcId => $costs)
{
if ($tok || $cur) // bought with specific token or currency
@@ -197,12 +197,15 @@ class ItemList extends BaseType
}
// reqRating ins't really a cost .. so pass it by ref instead of return
// use lowest total value
// use highest total value
// note: how to distinguish between brackets .. or team/pers-rating?
if (isset($data[$npcId]) && ($reqRating > $costs['reqRtg'] || $reqRating < 0 ))
if (isset($data[$npcId]) && ($reqRating < $costs['reqRtg']))
$reqRating = $costs['reqRtg'];
}
if ($reqRating)
$data['reqRating'] = $reqRating;
if (empty($data))
unset($result[$itemId]);
}
@@ -298,6 +301,9 @@ class ItemList extends BaseType
if ($tokens)
$data[$this->id]['cost'][] = $tokens;
if ($_ = @$this->getExtendedCost($miscData)[$this->id]['reqRating'])
$data[$this->id]['reqarenartng'] = $_;
}
if ($x = $this->curTpl['buyPrice'])
@@ -737,7 +743,7 @@ class ItemList extends BaseType
// required arena team rating / personal rating / todo (low): sort out what kind of rating
if (@$this->getExtendedCost([], $reqRating)[$this->id] && $reqRating)
$x .= sprintf(Lang::$item['reqRating'], $reqRating);
$x .= sprintf(Lang::$item['reqRating'], $reqRating).'<br />';
// item level
if (in_array($_class, [ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON]))
@@ -1405,6 +1411,9 @@ class ItemList extends BaseType
class ItemListFilter extends Filter
{
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
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemExtendedCost iec ON iec.id = genv.extendedCost WHERE %1$s';
public $extraOpts = []; // score for statWeights
public $wtCnd = [];
protected $enums = array(
@@ -1433,6 +1442,19 @@ class ItemListFilter extends Filter
),
153 => array( // race-specific
null, 1, 2, 3, 4, 5, 6, 7, 8, null, 10, 11, true, false
),
158 => array( // currency
32572, 32569, 29736, 44128, 20560, 20559, 29434, 37829, 23247, 44990, 24368, 52027, 52030, 43016, 41596, 34052, 45624, 49426, 40752, 47241, 40753, 29024,
24245, 26045, 26044, 38425, 29735, 24579, 24581, 32897, 22484, 52026, 52029, 4291, 28558, 43228, 34664, 47242, 52025, 52028, 37836, 20558, 34597, 43589
),
118 => array( // tokens
34853, 34854, 34855, 34856, 34857, 34858, 34848, 34851, 34852, 40625, 40626, 40627, 45632, 45633, 45634, 34169, 34186, 29754, 29753, 29755, 31089, 31091, 31090,
40610, 40611, 40612, 30236, 30237, 30238, 45635, 45636, 45637, 34245, 34332, 34339, 34345, 40631, 40632, 40633, 45638, 45639, 45640, 34244, 34208, 34180, 34229,
34350, 40628, 40629, 40630, 45641, 45642, 45643, 29757, 29758, 29756, 31092, 31094, 31093, 40613, 40614, 40615, 30239, 30240, 30241, 45644, 45645, 45646, 34342,
34211, 34243, 29760, 29761, 29759, 31097, 31095, 31096, 40616, 40617, 40618, 30242, 30243, 30244, 45647, 45648, 45649, 34216, 29766, 29767, 29765, 31098, 31100,
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,
45659, 45660, 45661, 34212, 34351, 34215
)
);
// cr => [type, field, misc, extraCol]
@@ -1696,12 +1718,13 @@ class ItemListFilter extends Filter
return ['randomEnchant', $randIds];
else
return [0]; // no results aren't really input errors
case 125: // reqarenartng [op] [int] JOIN npc_vendor, game_event_npc_vendor, itemextendedcost.dbc
if (!$this->isSaneNumeric($cr[2]))
case 125: // reqarenartng [op] [int] todo (low): find out, why "IN (W, X, Y) AND IN (X, Y, Z)" doesn't result in "(X, Y)"
if (!$this->isSaneNumeric($cr[2]) || !$this->int2Op($cr[1]))
break;
$this->formData['extraCols'][] = $cr[0];
/* todo */ return [1];
$query = sprintf($this->extCostQuery, 'iec.reqPersonalrating '.$cr[1].' '.$cr[2]);
return ['id', DB::Aowow()->selectCol($query)];
case 160: // relatedevent [enum] like 169 .. crawl though npc_vendor and loot_templates of event-related spawns
/* todo */ return [1];
case 152: // classspecific [enum]
@@ -1783,14 +1806,36 @@ class ItemListFilter extends Filter
/* todo */ return [1];
case 76: // otskinning [yn]
/* todo */ return [1];
case 158: // purchasablewithcurrency [currency-any]
/* todo */ return [1];
case 118: // purchasablewithitem [itemcurrency-any]
/* todo */ return [1];
case 158: // purchasablewithcurrency [enum]
case 118: // purchasablewithitem [enum]
if (in_array($cr[1], $this->enums[$cr[0]]))
$_ = (array)$cr[1];
else if ($cr[1] == FILTER_ENUM_ANY)
$_ = $this->enums[$cr[0]];
else
break;
$query = sprintf($this->extCostQuery, 'iec.reqItemId1 IN (?a) OR iec.reqItemId2 IN (?a) OR iec.reqItemId3 IN (?a) OR iec.reqItemId4 IN (?a) OR iec.reqItemId5 IN (?a)');
if ($foo = DB::Aowow()->selectCol($query, $_, $_, $_, $_, $_, $_, $_, $_, $_, $_))
return ['id', $foo];
break;
case 144: // purchasablewithhonor [yn]
/* todo */ return [1];
if ($this->int2Bool($cr[1]))
{
$query = sprintf($this->extCostQuery, 'iec.reqHonorPoints > 0');
if ($foo = DB::Aowow()->selectCol($query))
return ['id', $foo, $cr[1] ? null : '!'];
}
break;
case 145: // purchasablewitharena [yn]
/* todo */ return [1];
if ($this->int2Bool($cr[1]))
{
$query = sprintf($this->extCostQuery, 'iec.reqArenaPoints > 0');
if ($foo = DB::Aowow()->selectCol($query))
return ['id', $foo, $cr[1] ? null : '!'];
}
break;
case 18: // rewardedbyfactionquest [side]
/* todo */ return [1];
case 126: // rewardedbyquestin [zone-any]

View File

@@ -500,9 +500,9 @@ class QuestListFilter extends Filter
$_ = intVal($cr[1]);
if ($_ > 0)
return ['OR', ['reqFactionId1', $_], ['reqFactionId2', $_]];
else if ($cr[1] == -2323) // any
else if ($cr[1] == FILTER_ENUM_ANY) // any
return ['OR', ['reqFactionId1', 0, '>'], ['reqFactionId2', 0, '>']];
else if ($cr[1] == -2324) // none
else if ($cr[1] == FILTER_ENUM_NONE) // none
return ['AND', ['reqFactionId1', 0], ['reqFactionId2', 0]];
break;

View File

@@ -134,7 +134,7 @@ visibleCols: ['heroiclevel', 'players']
public function addGlobalsToJScript($addMask = 0)
{
foreach ($this->iterate() as $__)
Util::$pageTemplate->extendGlobalData(self::$type, [$this->id => ['name' => Util::jsEscape($this->getField('name', true))]]);
Util::$pageTemplate->extendGlobalData(self::$type, [$this->id => ['name' => $this->getField('name', true)]]);
}
public function renderTooltip() { }

View File

@@ -659,7 +659,7 @@ $lang = array(
'_unavailable' => "This item is not available to players.",
'_rndEnchants' => "Random Enchantments",
'_chance' => "(%s%% chance)",
'reqRating' => "Requires personal and team arena rating of %d<br />in 3v3 or 5v5 brackets",
'reqRating' => "Requires personal and team arena rating of %d in 3v3 or 5v5 brackets",
'slot' => "Slot",
'_quality' => "Quality",
'usableBy' => "Usable by",

View File

@@ -627,7 +627,7 @@ $lang = array(
'_unavailable' => "Este objeto no está disponible para los jugadores.",
'_rndEnchants' => "Enchantements aléatoires",
'_chance' => "(%s%% de chance)",
'reqRating' => "Nécessite une cote d'arène personnelle et en équipe de %d<br />en arène de 3c3 ou 5c5.",
'reqRating' => "Nécessite une cote d'arène personnelle et en équipe de %d en arène de 3c3 ou 5c5.",
'slot' => "Emplacement",
'_quality' => "Qualité",
'usableBy' => "Utilisable par",

View File

@@ -115,7 +115,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$holidays[$_] = 0; // applied as back ref.
$row['condition'] = array(
$row['condition'][] = array(
'type' => TYPE_WORLDEVENT,
'typeId' => &$holidays[$_],
'status' => 1
@@ -194,7 +194,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
}
else
{
$n = in_array($_id, [42, 61, 81, 241, 121, 122, 123, 125, 126, 161, 201, 101, 102, 221, 301, 341]) ? '?items&filter=cr=158;crs='.$currency->getField('itemId').';crv=0' : null;
$n = in_array($_id, [42, 61, 81, 241, 121, 122, 123, 125, 126, 161, 201, 101, 102, 221, 301, 341]) ? '?items&filter=cr=158;crs='.$_itemId.';crv=0' : null;
$w = 'iec.reqItemId1 = '.$_itemId.' OR iec.reqItemId2 = '.$_itemId.' OR iec.reqItemId3 = '.$_itemId.' OR iec.reqItemId4 = '.$_itemId.' OR iec.reqItemId5 = '.$_itemId;
}

View File

@@ -223,57 +223,60 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
}
// tab: see also (event conditions)
if($rel = DB::Aowow()->selectCol('SELECT IF(eventEntry = prerequisite_event, NULL, IF(eventEntry = ?d, -prerequisite_event, eventEntry)) FROM game_event_prerequisite WHERE prerequisite_event = ?d OR eventEntry = ?d', $_eId, $_eId, $_eId))
if ($rel = DB::Aowow()->selectCol('SELECT IF(eventEntry = prerequisite_event, NULL, IF(eventEntry = ?d, -prerequisite_event, eventEntry)) FROM game_event_prerequisite WHERE prerequisite_event = ?d OR eventEntry = ?d', $_eId, $_eId, $_eId))
{
$list = [];
array_walk($rel, function(&$v, $k) use (&$list) {
if ($v > 0)
$list[] = $v;
else if ($v == null)
else if ($v === null)
Util::$pageTemplate->internalNotice(U_GROUP_EMPLOYEE, 'game_event_prerequisite: this event has itself as prerequisite');
});
$relEvents = new WorldEventList(array(['id', $list]));
$relEvents->addGlobalsToJscript();
$relData = $relEvents->getListviewData(true);
foreach ($relEvents->iterate() as $id => $__)
if ($list)
{
$relData[$id]['condition'] = array(
'type' => TYPE_WORLDEVENT,
'typeId' => -$eId,
'status' => 2
$relEvents = new WorldEventList(array(['id', $list]));
$relEvents->addGlobalsToJscript();
$relData = $relEvents->getListviewData(true);
foreach ($relEvents->iterate() as $id => $__)
{
$relData[$id]['condition'] = array(
'type' => TYPE_WORLDEVENT,
'typeId' => -$_eId,
'status' => 2
);
}
$event->addGlobalsToJscript();
foreach ($rel as $r)
{
if ($r >= 0)
continue;
Util::$pageTemplate->extendGlobalIds(TYPE_WORLDEVENT, -$r);
$d = $event->getListviewData(true);
$d[-$_eId]['condition'][] = array(
'type' => TYPE_WORLDEVENT,
'typeId' => $r,
'status' => 2
);
$relData= array_merge($relData, $d);
}
$pageData['relTabs'][] = array(
'file' => WorldEventList::$brickFile,
'data' => $relData,
'params' => array(
'id' => 'see-also',
'name' => '$LANG.tab_seealso',
'tabs' => '$tabsRelated',
'hiddenCols' => "$['date']",
'extraCols' => '$[Listview.extraCols.condition]'
)
);
}
$event->addGlobalsToJscript();
foreach ($rel as $r)
{
if ($r >= 0)
continue;
Util::$pageTemplate->extendGlobalIds(TYPE_WORLDEVENT, -$r);
$d = $event->getListviewData(true);
$d[-$eId]['condition'] = array(
'type' => TYPE_WORLDEVENT,
'typeId' => $r,
'status' => 2
);
$relData= array_merge($relData, $d);
}
$pageData['relTabs'][] = array(
'file' => WorldEventList::$brickFile,
'data' => $relData,
'params' => array(
'id' => 'see-also',
'name' => '$LANG.tab_seealso',
'tabs' => '$tabsRelated',
'hiddenCols' => "$['date']",
'extraCols' => '$[Listview.extraCols.condition]'
)
);
}

View File

@@ -148,17 +148,21 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$items->addGlobalsToJScript(GLOBALINFO_SELF);
$pageData['relTabs'][] = array(
$tab = array(
'file' => 'item',
'data' => $items->getListviewData(),
'showRep' => true,
'params' => array(
'tabs' => '$tabsRelated',
'extraCols' => '$_',
'sort' => "$['standing', 'name']",
'note' => sprintf(Util::$filterResultString, '?items&filter=cr=17;crs='.$_id.';crv=0')
'sort' => "$['standing', 'name']"
)
);
if ($items->getMatches() > CFG_SQL_LIMIT_DEFAULT)
$tab['params']['note'] = sprintf(Util::$filterResultString, '?items&filter=cr=17;crs='.$_id.';crv=0');
$pageData['relTabs'][] = $tab;
}
// tab: creatures with onKill reputation
@@ -178,14 +182,19 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$killCreatures->addGlobalsToJscript();
$pageData['relTabs'][] = array(
$tab = array(
'file' => 'creature',
'data' => $killCreatures->getListviewData(),
'showRep' => true,
'params' => array(
'tabs' => '$tabsRelated',
'tabs' => '$tabsRelated',
)
);
if ($killCreatures->getMatches() > CFG_SQL_LIMIT_DEFAULT)
$tab['params']['note'] = sprintf(Util::$filterResultString, '?npcs&filter=cr=42;crs='.$_id.';crv=0');
$pageData['relTabs'][] = $tab;
}
}
}
@@ -198,13 +207,34 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$members->addGlobalsToJscript();
$pageData['relTabs'][] = array(
$tab = array(
'file' => 'creature',
'data' => $members->getListviewData(),
'showRep' => true,
'params' => array(
'id' => 'member',
'name' => '$LANG.tab_members',
'tabs' => '$tabsRelated'
)
);
if ($members->getMatches() > CFG_SQL_LIMIT_DEFAULT)
$tab['params']['note'] = sprintf(Util::$filterResultString, '?npcs&filter=cr=3;crs='.$_id.';crv=0');
$pageData['relTabs'][] = $tab;
}
}
// tab: objects
if ($_ = $faction->getField('templateIds'))
{
$objects = new GameObjectList(array(['faction', $_]));
if (!$objects->error)
{
$pageData['relTabs'][] = array(
'file' => 'object',
'data' => $objects->getListviewData(),
'params' => array(
'tabs' => '$tabsRelated',
)
);
@@ -225,16 +255,20 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$quests->addGlobalsToJScript(GLOBALINFO_ANY);
$pageData['relTabs'][] = array(
$tab = array(
'file' => 'quest',
'data' => $quests->getListviewData($_id),
'showRep' => true,
'params' => array(
'tabs' => '$tabsRelated',
'extraCols' => '$_',
'note' => sprintf(Util::$filterResultString, '?quests?filter=cr=1;crs='.$_id.';crv=0')
'extraCols' => '$_'
)
);
if ($quests->getMatches() > CFG_SQL_LIMIT_DEFAULT)
$tab['params']['note'] = sprintf(Util::$filterResultString, '?quests&filter=cr=1;crs='.$_id.';crv=0');
$pageData['relTabs'][] = $tab;
}
// tab: achievements

View File

@@ -286,6 +286,10 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$tokens = [];
$currency = [];
if (!is_array($data))
continue;
foreach ($data as $c => $qty)
{
if (is_string($c))
@@ -324,7 +328,27 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$quickInfo[] = Lang::$item['cost'].$each.Lang::$colon.'[ul][li]'.implode('[/li][li]', $costList).'[/li][/ul]';
if ($_reqRating)
$quickInfo[] = sprintf(Lang::$item['reqRating'], $_reqRating);
{
$res = [];
$i = 0;
$len = 0;
$parts = explode(' ', sprintf(Lang::$item['reqRating'], $_reqRating));
foreach ($parts as $p)
{
$res[$i][] = $p;
$len += mb_strlen($p);
if ($len < 30)
continue;
$len = 0;
$i++;
}
foreach ($res as &$r)
$r = implode(' ', $r);
$quickInfo[] = implode('[br]', $res);
}
}
if ($_ = $item->getField('repairPrice'))
@@ -557,7 +581,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$reqQuest[$lv['id']] = 0;
$itemLoot[$l]['condition'] = ['type' => TYPE_QUEST, 'typeId' => &$reqQuest[$lv['id']], 'status' => 1];
$itemLoot[$l]['condition'][] = ['type' => TYPE_QUEST, 'typeId' => &$reqQuest[$lv['id']], 'status' => 1];
}
$pageData['relTabs'][] = array(
@@ -900,7 +924,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$extraCols[] = 'Listview.extraCols.condition';
Util::$pageTemplate->extendGlobalIds(TYPE_WORLDEVENT, $e);
$row['condition'] = array(
$row['condition'][] = array(
'type' => TYPE_WORLDEVENT,
'typeId' => -$e,
'status' => 1

View File

@@ -172,7 +172,7 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
$path[] = $filter['sl'];
$infoMask = ITEMINFO_JSON;
if (array_intersect([63, 64], $xCols)) // 63:buyPrice; 64:sellPrice
if (array_intersect([63, 64, 125], $xCols)) // 63:buyPrice; 64:sellPrice; 125:reqarenartng
$infoMask |= ITEMINFO_VENDOR;

View File

@@ -520,7 +520,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
if (!isset($extra[0]))
$extra[0] = 'Listview.extraCols.condition';
$data[$sId]['condition'] = ['type' => TYPE_SKILL, 'typeId' => $_, 'status' => 1, 'reqSkillLvl' => $train['reqSkillValue']];
$data[$sId]['condition'][] = ['type' => TYPE_SKILL, 'typeId' => $_, 'status' => 1, 'reqSkillLvl' => $train['reqSkillValue']];
}
if ($_ = $train['reqLevel'])
@@ -631,7 +631,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$reqQuest[$lv['id']] = 0;
$itemLoot[$l]['condition'] = ['type' => TYPE_QUEST, 'typeId' => &$reqQuest[$lv['id']], 'status' => 1];
$itemLoot[$l]['condition'][] = ['type' => TYPE_QUEST, 'typeId' => &$reqQuest[$lv['id']], 'status' => 1];
}
$pageData['relTabs'][] = array(

View File

@@ -423,7 +423,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$reqQuest[$lv['id']] = 0;
$itemLoot[$l]['condition'] = ['type' => TYPE_QUEST, 'typeId' => &$reqQuest[$lv['id']], 'status' => 1];
$itemLoot[$l]['condition'][] = ['type' => TYPE_QUEST, 'typeId' => &$reqQuest[$lv['id']], 'status' => 1];
}
$extraCols[] = 'Listview.extraCols.percent';

View File

@@ -421,7 +421,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
'rangeName' => $spell->getField('rangeText', true),
'range' => $spell->getField('rangeMaxHostile'),
'gcd' => Util::formatTime($spell->getField('startRecoveryTime')),
'gcdCat' => "[NYI]",
'gcdCat' => null, // todo (low): nyi; find out how this works [n/a; normal; ..]
'school' => User::isInGroup(U_GROUP_STAFF) ? sprintf(Util::$dfnString, Util::asHex($spell->getField('schoolMask')), Lang::getMagicSchools($spell->getField('schoolMask'))) : Lang::getMagicSchools($spell->getField('schoolMask')),
'dispel' => Lang::$game['dt'][$spell->getField('dispelType')],
'mechanic' => Lang::$game['me'][$spell->getField('mechanic')],
@@ -666,7 +666,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
if ($spell->getField('effect'.$i.'RadiusMax') > 0)
$foo['radius'] = $spell->getField('effect'.$i.'RadiusMax');
if (($effBP + $effDS) && !($itemIdx && $spell->relItems && !$spell->relItems->error) && (!in_array($i, $spellIdx) || in_array($effAura, [225, 227])))
if (!($itemIdx && $spell->relItems && !$spell->relItems->error) && (!in_array($i, $spellIdx) || in_array($effAura, [225, 227])))
$foo['value'] = ($effDS != 1 ? ($effBP + 1).Lang::$game['valueDelim'] : null).($effBP + $effDS);
if ($effRPPL != 0)
@@ -1041,6 +1041,11 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
break;
}
case 139: // Force Reaction
{
$bar = ' (<a href="?faction='.$effMV.'">'.FactionList::getName($effMV).'</a>)';
$foo['value'] = sprintf(Util::$dfnString, $foo['value'], Lang::$game['rep'][$foo['value']]);
}
}
$foo['name'] .= strstr($bar, 'href') || strstr($bar, '#') ? $bar : ($bar ? ' ('.$bar.')' : null);
@@ -1058,7 +1063,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
}
// cases where we dont want 'Value' to be displayed
if (in_array($effAura, [11, 12, 36, 77]) || in_array($effId, []))
if (in_array($effAura, [11, 12, 36, 77]) || in_array($effId, []) || empty($foo['value']))
unset($foo['value']);
}
@@ -1372,8 +1377,8 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
if (($bar = $spell->getField('effect'.$i.'CreateItemId')) && isset($foo[$bar]))
{
$lv[$bar] = $foo[$bar];
$lv[$bar]['percent'] = $extraItem['additionalCreateChance'];
$lv[$bar]['condition'] = ['type' => TYPE_SPELL, 'typeId' => $extraItem['requiredSpecialization'], 'status' => 2];
$lv[$bar]['percent'] = $extraItem['additionalCreateChance'];
$lv[$bar]['condition'][] = ['type' => TYPE_SPELL, 'typeId' => $extraItem['requiredSpecialization'], 'status' => 2];
$smarty->extendGlobalIds(TYPE_SPELL, $extraItem['requiredSpecialization']);
$extraCols[] = 'Listview.extraCols.condition';
@@ -1568,6 +1573,130 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$ubCreature->addGlobalsToJScript(GLOBALINFO_SELF);
}
// tab: zone
if ($areas = DB::Aowow()->select('SELECT * FROM spell_area WHERE spell = ?d', $_id))
{
$zones = new ZoneList(array(['id', array_column($areas, 'area')]));
if (!$zones->error)
{
$lvZones = $zones->getListviewData();
$zones->addGlobalsToJscript();
$lv = [];
$parents = [];
foreach ($areas as $a)
{
if (empty($lvZones[$a['area']]))
continue;
$_ = ['condition' => []];
$extra = false;
if ($a['aura_spell'])
{
Util::$pageTemplate->extendGlobalIds(TYPE_SPELL, $a['aura_spell']);
$_['condition'][] = array(
'type' => TYPE_SPELL,
'typeId' => abs($a['aura_spell']),
'status' => $a['aura_spell'] > 0 ? 1 : 0
);
}
if ($a['quest_start']) // status for quests needs work
{
Util::$pageTemplate->extendGlobalIds(TYPE_QUEST, $a['quest_start']);
$_['condition'][] = array(
'type' => TYPE_QUEST,
'typeId' => $a['quest_start'],
'status' => $a['quest_start_status'] & 0x8 ? 1 : 2
);
}
if ($a['quest_end'] && $a['quest_end'] != $a['quest_start'])
{
Util::$pageTemplate->extendGlobalIds(TYPE_QUEST, $a['quest_end']);
$_['condition'][] = array(
'type' => TYPE_QUEST,
'typeId' => $a['quest_end'],
'status' => $a['quest_start_status'] & 0x8 ? 1 : 0
);
}
if ($a['racemask'])
{
$foo = [];
for ($i = 0; $i < 10; $i++)
if ($a['racemask'] & $i)
$foo[] = $i + 1;
Util::$pageTemplate->extendGlobalIds(TYPE_RACE, $foo);
$_['condition'][] = array(
'type' => TYPE_RACE,
'typeId' => $a['racemask'],
'status' => 1
);
}
if ($a['gender'] != 2) // 2: both
$_['condition'][] = ['gender' => $a['gender'] + 1];
if ($_['condition'])
$extra = true;
$row = array_merge($_, $lvZones[$a['area']]);
// merge subzones, into one row, if: conditions match && parentZone is shared
if ($p = $zones->getEntry($a['area'])['parentArea'])
{
$parents[] = $p;
$row['parentArea'] = $p;
$row['subzones'] = [$a['area']];
}
else
$row['parentArea'] = 0;
$set = false;
foreach ($lv as &$v)
{
if ($v['condition'] != $row['condition'] || ($v['parentArea'] != $row['parentArea'] && $v['id'] != $row['parentArea']))
continue;
if (!$row['parentArea'] && $v['id'] != $row['parentArea'])
continue;
$set = true;
$v['subzones'][] = $row['id'];
break;
}
// add self as potential subzone; IF we are a parentZone without added children, we get filtered in JScript
if (!$set)
{
$row['subzones'] = [$row['id']];
$lv[] = $row;
}
}
// overwrite lvData with parent-lvData (condition and subzones are kept)
if ($parents)
{
$parents = (new ZoneList(array(['id', $parents])))->getListviewData();
foreach ($lv as &$_)
if (isset($parents[$_['parentArea']]))
$_ = array_merge($_, $parents[$_['parentArea']]);
}
$pageData['relTabs'][] = array(
'file' => 'zone',
'data' => $lv,
'params' => [
'tabs' => '$tabsRelated',
'extraCols' => $extra ? '$[Listview.extraCols.condition]' : null,
'hiddenCols' => $extra ? "$['instancetype']" : null
]
);
}
}
// tab: teaches
if ($ids = Util::getTaughtSpells($spell))
{

View File

@@ -7,7 +7,7 @@ if (!defined('AOWOW_REVISION'))
$cats = Util::extractURLParams($pageParam);
$path = [0, 6];
$title = [Util::ucFirst(Lang::$game['zones'])];
$cacheKey = implode('_', [CACHETYPE_PAGE, TYPE_ZONE, -1, $cats[0] ? implode('.', $cats) : -1, User::$localeId]);
$cacheKey = implode('_', [CACHETYPE_PAGE, TYPE_ZONE, -1, $cats ? implode('.', $cats) : -1, User::$localeId]);
$validCats = array(
0 => true,
1 => true,
@@ -31,7 +31,7 @@ if (!$smarty->loadCache($cacheKey, $pageData))
$mapFile = 0;
$spawnMap = -1;
if (isset($cats[0]))
if ($cats)
{
$conditions[] = ['z.category', $cats[0]];
@@ -57,10 +57,24 @@ if (!$smarty->loadCache($cacheKey, $pageData))
$zones = new ZoneList($conditions);
// menuId 6: Zone g_initPath()
// tabId 0: Database g_initHeader()
$pageData = array(
'som' => '',
'map' => [],
'listviews' => array(
'page' => array(
'title' => implode(' - ', $title),
'path' => json_encode($path, JSON_NUMERIC_CHECK),
'tab' => 0,
'map' => null,
'reqCSS' => array(
['path' => STATIC_URL.'/css/Mapper.css'],
['path' => STATIC_URL.'/css/Mapper_ie6.css', 'ieCond' => 'lte IE 6']
),
'reqJS' => array(
STATIC_URL.'/js/Mapper.js',
STATIC_URL.'/js/ShowOnMap.js'
)
),
'lv' => array(
array(
'file' => 'zone',
'data' => $zones->getListviewData(),
@@ -113,37 +127,24 @@ if (!$smarty->loadCache($cacheKey, $pageData))
$somData['flightmaster'][] = $data;
}
$pageData['map'] = array(
'zone' => $mapFile,
'zoom' => 1,
'overlay' => 'true',
'zoomable' => 'false'
$pageData['page']['map'] = array(
'data' => array(
'zone' => $mapFile,
'zoom' => 1,
'overlay' => 'true',
'zoomable' => 'false'
),
'som' => json_encode($somData, JSON_NUMERIC_CHECK)
);
$pageData['som'] = json_encode($somData, JSON_NUMERIC_CHECK);
}
$smarty->saveCache($cacheKey, $pageData);
}
// menuId 6: Zone g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'title' => implode(' - ', $title),
'path' => json_encode($path, JSON_NUMERIC_CHECK),
'tab' => 0,
'reqCSS' => array(
['path' => 'template/css/Mapper.css'],
['path' => 'template/css/Mapper_ie6.css', 'ieCond' => 'lte IE 6']
),
'reqJS' => array(
'template/js/Mapper.js',
'template/js/ShowOnMap.js'
)
));
$smarty->updatePageVars($pageData['page']);
$smarty->assign('lang', Lang::$main);
$smarty->assign('lvData', $pageData);
$smarty->assign('lvData', $pageData['lv']);
// load the page
$smarty->display('list-page-generic.tpl');

View File

@@ -6235,61 +6235,93 @@ Listview.extraCols = {
id: 'condition',
name: LANG.requires,
width: '30%',
compute: function(row, td) {
if (!row.condition || !row.condition.type || !row.condition.typeId) {
return '';
}
var cnd = Listview.extraCols.condition.getState(row.condition);
if (!cnd) {
if (!row.condition || !$WH.is_array(row.condition)) {
return;
}
td.className = 'small';
td.style.lineHeight = '18px';
var span = $WH.ce('span');
span.className = cnd.color;
$WH.ae(span, cnd.state);
$WH.ae(td, span);
$WH.ae(td, $WH.ce('br'));
for (i in row.condition) {
if (cnd = Listview.extraCols.condition.getState(row.condition[i])) {
if (td.innerHTML)
$WH.ae(td, $WH.ce('br'));
var a = $WH.ce('a');
a.href = cnd.url;
a.style.whiteSpace = 'nowrap';
var span = $WH.ce('span');
span.className = cnd.color;
$WH.ae(span, cnd.state);
$WH.ae(td, span);
if (g_pageInfo.typeId == row.condition.typeId) { // ponts to self
a.className = 'q1';
$WH.st(a, 'This');
}
else {
$WH.st(a, cnd.name);
for (j in cnd.links) {
if (j > 0) {
$WH.ae(td, $WH.ct(LANG.comma));
}
if (cnd.icon) {
a.className = 'icontiny tinyspecial';
a.style.backgroundImage = 'url(' + g_staticUrl + '/images/wow/icons/tiny/' + cnd.icon + '.gif)';
var
l = cnd.links[j],
a = $WH.ce('a');
a.href = l.url;
a.style.whiteSpace = 'nowrap';
// points to self
if (g_pageInfo.type == row.condition[i].type && g_pageInfo.typeId == row.condition[i].typeId) {
a.className = 'q1';
$WH.st(a, 'This');
}
else {
$WH.ae(a, l.name);
if (l.icon) {
a.className = 'icontiny tinyspecial';
a.style.backgroundImage = 'url(' + g_staticUrl + '/images/wow/icons/tiny/' + l.icon + '.gif)';
}
if (l.color) {
a.className += ' ' + l.color;
}
}
$WH.ae(td, a);
}
}
else if ('gender' in row.condition[i]) {
var
gender = g_file_genders[row.condition[i].gender - 1],
sp = $WH.ce('span');
if (cnd.quality) {
a.className += ' q' + cnd.quality;
sp.className = 'icon-' + gender;
sp.style.position = 'absolute';
sp.style.right = '0px';
sp.style.top = '3px';
sp.innerHTML = '&nbsp;';
g_addTooltip(sp, LANG[gender]);
td.style.position = 'relative';
$WH.ae(td, sp);
}
}
$WH.ae(td, a);
},
getVisibleText: function(row) {
var buff = '';
if (!row.condition || !row.condition.type || !row.condition.typeId) {
if (!row.condition || !$WH.is_array(row.condition)) {
return buff;
}
var cnd = Listview.extraCols.condition.getState(row.condition);
if (!cnd) {
return buff;
}
for (i in row.condition) {
var cnd = Listview.extraCols.condition.getState(row.condition[i]);
if (!cnd) {
continue;
}
buff += cnd.name + ' ' + cnd.state;
for (j in cnd) {
buff += cnd[j].name + ' ' + cnd.state;
}
}
return buff;
},
@@ -6307,8 +6339,10 @@ Listview.extraCols = {
return Listview.extraCols.condition.getQuestState(cond);
case 'event':
return Listview.extraCols.condition.getEventState(cond);
case 'race':
return Listview.extraCols.condition.getRaceState(cond);
default:
return {};
return null;
}
},
getSkillState: function(cond) {
@@ -6320,14 +6354,16 @@ Listview.extraCols = {
cnd = {},
item = g_skills[cond.typeId];
cnd.icon = item.icon.toLowerCase();
cnd.state = cond.status ? $WH.ct(LANG.pr_note_known) : $WH.ct(LANG.pr_note_missing);
cnd.state = $WH.ct((cond.status ? LANG.pr_note_known : LANG.pr_note_missing) + LANG.colon);
cnd.color = cond.status ? 'q2' : 'q10';
cnd.name = item['name_' + g_locale.name];
cnd.url = '?skill=' + cond.typeId;
cnd.links = [{
icon: item.icon.toLowerCase(),
name: $WH.ct(item['name_' + g_locale.name]),
url : '?skill=' + cond.typeId
}];
if (cond.reqSkillLvl)
cnd.name += ' (' + cond.reqSkillLvl + ')';
cnd.l.name += ' (' + cond.reqSkillLvl + ')';
return cnd;
},
@@ -6340,11 +6376,13 @@ Listview.extraCols = {
cnd = {},
item = g_spells[cond.typeId];
cnd.icon = item.icon.toLowerCase();
cnd.state = cond.status ? $WH.ct(LANG.pr_note_known) : $WH.ct(LANG.pr_note_missing);
cnd.state = $WH.ct((cond.status ? LANG.pr_note_known : LANG.pr_note_missing) + LANG.colon);
cnd.color = cond.status ? 'q2' : 'q10';
cnd.name = item['name_' + g_locale.name];
cnd.url = '?spell=' + cond.typeId;
cnd.links = [{
icon: item.icon.toLowerCase(),
name: $WH.ct(item['name_' + g_locale.name]),
url : '?spell=' + cond.typeId
}];
return cnd;
},
@@ -6357,12 +6395,14 @@ Listview.extraCols = {
cnd = {},
item = g_items[cond.typeId];
cnd.icon = item.icon.toLowerCase();
cnd.state = cond.status ? $WH.ct(LANG.pr_note_earned) : $WH.ct(LANG.pr_note_missing);
cnd.color = cond.status ? 'q2' : 'q10';
cnd.name = item['name_' + g_locale.name];
cnd.url = '?item=' + cond.typeId;
cnd.quality = item.quality;
cnd.state = $WH.ct((cond.status ? LANG.pr_note_earned : LANG.pr_note_missing) + LANG.colon);
cnd.color = cond.status ? 'q2' : 'q10';
cnd.links = [{
icon : item.icon.toLowerCase(),
name : $WH.ct(item['name_' + g_locale.name]),
url : '?item=' + cond.typeId,
color: 'q' + item.quality
}];
return cnd;
},
@@ -6375,11 +6415,13 @@ Listview.extraCols = {
cnd = {},
item = g_achievements[cond.typeId];
cnd.icon = item.icon.toLowerCase();
cnd.state = cond.status ? $WH.ct(LANG.pr_note_earned) : $WH.ct(LANG.pr_note_incomplete);
cnd.state = $WH.ct((cond.status ? LANG.pr_note_earned : LANG.pr_note_incomplete) + LANG.colon);
cnd.color = cond.status ? 'q2' : 'q10';
cnd.name = item['name_' + g_locale.name];
cnd.url = '?achievement=' + cond.typeId;
cnd.links = [{
icon: item.icon.toLowerCase(),
name: $WH.ct(item['name_' + g_locale.name]),
url : '?achievement=' + cond.typeId
}];
return cnd;
},
@@ -6392,11 +6434,35 @@ Listview.extraCols = {
cnd = {},
item = g_quests[cond.typeId];
cnd.icon = '';
cnd.state = cond.status == 1 ? $WH.ct(LANG.progress) : cond.status == 2 ? $WH.ct(LANG.pr_note_complete) : $WH.ct(LANG.pr_note_incomplete);
cnd.state = $WH.ct((cond.status == 1 ? LANG.progress : (cond.status == 2 ? LANG.pr_note_complete : LANG.pr_note_incomplete)) + LANG.colon);
cnd.color = cond.status == 1 ? 'q1' : cond.status == 2 ? 'q2' : 'q10';
cnd.name = item['name_' + g_locale.name];
cnd.url = '?quest=' + cond.typeId;
cnd.links = [{
name: $WH.ct(item['name_' + g_locale.name]),
url : '?quest=' + cond.typeId
}];
return cnd;
},
getRaceState: function(cond) {
if (!cond.typeId) {
return;
}
var
cnd = {},
name = $WH.ce('div'),
races = Listview.funcBox.assocBinFlags(cond.typeId, g_chr_races);
cnd.state = $WH.ct((cond.status ? 'Player is' : 'Player is not') + LANG.colon);
cnd.color = 'q1';
cnd.links = [];
for (var i = 0, len = races.length; i < len; ++i) {
cnd.links.push({
name: $WH.ct(g_chr_races[races[i]]),
url : '?class=' + races[i]
});
}
return cnd;
},
@@ -6409,24 +6475,28 @@ Listview.extraCols = {
cnd = {},
item = g_holidays[cond.typeId];
cnd.icon = item.icon.toLowerCase();
cnd.state = cond.status == 1 ? $WH.ct('active') : cond.status == 2 ? $WH.ct(LANG.pr_note_complete) : $WH.ct('inactive');
cnd.state = $WH.ct((cond.status == 1 ? 'active' : (cond.status == 2 ? LANG.pr_note_complete : 'inactive')) + LANG.colon);
cnd.color = cond.status == 1 ? 'q1' : cond.status == 2 ? 'q2' : 'q10';
cnd.name = item['name_' + g_locale.name];
cnd.url = '?event=' + cond.typeId;
cnd.links = [{
icon: item.icon.toLowerCase(),
name: item['name_' + g_locale.name],
url :'?event=' + cond.typeId
}];
return cnd;
},
sortFunc: function(a, b, col) {
if (a.condition && b.condition) {
return $WH.strcmp(a.condition.status, b.condition.status);
}
else if (a.condition)
var text1 = this.getVisibleText(a);
var text2 = this.getVisibleText(b);
if (text1 != '' && text2 == '') {
return -1;
else if (b.condition)
}
if (text2 != '' && text1 == '') {
return 1;
else
return 0;
}
return $WH.strcmp(text1, text2);
}
},
};
@@ -11340,7 +11410,10 @@ Listview.templates = {
align: 'left',
value: 'name',
compute: function(zone, td) {
var a = $WH.ce('a');
var
wrapper = $WH.ce('div'),
a = $WH.ce('a');
a.style.fontFamily = 'Verdana, sans-serif';
a.href = this.getItemLink(zone);
$WH.ae(a, $WH.ct(zone.name));
@@ -11348,10 +11421,52 @@ Listview.templates = {
var sp = $WH.ce('span');
sp.className = g_GetExpansionClassName(zone.expansion);
$WH.ae(sp, a);
$WH.ae(td, sp);
$WH.ae(wrapper, sp);
}
else {
$WH.ae(td, a);
$WH.ae(wrapper, a);
}
$WH.ae(td, wrapper);
if (zone.subzones) {
if (zone.subzones.length == 1 && zone.subzones[0] == zone.id)
return;
var nRows = parseInt(zone.subzones.length / 3);
if (nRows != (zone.subzones.length / 3))
nRows++;
wrapper.style.position = 'relative';
wrapper.style.minHeight = ((nRows * 12) + 19) + 'px';
var d = $WH.ce('div');
d.className = 'small';
d.style.fontStyle = 'italic';
d.style.position = 'absolute';
d.style.right = '2px';
d.style.bottom = '2px';
d.style.textAlign = 'right';
for (i in zone.subzones) {
if (!g_gatheredzones[zone.subzones[i]]) {
continue;
}
if (i > 0) {
$WH.ae(d, $WH.ct(LANG.comma));
}
var a = $WH.ce('a');
a.className = zone.subzones[i] == zone.id ? 'q1' : 'q0';
a.style.whiteSpace = 'nowrap';
a.href = '?zone=' + zone.subzones[i];
$WH.st(a, g_gatheredzones[zone.subzones[i]]['name_' + g_locale.name]);
$WH.ae(d, a);
}
$WH.ae(wrapper, d);
}
},
getVisibleText: function(zone) {
@@ -13314,7 +13429,7 @@ Listview.templates = {
if (title.gender && title.gender != 3) {
var gender = g_file_genders[title.gender - 1];
var sp = $WH.ce('span');
sp.className = gender + '-icon';
sp.className = 'icon-' + gender;
g_addTooltip(sp, LANG[gender]);
$WH.ae(td, sp);

View File

@@ -2,7 +2,7 @@ var _ = g_quests;
{strip}
{foreach from=$data key=id item=item}
_[{$id}]={ldelim}
name_{$user.language}:'{$item.name|escape:"javascript"}',
name_{$user.language}:'{$item.name|escape:"javascript"}'
{rdelim};
{/foreach}
{/strip}

View File

@@ -9,17 +9,17 @@
<!--[if lte IE 6]><link rel="stylesheet" type="text/css" href="{$smarty.const.STATIC_URL}/css/global_ie6.css?{$AOWOW_REVISION}" /><![endif]-->
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="{$smarty.const.STATIC_URL}/css/global_ie67.css?{$AOWOW_REVISION}" /><![endif]-->
{foreach from=$reqCSS item=css}
{if isset($css.string)}
{if !empty($css.string)}
<style type="text/css">{$css.string}</style>
{else}
{if isset($css.ieCond)}<!--[if {$css.ieCond}]>{/if}<link rel="stylesheet" type="text/css" href="{$css.path}?{$AOWOW_REVISION}" />{if isset($css.ieCond)}<![endif]-->{/if}
{elseif !empty($css.path)}
{if !empty($css.ieCond)}<!--[if {$css.ieCond}]>{/if}<link rel="stylesheet" type="text/css" href="{$css.path}?{$AOWOW_REVISION}" />{if !empty($css.ieCond)}<![endif]-->{/if}
{/if}
{/foreach}
<script type="text/javascript">
var g_serverTime = new Date('{$smarty.now|date_format:"%Y/%m/%d %H:%M:%S"}');
var g_staticUrl = "{$smarty.const.STATIC_URL}";
var g_host = "{$smarty.const.HOST_URL}";
{if isset($dataKey)}
{if !empty($dataKey)}
var g_dataKey = '{$dataKey}';
{/if}
</script>
@@ -29,9 +29,9 @@
<script src="{$smarty.const.STATIC_URL}/js/locale_{$user.language}.js?{$AOWOW_REVISION}" type="text/javascript"></script>
<script src="{$smarty.const.STATIC_URL}/js/global.js?{$AOWOW_REVISION}" type="text/javascript"></script>
<script src="{$smarty.const.STATIC_URL}/js/Markup.js?{$AOWOW_REVISION}" type="text/javascript"></script>
{foreach from=$reqJS item=file}
{foreach from=$reqJS item=file}{if !empty($file)}
<script src="{$file}{if $file[0] == '?'}&{else}?{/if}{$AOWOW_REVISION}" type="text/javascript"></script>
{/foreach}
{/if}{/foreach}
<script type="text/javascript">
var g_locale = {ldelim} id:{$user.locale}, name:'{$user.language}' {rdelim};
var g_user = {ldelim} {strip}

View File

@@ -98,7 +98,7 @@ if !empty($transfer)}
</tr>
<tr>
<th style="border-bottom: 0; border-left: 0">{$lang._gcdCategory}</th>
<td style="border-bottom: 0">{$gcdCat}</td>
<td style="border-bottom: 0">{if $gcdCat}{$gcdCat}{else}<span class="q0">{$lang.n_a}</span>{/if}</td>
</tr>
</table>
</td>