error-announces

rough draft for gameobjects (searchable, tooltips)
more tabs for item.php
This commit is contained in:
Sarjuuk
2013-11-28 20:42:26 +01:00
parent 5e785d6c78
commit 2830fe97fc
19 changed files with 866 additions and 172 deletions

View File

@@ -54,6 +54,9 @@ foreach ($AoWoWconf['characters'] as $realm => $charDBInfo)
// create Template-Object
$smarty = new SmartyAoWoW($AoWoWconf);
// attach template to util (yes bandaid, shut up and code me a fix)
Util::$pageTemplate = &$smarty;
// Setup Session
if (isset($_COOKIE[COOKIE_AUTH]))
{

View File

@@ -13,8 +13,11 @@ class AchievementList extends BaseType
public $criteria = [];
public $tooltip = [];
protected $queryBase = 'SELECT *, id AS ARRAY_KEY FROM ?_achievement a';
protected $queryOpts = ['a' => ['o' => 'orderInGroup ASC']];
protected $queryBase = 'SELECT `a`.*, `a`.`id` AS ARRAY_KEY FROM ?_achievement a';
protected $queryOpts = array(
'a' => ['o' => 'orderInGroup ASC'],
'ac' => ['j' => ['?_achievementcriteria AS `ac` ON `ac`.`refAchievement` = `a`.`id`', true], 'g' => '`a`.`id`']
);
public function __construct($conditions = [], $applyFilter = false)
{
@@ -267,7 +270,7 @@ class AchievementListFilter extends Filter
}
unset($cr);
$this->error = 1;
$this->error = true;
return [1];
}

View File

@@ -6,14 +6,74 @@ if (!defined('AOWOW_REVISION'))
class GameObjectList extends BaseType
{
use listviewHelper, spawnHelper;
public static $type = TYPE_OBJECT;
protected $queryBase = 'SELECT *, go.entry AS ARRAY_KEY FROM gameobject_template go';
protected $queryOpts = array(
'go' => [['lg']],
'lg' => ['j' => ['locales_gameobject lq ON go.entry = lq.entry', true]]
'lg' => ['j' => ['locales_gameobject lq ON go.entry = lq.entry', true]],
'l' => ['j' => ['?_lock l ON l.id = IF(go.type = 3, data0, null)', true], 's' => ', l.type1, l.properties1, l.reqSkill1, l.type2, l.properties2, l.reqSkill2']
);
public function __construct($conditions = [], $applyFilter = false)
{
parent::__construct($conditions, $applyFilter);
if ($this->error)
return;
// post processing
// most of this will be obsolete, when gameobjects get their own table
foreach ($this->iterate() as $_id => &$curTpl)
{
switch ($curTpl['type'])
{
case OBJECT_CHEST:
$curTpl['lootId'] = $curTpl['data1'];
$curTpl['lootStack'] = [$curTpl['data4'], $curTpl['data5']];
$curTpl['lockId'] = $curTpl['data0'];
if (!isset($curTpl['properties1']))
break;
if ($curTpl['properties1'] == LOCK_PROPERTY_HERBALISM)
{
$curTpl['reqSkill'] = $curTpl['reqSkill1'];
$curTpl['type'] = -3;
}
else if ($curTpl['properties1'] == LOCK_PROPERTY_MINING)
{
$curTpl['reqSkill'] = $curTpl['reqSkill1'];
$curTpl['type'] = -4;
}
else if ($curTpl['properties1'] == LOCK_PROPERTY_FOOTLOCKER)
{
$curTpl['reqSkill'] = $curTpl['reqSkill1'];
$curTpl['type'] = -5;
}
else if( $curTpl['properties2'] == LOCK_PROPERTY_FOOTLOCKER)
{
$curTpl['reqSkill'] = $curTpl['reqSkill2'];
$curTpl['type'] = -5;
}
break;
case OBJECT_FISHINGHOLE:
$curTpl['lootId'] = $curTpl['data1'];
$curTpl['lootStack'] = [$curTpl['data2'], $curTpl['data3']];
break;
default: // adding more, when i need them
$curTpl['lockId'] = 0;
break;
}
for ($i = 0; $i < 24; $i++) // kill indescriptive/unused fields
unset($curTpl['data'.$i]);
}
}
public static function getName($id)
{
$n = DB::Aowow()->SelectRow('
@@ -36,10 +96,47 @@ class GameObjectList extends BaseType
return Util::localizedString($n, 'name');
}
public function getListviewData() { }
public function addGlobalsToJScript(&$template, $addMask = 0) { }
public function renderTooltip() { }
public function getListviewData()
{
$data = [];
foreach ($this->iterate() as $__)
{
$data[$this->id] = array(
'id' => $this->id,
'name' => $this->getField('name', true),
'type' => $this->curTpl['type']
);
if (!empty($this->curTpl['reqSkill']))
$data[$this->id]['skill'] = $this->curTpl['reqSkill'];
}
return $data;
}
public function renderTooltip($interactive = false)
{
if (!$this->curTpl)
return array();
if (isset($this->tooltips[$this->id]))
return $this->tooltips[$this->id];
$x = '<table>';
$x .= '<tr><td><b class="q">'.$this->getField('name', true).'</b></td></tr>';
$x .= '<tr><td>[TYPE '.$this->curTpl['type'].']</td></tr>';
if ($locks = Lang::getLocks($this->curTpl['lockId']))
foreach ($locks as $l)
$x .= '<tr><td>'.$l.'</td></tr>';
$x .= '</table>';
$this->tooltips[$this->id] = $x;
return $this->tooltips[$this->id];
}
public function addGlobalsToJScript(&$template, $addMask = 0) { }
}
?>

View File

@@ -122,7 +122,7 @@ class ItemsetListFilter extends Filter
}
unset($cr);
$this->error = 1;
$this->error = true;
return [1];
}

View File

@@ -1840,7 +1840,7 @@ class SpellListFilter extends Filter
}
unset($cr);
$this->error = 1;
$this->error = true;
return [1];
}

View File

