diff --git a/includes/ajaxHandler.class.php b/includes/ajaxHandler.class.php index 207b5ff0..9ccf40ee 100644 --- a/includes/ajaxHandler.class.php +++ b/includes/ajaxHandler.class.php @@ -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'] : '.')); } diff --git a/includes/defines.php b/includes/defines.php index b19b2060..adae618e 100644 --- a/includes/defines.php +++ b/includes/defines.php @@ -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 diff --git a/includes/types/achievement.class.php b/includes/types/achievement.class.php index f81cd532..a33627e0 100644 --- a/includes/types/achievement.class.php +++ b/includes/types/achievement.class.php @@ -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, diff --git a/includes/types/basetype.class.php b/includes/types/basetype.class.php index f4a16b71..413855ff 100644 --- a/includes/types/basetype.class.php +++ b/includes/types/basetype.class.php @@ -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]; diff --git a/includes/types/item.class.php b/includes/types/item.class.php index fd88c640..d7a81c64 100644 --- a/includes/types/item.class.php +++ b/includes/types/item.class.php @@ -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).'
'; // 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] diff --git a/includes/types/quest.class.php b/includes/types/quest.class.php index d34b43c6..9e19c31a 100644 --- a/includes/types/quest.class.php +++ b/includes/types/quest.class.php @@ -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; diff --git a/includes/types/zone.class.php b/includes/types/zone.class.php index 12378839..6d364129 100644 --- a/includes/types/zone.class.php +++ b/includes/types/zone.class.php @@ -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() { } diff --git a/localization/locale_enus.php b/localization/locale_enus.php index 19b225f4..a4007cad 100644 --- a/localization/locale_enus.php +++ b/localization/locale_enus.php @@ -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
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", diff --git a/localization/locale_frfr.php b/localization/locale_frfr.php index 04cf42eb..65523749 100644 --- a/localization/locale_frfr.php +++ b/localization/locale_frfr.php @@ -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
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", diff --git a/pages/currency.php b/pages/currency.php index 47ba608a..37ae0966 100644 --- a/pages/currency.php +++ b/pages/currency.php @@ -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; } diff --git a/pages/event.php b/pages/event.php index 0237a4dc..66a6e89c 100644 --- a/pages/event.php +++ b/pages/event.php @@ -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]' - ) - ); } diff --git a/pages/faction.php b/pages/faction.php index 5736e48e..6e162bea 100644 --- a/pages/faction.php +++ b/pages/faction.php @@ -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 diff --git a/pages/item.php b/pages/item.php index 505460dc..76eb8af9 100644 --- a/pages/item.php +++ b/pages/item.php @@ -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 diff --git a/pages/items.php b/pages/items.php index 4ab365c1..90c39ccc 100644 --- a/pages/items.php +++ b/pages/items.php @@ -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; diff --git a/pages/npc.php b/pages/npc.php index 7b18de8a..b2cb69e2 100644 --- a/pages/npc.php +++ b/pages/npc.php @@ -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( diff --git a/pages/object.php b/pages/object.php index 582da7d1..c143bf4f 100644 --- a/pages/object.php +++ b/pages/object.php @@ -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'; diff --git a/pages/spell.php b/pages/spell.php index 9594a109..7b6f1928 100644 --- a/pages/spell.php +++ b/pages/spell.php @@ -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 = ' ('.FactionList::getName($effMV).')'; + $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)) { diff --git a/pages/zones.php b/pages/zones.php index 95c04179..fb92bfe8 100644 --- a/pages/zones.php +++ b/pages/zones.php @@ -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'); diff --git a/static/js/global.js b/static/js/global.js index 04216540..039c6ecb 100644 --- a/static/js/global.js +++ b/static/js/global.js @@ -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 = ' '; + 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); diff --git a/template/globals/quest.tpl b/template/globals/quest.tpl index 4d1834e8..8b24f8aa 100644 --- a/template/globals/quest.tpl +++ b/template/globals/quest.tpl @@ -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} diff --git a/template/head.tpl b/template/head.tpl index 3d9a5ffb..7c2c622b 100644 --- a/template/head.tpl +++ b/template/head.tpl @@ -9,17 +9,17 @@ {foreach from=$reqCSS item=css} -{if isset($css.string)} +{if !empty($css.string)} -{else} - {if isset($css.ieCond)}{/if} +{elseif !empty($css.path)} + {if !empty($css.ieCond)}{/if} {/if} {/foreach} @@ -29,9 +29,9 @@ -{foreach from=$reqJS item=file} +{foreach from=$reqJS item=file}{if !empty($file)} -{/foreach} +{/if}{/foreach}