@@ -279,6 +279,7 @@ class SmartyAoWoW extends Smarty
{
private $config = [];
private $jsGlobals = [];
private $errors = [];
public function __construct($config)
{
@@ -319,6 +320,12 @@ class SmartyAoWoW extends Smarty
$this->_tpl_vars['page'][$var] = $val;
}
// use, if you want to alert the staff to a problem with Trinity
public function internalError($str)
{
$this->errors[] = $str;
}
public function display($tpl)
{
$tv = &$this->_tpl_vars;
@@ -355,19 +362,37 @@ class SmartyAoWoW extends Smarty
}
}
// display occured errors
if (User::isInGroup(U_GROUP_STAFF) && $this->errors)
{
if (!isset($tv['announcements']))
$tv['announcements'] = [];
$tv['announcements'][] = array(
'id' => 0,
'mode' => 1,
'status' => 1,
'name' => 'internal error',
'style' => 'padding-left: 45px; background-image: url(template/images/report.gif); background-size: 15px 15px; background-position: 10px center; border: dashed 2px #C03030;',
'text' => '<span id="inputbox-error">- '.implode("<br>- ", $this->errors).'</span>',
);
}
// fetch announcements
if ($tv['query'][0] && !preg_match('/[^a-z]/i', $tv['query'][0]))
{
if (!isset($tv['announcements']))
$tv['announcements'] = [];
$ann = DB::Aowow()->Select('SELECT * FROM ?_announcements WHERE status = 1 AND (page = ? OR page = "*")', $tv['query'][0]);
foreach ($ann as $k => $v)
{
if ($t = Util::localizedString($v, 'text'))
{
$ann[$k]['text'] = Util::jsEscape($t);
else
unset($ann[$k]);
$tv['announcements'][] = $ann[$k];
}
}
$tv['announcements'] = $ann;
}
$this->applyGlobals();
@@ -1233,6 +1258,8 @@ class Util
public static $tcEncoding = '0zMcmVokRsaqbdrfwihuGINALpTjnyxtgevElBCDFHJKOPQSUWXYZ123456789';
public static $pageTemplate = null;
private static $execTime = 0.0;
public static function execTime($set = false)
@@ -1676,7 +1703,7 @@ class Util
case 0:
return true;
case 1:
return !$keys[0] || isset($struct[$keys[0]]);
return (is_int($keys) && in_array($keys, $struct)) || (is_array($keys) && isset($struct[$keys[0]]));
case 2:
if (!isset($struct[$keys[0]]))
return false;
@@ -1840,11 +1867,17 @@ class Util
$set['max'] = $entry['maxcount'];
}
if (!isset($groupChances[$entry['groupid']]))
{
$groupChances[$entry['groupid']] = 0;
$nGroupEquals[$entry['groupid']] = 0;
}
if ($set['quest'] || !$set['group'])
$set['groupChance'] = abs($entry['ChanceOrQuestChance']);
else if ($entry['groupid'] && !$entry['ChanceOrQuestChance'])
{
@$nGroupEquals[$entry['groupid']]++;
$nGroupEquals[$entry['groupid']]++;
$set['groupChance'] = &$groupChances[$entry['groupid']];
}
else if ($entry['groupid'] && $entry['ChanceOrQuestChance'])
@@ -1854,9 +1887,7 @@ class Util
}
else // shouldn't happened
{
if (User::isInGroup(U_GROUP_DEV))
die(var_dump($entry));
else
Util::$pageTemplate->internalError('Loot by LootId: unhandled case in calculating chance for item '.$entry['item'].'!');
continue;
}
@@ -1868,8 +1899,11 @@ class Util
$sum = $groupChances[$k];
if (!$sum)
$sum = 0;
else if ($sum > 100) // group has > 100% dropchance .. hmm, display some kind of error..?
else if ($sum > 100)
{
Util::$pageTemplate->internalError('Loot by LootId: entry '.$lootId.' / group '.$k.' has a total chance of '.$sum.'%. Some items cannot drop!');
$sum = 100;
}
$cnt = empty($nGroupEquals[$k]) ? 1 : $nGroupEquals[$k];
@@ -1879,8 +1913,7 @@ class Util
return [$loot, array_unique($rawItems)];
}
// v this is bullshit, but as long as there is no integral template class..
public static function handleLoot($table, $entry, &$pageTemplate, $debug = false)
public static function handleLoot($table, $entry, $debug = false, &$debugCols = [])
{
$lv = [];
$loot = null;
@@ -1902,7 +1935,7 @@ class Util
return $lv;
$items = new ItemList(array(['i.id', $struct[1]]));
$items->addGlobalsToJscript($pageTemplate, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$items->addGlobalsToJscript(Util::$pageTemplate, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$foo = $items->getListviewData();
// assign listview LV rows to loot rows, not the other way round! The same item may be contained multiple times
@@ -1950,7 +1983,7 @@ class Util
);
$lv[] = array_merge($base, $data);
$pageTemplate->extendGlobalData(TYPE_ITEM, [$loot['content'] => $data]);
Util::$pageTemplate->extendGlobalData(TYPE_ITEM, [$loot['content'] => $data]);
}
}
@@ -1973,6 +2006,20 @@ class Util
$_['percent'] = 100;
}
}
else
{
$fields = ['mode', 'reference'];
$set = 0;
foreach ($lv as $foo)
foreach ($fields as $idx => $field)
if (!empty($foo[$field]))
$set |= 1 << $idx;
$debugCols[] = "Listview.funcBox.createSimpleCol('group', 'Group', '7%', 'group')";
foreach ($fields as $idx => $field)
if ($set & (1 << $idx))
$debugCols[] = "Listview.funcBox.createSimpleCol('".$field."', '".Util::ucFirst($field)."', '7%', '".$field."')";
}
return $lv;
}
@@ -2009,13 +2056,15 @@ class Util
foreach ($refs as $rId => $ref)
{
// errör: item/ref is in group 0 without a chance set
// check for possible database inconsistencies
if (!$ref['chance'] && !$ref['isGrouped'])
continue; // todo (low): create dubug output
Util::$pageTemplate->internalError('Loot by Item: ungrouped Item/Ref '.$ref['item'].' has 0% chance assigned!');
// errör: item/ref is in group with >100% chance across all items contained
if ($ref['isGrouped'] && $ref['sumChance'] > 100)
continue; // todo (low): create dubug output
Util::$pageTemplate->internalError('Loot by Item: group with Item/Ref '.$ref['item'].' has '.$ref['sumChance'].'% total chance! Some items cannot drop!');
if ($ref['isGrouped'] && $ref['sumChance'] == 100 && !$ref['chance'])
Util::$pageTemplate->internalError('Loot by Item: Item/Ref '.$ref['item'].' with adaptive chance cannot drop. Group already at 100%!');
$chance = ($ref['chance'] ? $ref['chance'] : (100 - $ref['sumChance']) / $ref['nZeroItems']) / 100;

View File

@@ -10,7 +10,7 @@ $validCats = [1, 2, 3, 22];
$title = [Util::ucFirst(Lang::$game['currencies'])];
$cacheKey = implode('_', [CACHETYPE_PAGE, TYPE_CURRENCY, -1, isset($cat) ? $cat : -1, User::$localeId]);
if ($cat !== null && !in_array($cat, $validCats))
if (!Util::isValidPage($validCats, $cat))
$smarty->error();
if (isset($cat))

View File

@@ -11,7 +11,7 @@ $validCats = [0, 1, 2, 3];
$title = [Lang::$game['events']];
$cacheKey = implode('_', [CACHETYPE_PAGE, TYPE_WORLDEVENT, -1, $cat, User::$localeId]);
if (!in_array($cat, $validCats))
if (!Util::isValidPage($validCats, $cat))
$smarty->error();
$path[] = $cat;

View File

@@ -79,6 +79,7 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
$_slot = $item->getField('slot');
$_subClass = $item->getField('subClass');
$_class = $item->getField('class');
$_bagFamily = $item->getField('bagFamily');
/***********/
/* Infobox */
@@ -196,7 +197,7 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
if ($item->getField('flagsExtra') & 0x0100) // cant roll need
$quickInfo[] = '[tooltip=tooltip_cannotrollneed]'.Lang::$item['noNeedRoll'].'[/tooltip]';
if ($item->getField('bagFamily') & 0x0100) // fits into keyring
if ($_bagFamily & 0x0100) // fits into keyring
$quickInfo[] = Lang::$item['atKeyring'];
@@ -308,28 +309,31 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
/* Extra Tabs */
/**************/
// tabs: this item is contained in..
$sourceTabs = array(
// 0 => refLoot
1 => ['item', '$LANG.tab_containedin', 'contained-in-item', [], []],
2 => ['item', '$LANG.tab_disenchantedfrom', 'disenchanted-from', [], []],
3 => ['item', '$LANG.tab_prospectedfrom', 'prospected-from', [], []],
4 => ['item', '$LANG.tab_milledfrom', 'milled-from', [], []],
5 => ['creature', '$LANG.tab_droppedby', 'dropped-by', [], []],
6 => ['creature', '$LANG.tab_pickpocketedfrom', 'pickpocketed-from', [], []],
7 => ['creature', '$LANG.tab_skinnedfrom', 'skinned-from', [], []],
8 => ['creature', '$LANG.tab_minedfromnpc', 'mined-from-npc', [], []],
9 => ['creature', '$LANG.tab_salvagedfrom', 'salvaged-from', [], []],
10 => ['creature', '$LANG.tab_gatheredfromnpc', 'gathered-from-npc', [], []],
11 => ['quest', '$LANG.tab_rewardfrom', 'reward-from-quest', [], []],
12 => ['zone', '$LANG.tab_fishedin', 'fished-in', [], []],
13 => ['object', '$LANG.tab_containedin', 'contained-in-go', [], []],
14 => ['object', '$LANG.tab_minedfrom', 'mined-from-go', [], []],
15 => ['object', '$LANG.tab_gatheredfrom', 'gathered-from-go', [], []],
16 => ['spell', '$LANG.tab_createdby', 'created-by', [], []]
1 => ['item', '$LANG.tab_containedin', 'contained-in-item', [], [], []],
2 => ['item', '$LANG.tab_disenchantedfrom', 'disenchanted-from', [], [], []],
3 => ['item', '$LANG.tab_prospectedfrom', 'prospected-from', [], [], []],
4 => ['item', '$LANG.tab_milledfrom', 'milled-from', [], [], []],
5 => ['creature', '$LANG.tab_droppedby', 'dropped-by', [], [], []],
6 => ['creature', '$LANG.tab_pickpocketedfrom', 'pickpocketed-from', [], [], []],
7 => ['creature', '$LANG.tab_skinnedfrom', 'skinned-from', [], [], []],
8 => ['creature', '$LANG.tab_minedfromnpc', 'mined-from-npc', [], [], []],
9 => ['creature', '$LANG.tab_salvagedfrom', 'salvaged-from', [], [], []],
10 => ['creature', '$LANG.tab_gatheredfromnpc', 'gathered-from-npc', [], [], []],
11 => ['quest', '$LANG.tab_rewardfrom', 'reward-from-quest', [], [], []],
12 => ['zone', '$LANG.tab_fishedin', 'fished-in-zone', [], [], []],
13 => ['object', '$LANG.tab_containedin', 'contained-in-go', [], [], []],
14 => ['object', '$LANG.tab_minedfrom', 'mined-from-go', [], [], []],
15 => ['object', '$LANG.tab_gatheredfrom', 'gathered-from-go', [], [], []],
16 => ['object', '$LANG.tab_fishedin', 'fished-in-go', [], [], []],
17 => ['spell', '$LANG.tab_createdby', 'created-by', [], [], []]
);
$data = [];
$xCols = '';
$questLoot = [];
$spellLoot = [];
$sources = Util::getLootSource($_id);
foreach ($sources as $lootTpl => $lootData)
{
@@ -365,26 +369,16 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
foreach ($srcType->iterate() as $curTpl)
{
$tabId = 7; // general case (skinning)
if ($curTpl['type_flags'] & NPC_TYPEFLAG_HERBLOOT)
{
$data[10][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('skinLootId')]);
$sourceTabs[10][3][] = 'Listview.extraCols.percent';
}
$tabId = 10;
else if ($curTpl['type_flags'] & NPC_TYPEFLAG_ENGINEERLOOT)
{
$data[9][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('skinLootId')]);
$sourceTabs[9][3][] = 'Listview.extraCols.percent';
}
$tabId = 9;
else if ($curTpl['type_flags'] & NPC_TYPEFLAG_MININGLOOT)
{
$data[8][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('skinLootId')]);
$sourceTabs[8][3][] = 'Listview.extraCols.percent';
}
else
{
$data[7][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('skinLootId')]);
$sourceTabs[7][3][] = 'Listview.extraCols.percent';
}
$tabId = 8;
$data[$tabId][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('skinLootId')]);
$sourceTabs[$tabId][3][] = 'Listview.extraCols.percent';
}
break;
@@ -400,23 +394,23 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
$sourceTabs[12][3][] = 'Listview.extraCols.percent';
break;
case LOOT_GAMEOBJECT:
// GO-loot
// contained in GO (chest)
// mined-from (vine)
// gathered-from (herb)
// like skinning with lock-properties instead of type_flags
// foreach($rows as $row)
// {
// // Залежи руды
// if($row['lockproperties1'] == LOCK_PROPERTIES_MINING)
// $item['minedfromobject'][] = array_merge(objectinfo2($row), $drop);
// // Собирается с трав
// elseif($row['lockproperties1'] == LOCK_PROPERTIES_HERBALISM)
// $item['gatheredfromobject'][] = array_merge(objectinfo2($row), $drop);
// // Сундуки
// else
// $item['containedinobject'][] = array_merge(objectinfo2($row), $drop);
// }
$srcType = new GameObjectList(array(['type', [OBJECT_CHEST, OBJECT_FISHINGHOLE]], ['data1', $ids]));
$srcData = $srcType->getListviewData();
foreach ($srcType->iterate() as $curTpl)
{
$tabId = 13; // general chest loot
if ($curTpl['type'] == -4) // vein
$tabId = 14;
else if ($curTpl['type'] == -3) // herb
$tabId = 15;
else if ($curTpl['type'] == 25) // fishing node
$tabId = 16;
$data[$tabId][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('lootId')]);
$sourceTabs[$tabId][3][] = 'Listview.extraCols.percent';
$sourceTabs[$tabId][5][] = 'skill'; // conflicts a bit with fishing nodes (no real requirement)
}
break;
case LOOT_PROSPECTING:
$sourceTab = 3;
@@ -448,20 +442,52 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
break;
case LOOT_QUEST:
// merge regular quest rewards into quest_mail_loot_template results
$questLoot = $ids;
break;
case LOOT_SPELL:
// merge with "created by [spell]"
$spellLoot = $ids;
break;
}
}
// merge quest rewards with quest_mail_loot
$conditions = array(
'OR', ['qt.RewardMailTemplateId', $ids],
'OR',
['RewardChoiceItemId1', $_id], ['RewardChoiceItemId2', $_id], ['RewardChoiceItemId3', $_id], ['RewardChoiceItemId4', $_id], ['RewardChoiceItemId5', $_id],
['RewardChoiceItemId6', $_id], ['RewardItemId1', $_id], ['RewardItemId2', $_id], ['RewardItemId3', $_id], ['RewardItemId4', $_id],
);
$srcType = new QuestList($conditions);
$srcType->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_REWARDS);
$data[11] = $srcType->getListviewData(); // dont merge chances; most are 100% anyway and regular reward loot has none
break;
case LOOT_SPELL:
// merge with: created by [spell]
if ($questLoot)
$conditions[] = ['qt.RewardMailTemplateId', $questLoot];
break;
$questLoot = new QuestList($conditions);
if (!$questLoot->error)
{
$questLoot->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_REWARDS);
$data[11] = $questLoot->getListviewData();
}
// merge spell_loot with "created by [spell]"
$conditions = ['OR', ['effect1CreateitemId', $_id], ['effect2CreateitemId', $_id], ['effect3CreateitemId', $_id]];
if ($spellLoot)
$conditions[] = ['id', $spellLoot];
$spellLoot = new SpellList($conditions);
if (!$spellLoot->error)
{
$spellLoot->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_REWARDS);
$spellData = $spellLoot->getListviewData();
if (!empty($sources[LOOT_SPELL]))
$sourceTabs[17][3][] = 'Listview.extraCols.percent';
foreach ($spellLoot->iterate() as $_)
{
if (!empty($sources[LOOT_SPELL][$spellLoot->id]))
$data[17][] = array_merge($spellData[$spellLoot->id], $sources[LOOT_SPELL][$spellLoot->id]);
else
$data[17][] = array_merge($spellData[$spellLoot->id], ['percent' => -1]);
}
}
@@ -478,32 +504,25 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
'name' => $tab[1],
'id' => $tab[2],
'extraCols' => $tab[3] ? '$['.implode(', ', array_unique($tab[3])).']' : null,
'hiddenCols' => $tab[4] ? '$['.implode(', ', array_unique($tab[4])).']' : null
'hiddenCols' => $tab[4] ? '$['.implode(', ', array_unique($tab[4])).']' : null,
'visibleCols' => $tab[5] ? '$'.json_encode($tab[5]) : null
]
);
}
/* this item contains.. */
// tabs: this item contains
$sourceFor = array(
[LOOT_ITEM, $item->id, '$LANG.tab_contains', 'contains', ['Listview.extraCols.percent'], [] ],
[LOOT_PROSPECTING, $item->id, '$LANG.tab_prospecting', 'prospecting', ['Listview.extraCols.percent'], ['side', 'slot', 'reqlevel']],
[LOOT_MILLING, $item->id, '$LANG.tab_milling', 'milling', ['Listview.extraCols.percent'], ['side', 'slot', 'reqlevel']],
[LOOT_DISENCHANT, $item->getField('disenchantId'), '$LANG.tab_disenchanting', 'disenchanting', ['Listview.extraCols.percent'], ['side', 'slot', 'reqlevel']]
[LOOT_ITEM, $item->id, '$LANG.tab_contains', 'contains', ['Listview.extraCols.percent'], [] , []],
[LOOT_PROSPECTING, $item->id, '$LANG.tab_prospecting', 'prospecting', ['Listview.extraCols.percent'], ['side', 'slot', 'reqlevel'], []],
[LOOT_MILLING, $item->id, '$LANG.tab_milling', 'milling', ['Listview.extraCols.percent'], ['side', 'slot', 'reqlevel'], []],
[LOOT_DISENCHANT, $item->getField('disenchantId'), '$LANG.tab_disenchanting', 'disenchanting', ['Listview.extraCols.percent'], ['side', 'slot', 'reqlevel'], []]
);
foreach ($sourceFor as $sf)
{
$itemLoot = Util::handleLoot($sf[0], $sf[1], $smarty, User::isInGroup(U_GROUP_STAFF));
$itemLoot = Util::handleLoot($sf[0], $sf[1], User::isInGroup(U_GROUP_STAFF), $sf[4]);
if ($itemLoot)
{
if (User::isInGroup(U_GROUP_STAFF))
{
$sf[4][] = "Listview.funcBox.createSimpleCol('group', 'Group', '10%', 'group')";
$sf[4][] = "Listview.funcBox.createSimpleCol('mode', 'Mode', '10%', 'mode')";
$sf[4][] = "Listview.funcBox.createSimpleCol('reference', 'Reference', '10%', 'reference')";
}
$pageData['relTabs'][] = array(
'file' => 'item',
'data' => $itemLoot,
@@ -512,49 +531,192 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
'name' => $sf[2],
'id' => $sf[3],
'extraCols' => $sf[4] ? "$[".implode(', ', $sf[4])."]" : null,
'hiddenCols' => $sf[5] ? "$".json_encode($sf[5]) : null
'hiddenCols' => $sf[5] ? "$".json_encode($sf[5]) : null,
'visibleCols' => $sf[6] ? '$'.json_encode($sf[6]) : null
]
);
}
}
// tab: container can contain
if ($item->getField('slots') > 0)
{
$contains = new ItemList(array(['bagFamily', $_bagFamily, '&'], ['slots', 1, '<'], 0));
if (!$contains->error)
{
$contains->addGlobalsToJscript($smarty);
$hCols = ['side'];
if (!$contains->hasSetFields(['slot']))
$hCols[] = 'slot';
$pageData['relTabs'][] = array(
'file' => 'item',
'data' => $contains->getListviewData(),
'params' => [
'tabs' => '$tabsRelated',
'name' => '$LANG.tab_cancontain',
'id' => 'can-contain',
'hiddenCols' => '$'.json_encode($hCols)
]
);
}
}
// tab: can be contained in (except keys)
else if ($_bagFamily != 0x0100)
{
$contains = new ItemList(array(['bagFamily', $_bagFamily, '&'], ['slots', 0, '>'], 0));
if (!$contains->error)
{
$contains->addGlobalsToJscript($smarty);
$pageData['relTabs'][] = array(
'file' => 'item',
'data' => $contains->getListviewData(),
'params' => [
'tabs' => '$tabsRelated',
'name' => '$LANG.tab_canbeplacedin',
'id' => 'can-be-placed-in',
'hiddenCols' => "$['side']"
]
);
}
}
// tab: criteria of
$conditions = array(
['ac.type', [ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM]],
['ac.value1', $_id]
);
$criteriaOf = new AchievementList($conditions);
if (!$criteriaOf->error)
{
$criteriaOf->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_REWARDS);
$hCols = [];
if (!$criteriaOf->hasSetFields(['rewardIds']))
$hCols = ['rewards'];
$pageData['relTabs'][] = array(
'file' => 'achievement',
'data' => $criteriaOf->getListviewData(),
'params' => [
'tabs' => '$tabsRelated',
'name' => '$LANG.tab_criteriaof',
'id' => 'criteria-of',
'visibleCols' => "$['category']",
'hiddenCols' => '$'.json_encode($hCols)
]
);
}
// tab: reagent for
$conditions = array(
'OR',
['reagent1', $_id], ['reagent2', $_id], ['reagent3', $_id], ['reagent4', $_id],
['reagent5', $_id], ['reagent6', $_id], ['reagent7', $_id], ['reagent8', $_id]
);
$reagent = new SpellList($conditions);
if (!$reagent->error)
{
$reagent->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$pageData['relTabs'][] = array(
'file' => 'spell',
'data' => $reagent->getListviewData(),
'params' => [
'tabs' => '$tabsRelated',
'name' => '$LANG.tab_reagentfor',
'id' => 'reagent-for',
'visibleCols' => "$['reagents']"
]
);
}
// tab: unlocks (object or item)
$lockIds = DB::Aowow()->selectCol(
'SELECT id FROM ?_lock WHERE
(type1 = 1 AND properties1 = ?d) OR
(type2 = 1 AND properties2 = ?d) OR
(type3 = 1 AND properties3 = ?d) OR
(type4 = 1 AND properties4 = ?d) OR
(type5 = 1 AND properties5 = ?d)',
$_id, $_id, $_id, $_id, $_id
);
if ($lockIds)
{
// objects
$conditions = array(
'OR',
['AND', ['data0', $lockIds], ['type', [OBJECT_QUESTGIVER, OBJECT_CHEST, OBJECT_TRAP, OBJECT_GOOBER, OBJECT_CAMERA, OBJECT_FLAGSTAND, OBJECT_FLAGDROP]]],
['AND', ['data1', $lockIds], ['type', [OBJECT_DOOR, OBJECT_BUTTON]]]
);
$lockedObj = new GameObjectList($conditions);
if (!$lockedObj->error)
{
$pageData['relTabs'][] = array(
'file' => 'object',
'data' => $lockedObj->getListviewData(),
'params' => [
'tabs' => '$tabsRelated',
'name' => '$LANG.tab_unlocks',
'id' => 'unlocks-object'
]
);
}
// items (generally unused. It's the spell on the item, that unlocks stuff)
$lockedItm = new ItemList(array(['lockId', $lockIds]));
if (!$lockedItm->error)
{
$lockedItm->addGlobalsToJscript($smarty, GLOBALINFO_SELF);
$pageData['relTabs'][] = array(
'file' => 'item',
'data' => $lockedItm->getListviewData(),
'params' => [
'tabs' => '$tabsRelated',
'name' => '$LANG.tab_unlocks',
'id' => 'unlocks-item'
]
);
}
}
// tab: see also
$saItems = new ItemList(array(['id', $_id, '!'], ['name_loc'.User::$localeId, $item->getField('name', true)]));
if (!$saItems->error)
{
$saItems->addGlobalsToJscript($smarty, GLOBALINFO_SELF);
$pageData['relTabs'][] = array(
'file' => 'item',
'data' => $saItems->getListviewData(),
'params' => [
'tabs' => '$tabsRelated',
'name' => '$LANG.tab_seealso',
'id' => 'see-also'
]
);
}
// sold by [consult itemExtendedCost]
// Objective of (quest)
// provided for (quest)
// can be placed in
// if($item['BagFamily'] == 256)
// {
// // Если это ключ
// $item['key'] = true;
// }
// reagent for
// currency for
// criteria of
// array(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM),
// teaches
// Same model as
// unlocks
// $locks_row = $DB->selectCol('
// SELECT lockID
// FROM ?_lock
// WHERE
// (type1=1 AND lockproperties1=?d) OR
// (type2=1 AND lockproperties2=?d) OR
// (type3=1 AND lockproperties3=?d) OR
// (type4=1 AND lockproperties4=?d) OR
// (type5=1 AND lockproperties5=?d)
// ',
// $item['entry'], $item['entry'], $item['entry'], $item['entry'], $item['entry']
// );
// Shared cooldown
$smarty->saveCache($cacheKeyPage, $pageData);
}

View File

@@ -22,13 +22,13 @@ if (isset($_GET['power']))
{
$npc = new CreatureList(array(['ct.id', $_id]));
if ($npc->error)
die('$WowheadPower.registerNpc(\''.$_id.'\', '.User::$localeId.', {})');
die('$WowheadPower.registerNpc('.$_id.', '.User::$localeId.', {})');
$s = $npc->getSpawns(true);
$x = '$WowheadPower.registerNpc('.$_id.', '.User::$localeId.", {\n";
$x .= "\tname_".User::$localeString.": '".Util::jsEscape($npc->getField('name', true))."',\n";
$x .= "\ttooltip_".User::$localeString.': \''.Util::jsEscape($npc->renderTooltip())."',\n";
$x .= "\ttooltip_".User::$localeString.": '".Util::jsEscape($npc->renderTooltip())."',\n";
// $x .= "\tmap: ".($s ? '{zone: '.$s[0].', coords: {0:'.json_encode($s[1], JSON_NUMERIC_CHECK).'}' : '{}')."\n";
$x .= "});";

113
pages/object.php Normal file
View File

@@ -0,0 +1,113 @@
<?php
if (!defined('AOWOW_REVISION'))
die('illegal access');
require 'includes/community.class.php';
$_id = intVal($pageParam);
$cacheKeyPage = implode('_', [CACHETYPE_PAGE, TYPE_OBJECT, $_id, -1, User::$localeId]);
$cacheKeyTooltip = implode('_', [CACHETYPE_TOOLTIP, TYPE_OBJECT, $_id, -1, User::$localeId]);
// AowowPower-request
if (isset($_GET['power']))
{
header('Content-type: application/x-javascript; charsetUTF-8');
Util::powerUseLocale(@$_GET['domain']);
if (!$smarty->loadCache($cacheKeyTooltip, $x))
{
$object = new GameObjectList(array(['entry', $_id]));
if ($object->error)
die('$WowheadPower.registerObject('.$_id.', '.User::$localeId.', {});');
$s = $object->getSpawns(true);
$x = '$WowheadPower.registerObject('.$_id.', '.User::$localeId.", {\n";
$x .= "\tname_".User::$localeString.": '".Util::jsEscape($object->getField('name', true))."',\n";
$x .= "\ttooltip_".User::$localeString.": '".Util::jsEscape($object->renderTooltip())."'\n";
// $x .= "\tmap: ".($s ? '{zone: '.$s[0].', coords: {0:'.json_encode($s[1], JSON_NUMERIC_CHECK).'}' : '{}')."\n";
$x .= "});";
$smarty->saveCache($cacheKeyTooltip, $x);
}
die($x);
}
// regular page
if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$object = new GameObjectList(array(['entry', $_id]));
if ($object->error)
$smarty->notFound(Lang::$game['gameObject']);
/*
ListView for fishing holes
id:'fished-in',
hiddenCols:['instancetype', 'level', 'territory', 'category'],
extraCols:[{if $percent}Listview.extraCols.percent{/if}],
sort:['-percent', 'name'],
*/
// NYI -> die()
$smarty->error();
// path(0, 5, $object['type']),
// $object['starts'] = array();
// $object['ends'] = array();
// array(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT),
// $object['criteria_of'] = array();
// object contains [..]
$object['position'] = position($object['entry'], 'gameobject');
// Исправить type, чтобы подсвечивались event-овые объекты
if ($object['position'])
foreach ($object['position'] as $z => $zone)
foreach ($zone['points'] as $p => $pos)
if ($pos['type'] == 0 && ($events = event_find(array('object_guid' => $pos['guid']))))
{
$names = arraySelectKey(event_name($events), 'name');
$object['position'][$z]['points'][$p]['type'] = 4;
$object['position'][$z]['points'][$p]['events'] = implode(", ", $names);
}
$smarty->saveCache($cacheKeyPage, $pageData);
}
// menuId 5: Object g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'title' => $pageData['title'].' - '.Util::ucFirst(Lang::$game['gameObject']),
'path' => $pageData['path'],
'tab' => 0,
'type' => TYPE_OBJECT,
'typeId' => $_id,
'reqCSS' => array(
$object['pageText'] ? ['path' => 'template/css/Book.css'] : null,
['path' => 'template/css/Mapper.css'],
['path' => 'template/css/Mapper_ie6.css', 'ieCond' => 'lte IE 6']
),
'reqJS' => array(
$object['pageText'] ? 'template/js/Book.js' : null,
'template/js/Mapper.js'
)
));
$smarty->assign('community', CommunityContent::getAll(TYPE_OBJECT, $_id)); // comments, screenshots, videos
$smarty->assign('lang', array_merge(Lang::$main, Lang::$game, Lang::$object, ['colon' => Lang::$colon]));
$smarty->assign('lvData', $pageData);
// load the page
$smarty->display('object.tpl');
?>

81
pages/objects.php Normal file
View File

@@ -0,0 +1,81 @@
<?php
if (!defined('AOWOW_REVISION'))
die('illegal access');
$cat = Util::extractURLParams($pageParam)[0];
$path = [0, 5];
$validCats = [-2, -3, -4, -5, 3, 9];
$title = [Util::ucFirst(Lang::$game['gameObjects'])];
$cacheKey = implode('_', [CACHETYPE_PAGE, TYPE_OBJECT, -1, isset($cat) ? $cat : -1, User::$localeId]);
if (!Util::isValidPage($validCats, $cat))
$smarty->error();
if (isset($cat))
{
$path[] = $cat; // should be only one parameter anyway
// array_unshift($title, Lang::$object['cat'][$cat]);
}
if (!$smarty->loadCache($cacheKey, $pageData))
{
$pageData = array(
'listviews' => []
);
$conditions = [];
if ($cat == -3)
{
$conditions[] = ['type', 3];
$conditions[] = ['l.properties1', LOCK_PROPERTY_HERBALISM];
}
else if ($cat == -4)
{
$conditions[] = ['type', 3];
$conditions[] = ['l.properties1', LOCK_PROPERTY_MINING];
}
else if ($cat == -5)
{
$conditions[] = ['type', 3];
$conditions[] = ['l.properties2', LOCK_PROPERTY_FOOTLOCKER];
}
else
$conditions[] = ['type', (int)$cat]; // quest not supported
$objects = new GameObjectList($conditions);
$params = [];
if ($objects->hasSetFields(['reqSkill']))
$params['visibleCols'] = "$['skill']";
$pageData['listviews'][] = array(
'file' => 'object',
'data' => $objects->getListviewData(),
'params' => $params
);
$objects->addGlobalsToJscript($smarty);
$smarty->saveCache($cacheKey, $pageData);
}
// menuId 5: Object g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'tab' => 0,
'title' => implode(" - ", $title),
'path' => "[".implode(", ", $path)."]"
));
$smarty->assign('lang', Lang::$main);
$smarty->assign('lvData', $pageData);
// load the page
// $smarty->display('objects.tpl');
$smarty->display('generic-no-filter.tpl');
?>

View File

@@ -10,7 +10,7 @@ $validCats = [0, 1, 2];
$title = [Util::ucFirst(Lang::$game['pets'])];
$cacheKey = implode('_', [CACHETYPE_PAGE, TYPE_PET, -1, isset($cat) ? $cat : -1, User::$localeId]);
if (!in_array($cat, $validCats))
if (!Util::isValidPage($validCats, $cat))
$smarty->error();
$path[] = $cat; // should be only one parameter anyway

View File

@@ -1180,19 +1180,11 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
// tab: contains
// spell_loot_template & skill_extra_item_template
$extraItem = DB::Aowow()->selectRow('SELECT * FROM skill_extra_item_template WHERE spellid = ?d', $spell->id);
$spellLoot = Util::handleLoot(LOOT_SPELL, $spell->id, $smarty, User::isInGroup(U_GROUP_STAFF));
$spellLoot = Util::handleLoot(LOOT_SPELL, $spell->id, User::isInGroup(U_GROUP_STAFF), $extraCols);
if ($extraItem || $spellLoot)
{
$extraCols = ['Listview.extraCols.percent'];
if ($spellLoot && User::isInGroup(U_GROUP_STAFF))
{
$extraCols[] = "Listview.funcBox.createSimpleCol('group', 'Group', '10%', 'group')";
$extraCols[] = "Listview.funcBox.createSimpleCol('mode', 'Mode', '10%', 'mode')";
$extraCols[] = "Listview.funcBox.createSimpleCol('reference', 'Reference', '10%', 'reference')";
}
$extraCols[] = 'Listview.extraCols.percent';
$lv = $spellLoot;
if ($extraItem && $spell->canCreateItem())

View File

@@ -38,7 +38,7 @@ if (!defined('AOWOW_REVISION'))
17: Listview - template: 'achievement', id: 'achievements', name: LANG.tab_achievements,
18: Listview - template: 'achievement', id: 'statistics', name: LANG.tab_statistics,
19: Listview - template: 'zone', id: 'zones', name: LANG.tab_zones,
todo 20: Listview - template: 'object', id: 'objects', name: LANG.tab_objects,
20: Listview - template: 'object', id: 'objects', name: LANG.tab_objects,
todo 21: Listview - template: 'faction', id: 'factions', name: LANG.tab_factions,
22: Listview - template: 'skill', id: 'skills', name: LANG.tab_skills,
23: Listview - template: 'pet', id: 'pets', name: LANG.tab_pets,
@@ -835,7 +835,7 @@ if ($searchMask & 0x40000)
'file' => 'zone',
'data' => $data,
'params' => [
'tabs' => '$myTabs',
'tabs' => '$myTabs'
]
);
@@ -848,7 +848,37 @@ if ($searchMask & 0x40000)
}
// 20 Objects
// if ($searchMask & 0x80000)
if ($searchMask & 0x80000)
{
$conditions = array(
['name'.(User::$localeId ? '_loc'.User::$localeId : null), $query],
$maxResults
);
$objects = new GameObjectList($conditions);
if ($data = $objects->getListviewData())
{
$objects->addGlobalsToJScript($smarty);
$found['zone'] = array(
'type' => TYPE_OBJECT,
'appendix' => ' (Object)',
'matches' => $objects->getMatches(),
'file' => 'object',
'data' => $data,
'params' => [
'tabs' => '$myTabs'
]
);
if ($objects->getMatches() > $maxResults)
{
$found['zone']['params']['note'] = sprintf(Util::$tryNarrowingString, 'LANG.lvnote_objectsfound', $objects->getMatches(), $maxResults);
$found['zone']['params']['_truncated'] = 1;
}
}
}
// 21 Factions
// if ($searchMask & 0x100000)
@@ -869,7 +899,9 @@ if ($searchMask & 0x200000)
'matches' => $skills->getMatches(),
'file' => 'skill',
'data' => $data,
'params' => ['tabs' => '$myTabs']
'params' => [
'tabs' => '$myTabs'
]
);
if ($skills->getMatches() > $maxResults)

View File

@@ -0,0 +1,29 @@
{strip}
new Listview({ldelim}
template:'object',
{if !isset($params.id)}id:'objects',{/if}
{if !isset($params.name)}name:LANG.tab_objects,{/if}
{if !isset($params.parent)}parent:'lv-generic',{/if}
{foreach from=$params key=k item=v}
{if $v[0] == '$'}
{$k}:{$v|substr:1},
{else if $v}
{$k}:'{$v}',
{/if}
{/foreach}
data:[
{foreach name=i from=$data item=curr}
{ldelim}
{foreach from=$curr key='name' item=val}
{if $name != 'id' && $name != 'name'}
{$name}:{$val|@json_encode:$smarty.const.JSON_NUMERIC_CHECK},
{/if}
{/foreach}
name:'{$curr.name|escape:"quotes"}',
id:{$curr.id}
{rdelim}
{if $smarty.foreach.i.last}{else},{/if}
{/foreach}
]
{rdelim});
{/strip}

View File

@@ -5223,7 +5223,8 @@ Listview.extraCols = {
g_addTooltip(td, text);
}
var value = parseFloat(row.percent.toFixed(row.percent >= 1.95 ? 0 : (row.percent >= 0.195 ? 1 : 2)));
// var value = parseFloat(row.percent.toFixed(row.percent >= 1.95 ? 0 : (row.percent >= 0.195 ? 1 : 2)));
var value = parseFloat(row.percent.toFixed(row.percent >= 1.95 ? 1 : 2)); // sarjuuk: doesn't look as nice but i prefer accuracy
if (row.pctstack) {
var sp = $WH.ce('span');
@@ -5241,11 +5242,12 @@ Listview.extraCols = {
}
if (row.percent >= 1.95) {
return row.percent.toFixed(0);
}
else if (row.percent >= 0.195) {
return parseFloat(row.percent.toFixed(1));
// return row.percent.toFixed(0);
return row.percent.toFixed(1);
}
// else if (row.percent >= 0.195) {
// return parseFloat(row.percent.toFixed(1));
// }
else {
return parseFloat(row.percent.toFixed(2));
}

111
template/object.tpl Normal file
View File

@@ -0,0 +1,111 @@
{include file='header.tpl'}
<div id="main">
<div id="main-precontents"></div>
<div id="main-contents" class="main-contents">
<script type="text/javascript">
{include file='bricks/community.tpl'}
var g_pageInfo = {ldelim}type: {$page.type}, typeId: {$page.typeId}, name: '{$object.name|escape:"quotes"}'{rdelim};
g_initPath({$page.path});
</script>
{if isset($object.key) or isset($object.lockpicking) or isset($object.mining) or isset($object.herbalism)}
<table class="infobox">
<tr><th>{#Quick_Facts#}</th></tr>
<tr><td><div class="infobox-spacer"></div>
<ul>
{if isset($object.key)}<li><div>{#Key#}{$lang.colon}<a class="q{$object.key.quality}" href="?item={$object.key.id}">[{$object.key.name}]</a></div></li>{/if}
{if isset($object.lockpicking)}<li><div>{#Lockpickable#} (<span class="tip" onmouseover="$WH.Tooltip.showAtCursor(event, '{#Required_lockpicking_skill#}', 0, 0, 'q')" onmousemove="$WH.Tooltip.cursorUpdate(event)" onmouseout="$WH.Tooltip.hide()">{$object.lockpicking}</span>)</div></li>{/if}
{if isset($object.mining)}<li><div>{#Mining#} (<span class="tip" onmouseover="$WH.Tooltip.showAtCursor(event, '{#Required_mining_skill#}', 0, 0, 'q')" onmousemove="$WH.Tooltip.cursorUpdate(event)" onmouseout="$WH.Tooltip.hide()">{$object.mining}</span>)</div></li>{/if}
{if isset($object.herbalism)}<li><div>{#Herb#} (<span class="tip" onmouseover="$WH.Tooltip.showAtCursor(event, '{#Required_herb_skill#}', 0, 0, 'q')" onmousemove="$WH.Tooltip.cursorUpdate(event)" onmouseout="$WH.Tooltip.hide()">{$object.herbalism}</span>)</div></li>{/if}
</ul>
</td></tr>
</table>
{/if}
<div class="text">
<a href="{$wowhead}" class="button-red"><em><b><i>Wowhead</i></b><span>Wowhead</span></em></a>
<h1>{$object.name}</h1>
{if $object.position}
<div>{#This_Object_can_be_found_in#}
{strip}
<span id="locations">
{foreach from=$object.position item=zone name=zone}
<a href="javascript:;" onclick="
myMapper.update(
{ldelim}
{if $zone.atid}
zone:{$zone.atid}
{if $zone.points}
,
{/if}
{else}
show:false
{/if}
{if $zone.points}
coords:[
{foreach from=$zone.points item=point name=point}
[{$point.x},{$point.y},
{ldelim}
label:'$<br>
<div class=q0>
<small>{#Respawn#}:
{if isset($point.r.h)} {$point.r.h}{#hr#}{/if}
{if isset($point.r.m)} {$point.r.m}{#min#}{/if}
{if isset($point.r.s)} {$point.r.s}{#sec#}{/if}
{if isset($point.events)}<br>{$point.events|escape:"quotes"}{/if}
</small>
</div>',type:'{$point.type}'
{rdelim}]
{if !$smarty.foreach.point.last},{/if}
{/foreach}
]
{/if}
{rdelim});
g_setSelectedLink(this, 'mapper'); return false" onmousedown="return false">
{$zone.name}</a>{if $zone.population > 1}&nbsp;({$zone.population}){/if}{if $smarty.foreach.zone.last}.{else}, {/if}
{/foreach}
</span></div>
{/strip}
<div id="mapper-generic"></div>
<div class="clear"></div>
<script type="text/javascript">
var myMapper = new Mapper({ldelim}parent: 'mapper-generic', zone: '{$object.position[0].atid}'{rdelim});
$WH.gE($WH.ge('locations'), 'a')[0].onclick();
</script>
{else}
{#This_Object_cant_be_found#}
{/if}
{if isset($object.pagetext)}
<h3>Content</h3>
<div id="book-generic"></div>
{strip}
<script>
new Book({ldelim} parent: 'book-generic', pages: [
{foreach from=$object.pagetext item=pagetext name=j}
'{$pagetext|escape:"javascript"}'
{if $smarty.foreach.j.last}{else},{/if}
{/foreach}
]{rdelim})
</script>
{/strip}
{/if}
<h2 class="clear">{$lang.related}</h2>
</div>
{include file='bricks/tabsRelated.tpl' tabs=$lvData.relTabs}
{include file='bricks/contribute.tpl'}
</div><!-- main-contents -->
</div><!-- main -->
{include file='footer.tpl'}

20
template/objects.tpl Normal file
View File

@@ -0,0 +1,20 @@
{include file='header.tpl'}
<div id="main">
<div id="main-precontents"></div>
<div id="main-contents" class="main-contents">
<script type="text/javascript">
g_initPath({$page.path});
</script>
<div id="lv-objects" class="listview"></div>
<script type="text/javascript">
{include file='bricks/listviews/object.tpl' data=$objects.data params=$objects.params}
</script>
<div class="clear"></div>
</div>
</div>
{include file='footer.tpl'}