omgishouldntbedoingthis

This commit is contained in:
Sarjuuk
2013-11-24 23:15:15 +01:00
parent 2d736fc785
commit 5e785d6c78
39 changed files with 2131 additions and 937 deletions

View File

@@ -162,7 +162,7 @@ define('LOOT_PROSPECTING', 'prospecting_loot_template');
define('LOOT_MILLING', 'milling_loot_template'); define('LOOT_MILLING', 'milling_loot_template');
define('LOOT_PICKPOCKET', 'pickpocketing_loot_template'); define('LOOT_PICKPOCKET', 'pickpocketing_loot_template');
define('LOOT_SKINNING', 'skinning_loot_template'); define('LOOT_SKINNING', 'skinning_loot_template');
define('LOOT_QUEST', 'quest_mail_loot_template'); define('LOOT_QUEST', 'mail_loot_template'); // changed to quest_mail_loot_template..?
define('LOOT_SPELL', 'spell_loot_template'); define('LOOT_SPELL', 'spell_loot_template');
define('LOOT_REFERENCE', 'reference_loot_template'); define('LOOT_REFERENCE', 'reference_loot_template');
@@ -310,6 +310,11 @@ define('LOCK_PROPERTY_FOOTLOCKER', 1);
define('LOCK_PROPERTY_HERBALISM', 2); define('LOCK_PROPERTY_HERBALISM', 2);
define('LOCK_PROPERTY_MINING', 3); define('LOCK_PROPERTY_MINING', 3);
// Creature
define('NPC_TYPEFLAG_HERBLOOT', 0x0100);
define('NPC_TYPEFLAG_MININGLOOT', 0x0200);
define('NPC_TYPEFLAG_ENGINEERLOOT', 0x8000);
// GameObject // GameObject
define('OBJECT_DOOR', 0); define('OBJECT_DOOR', 0);
define('OBJECT_BUTTON', 1); define('OBJECT_BUTTON', 1);

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class AchievementList extends BaseType class AchievementList extends BaseType
{ {
use listviewHelper; use listviewHelper;

View File

@@ -227,37 +227,32 @@ abstract class BaseType
// append joins // append joins
if ($j = array_column($this->queryOpts, 'j')) if ($j = array_column($this->queryOpts, 'j'))
foreach ($j as $_) foreach ($j as $_)
$this->queryBase .= is_array($_) ? (empty($_[1]) ? ' JOIN ' : ' LEFT JOIN ') . $_[0] : ' JOIN ' . $_; $this->queryBase .= is_array($_) ? (empty($_[1]) ? ' JOIN ' : ' LEFT JOIN ').$_[0] : ' JOIN '.$_;
// append conditions // append conditions
if ($where) if ($where)
$this->queryBase .= ' WHERE (' . implode($linking, $where).')'; $this->queryBase .= ' WHERE ('.implode($linking, $where).')';
// append grouping // append grouping
if ($g = array_column($this->queryOpts, 'g')) if ($g = array_column($this->queryOpts, 'g'))
$this->queryBase .= ' GROUP BY ' . implode(', ', $g); $this->queryBase .= ' GROUP BY '.implode(', ', $g);
// append post filtering // append post filtering
if ($h = array_column($this->queryOpts, 'h')) if ($h = array_column($this->queryOpts, 'h'))
$this->queryBase .= ' HAVING ' . implode(' AND ', $h); $this->queryBase .= ' HAVING '.implode(' AND ', $h);
// append ordering // append ordering
if ($o = array_column($this->queryOpts, 'o')) if ($o = array_column($this->queryOpts, 'o'))
$this->queryBase .= ' ORDER BY ' . implode(', ', $o); $this->queryBase .= ' ORDER BY '.implode(', ', $o);
// apply limit // apply limit
if ($limit) if ($limit)
$this->queryBase .= ' LIMIT '.$limit; $this->queryBase .= ' LIMIT '.$limit;
// Util::execTime(true);
// var_dump($this->queryBase);
// echo "<br><br>\n\n";
// execure query (finally) // execure query (finally)
$rows = DB::Aowow()->SelectPage($this->matches, $this->queryBase); $rows = DB::Aowow()->SelectPage($this->matches, $this->queryBase);
if (!$rows) if (!$rows)
return; return;
// var_dump(Util::execTime());
// echo "<br><br><br>\n\n";
// assign query results to template // assign query results to template
foreach ($rows as $k => $tpl) foreach ($rows as $k => $tpl)
@@ -789,7 +784,7 @@ abstract class Filter
private function genericString($field, $value, $localized) private function genericString($field, $value, $localized)
{ {
$field .= $localized ? '_loc' . User::$localeId : null; $field .= $localized ? '_loc'.User::$localeId : null;
return [$field, (string)$value]; return [$field, (string)$value];
} }

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class CharClassList extends BaseType class CharClassList extends BaseType
{ {
public static $type = TYPE_CLASS; public static $type = TYPE_CLASS;

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class CharRaceList extends BaseType class CharRaceList extends BaseType
{ {
public static $type = TYPE_RACE; public static $type = TYPE_RACE;

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class CurrencyList extends BaseType class CurrencyList extends BaseType
{ {
public static $type = TYPE_CURRENCY; public static $type = TYPE_CURRENCY;

View File

@@ -8,6 +8,12 @@ class GameObjectList extends BaseType
{ {
public static $type = TYPE_OBJECT; 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]]
);
public static function getName($id) public static function getName($id)
{ {
$n = DB::Aowow()->SelectRow(' $n = DB::Aowow()->SelectRow('

View File

@@ -3,15 +3,6 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
/*
! DONT FORGET !
REMOVE TEMP-HACK FROM Lang::load
fix locale files in gereral >.<
! DONT FORGET !
*/
class ItemList extends BaseType class ItemList extends BaseType
{ {
@@ -40,7 +31,7 @@ class ItemList extends BaseType
{ {
// search by statweight // search by statweight
if ($miscData && isset($miscData['wt']) && isset($miscData['wtv'])) if ($miscData && isset($miscData['wt']) && isset($miscData['wtv']))
$conditions[] = $this->createConditionsForWeights($miscData, $this->queryOpts); $conditions[] = $this->createConditionsForWeights($miscData);
parent::__construct($conditions, $applyFilter); parent::__construct($conditions, $applyFilter);
@@ -85,7 +76,7 @@ class ItemList extends BaseType
public function getExtendedCost() public function getExtendedCost()
{ {
// placeholder // placeholder
return []; return []; // [id => qty]
} }
public function getListviewData($addInfoMask = 0x0) public function getListviewData($addInfoMask = 0x0)
@@ -126,7 +117,7 @@ class ItemList extends BaseType
$data[$this->id]['repaircost'] = $_; $data[$this->id]['repaircost'] = $_;
} }
if ($addInfoMask & (ITEMINFO_JSON |ITEMINFO_GEM)) if ($addInfoMask & (ITEMINFO_JSON | ITEMINFO_GEM))
if (isset($this->curTpl['score'])) if (isset($this->curTpl['score']))
$data[$this->id]['score'] = $this->curTpl['score']; $data[$this->id]['score'] = $this->curTpl['score'];
@@ -300,8 +291,8 @@ class ItemList extends BaseType
// requires map (todo: reparse ?_zones for non-conflicting data; generate Link to zone) // requires map (todo: reparse ?_zones for non-conflicting data; generate Link to zone)
if ($_ = $this->curTpl['map']) if ($_ = $this->curTpl['map'])
{ {
$map = DB::Aowow()->selectRow('SELECT * FROM ?_zones WHERE mapId=?d LIMIT 1', $_); $map = DB::Aowow()->selectRow('SELECT * FROM ?_zones WHERE mapId = ?d LIMIT 1', $_);
$x .= '<br /><a href="?map='.$_.'" class="q1">'.Util::localizedString($map, 'name').'</a>'; $x .= '<br /><a href="?zone='.$_.'" class="q1">'.Util::localizedString($map, 'name').'</a>';
} }
// requires area // requires area
@@ -316,7 +307,7 @@ class ItemList extends BaseType
$x .= '<br />'.Lang::$item['conjured']; $x .= '<br />'.Lang::$item['conjured'];
// bonding // bonding
if (($_flags & ITEM_FLAG_ACCOUNTBOUND)) if ($_flags & ITEM_FLAG_ACCOUNTBOUND)
$x .= '<br /><!--bo-->'.Lang::$item['bonding'][0]; $x .= '<br /><!--bo-->'.Lang::$item['bonding'][0];
else if ($this->curTpl['bonding']) else if ($this->curTpl['bonding'])
$x .= '<br /><!--bo-->'.Lang::$item['bonding'][$this->curTpl['bonding']]; $x .= '<br /><!--bo-->'.Lang::$item['bonding'][$this->curTpl['bonding']];
@@ -339,7 +330,7 @@ class ItemList extends BaseType
// max duration // max duration
if ($dur = $this->curTpl['duration']) if ($dur = $this->curTpl['duration'])
$x .= "<br />".Lang::$game['duration'] . ' '. Util::formatTime(abs($dur) * 1000) . ($dur < 0 ? ' ('.Lang::$game['realTime'].')' : null); $x .= "<br />".Lang::$game['duration'].Lang::$colon.Util::formatTime(abs($dur) * 1000).($this->curTpl['flagsCustom'] & 0x1 ? ' ('.Lang::$item['realTime'].')' : null);
// required holiday // required holiday
if ($hId = $this->curTpl['holidayId']) if ($hId = $this->curTpl['holidayId'])
@@ -353,7 +344,7 @@ class ItemList extends BaseType
$x .= '<br /><a class="q1" href="?quest='.$this->curTpl['startQuest'].'">'.Lang::$item['startQuest'].'</a>'; $x .= '<br /><a class="q1" href="?quest='.$this->curTpl['startQuest'].'">'.Lang::$item['startQuest'].'</a>';
// containerType (slotCount) // containerType (slotCount)
if ($this->curTpl['slots'] > 1) if ($this->curTpl['slots'] > 0)
{ {
$fam = log($this->curTpl['bagFamily'], 2) + 1; $fam = log($this->curTpl['bagFamily'], 2) + 1;
// word order differs <_< // word order differs <_<
@@ -380,7 +371,7 @@ class ItemList extends BaseType
$x .= '</tr></table>'; $x .= '</tr></table>';
} }
else if ($_ = $this->curTpl['slot']) // yes, slot can occur on random items and is than also displayed <_< else if (($_ = $this->curTpl['slot']) && $_class != ITEM_CLASS_CONTAINER) // yes, slot can occur on random items and is then also displayed <_< .. excluding Bags >_>
$x .= '<br />'.Lang::$item['inventoryType'][$this->curTpl['slot']].'<br />'; $x .= '<br />'.Lang::$item['inventoryType'][$this->curTpl['slot']].'<br />';
else else
$x .= '<br />'; $x .= '<br />';
@@ -571,12 +562,13 @@ class ItemList extends BaseType
// required level // required level
if (($_flags & ITEM_FLAG_ACCOUNTBOUND) && $_quality == ITEM_QUALITY_HEIRLOOM) if (($_flags & ITEM_FLAG_ACCOUNTBOUND) && $_quality == ITEM_QUALITY_HEIRLOOM)
$x .= sprintf(Lang::$game['reqLevelHlm'], ' 1'.Lang::$game['valueDelim'].MAX_LEVEL.' ('.($interactive ? printf(Util::$changeLevelString, MAX_LEVEL) : '<!--lvl-->'.MAX_LEVEL).')').'<br />'; $x .= sprintf(Lang::$game['reqLevelHlm'], ' 1'.Lang::$game['valueDelim'].MAX_LEVEL.' ('.($interactive ? sprintf(Util::$changeLevelString, MAX_LEVEL) : '<!--lvl-->'.MAX_LEVEL).')').'<br />';
else if ($_reqLvl > 1) else if ($_reqLvl > 1)
$x .= sprintf(Lang::$game['reqLevel'], $_reqLvl).'<br />'; $x .= sprintf(Lang::$game['reqLevel'], $_reqLvl).'<br />';
// item level // item level
$x .= Lang::$item['itemLevel'].' '.$this->curTpl['itemLevel']; if (in_array($_class, [ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON]))
$x .= Lang::$item['itemLevel'].' '.$this->curTpl['itemLevel'].'<br />';
// required skill // required skill
if ($reqSkill = $this->curTpl['requiredSkill']) if ($reqSkill = $this->curTpl['requiredSkill'])
@@ -585,28 +577,26 @@ class ItemList extends BaseType
if ($this->curTpl['requiredSkillRank'] > 0) if ($this->curTpl['requiredSkillRank'] > 0)
$_ .= ' ('.$this->curTpl['requiredSkillRank'].')'; $_ .= ' ('.$this->curTpl['requiredSkillRank'].')';
$x .= '<br />'.sprintf(Lang::$game['requires'], $_); $x .= sprintf(Lang::$game['requires'], $_).'<br />';
} }
// required spell // required spell
if ($reqSpell = $this->curTpl['requiredSpell']) if ($reqSpell = $this->curTpl['requiredSpell'])
$x .= '<br />'.Lang::$game['requires2'].' <a class="q1" href="?spell='.$reqSpell.'">'.SpellList::getName($reqSpell).'</a>'; $x .= Lang::$game['requires2'].' <a class="q1" href="?spell='.$reqSpell.'">'.SpellList::getName($reqSpell).'</a><br />';
// required reputation w/ faction // required reputation w/ faction
if ($reqFac = $this->curTpl['requiredFaction']) if ($reqFac = $this->curTpl['requiredFaction'])
$x .= '<br />'.sprintf(Lang::$game['requires'], '<a class="q1" href=?faction="'.$reqFac.'">'.FactionList::getName($reqFac).'</a> - '.Lang::$game['rep'][$this->curTpl['requiredFactionRank']]); $x .= sprintf(Lang::$game['requires'], '<a class="q1" href=?faction="'.$reqFac.'">'.FactionList::getName($reqFac).'</a> - '.Lang::$game['rep'][$this->curTpl['requiredFactionRank']]).'<br />';
// locked or openable // locked or openable
if ($locks = Lang::getLocks($this->curTpl['lockId'], true)) if ($locks = Lang::getLocks($this->curTpl['lockId'], true))
$x .= '<br /><span class="q0">'.Lang::$item['locked'].'<br />'.implode('<br />', $locks).'</span>'; $x .= '<span class="q0">'.Lang::$item['locked'].'<br />'.implode('<br />', $locks).'</span><br />';
else if ($this->curTpl['flags'] & ITEM_FLAG_OPENABLE) else if ($this->curTpl['flags'] & ITEM_FLAG_OPENABLE)
$x .= '<br /><span class="q2">'.Lang::$item['openClick'].'</span>'; $x .= '<span class="q2">'.Lang::$item['openClick'].'</span><br />';
// upper table: done // upper table: done
if (!$subOf) if (!$subOf)
$x .= '</td></tr></table>'; $x .= '</td></tr></table>';
else
$x .= '<br>';
// spells on item // spells on item
if (!$this->canTeachSpell()) if (!$this->canTeachSpell())
@@ -648,7 +638,7 @@ class ItemList extends BaseType
$parsed = sprintF($link, $parsed); $parsed = sprintF($link, $parsed);
} }
$green[] = Lang::$item['trigger'][$itemSpellsAndTrigger[$itemSpells->id][0]] . $parsed . $itemSpellsAndTrigger[$itemSpells->id][1]; $green[] = Lang::$item['trigger'][$itemSpellsAndTrigger[$itemSpells->id][0]].$parsed.$itemSpellsAndTrigger[$itemSpells->id][1];
} }
} }
} }
@@ -1050,7 +1040,7 @@ class ItemList extends BaseType
if (!Lang::$item['statType'][$type]) // unknown rating if (!Lang::$item['statType'][$type]) // unknown rating
return sprintf(Lang::$item['statType'][count(Lang::$item['statType']) - 1], $type, $value); return sprintf(Lang::$item['statType'][count(Lang::$item['statType']) - 1], $type, $value);
else if (in_array($type, Util::$lvlIndepRating)) // level independant Bonus else if (in_array($type, Util::$lvlIndepRating)) // level independant Bonus
return Lang::$item['trigger'][1] . str_replace('%d', '<!--rtg'.$type.'-->'.$value, Lang::$item['statType'][$type]); return Lang::$item['trigger'][1].str_replace('%d', '<!--rtg'.$type.'-->'.$value, Lang::$item['statType'][$type]);
else // rating-Bonuses else // rating-Bonuses
{ {
$scaling = true; $scaling = true;
@@ -1199,14 +1189,14 @@ class ItemList extends BaseType
'classs' => $this->curTpl['class'], 'classs' => $this->curTpl['class'],
'subclass' => $this->curTpl['subClass'], 'subclass' => $this->curTpl['subClass'],
'subsubclass' => $this->curTpl['subSubClass'], 'subsubclass' => $this->curTpl['subSubClass'],
'heroic' => (string)($this->curTpl['flags'] & 0x8), 'heroic' => ($this->curTpl['flags'] & 0x8) >> 3,
'side' => $this->curTpl['flagsExtra'] & 0x3 ? 3 - ($this->curTpl['flagsExtra'] & 0x3) : Util::sideByRaceMask($this->curTpl['requiredRace']), 'side' => $this->curTpl['flagsExtra'] & 0x3 ? 3 - ($this->curTpl['flagsExtra'] & 0x3) : Util::sideByRaceMask($this->curTpl['requiredRace']),
'slot' => $this->curTpl['slot'], 'slot' => $this->curTpl['slot'],
'slotbak' => $this->curTpl['slotBak'], 'slotbak' => $this->curTpl['slotBak'],
'level' => $this->curTpl['itemLevel'], 'level' => $this->curTpl['itemLevel'],
'reqlevel' => $this->curTpl['requiredLevel'], 'reqlevel' => $this->curTpl['requiredLevel'],
'displayid' => $this->curTpl['displayId'], 'displayid' => $this->curTpl['displayId'],
// 'commondrop' => 'true' / null // set if the item is a loot-filler-item .. checke common ref-templates..? // 'commondrop' => 'true' / null // set if the item is a loot-filler-item .. check common ref-templates..?
'holres' => $this->curTpl['resHoly'], 'holres' => $this->curTpl['resHoly'],
'firres' => $this->curTpl['resFire'], 'firres' => $this->curTpl['resFire'],
'natres' => $this->curTpl['resNature'], 'natres' => $this->curTpl['resNature'],
@@ -1334,8 +1324,6 @@ class ItemListFilter extends Filter
157 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_SMARTLOOT ], // smartloot 157 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_SMARTLOOT ], // smartloot
159 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_MILLABLE ], // millable 159 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_MILLABLE ], // millable
162 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_DEPRECATED ], // deprecated 162 => [FILTER_CR_FLAG, 'flags', ITEM_FLAG_DEPRECATED ], // deprecated
127 => [FILTER_CR_FLAG, 'cuFlags', CUSTOM_UNAVAILABLE ], // notavailable
// 161 => [FILTER_CR_FLAG, 'cuFlags', ~CUSTOM_UNAVAILABLE ], // availabletoplayers .. wait what?!
151 => [FILTER_CR_NUMERIC, 'id', null, true], // id 151 => [FILTER_CR_NUMERIC, 'id', null, true], // id
100 => [FILTER_CR_NUMERIC, 'is.nsockets' ], // nsockets 100 => [FILTER_CR_NUMERIC, 'is.nsockets' ], // nsockets
111 => [FILTER_CR_NUMERIC, 'requiredSkillRank', null, true], // reqskillrank 111 => [FILTER_CR_NUMERIC, 'requiredSkillRank', null, true], // reqskillrank
@@ -1480,6 +1468,10 @@ class ItemListFilter extends Filter
if ($this->int2Bool($cr[1])) if ($this->int2Bool($cr[1]))
return ['maxCount', 1, $cr[1] ? null : '!']; return ['maxCount', 1, $cr[1] ? null : '!'];
break; break;
case 161: // availabletoplayers [yn]
if ($this->int2Bool($cr[1]))
return [['cuFlags', CUSTOM_UNAVAILABLE, '&'], 0, $cr[1] ? null : '!'];
break;
case 80: // has sockets [enum] case 80: // has sockets [enum]
switch ($cr[1]) switch ($cr[1])
{ {
@@ -1728,10 +1720,20 @@ class ItemListFilter extends Filter
if (isset($_v['upg'])) if (isset($_v['upg']))
{ {
// valid item? // valid item?
if (is_int($_v['upg']) && DB::Aowow()->selectCell('SELECT 1 FROM ?_items WHERE class IN (2, 3, 4) AND id = ?d', $_v['upg'])) if (!is_int($_v['upg']))
$this->formData['form']['upg'] = $_v['upg'];
else
unset($_v['upg']); unset($_v['upg']);
else
{
$_ = DB::Aowow()->selectCell('SELECT slot FROM ?_items WHERE class IN (2, 3, 4) AND id = ?d', $_v['upg']);
if ($_ === null)
unset($_v['upg']);
else
{
$this->formData['form']['upg'] = $_v['upg'];
if ($_)
$parts[] = ['slot', $_];
}
}
} }
// group by [form only] // group by [form only]

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class ItemsetList extends BaseType class ItemsetList extends BaseType
{ {
use ListviewHelper; use ListviewHelper;

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class PetList extends BaseType class PetList extends BaseType
{ {
use ListviewHelper; use ListviewHelper;

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class QuestList extends BaseType class QuestList extends BaseType
{ {
public static $type = TYPE_QUEST; public static $type = TYPE_QUEST;

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class SpellList extends BaseType class SpellList extends BaseType
{ {
use listviewHelper; use listviewHelper;
@@ -394,11 +395,11 @@ class SpellList extends BaseType
{ // Blood 2|1 - Unholy 2|1 - Frost 2|1 { // Blood 2|1 - Unholy 2|1 - Frost 2|1
$runes = []; $runes = [];
if ($_ = (($rCost & 0x300) >> 8)) if ($_ = (($rCost & 0x300) >> 8))
$runes[] = $_." ".Lang::$spell['powerRunes'][2]; $runes[] = $_.' '.Lang::$spell['powerRunes'][2];
if ($_ = (($rCost & 0x030) >> 4)) if ($_ = (($rCost & 0x030) >> 4))
$runes[] = $_." ".Lang::$spell['powerRunes'][1]; $runes[] = $_.' '.Lang::$spell['powerRunes'][1];
if ($_ = ($rCost & 0x003)) if ($_ = ($rCost & 0x003))
$runes[] = $_." ".Lang::$spell['powerRunes'][0]; $runes[] = $_.' '.Lang::$spell['powerRunes'][0];
$str .= implode(', ', $runes); $str .= implode(', ', $runes);
} }
@@ -421,7 +422,7 @@ class SpellList extends BaseType
else if ($this->curTpl['castTime'] > 0) else if ($this->curTpl['castTime'] > 0)
return $short ? sprintf(Lang::$spell['castIn'], $this->curTpl['castTime'] / 1000) : Util::formatTime($this->curTpl['castTime']); return $short ? sprintf(Lang::$spell['castIn'], $this->curTpl['castTime'] / 1000) : Util::formatTime($this->curTpl['castTime']);
// show instant only for player/pet/npc abilities (todo (low): unsure when really hidden (like talent-case)) // show instant only for player/pet/npc abilities (todo (low): unsure when really hidden (like talent-case))
else if ($noInstant && !in_array($this->curTpl['typeCat'], [11, 7, -3, -8, 0]) && !($this->curTpl['cuFlags'] & SPELL_CU_TALENTSPELL)) else if ($noInstant && !in_array($this->curTpl['typeCat'], [11, 7, -3, -6, -8, 0]) && !($this->curTpl['cuFlags'] & SPELL_CU_TALENTSPELL))
return ''; return '';
// SPELL_ATTR0_ABILITY instant ability.. yeah, wording thing only (todo (low): rule is imperfect) // SPELL_ATTR0_ABILITY instant ability.. yeah, wording thing only (todo (low): rule is imperfect)
else if ($this->curTpl['damageClass'] != 1 || $this->curTpl['attributes0'] & 0x10) else if ($this->curTpl['damageClass'] != 1 || $this->curTpl['attributes0'] & 0x10)
@@ -487,16 +488,56 @@ class SpellList extends BaseType
public function canTriggerSpell() public function canTriggerSpell()
{ {
$idx = []; $idx = [];
// effect - 3: dummy; 32: trigger missile; 36: learn spell; 57: learn pet spell; 64/151: trigger spell (2); 101: feed pet; 133: unlearn specialization; 140/142: force cast (with value); 148/152/160: unk; 164: remove aura // effect - 3: dummy; 32: trigger missile; 36: learn spell; 57: learn pet spell; 64/151: trigger spell (2); 101: feed pet; 133: unlearn specialization; 140/142: force cast (with value); 148/152/160: unk; 155: dualwield 2H; 164: remove aura
// aura - 4: dummy; 23/227: periodic trigger spell (with value); 42/231: proc trigger spell (with value); 48: unk; 109: add target trigger; 226: periodic dummy; 236: control vehicle; 284: linked // aura - 4: dummy; 23/227: periodic trigger spell (with value); 42/231: proc trigger spell (with value); 48: unk; 109: add target trigger; 226: periodic dummy; 236: control vehicle; 284: linked
for ($i = 1; $i < 4; $i++) for ($i = 1; $i < 4; $i++)
if (in_array($this->curTpl['effect'.$i.'Id'], [3, 32, 36, 57, 64, 101, 133, 142, 148, 151, 152, 160, 164]) || in_array($this->curTpl['effect'.$i.'AuraId'], [4, 23, 42, 48, 109, 226, 227, 231, 236, 284])) if (in_array($this->curTpl['effect'.$i.'Id'], [3, 32, 36, 57, 64, 101, 133, 142, 148, 151, 152, 155, 160, 164]) || in_array($this->curTpl['effect'.$i.'AuraId'], [4, 23, 42, 48, 109, 226, 227, 231, 236, 284]))
if ($this->curTpl['effect'.$i.'TriggerSpell'] > 0) if ($this->curTpl['effect'.$i.'TriggerSpell'] > 0 || $this->curTpl['effect'.$i.'MiscValue'] > 0)
$idx[] = $i; $idx[] = $i;
return $idx; return $idx;
} }
public function isChanneledSpell()
{
return $this->curTpl['attributes1'] & 0x44;
}
public function isHealingSpell()
{
$eff = [0, 3, 10, 67, 75, 136]; // <no effect>, Dummy, Heal, Heal Max Health, Heal Mechanical, Heal Percent
$aur = [4, 8, 62, 69, 97, 226]; // Dummy, Periodic Heal, Periodic Health Funnel, School Absorb, Mana Shield, Periodic Dummy
for ($i = 1; $i < 4; $i++)
if (!in_array($this->curTpl['effect'.$i.'Id'], $eff) && !in_array($this->curTpl['effect'.$i.'AuraId'], $aur))
return false;
return true;
}
public function isDamagingSpell()
{
$eff = [0, 2, 3, 9, 62]; // <no effect>, Dummy, School Damage, Health Leech, Power Burn
$aur = [3, 4, 15, 53, 89, 162, 226]; // Periodic Damage, Dummy, Damage Shield, Periodic Health Leech, Periodic Damage Percent, Power Burn Mana, Periodic Dummy
for ($i = 1; $i < 4; $i++)
if (!in_array($this->curTpl['effect'.$i.'Id'], $eff) && !in_array($this->curTpl['effect'.$i.'AuraId'], $aur))
return false;
return true;
}
public function periodicEffectsMask()
{
$effMask = 0x0;
for ($i = 1; $i < 4; $i++)
if ($this->curTpl['effect'.$i.'Periode'] > 0)
$effMask |= 1 << ($i - 1);
return $effMask;
}
// description-, buff-parsing component // description-, buff-parsing component
private function resolveEvaluation($formula) private function resolveEvaluation($formula)
{ {
@@ -566,6 +607,10 @@ class SpellList extends BaseType
return eval('return '.$formula.';'); return eval('return '.$formula.';');
} }
// since this function may be called recursively, there are cases, where the already evaluated string is tried to be evaled again, throwing parse errors
if (strstr($formula, '</dfn>'))
return $formula;
// hm, minor eval-issue. eval doesnt understand two operators without a space between them (eg. spelll: 18126) // hm, minor eval-issue. eval doesnt understand two operators without a space between them (eg. spelll: 18126)
$formula = preg_replace('/(\+|-|\*|\/)(\+|-|\*|\/)/i', '\1 \2', $formula); $formula = preg_replace('/(\+|-|\*|\/)(\+|-|\*|\/)/i', '\1 \2', $formula);
@@ -626,7 +671,7 @@ class SpellList extends BaseType
else else
$base = $this->getField('duration'); $base = $this->getField('duration');
if ($base < 0) if ($base <= 0)
return Lang::$spell['untilCanceled']; return Lang::$spell['untilCanceled'];
if ($op && is_numeric($oparg) && is_numeric($base)) if ($op && is_numeric($oparg) && is_numeric($base))
@@ -1042,13 +1087,16 @@ class SpellList extends BaseType
return array("", []); return array("", []);
// step 1: if the text is supplemented with text-variables, get and replace them // step 1: if the text is supplemented with text-variables, get and replace them
if (empty($this->spellVars[$this->id]) && $this->curTpl['spellDescriptionVariableId'] > 0) if ($this->curTpl['spellDescriptionVariableId'] > 0)
{
if (empty($this->spellVars[$this->id]))
{ {
$spellVars = DB::Aowow()->SelectCell('SELECT vars FROM ?_spellVariables WHERE id = ?d', $this->curTpl['spellDescriptionVariableId']); $spellVars = DB::Aowow()->SelectCell('SELECT vars FROM ?_spellVariables WHERE id = ?d', $this->curTpl['spellDescriptionVariableId']);
$spellVars = explode("\n", $spellVars); $spellVars = explode("\n", $spellVars);
foreach ($spellVars as $sv) foreach ($spellVars as $sv)
if (preg_match('/\$(\w*\d*)=(.*)/i', trim($sv), $matches)) if (preg_match('/\$(\w*\d*)=(.*)/i', trim($sv), $matches))
$this->spellVars[$this->id][$matches[1]] = $matches[2]; $this->spellVars[$this->id][$matches[1]] = $matches[2];
}
// replace self-references // replace self-references
$reset = true; $reset = true;
@@ -1345,7 +1393,7 @@ Lasts 5 min. $?$gte($pl,68)[][Cannot be used on items level 138 and higher.]
if ($cId = $this->curTpl['effect'.$i.'CreateItemId']) if ($cId = $this->curTpl['effect'.$i.'CreateItemId'])
{ {
$createItem = (new ItemList(array(['i.id', (int)$cId])))->renderTooltip([], true, true); $createItem = (new ItemList(array(['i.id', (int)$cId])))->renderTooltip([], true, $this->id);
break; break;
} }
} }
@@ -1520,13 +1568,13 @@ Lasts 5 min. $?$gte($pl,68)[][Cannot be used on items level 138 and higher.]
'cat' => $this->curTpl['typeCat'], 'cat' => $this->curTpl['typeCat'],
'trainingcost' => $this->curTpl['trainingCost'], 'trainingcost' => $this->curTpl['trainingCost'],
'skill' => count($this->curTpl['skillLines']) > 4 ? array_merge(array_splice($this->curTpl['skillLines'], 0, 4), [-1]): $this->curTpl['skillLines'], // display max 4 skillLines (fills max three lines in listview) 'skill' => count($this->curTpl['skillLines']) > 4 ? array_merge(array_splice($this->curTpl['skillLines'], 0, 4), [-1]): $this->curTpl['skillLines'], // display max 4 skillLines (fills max three lines in listview)
'reagents' => $this->getReagentsForCurrent(), 'reagents' => array_values($this->getReagentsForCurrent()),
'source' => [] 'source' => []
); );
// Sources // Sources
if (!empty($this->sources[$this->id]) && $s = $this->sources[$this->id]) if (!empty($this->sources[$this->id]) && $s = $this->sources[$this->id])
$data[$this->id]['source'] = json_encode(array_keys($s), JSON_NUMERIC_CHECK); $data[$this->id]['source'] = array_keys($s);
// Proficiencies // Proficiencies
if ($this->curTpl['typeCat'] == -11) if ($this->curTpl['typeCat'] == -11)
@@ -1633,6 +1681,81 @@ spells / buffspells = {
$template->extendGlobalData(self::$type, $data, $extra); $template->extendGlobalData(self::$type, $data, $extra);
} }
} }
// mostly similar to TC
public function getCastingTimeForBonus($asDOT = false)
{
$areaTargets = [7, 8, 15, 16, 20, 24, 30, 31, 33, 34, 37, 54, 56, 59, 104, 108];
$castingTime = $this->IsChanneledSpell() ? $this->curTpl['duration'] : $this->curTpl['castTime'];
if (!$castingTime)
return 3500;
if ($castingTime > 7000)
$castingTime = 7000;
if ($castingTime < 1500)
$castingTime = 1500;
if ($asDOT && !$this->isChanneledSpell())
$castingTime = 3500;
$overTime = 0;
$nEffects = 0;
$isDirect = false;
$isArea = false;
for ($i = 1; $i <= 3; $i++)
{
if (in_array($this->curTpl['effect'.$i.'Id'], [2, 7, 8, 9, 62, 67]))
$isDirect = true;
else if (in_array($this->curTpl['effect'.$i.'AuraId'], [3, 8, 53]))
if ($_ = $this->curTpl['duration'])
$overTime = $_;
else if ($this->curTpl['effect'.$i.'AuraId'])
$nEffects++;
if (in_array($this->curTpl['effect'.$i.'ImplicitTargetA'], $areaTargets) || in_array($this->curTpl['effect'.$i.'ImplicitTargetB'], $areaTargets))
$isArea = true;
}
// Combined Spells with Both Over Time and Direct Damage
if ($overTime > 0 && $castingTime > 0 && $isDirect)
{
// mainly for DoTs which are 3500 here otherwise
$originalCastTime = $this->curTpl['castTime'];
if ($this->curTpl['attributes0'] & 0x2) // requires Ammo
$originalCastTime += 500;
if ($originalCastTime > 7000)
$originalCastTime = 7000;
if ($originalCastTime < 1500)
$originalCastTime = 1500;
// Portion to Over Time
$PtOT = ($overTime / 15000) / (($overTime / 15000) + (OriginalCastTime / 3500));
if ($asDOT)
$castingTime = $castingTime * $PtOT;
else if ($PtOT < 1)
$castingTime = $castingTime * (1 - $PtOT);
else
$castingTime = 0;
}
// Area Effect Spells receive only half of bonus
if ($isArea)
$castingTime /= 2;
// -5% of total per any additional effect
$castingTime -= ($nEffects * 175);
if ($castingTime < 0)
$castingTime = 0;
return $castingTime;
}
} }

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class TitleList extends BaseType class TitleList extends BaseType
{ {
use listviewHelper; use listviewHelper;

View File

@@ -3,6 +3,7 @@
if (!defined('AOWOW_REVISION')) if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
class WorldEventList extends BaseType class WorldEventList extends BaseType
{ {
public static $type = TYPE_WORLDEVENT; public static $type = TYPE_WORLDEVENT;

View File

@@ -41,13 +41,10 @@ class Lang
foreach ($lang as $k => $v) foreach ($lang as $k => $v)
self::$$k = $v; self::$$k = $v;
// *cough* .. temp-hack // *cough* .. reuse-hack
if (User::$localeId == LOCALE_EN)
{
self::$item['cat'][2] = [self::$item['cat'][2], self::$spell['weaponSubClass']]; self::$item['cat'][2] = [self::$item['cat'][2], self::$spell['weaponSubClass']];
self::$item['cat'][2][1][14] .= ' ('.self::$item['cat'][2][0].')'; self::$item['cat'][2][1][14] .= ' ('.self::$item['cat'][2][0].')';
} }
}
// todo: expand // todo: expand
public static function getInfoBoxForFlags($flags) public static function getInfoBoxForFlags($flags)
@@ -141,16 +138,25 @@ class Lang
public static function getRequiredItems($class, $mask, $short = true) public static function getRequiredItems($class, $mask, $short = true)
{ {
if (!in_array($class, [ITEM_CLASS_MISC, ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON]))
return '';
// not checking weapon / armor here. It's highly unlikely that they overlap // not checking weapon / armor here. It's highly unlikely that they overlap
if ($short) if ($short)
{ {
if ($class == ITEM_CLASS_MISC) // misc - Mounts // misc - Mounts
if ($class == ITEM_CLASS_MISC)
return ''; return '';
if ($class == ITEM_CLASS_ARMOR && $mask == 0x1E) // all basic armor classes // all basic armor classes
if ($class == ITEM_CLASS_ARMOR && ($mask & 0x1E) == 0x1E)
return ''; return '';
foreach(Lang::$spell['subClassMasks'] as $m => $str) // all weapon classes
if ($class == ITEM_CLASS_WEAPON && ($mask & 0x1DE5FF) == 0x1DE5FF)
return '';
foreach (Lang::$spell['subClassMasks'] as $m => $str)
if ($mask == $m) if ($mask == $m)
return $str; return $str;
} }
@@ -380,8 +386,10 @@ class SmartyAoWoW extends Smarty
$this->jsGlobals[$type] = []; $this->jsGlobals[$type] = [];
if (is_array($data)) if (is_array($data))
{
foreach ($data as $id) foreach ($data as $id)
$this->jsGlobals[$type][] = (int)$id; $this->jsGlobals[$type][] = (int)$id;
}
else if (is_numeric($data)) else if (is_numeric($data))
$this->jsGlobals[$type][] = (int)$data; $this->jsGlobals[$type][] = (int)$data;
else else
@@ -441,6 +449,7 @@ class SmartyAoWoW extends Smarty
if (!$ids) if (!$ids)
continue; continue;
$this->initJSGlobal($type); $this->initJSGlobal($type);
$ids = array_unique($ids, SORT_NUMERIC); $ids = array_unique($ids, SORT_NUMERIC);
@@ -711,104 +720,22 @@ class Util
null, 1.0, 0.6, 1.0, 0.8, 1.0, 1.0, 1.2, 1.25, 1.44, 2.5, 1.728, 3.0, 0.0, 0.0, 1.2, 1.25 null, 1.0, 0.6, 1.0, 0.8, 1.0, 1.0, 1.2, 1.25, 1.44, 2.5, 1.728, 3.0, 0.0, 0.0, 1.2, 1.25
); );
public static $lootTemplates = array(
LOOT_REFERENCE, // internal
LOOT_ITEM, // item
LOOT_DISENCHANT, // item
LOOT_PROSPECTING, // item
LOOT_MILLING, // item
LOOT_CREATURE, // npc
LOOT_PICKPOCKET, // npc
LOOT_SKINNING, // npc (see its flags for mining, herbing or actual skinning)
LOOT_FISHING, // zone
LOOT_GAMEOBJECT, // object
LOOT_QUEST, // quest (mail rewards)
LOOT_SPELL // spell
);
// todo: translate and move to Lang // todo: translate and move to Lang
public static $spellModOp = array(
0 => 'DAMAGE',
1 => 'DURATION',
2 => 'THREAT',
3 => 'EFFECT1',
4 => 'CHARGES',
5 => 'RANGE',
6 => 'RADIUS',
7 => 'CRITICAL_CHANCE',
8 => 'ALL_EFFECTS',
9 => 'NOT_LOSE_CASTING_TIME',
10 => 'CASTING_TIME',
11 => 'COOLDOWN',
12 => 'EFFECT2',
13 => 'IGNORE_ARMOR',
14 => 'COST',
15 => 'CRIT_DAMAGE_BONUS',
16 => 'RESIST_MISS_CHANCE',
17 => 'JUMP_TARGETS',
18 => 'CHANCE_OF_SUCCESS',
19 => 'ACTIVATION_TIME',
20 => 'DAMAGE_MULTIPLIER',
21 => 'GLOBAL_COOLDOWN',
22 => 'DOT',
23 => 'EFFECT3',
24 => 'BONUS_MULTIPLIER',
25 => '25_UNUSED',
26 => 'PROC_PER_MINUTE',
27 => 'VALUE_MULTIPLIER',
28 => 'RESIST_DISPEL_CHANCE',
29 => 'CRIT_DAMAGE_BONUS_2', //one not used spell
30 => 'SPELL_COST_REFUND_ON_FAIL'
);
public static $combatRating = array(
0 => 'WEAPON_SKILL',
1 => 'DEFENSE_SKILL',
2 => 'DODGE',
3 => 'PARRY',
4 => 'BLOCK',
5 => 'HIT_MELEE',
6 => 'HIT_RANGED',
7 => 'HIT_SPELL',
8 => 'CRIT_MELEE',
9 => 'CRIT_RANGED',
10 => 'CRIT_SPELL',
11 => 'HIT_TAKEN_MELEE',
12 => 'HIT_TAKEN_RANGED',
13 => 'HIT_TAKEN_SPELL',
14 => 'CRIT_TAKEN_MELEE',
15 => 'CRIT_TAKEN_RANGED',
16 => 'CRIT_TAKEN_SPELL',
17 => 'HASTE_MELEE',
18 => 'HASTE_RANGED',
19 => 'HASTE_SPELL',
20 => 'WEAPON_SKILL_MAINHAND',
21 => 'WEAPON_SKILL_OFFHAND',
22 => 'WEAPON_SKILL_RANGED',
23 => 'EXPERTISE',
24 => 'ARMOR_PENETRATION'
);
public static $lockType = array(
1 => 'PICKLOCK',
2 => 'HERBALISM',
3 => 'MINING',
4 => 'DISARM_TRAP',
5 => 'OPEN',
6 => 'TREASURE',
7 => 'CALCIFIED_ELVEN_GEMS',
8 => 'CLOSE',
9 => 'ARM_TRAP',
10 => 'QUICK_OPEN',
11 => 'QUICK_CLOSE',
12 => 'OPEN_TINKERING',
13 => 'OPEN_KNEELING',
14 => 'OPEN_ATTACKING',
15 => 'GAHZRIDIAN',
16 => 'BLASTING',
17 => 'SLOW_OPEN',
18 => 'SLOW_CLOSE',
19 => 'FISHING',
20 => 'INSCRIPTION',
21 => 'OPEN_FROM_VEHICLE'
);
public static $stealthType = array(
0 => 'GENERAL',
1 => 'TRAP'
);
public static $invisibilityType = array(
0 => 'GENERAL',
3 => 'TRAP',
6 => 'DRUNK'
);
public static $spellEffectStrings = array( public static $spellEffectStrings = array(
0 => 'None', 0 => 'None',
1 => 'Instakill', 1 => 'Instakill',
@@ -1076,7 +1003,7 @@ class Util
95 => 'Ghost', 95 => 'Ghost',
96 => 'Spell Magnet', 96 => 'Spell Magnet',
97 => 'Mana Shield', 97 => 'Mana Shield',
98 => 'Mod Skill Talent', 98 => 'Mod Skill Value',
99 => 'Mod Attack Power', 99 => 'Mod Attack Power',
100 => 'Auras Visible', 100 => 'Auras Visible',
101 => 'Mod Resistance Percent', 101 => 'Mod Resistance Percent',
@@ -1609,13 +1536,14 @@ class Util
// for item and spells // for item and spells
public static function setRatingLevel($level, $type, $val) public static function setRatingLevel($level, $type, $val)
{ {
if (in_array($type, array(ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_PARRY_RATING, ITEM_MOD_BLOCK_RATING)) && $level < 34) if (in_array($type, [ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_PARRY_RATING, ITEM_MOD_BLOCK_RATING]) && $level < 34)
$level = 34; $level = 34;
if (!isset(Util::$gtCombatRatings[$type])) if (!isset(Util::$gtCombatRatings[$type]))
$result = 0; $result = 0;
else
else if ($level > 70) {
if ($level > 70)
$c = 82 / 52 * pow(131 / 63, ($level - 70) / 10); $c = 82 / 52 * pow(131 / 63, ($level - 70) / 10);
else if ($level > 60) else if ($level > 60)
$c = 82 / (262 - 3 * $level); $c = 82 / (262 - 3 * $level);
@@ -1625,11 +1553,12 @@ class Util
$c = 2 / 52; $c = 2 / 52;
$result = number_format($val / Util::$gtCombatRatings[$type] / $c, 2); $result = number_format($val / Util::$gtCombatRatings[$type] / $c, 2);
}
if (!in_array($type, array(ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_EXPERTISE_RATING))) if (!in_array($type, array(ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_EXPERTISE_RATING)))
$result .= '%'; $result .= '%';
return sprintf(Lang::$item['ratingString'], '<!--rtg%'.$type.'-->' . $result, '<!--lvl-->' . $level); return sprintf(Lang::$item['ratingString'], '<!--rtg%'.$type.'-->'.$result, '<!--lvl-->'.$level);
} }
public static function powerUseLocale($domain = 'www') public static function powerUseLocale($domain = 'www')
@@ -1770,7 +1699,7 @@ class Util
$first = mb_substr($str, 0, 1, 'UTF-8'); $first = mb_substr($str, 0, 1, 'UTF-8');
$rest = mb_substr($str, 1, $len, 'UTF-8'); $rest = mb_substr($str, 1, $len, 'UTF-8');
return mb_strtoupper($first, 'UTF-8') . $rest; return mb_strtoupper($first, 'UTF-8').$rest;
} }
public static function ucWords($str) public static function ucWords($str)
@@ -1845,11 +1774,6 @@ class Util
quest_mail_loot_template entry quest_template RewMailTemplateId quest_mail_loot_template entry quest_template RewMailTemplateId
reference_loot_template entry many <- many _loot_template -mincountOrRef In case of negative mincountOrRef reference_loot_template entry many <- many _loot_template -mincountOrRef In case of negative mincountOrRef
*/ */
private static function getLootByItem($tableName, $itemId)
{
return;
}
private static function getLootByEntry($tableName, $lootId, $groupId = 0, $baseChance = 1.0) private static function getLootByEntry($tableName, $lootId, $groupId = 0, $baseChance = 1.0)
{ {
$loot = []; $loot = [];
@@ -1858,7 +1782,7 @@ class Util
if (!$tableName || !$lootId) if (!$tableName || !$lootId)
return null; return null;
$rows = DB::Aowow()->select('SELECT * FROM ?# WHERE entry = ?d {AND groupid = ?d}', $tableName, abs($lootId), $groupId ? $groupId : DBSIMPLE_SKIP); $rows = DB::Aowow()->select('SELECT * FROM ?# WHERE entry = ?d{ AND groupid = ?d}', $tableName, abs($lootId), $groupId ? $groupId : DBSIMPLE_SKIP);
if (!$rows) if (!$rows)
return null; return null;
@@ -1928,8 +1852,13 @@ class Util
@$groupChances[$entry['groupid']] += $entry['ChanceOrQuestChance']; @$groupChances[$entry['groupid']] += $entry['ChanceOrQuestChance'];
$set['groupChance'] = abs($entry['ChanceOrQuestChance']); $set['groupChance'] = abs($entry['ChanceOrQuestChance']);
} }
else // shouldn't happened
{
if (User::isInGroup(U_GROUP_DEV))
die(var_dump($entry));
else else
continue; // shouldn't happen continue;
}
$loot[] = $set; $loot[] = $set;
} }
@@ -1939,7 +1868,7 @@ class Util
$sum = $groupChances[$k]; $sum = $groupChances[$k];
if (!$sum) if (!$sum)
$sum = 0; $sum = 0;
elseif ($sum > 100) // group has > 100% dropchance .. hmm, display some kind of error..? else if ($sum > 100) // group has > 100% dropchance .. hmm, display some kind of error..?
$sum = 100; $sum = 100;
$cnt = empty($nGroupEquals[$k]) ? 1 : $nGroupEquals[$k]; $cnt = empty($nGroupEquals[$k]) ? 1 : $nGroupEquals[$k];
@@ -1968,11 +1897,7 @@ class Util
// iterate over the 4 available difficulties and assign modes // iterate over the 4 available difficulties and assign modes
*/ */
if ($entry > 0)
$struct = self::getLootByEntry($table, $entry); $struct = self::getLootByEntry($table, $entry);
else if ($entry < 0)
$struct = self::getLootByItem($table, -$entry);
if (!$struct) if (!$struct)
return $lv; return $lv;
@@ -1995,13 +1920,13 @@ class Util
if ($_ = $loot['reference']) if ($_ = $loot['reference'])
$base['reference'] = $_; $base['reference'] = $_;
$buff = []; // equal distribution between min/max .. not blizzlike, but hey, TC-issue $stack = []; // equal distribution between min/max .. not blizzlike, but hey, TC-issue
if (isset($loot['max']) && isset($loot['min']) && ($loot['max'] > $loot['min'])) if (isset($loot['max']) && isset($loot['min']) && ($loot['max'] > $loot['min']))
for ($i = $loot['min']; $i <= $loot['max']; $i++) for ($i = $loot['min']; $i <= $loot['max']; $i++)
$buff[] = $i.':'.(round(100 / (1 + $loot['max'] - $loot['min']), 3)); $stack[$i] = round(100 / (1 + $loot['max'] - $loot['min']), 3);
if ($buff) // yes, it wants a string .. how weired is that.. if ($stack) // yes, it wants a string .. how weired is that..
$base['pctstack'] = '{'.implode(',',$buff).'}'; $base['pctstack'] = json_encode($stack, JSON_NUMERIC_CHECK);
if ($loot['content'] > 0) // regular drop if ($loot['content'] > 0) // regular drop
{ {
@@ -2049,9 +1974,142 @@ class Util
} }
} }
return $lv; return $lv;
} }
public static function getLootSource($itemId)
{
if (!$itemId)
return [];
$final = [];
$refResults = [];
$chanceMods = [];
$query = 'SELECT
-lt1.entry AS ARRAY_KEY,
IF (lt1.mincountOrRef > 0, lt1.item, lt1.mincountOrRef) AS item,
lt1.ChanceOrQuestChance AS chance,
SUM(IF(lt2.ChanceOrQuestChance = 0, 1, 0)) AS nZeroItems,
SUM(IF(lt2.ChanceOrQuestChance > 0, lt2.ChanceOrQuestChance, 0)) AS sumChance,
IF(lt1.groupid > 0, 1, 0) AS isGrouped,
IF (lt1.mincountOrRef > 0, lt1.mincountOrRef, 1) AS min,
IF (lt1.mincountOrRef > 0, lt1.maxcount, 1) AS max,
IF (lt1.mincountOrRef < 0, lt1.maxcount, 1) AS multiplier
FROM
?# lt1
LEFT JOIN
?# lt2 ON lt1.entry = lt2.entry AND lt1.groupid = lt2.groupid
WHERE
%s
GROUP BY lt2.entry';
$calcChance = function ($refs, $parents = []) use (&$chanceMods)
{
$return = [];
foreach ($refs as $rId => $ref)
{
// errör: item/ref is in group 0 without a chance set
if (!$ref['chance'] && !$ref['isGrouped'])
continue; // todo (low): create dubug output
// 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
$chance = ($ref['chance'] ? $ref['chance'] : (100 - $ref['sumChance']) / $ref['nZeroItems']) / 100;
// apply inherited chanceMods
if (isset($chanceMods[$ref['item']]))
{
$chance *= $chanceMods[$ref['item']][0];
$chance = 1 - pow(1 - $chance, $chanceMods[$ref['item']][1]);
}
// save chance for parent-ref
$chanceMods[$rId] = [$chance, $ref['multiplier']];
// refTemplate doesn't point to a new ref -> we are done
if (!in_array($rId, $parents))
{
$data = array(
'percent' => $chance,
'stack' => [$ref['multiplier'], $ref['multiplier']],
'count' => 1 // ..and one for the sort script
);
$stack = []; // equal distribution between min/max .. not blizzlike, but hey, TC-issue
if ($ref['max'] > $ref['min'])
for ($i = $ref['min']; $i <= $ref['max']; $i++)
$stack[$i] = round(100 / (1 + $ref['max'] - $ref['min']), 3);
if ($stack) // yes, it wants a string .. how weired is that..
$data['pctstack'] = json_encode($stack, JSON_NUMERIC_CHECK);
$return[$rId] = $data;
}
}
return $return;
};
$newRefs = DB::Aowow()->select(
sprintf($query, 'lt1.item = ?d AND lt1.mincountOrRef > 0'),
LOOT_REFERENCE, LOOT_REFERENCE,
$itemId
);
while ($newRefs)
{
$curRefs = $newRefs;
$newRefs = DB::Aowow()->select(
sprintf($query, 'lt1.mincountOrRef IN (?a)'),
LOOT_REFERENCE, LOOT_REFERENCE,
array_keys($curRefs)
);
$refResults += $calcChance($curRefs, array_column($newRefs, 'item'));
}
for ($i = 1; $i < count(self::$lootTemplates); $i++)
{
$res = DB::Aowow()->select(
sprintf($query, '{lt1.mincountOrRef IN (?a) OR }(lt1.mincountOrRef > 0 AND lt1.item = ?d)'),
self::$lootTemplates[$i], self::$lootTemplates[$i],
$refResults ? array_keys($refResults) : DBSIMPLE_SKIP,
$itemId
);
if ($_ = $calcChance($res))
{
// format for use in item.php
$sort = [];
foreach ($_ as $k => $v)
{
unset($_[$k]);
$v['percent'] = round($v['percent'] * 100, 3);
$v['key'] = abs($k); // array_multisort issue: it does not preserve numeric keys, restore after sort
$sort[$k] = $v['percent'];
$_[abs($k)] = $v;
}
array_multisort($sort, SORT_DESC, $_);
foreach ($_ as $k => $v)
{
$key = $v['key'];
unset($_[$k]);
unset($v['key']);
$_[$key] = $v;
}
$final[self::$lootTemplates[$i]] = $_;
}
}
return $final;
}
} }
?> ?>

View File

@@ -15,7 +15,6 @@ require 'includes/kernel.php';
if ($AoWoWconf['maintenance'] && !User::isInGroup(U_GROUP_EMPLOYEE)) if ($AoWoWconf['maintenance'] && !User::isInGroup(U_GROUP_EMPLOYEE))
$smarty->brb(); $smarty->brb();
switch ($pageCall) switch ($pageCall)
{ {
/* called by user */ /* called by user */

View File

@@ -141,6 +141,8 @@ $lang = array(
'itemsets' => "Ausrüstungssets", 'itemsets' => "Ausrüstungssets",
'mechanic' => "Auswirkung", 'mechanic' => "Auswirkung",
'mechAbbr' => "Ausw.", 'mechAbbr' => "Ausw.",
'npc' => "NPC",
'npcs' => "NPCs",
'pet' => "Begleiter", 'pet' => "Begleiter",
'pets' => "Begleiter", 'pets' => "Begleiter",
'requires' => "Benötigt %s", 'requires' => "Benötigt %s",
@@ -169,6 +171,7 @@ $lang = array(
'specs' => "Spezialisierungen", 'specs' => "Spezialisierungen",
'_roles' => ['Heiler', 'Nahkampf-DPS', 'Distanz-DPS', 'Tank'], '_roles' => ['Heiler', 'Nahkampf-DPS', 'Distanz-DPS', 'Tank'],
'modes' => ['Normal / Normal 10', 'Heroisch / Normal 25', 'Heroisch 10', 'Heroisch 25'],
'expansions' => array("Classic", "The Burning Crusade", "Wrath of the Lich King"), 'expansions' => array("Classic", "The Burning Crusade", "Wrath of the Lich King"),
'stats' => array("Stärke", "Beweglichkeit", "Ausdauer", "Intelligenz", "Willenskraft"), 'stats' => array("Stärke", "Beweglichkeit", "Ausdauer", "Intelligenz", "Willenskraft"),
'languages' => array( 'languages' => array(
@@ -176,7 +179,7 @@ $lang = array(
11 => "Drachisch", 12 => "Kalimagisch", 13 => "Gnomisch", 14 => "Trollisch", 33 => "Gossensprache", 35 => "Draeneiisch", 36 => "Zombie", 37 => "Gnomenbinär", 38 => "Goblinbinär" 11 => "Drachisch", 12 => "Kalimagisch", 13 => "Gnomisch", 14 => "Trollisch", 33 => "Gossensprache", 35 => "Draeneiisch", 36 => "Zombie", 37 => "Gnomenbinär", 38 => "Goblinbinär"
), ),
'gl' => array(null, "Erhebliche", "Geringe"), 'gl' => array(null, "Erhebliche", "Geringe"),
'si' => array(-2 => "Nur für Horde", -1 => "Nur für Allianz", null, "Allianz", "Horde", "Beide"), 'si' => array(1 => "Allianz", -1 => "Nur für Allianz", 2 => "Horde", -2 => "Nur für Horde", 3 => "Beide"),
'resistances' => array(null, 'Heiligwiderstand', 'Feuerwiderstand', 'Naturwiderstand', 'Frostwiderstand', 'Schattenwiderstand', 'Arkanwiderstand'), 'resistances' => array(null, 'Heiligwiderstand', 'Feuerwiderstand', 'Naturwiderstand', 'Frostwiderstand', 'Schattenwiderstand', 'Arkanwiderstand'),
'sc' => array("Körperlich", "Heilig", "Feuer", "Natur", "Frost", "Schatten", "Arkan"), 'sc' => array("Körperlich", "Heilig", "Feuer", "Natur", "Frost", "Schatten", "Arkan"),
'dt' => array(null, "Magie", "Fluch", "Krankheit", "Gift", "Verstohlenheit", "Unsichtbarkeit", null, null, "Wut"), 'dt' => array(null, "Magie", "Fluch", "Krankheit", "Gift", "Verstohlenheit", "Unsichtbarkeit", null, null, "Wut"),
@@ -256,19 +259,13 @@ $lang = array(
'editAccount' => "Benutze die folgenden Formulare um deine Account-Informationen zu aktualisieren", 'editAccount' => "Benutze die folgenden Formulare um deine Account-Informationen zu aktualisieren",
'publicDesc' => "Öffentliche Beschreibung", 'publicDesc' => "Öffentliche Beschreibung",
'viewPubDesc' => "Die Beschreibung in deinem <a href=\"?user=%s\">öffentlichen Profil</a> ansehen", 'viewPubDesc' => "Die Beschreibung in deinem <a href=\"?user=%s\">öffentlichen Profil</a> ansehen",
// Please_enter_your_confirm_password = Bitte das Passwort bestätigen
// Please_enter_your_username = Gib bitte deinen Benutzernamen ein
// Please_enter_your_password = Gib bitte dein Kennwort ein
// Remember_me_on_this_computer = Auf diesem Computer merken
),
'event' => array(
'category' => array("Nicht kategorisiert", "Feiertage", "Wiederkehrend", "Spieler vs. Spieler")
), ),
'npc' => array( 'npc' => array(
'rank' => ['Normal', 'Elite', 'Rar Elite', 'Boss', 'Rar'] 'rank' => ['Normal', 'Elite', 'Rar Elite', 'Boss', 'Rar']
), ),
'event' => array(
'category' => array("Nicht kategorisiert", "Feiertage", "Wiederkehrend", "Spieler vs. Spieler")
),
'achievement' => array( 'achievement' => array(
'criteria' => "Kriterien", 'criteria' => "Kriterien",
'points' => "Punkte", 'points' => "Punkte",
@@ -376,6 +373,8 @@ $lang = array(
'_interval' => "Interval", '_interval' => "Interval",
'_inSlot' => "im Platz", '_inSlot' => "im Platz",
'ppm' => "%s Auslösungen pro Minute",
'procChance' => "Procchance",
'starter' => "Basiszauber", 'starter' => "Basiszauber",
'trainingCost' => "Trainingskosten", 'trainingCost' => "Trainingskosten",
'remaining' => "Noch %s", 'remaining' => "Noch %s",
@@ -393,6 +392,11 @@ $lang = array(
'pctCostOf' => "vom Grund%s", 'pctCostOf' => "vom Grund%s",
'costPerSec' => ", plus %s pro Sekunde", 'costPerSec' => ", plus %s pro Sekunde",
'costPerLevel' => ", plus %s pro Stufe", 'costPerLevel' => ", plus %s pro Stufe",
'_scaling' => "Skalierung",
'scaling' => array(
'directSP' => "+%.2f%% der Zaubermacht zum direkten Effekt", 'directAP' => "+%.2f%% der Angriffskraft zum direkten Effekt",
'dotSP' => "+%.2f%% der Zaubermacht pro Tick", 'dotAP' => "+%.2f%% der Angriffskraft pro Tick"
),
'powerRunes' => ["Frost", "Unheilig", "Blut", "Tod"], 'powerRunes' => ["Frost", "Unheilig", "Blut", "Tod"],
'powerTypes' => array( 'powerTypes' => array(
-2 => "Gesundheit", -1 => null, "Mana", "Wut", "Fokus", "Energie", "Zufriedenheit", "Runen", "Runenmacht", -2 => "Gesundheit", -1 => null, "Mana", "Wut", "Fokus", "Energie", "Zufriedenheit", "Runen", "Runenmacht",
@@ -447,27 +451,48 @@ $lang = array(
"Siegel" "Siegel"
), ),
'weaponSubClass' => array( 'weaponSubClass' => array(
"Einhandäxte", "Zweihandäxte", "Bögen", "Schusswaffen", "Einhandstreitkolben", 15 => "Dolche", 0 => "Einhandäxte", 7 => "Einhandschwerter", 4 => "Einhandstreitkolben", 13 => "Faustwaffen",
"Zweihandstreitkolben", "Stangenwaffen", "Einhandschwerter", "Zweihandschwerter", null, 6 => "Stangenwaffen", 10 => "Stäbe", 1 => "Zweihandäxte", 8 => "Zweihandschwerter", 5 => "Zweihandstreitkolben",
"Stäbe", null, null, "Faustwaffen", "Diverse", 18 => "Armbrüste", 2 => "Bögen", 3 => "Schusswaffen", 16 => "Wurfwaffen", 19 => "Zauberstäbe",
"Dolche", "Wurfwaffe", null, "Armbrüste", "Zauberstäbe", 20 => "Angelruten", 14 => "Diverse"
"Angelruten"
), ),
'subClassMasks' => array( 'subClassMasks' => array(
0x02A5F3 => 'Nahkampfwaffe', 0x0060 => 'Schild', 0x04000C => 'Distanzwaffe', 0xA091 => 'Einhandnahkampfwaffe' 0x02A5F3 => 'Nahkampfwaffe', 0x0060 => 'Schild', 0x04000C => 'Distanzwaffe', 0xA091 => 'Einhandnahkampfwaffe'
), ),
'traitShort' => array( 'traitShort' => array(
'atkpwr' => "Angr", 'rgdatkpwr' => "DAngr", 'splpwr' => "ZMacht", 'atkpwr' => "Angr", 'rgdatkpwr' => "DAngr", 'splpwr' => "ZMacht", 'arcsplpwr' => "ArkM", 'firsplpwr' => "FeuM",
'arcsplpwr' => "ArkM", 'firsplpwr' => "FeuM", 'frosplpwr' => "FroM", 'frosplpwr' => "FroM", 'holsplpwr' => "HeiM", 'natsplpwr' => "NatM", 'shasplpwr' => "SchM", 'splheal' => "Heil"
'holsplpwr' => "HeiM", 'natsplpwr' => "NatM", 'shasplpwr' => "SchM", ),
'splheal' => "Heil" 'spellModOp' => array(
) "Schaden", "Dauer", "Bedrohung", "Effekt 1", "Aufladungen",
"Reichweite", "Radius", "kritische Trefferchance", "Alle Effekte", "Zauberzeitverlust",
"Zauberzeit", "Abklingzeit", "Effekt 2", "Ignoriere Rüstung", "Kosten",
"Kritischer Bonusschaden", "Chance auf Fehlschlag", "Sprung-Ziele", "Chance auf Auslösung", "Intervall",
"Multiplikator (Schaden)", "Globale Abklingzeit", "Schaden über Zeit", "Effekt 3", "Multiplikator (Bonus)",
null, "Auslösungen pro Minute", "Multiplikator (Betrag)", "Widerstand gegen Bannung", "kritischer Bonusschaden2",
"Kostenrückerstattung bei Fehlschlag"
),
'combatRating' => array(
"Waffenfertigkeit", "Verteidigungsfertigkeit", "Ausweichen", "Parrieren", "Blocken",
"Nahkampftrefferchance", "Fernkampftrefferchance", "Zaubertrefferchance", "kritische Nahkampftrefferchance", "kritische Fernkampftrefferchance",
"kritische Zaubertrefferchance", "erhaltene Nahkampftreffer", "erhaltene Fernkampftreffer", "erhaltene Zaubertreffer", "erhaltene kritische Nahkampftreffer",
"erhaltene kritische Fernkampftreffer", "erhaltene kritische Zaubertreffer", "Nahkampftempo", "Fernkampftempo", "Zaubertempo",
"Waffenfertigkeit Haupthand", "Waffenfertigkeit Nebenhand", "Waffenfertigkeit Fernkampf", "Waffenkunde", "Rüstungsdurchschlag"
),
'lockType' => array(
null, "Schlossknacken", "Kräuterkunde", "Bergbau", "Falle entschärfen",
"Öffnen", "Schatz (DND)", "Verkalkte Elfenedelsteine (DND)", "Schließen", "Falle scharf machen",
"Schnell öffnen", "Schnell schließen", "Offenes Tüfteln", "Offenes Knien", "Offenes Angreifen",
"Gahz'ridian (DND)", "Schlagen", "PvP öffnen", "PvP schließen", "Angeln",
"Inschriftenkunde", "Vom Fahrzeug öffnen"
),
'stealthType' => ["Allgemein", "Falle"],
'invisibilityType' => ["Allgemein", 3 => "Falle", 6 => "Trunkenheit"]
), ),
'item' => array( 'item' => array(
'armor' => "%s Rüstung", 'armor' => "%s Rüstung",
'block' => "%s Blocken", 'block' => "%s Blocken",
'charges' => "Aufladungen", 'charges' => "Aufladungen",
'expend' => "Verbrauchen",
'locked' => "Verschlossen", 'locked' => "Verschlossen",
'ratingString' => "%s&nbsp;@&nbsp;L%s", 'ratingString' => "%s&nbsp;@&nbsp;L%s",
'heroic' => "Heroisch", 'heroic' => "Heroisch",
@@ -480,7 +505,6 @@ $lang = array(
'addsDps' => "Adds", 'addsDps' => "Adds",
'fap' => "Angriffskraft in Tiergestalt", 'fap' => "Angriffskraft in Tiergestalt",
'durability' => "Haltbarkeit", 'durability' => "Haltbarkeit",
'duration' => "Dauer",
'realTime' => "Realzeit", 'realTime' => "Realzeit",
'conjured' => "Herbeigezauberter Gegenstand", 'conjured' => "Herbeigezauberter Gegenstand",
'damagePhys' => "%s Schaden", 'damagePhys' => "%s Schaden",
@@ -490,13 +514,40 @@ $lang = array(
'itemLevel' => "Gegenstandsstufe", 'itemLevel' => "Gegenstandsstufe",
'randEnchant' => "&lt;Zufällige Verzauberung&gt", 'randEnchant' => "&lt;Zufällige Verzauberung&gt",
'readClick' => "&lt;Zum Lesen rechtsklicken&gt", 'readClick' => "&lt;Zum Lesen rechtsklicken&gt",
'openClick' => "&lt;Zum Öffnen rechtsklicken&gt",
'set' => "Set", 'set' => "Set",
'partyLoot' => "Gruppenloot",
'smartLoot' => "Intelligente Beuteverteilung",
'indestructible'=> "Kann nicht zerstört werden",
'deprecated' => "Nicht benutzt",
'useInShape' => "Benutzbar in Gestaltwandlung",
'useInArena' => "Benutzbar in Arenen",
'refundable' => "Rückzahlbar",
'noNeedRoll' => "Kann nicht für Bedarf werfen",
'atKeyring' => "Passt in den Schlüsselbund",
'worth' => "Wert",
'consumable' => "Verbrauchbar",
'nonConsumable' => "Nicht verbrauchbar",
'accountWide' => "Accountweit",
'millable' => "Mahlbar",
'noEquipCD' => "Keine Anlegabklingzeit",
'prospectable' => "Sondierbar",
'disenchantable'=> "Kann entzaubert werden",
'cantDisenchant'=> "Kann nicht entzaubert werden",
'repairCost' => "Reparaturkosten",
'tool' => "Werkzeug",
'cost' => "Preis",
'content' => "Inhalt",
'_transfer' => 'Dieser Gegenstand wird mit <a href="?item=%d" class="q%d icontiny tinyspecial" style="background-image: url(images/icons/tiny/%s.gif)">%s</a> vertauscht, wenn Ihr zur <span class="%s-icon">%s</span> wechselt.',
'_unavailable' => "Dieser Gegenstand ist nicht für Spieler verfügbar.",
'_rndEnchants' => "Zufällige Verzauberungen", '_rndEnchants' => "Zufällige Verzauberungen",
'_chance' => "(Chance von %s%%)", '_chance' => "(Chance von %s%%)",
'_reqLevel' => "Mindeststufe", '_reqLevel' => "Mindeststufe",
'slot' => "Platz", 'slot' => "Platz",
'_quality' => "Qualität", '_quality' => "Qualität",
'usableBy' => "Benutzbar von", 'usableBy' => "Benutzbar von",
'buyout' => "Sofortkaufpreis",
'each' => "Stück",
'gems' => "Edelsteine", 'gems' => "Edelsteine",
'socketBonus' => "Sockelbonus", 'socketBonus' => "Sockelbonus",
'socket' => array ( 'socket' => array (
@@ -516,16 +567,16 @@ $lang = array(
), ),
'bagFamily' => array( 'bagFamily' => array(
"Tasche", "Köcher", "Munitionsbeutel", "Seelentasche", "Lederertasche", "Tasche", "Köcher", "Munitionsbeutel", "Seelentasche", "Lederertasche",
"Schreibertasche", "Kräutertasche", "Verzauberertasche", "Ingenieurstasche", "Schlüssel", "Schreibertasche", "Kräutertasche", "Verzauberertasche", "Ingenieurstasche", null, /*Schlüssel*/
"Edelsteintasche", "Bergbautasche" "Edelsteintasche", "Bergbautasche"
), ),
'inventoryType' => array( 'inventoryType' => array(
null, "Kopf", "Hals", "Schulter", "Hemd", null, "Kopf", "Hals", "Schulter", "Hemd",
"Brust", "Taille", "Beine", "Füße", "Handgelenke", "Brust", "Taille", "Beine", "Füße", "Handgelenke",
"Hände", "Finger", "Schmuck", "Einhändig", "Schildhand", "Hände", "Finger", "Schmuck", "Einhändig", "Schildhand", /*Schild*/
"Distanz", "Rücken", "Zweihändig", "Tasche", "Wappenrock", "Distanz", "Rücken", "Zweihändig", "Tasche", "Wappenrock",
"Brust", "Waffenhand", "Schildhand", "In der Schildhand geführt", "Projektil", null, /*Robe*/ "Waffenhand", "Schildhand", "In der Schildhand geführt", "Projektil",
"Wurfwaffe", "Distanzwaffe", "Köcher", "Relikt" "Wurfwaffe", null, /*Ranged2*/ "Köcher", "Relikt"
), ),
'armorSubClass' => array( 'armorSubClass' => array(
"Sonstiges", "Stoff", "Leder", "Schwere Rüstung", "Platte", "Sonstiges", "Stoff", "Leder", "Schwere Rüstung", "Platte",
@@ -543,9 +594,50 @@ $lang = array(
null, null, "Pfeil", "Kugel", null null, null, "Pfeil", "Kugel", null
), ),
'elixirType' => [null, "Kampf", "Wächter"], 'elixirType' => [null, "Kampf", "Wächter"],
'cat' => array( 'cat' => array(
// locale_dede.js zerparsen.. 2 => "Waffen", // self::$spell['weaponSubClass']
), 4 => array("Rüstung", array(
1 => "Stoffrüstung", 2 => "Lederrüstung", 3 => "Schwere Rüstung", 4 => "Plattenrüstung", 6 => "Schilde", 7 => "Buchbände",
8 => "Götzen", 9 => "Totems", 10 => "Siegel", -6 => "Umhänge", -5 => "Nebenhandgegenstände", -8 => "Hemden",
-7 => "Wappenröcke", -3 => "Amulette", -2 => "Ringe", -4 => "Schmuckstücke", 0 => "Verschiedenes (Rüstung)",
)),
1 => array("Behälter", array(
0 => "Taschen", 3 => "Verzauberertaschen", 4 => "Ingenieurstaschen", 5 => "Edelsteintaschen", 2 => "Kräutertaschen", 8 => "Schreibertaschen",
7 => "Lederertaschen", 6 => "Bergbautaschen", 1 => "Seelentaschen"
)),
0 => array("Verbrauchbar", array(
-3 => "Gegenstandsverzauberungen (Temporäre)", 6 => "Gegenstandsverzauberungen (Dauerhafte)", 2 => ["Elixire", [1 => "Kampfelixire", 2 => "Wächterelixire"]],
1 => "Tränke", 4 => "Schriftrollen", 7 => "Verbände", 0 => "Verbrauchbar", 3 => "Fläschchen", 5 => "Essen & Trinken",
8 => "Andere (Verbrauchbar)"
)),
16 => array("Glyphen", array(
1 => "Kriegerglyphen", 2 => "Paladinglyphen", 3 => "Jägerglyphen", 4 => "Schurkenglyphen", 5 => "Priesterglyphen", 6 => "Todesritterglyphen",
7 => "Schamanenglyphen", 8 => "Magierglyphen", 9 => "Hexenmeisterglyphen", 11 => "Druidenglyphen"
)),
7 => array("Handwerkswaren", array(
14 => "Rüstungsverzauberungen", 5 => "Stoff", 3 => "Geräte", 10 => "Elementar", 12 => "Verzauberkunst", 2 => "Sprengstoff",
9 => "Kräuter", 4 => "Juwelenschleifen", 6 => "Leder", 13 => "Materialien", 8 => "Fleisch", 7 => "Metall & Stein",
1 => "Teile", 15 => "Waffenverzauberungen", 11 => "Andere (Handwerkswaren)"
)),
6 => ["Projektile", [ 2 => "Pfeile", 3 => "Kugeln" ]],
11 => ["Köcher", [ 2 => "Köcher", 3 => "Munitionsbeutel" ]],
9 => array("Rezepte", array(
0 => "Bücher", 6 => "Alchemierezepte", 4 => "Schmiedekunstpläne", 5 => "Kochrezepte", 8 => "Verzauberkunstformeln", 3 => "Ingenieurschemata",
7 => "Erste Hilfe-Bücher", 9 => "Angelbücher", 11 => "Inschriftenkundetechniken",10 => "Juwelenschleifen-Vorlagen",1 => "Lederverarbeitungsmuster",12 => "Bergbauleitfäden",
2 => "Schneidereimuster"
)),
3 => array("Edelsteine", array(
6 => "Meta-Edelsteine", 0 => "Rote Edelsteine", 1 => "Blaue Edelsteine", 2 => "Gelbe Edelsteine", 3 => "Violette Edelsteine", 4 => "Grüne Edelsteine",
5 => "Orange Edelsteine", 8 => "Prismatische Edelsteine", 7 => "Einfache Edelsteine"
)),
15 => array("Verschiedenes", array(
-2 => "Rüstungsmarken", 3 => "Feiertag", 0 => "Plunder", 1 => "Reagenzien", 5 => "Reittiere", -7 => "Flugtiere",
2 => "Haustiere", 4 => "Andere (Verschiedenes)"
)),
10 => "Währung",
12 => "Quest",
13 => "schlüssel",
),
'statType' => array( 'statType' => array(
"Erhöht Euer Mana um %d.", "Erhöht Euer Mana um %d.",
"Erhöht Eure Gesundheit um %d.", "Erhöht Eure Gesundheit um %d.",

View File

@@ -12,7 +12,7 @@ $lang = array(
'ab' => ["yr", "mo", "wk", "day", "hr", "min", "sec", "ms"] 'ab' => ["yr", "mo", "wk", "day", "hr", "min", "sec", "ms"]
), ),
'main' => array( 'main' => array(
'help' => "Help", 'help' => "Help",
'name' => "name", 'name' => "name",
'link' => "Link", 'link' => "Link",
'signIn' => "Sign in", 'signIn' => "Sign in",
@@ -41,14 +41,6 @@ $lang = array(
'forum' => "Forum", 'forum' => "Forum",
'n_a' => "n/a", 'n_a' => "n/a",
// err_title = An error in AoWoW
// un_err = Enter your username
// pwd_err = Enter your password
// signin_msg = Enter your game account
// c_pwd = Repeat password
// facts = Facts
// This_Object_cant_be_found = Object map not available, Object may be spawned via a script
// filter // filter
'extSearch' => "Extended search", 'extSearch' => "Extended search",
'addFilter' => "Add another Filter", 'addFilter' => "Add another Filter",
@@ -66,13 +58,13 @@ $lang = array(
'disabled' => "Disabled", 'disabled' => "Disabled",
'disabledHint' => "Cannot be attained or completed", 'disabledHint' => "Cannot be attained or completed",
'serverside' => "Serverside", 'serverside' => "Serverside",
'serversideHint' => "These informations are not in the Client and have been provided by sniffing and/or guessing.", 'serversideHint'=> "These informations are not in the Client and have been provided by sniffing and/or guessing.",
// red buttons // red buttons
'links' => "Links", 'links' => "Links",
'compare' => "Compare", 'compare' => "Compare",
'view3D' => "View in 3D", 'view3D' => "View in 3D",
'findUpgrades' => "Find upgrades...", 'findUpgrades' => "Find upgrades...",
// misc Tools // misc Tools
'subscribe' => "Subscribe", 'subscribe' => "Subscribe",
@@ -86,15 +78,15 @@ $lang = array(
'englishOnly' => "This page is only available in <b>English</b>.", 'englishOnly' => "This page is only available in <b>English</b>.",
// calculators // calculators
'preset' => "Preset", 'preset' => "Preset",
'addWeight' => "Add another weight", 'addWeight' => "Add another weight",
'createWS' => "Create a weight scale", 'createWS' => "Create a weight scale",
'jcGemsOnly' => "Include <span%s>JC-only</span> gems", 'jcGemsOnly' => "Include <span%s>JC-only</span> gems",
'cappedHint' => 'Tip: <a href="javascript:;" onclick="fi_presetDetails();">Remove</a> weights for capped statistics such as Hit rating.', 'cappedHint' => 'Tip: <a href="javascript:;" onclick="fi_presetDetails();">Remove</a> weights for capped statistics such as Hit rating.',
'groupBy' => "Group By", 'groupBy' => "Group By",
'gb' => array( 'gb' => array(
['None', 'none'], ['Slot', 'slot'], ['Level', 'level'], ['Source', 'source'] ['None', 'none'], ['Slot', 'slot'], ['Level', 'level'], ['Source', 'source']
), ),
'compareTool' => "Item Comparison Tool", 'compareTool' => "Item Comparison Tool",
'talentCalc' => "Talent Calculator", 'talentCalc' => "Talent Calculator",
'petCalc' => "Hunter Pet Calculator", 'petCalc' => "Hunter Pet Calculator",
@@ -117,7 +109,7 @@ $lang = array(
'difficulty' => "Difficulty", 'difficulty' => "Difficulty",
'dispelType' => "Dispel type", 'dispelType' => "Dispel type",
'duration' => "Duration", 'duration' => "Duration",
'gameObject' => "objects", 'gameObject' => "object",
'gameObjects' => "Objects", 'gameObjects' => "Objects",
'glyphType' => "Glyph type", 'glyphType' => "Glyph type",
'race' => "race", 'race' => "race",
@@ -130,12 +122,14 @@ $lang = array(
'faction' => "faction", 'faction' => "faction",
'factions' => "Factions", 'factions' => "Factions",
'cooldown' => "%s cooldown", 'cooldown' => "%s cooldown",
'item' => "item", 'item' => "item",
'items' => "Items", 'items' => "Items",
'itemset' => "item Set", 'itemset' => "item Set",
'itemsets' => "Item Sets", 'itemsets' => "Item Sets",
'mechanic' => "Mechanic", 'mechanic' => "Mechanic",
'mechAbbr' => "Mech.", 'mechAbbr' => "Mech.",
'npc' => "NPC",
'npcs' => "NPCs",
'pet' => "Pet", 'pet' => "Pet",
'pets' => "Hunter Pets", 'pets' => "Hunter Pets",
'profile' => "profile", 'profile' => "profile",
@@ -164,6 +158,7 @@ $lang = array(
'specs' => "Specs", 'specs' => "Specs",
'_roles' => ['Healer', 'Melee DPS', 'Ranged DPS', 'Tank'], '_roles' => ['Healer', 'Melee DPS', 'Ranged DPS', 'Tank'],
'modes' => ['Normal / Normal 10', 'Heroic / Normal 25', 'Heroic 10', 'Heroic 25'],
'expansions' => array("Classic", "The Burning Crusade", "Wrath of the Lich King"), 'expansions' => array("Classic", "The Burning Crusade", "Wrath of the Lich King"),
'stats' => array("Strength", "Agility", "Stamina", "Intellect", "Spirit"), 'stats' => array("Strength", "Agility", "Stamina", "Intellect", "Spirit"),
'languages' => array( 'languages' => array(
@@ -251,12 +246,6 @@ $lang = array(
'editAccount' => "Simply use the forms below to update your account information", 'editAccount' => "Simply use the forms below to update your account information",
'publicDesc' => "Public Description", 'publicDesc' => "Public Description",
'viewPubDesc' => "View your Public Description in your <a href=\"?user=%s\">Profile Page</a>", 'viewPubDesc' => "View your Public Description in your <a href=\"?user=%s\">Profile Page</a>",
// Please_enter_your_username = Enter your username (account)
// Please_enter_your_password = Enter your password
// Sign_in_to_your_Game_Account = Enter your game account:
// Please_enter_your_confirm_password = Please enter your confirm password
), ),
'npc' => array( 'npc' => array(
'rank' => ['Normal', 'Elite', 'Rare Elite', 'Boss', 'Rare'] 'rank' => ['Normal', 'Elite', 'Rare Elite', 'Boss', 'Rare']
@@ -371,6 +360,8 @@ $lang = array(
'_interval' => "Interval", '_interval' => "Interval",
'_inSlot' => "in slot", '_inSlot' => "in slot",
'ppm' => "%s procs per minute",
'procChance' => "Proc chance",
'starter' => "Starter spell", 'starter' => "Starter spell",
'trainingCost' => "Training cost", 'trainingCost' => "Training cost",
'remaining' => "%s remaining", 'remaining' => "%s remaining",
@@ -388,6 +379,11 @@ $lang = array(
'pctCostOf' => "of base %s", 'pctCostOf' => "of base %s",
'costPerSec' => ", plus %s per sec", 'costPerSec' => ", plus %s per sec",
'costPerLevel' => ", plus %s per level", 'costPerLevel' => ", plus %s per level",
'_scaling' => "Scaling",
'scaling' => array(
'directSP' => "+%.2f%% of spell power to direct component", 'directAP' => "+%.2f%% of attack power to direct component",
'dotSP' => "+%.2f%% of spell power per tick", 'dotAP' => "+%.2f%% of attack power per tick"
),
'powerRunes' => ["Frost", "Unholy", "Blood", "Death"], 'powerRunes' => ["Frost", "Unholy", "Blood", "Death"],
'powerTypes' => array( 'powerTypes' => array(
-2 => "Health", -1 => null, "Mana", "Rage", "Focus", "Energy", "Happiness", "Rune", "Runic Power", -2 => "Health", -1 => null, "Mana", "Rage", "Focus", "Energy", "Happiness", "Rune", "Runic Power",
@@ -441,7 +437,7 @@ $lang = array(
null, "Shields", "Librams", "Idols", "Totems", null, "Shields", "Librams", "Idols", "Totems",
"Sigils" "Sigils"
), ),
'weaponSubClass' => array( 'weaponSubClass' => array( // ordered by content firts, then alphabeticaly
15 => "Daggers", 13 => "Fist Weapons", 0 => "One-Handed Axes", 4 => "One-Handed Maces", 7 => "One-Handed Swords", 15 => "Daggers", 13 => "Fist Weapons", 0 => "One-Handed Axes", 4 => "One-Handed Maces", 7 => "One-Handed Swords",
6 => "Polearms", 10 => "Staves", 1 => "Two-Handed Axes", 5 => "Two-Handed Maces", 8 => "Two-Handed Swords", 6 => "Polearms", 10 => "Staves", 1 => "Two-Handed Axes", 5 => "Two-Handed Maces", 8 => "Two-Handed Swords",
2 => "Bows", 18 => "Crossbows", 3 => "Guns", 16 => "Thrown", 19 => "Wands", 2 => "Bows", 18 => "Crossbows", 3 => "Guns", 16 => "Thrown", 19 => "Wands",
@@ -451,17 +447,39 @@ $lang = array(
0x02A5F3 => 'Melee Weapon', 0x0060 => 'Shield', 0x04000C => 'Ranged Weapon', 0xA091 => 'One-Handed Melee Weapon' 0x02A5F3 => 'Melee Weapon', 0x0060 => 'Shield', 0x04000C => 'Ranged Weapon', 0xA091 => 'One-Handed Melee Weapon'
), ),
'traitShort' => array( 'traitShort' => array(
'atkpwr' => "AP", 'rgdatkpwr' => "RAP", 'splpwr' => "SP", 'atkpwr' => "AP", 'rgdatkpwr' => "RAP", 'splpwr' => "SP", 'arcsplpwr' => "ArcP", 'firsplpwr' => "FireP",
'arcsplpwr' => "ArcP", 'firsplpwr' => "FireP", 'frosplpwr' => "FroP", 'frosplpwr' => "FroP", 'holsplpwr' => "HolP", 'natsplpwr' => "NatP", 'shasplpwr' => "ShaP", 'splheal' => "Heal"
'holsplpwr' => "HolP", 'natsplpwr' => "NatP", 'shasplpwr' => "ShaP", ),
'splheal' => "Heal" 'spellModOp' => array(
) "Damage", "Duration", "Thread", "Effect 1", "Charges",
"Range", "Radius", "Critical Hit Chance", "All Effects", "Casting Time loss",
"Casting Time", "Cooldown", "Effect 2", "Ignore Armor", "Cost",
"Critical Damage Bonus", "Chance to Fail", "Jump Targets", "Proc Chance", "Intervall",
"Multiplier (Damage)", "Global Cooldown", "Damage over Time", "Effect 3", "Multiplier (Bonus)",
null, "Procs per Minute", "Multiplier (Value)", "Chance to Resist Dispel", "Critical Damage Bonus2",
"Refund Cost on Fail"
),
'combatRating' => array(
"Weapon Skill", "Defense Skill", "Dodge", "Parry", "Block",
"Melee Hit Chance", "Ranged Hit Chance", "Spell Hit Chance", "Casting Melee Hit Chance", "Casting Ranged Hit Chance",
"Casting Spell Hit Chance", "Taken Melee Hit Chance", "Taken Ranged Hit Chance", "Taken Spell Hit Chance", "Taken Critical Melee Hit Chance",
"Taken Critical Ranged Hit Chance", "Taken Critical Spell Hit Chance", "Melee Haste", "Ranged Haste", "Spell Haste",
"Mainhand Weapon Skill", "Offhand Weapon Skill", "Ranged Weapon Skill", "Expertise", "Armor Penetration"
),
'lockType' => array(
null, "Lockpicking", "Herbalism", "Mining", "Disarm Trap",
"Open", "Treasure (DND)", "Calcified Elven Gems (DND)", "Close", "Arm Trap",
"Quick Open", "Quick Close", "Open Tinkering", "Open Kneeling", "Open Attacking",
"Gahz'ridian (DND)", "Blasting", "PvP Open", "PvP Close", "Fishing (DND)",
"Inscription", "Open From Vehicle"
),
'stealthType' => ["General", "Trap"],
'invisibilityType' => ["General", 3 => "Trap", 6 => "Drunk"]
), ),
'item' => array( 'item' => array(
'armor' => "%s Armor", 'armor' => "%s Armor",
'block' => "%s Block", 'block' => "%s Block",
'charges' => "Charges", 'charges' => "Charges",
'expend' => "expendable",
'locked' => "Locked", 'locked' => "Locked",
'ratingString' => "%s&nbsp;@&nbsp;L%s", 'ratingString' => "%s&nbsp;@&nbsp;L%s",
'heroic' => "Heroic", 'heroic' => "Heroic",
@@ -483,41 +501,41 @@ $lang = array(
'itemLevel' => "Item Level", 'itemLevel' => "Item Level",
'randEnchant' => "&lt;Random enchantment&gt", 'randEnchant' => "&lt;Random enchantment&gt",
'readClick' => "&lt;Right Click To Read&gt", 'readClick' => "&lt;Right Click To Read&gt",
'openClick' => "&lt;Right Click To Open&gt", 'openClick' => "&lt;Right Click To Open&gt",
'set' => "Set", 'set' => "Set",
'partyLoot' => "Party loot", 'partyLoot' => "Party loot",
'smartLoot' => "Smart loot", 'smartLoot' => "Smart loot",
'indestructible' => "Cannot be destroyed", 'indestructible'=> "Cannot be destroyed",
'deprecated' => "Deprecated", 'deprecated' => "Deprecated",
'useInShape' => "Usable when shapeshifted", 'useInShape' => "Usable when shapeshifted",
'useInArena' => "Usable in arenas", 'useInArena' => "Usable in arenas",
'refundable' => "Refundable", 'refundable' => "Refundable",
'noNeedRoll' => "Cannot roll Need", 'noNeedRoll' => "Cannot roll Need",
'atKeyring' => "Can be placed in the keyring", 'atKeyring' => "Can be placed in the keyring",
'worth' => "Worth", 'worth' => "Worth",
'consumable' => "Consumable", 'consumable' => "Consumable",
'nonConsumable' => "Non-consumable", 'nonConsumable' => "Non-consumable",
'accountWide' => "Account-wide", 'accountWide' => "Account-wide",
'millable' => "Millable", 'millable' => "Millable",
'noEquipCD' => "No equip cooldown", 'noEquipCD' => "No equip cooldown",
'prospectable' => "Prospectable", 'prospectable' => "Prospectable",
'disenchantable' => "Disenchantable", 'disenchantable'=> "Disenchantable",
'cantDisenchant' => "Cannot be disenchanted", 'cantDisenchant'=> "Cannot be disenchanted",
'repairCost' => "Repair cost", 'repairCost' => "Repair cost",
'tool' => "Tool", 'tool' => "Tool",
'cost' => "Cost", 'cost' => "Cost",
'content' => "Content", 'content' => "Content",
'_transfer' => 'This item will be converted to <a href="?item=%d" class="q%d icontiny tinyspecial" style="background-image: url(images/icons/tiny/%s.gif)">%s</a> if you transfer to <span class="%s-icon">%s</span>.', '_transfer' => 'This item will be converted to <a href="?item=%d" class="q%d icontiny tinyspecial" style="background-image: url(images/icons/tiny/%s.gif)">%s</a> if you transfer to <span class="%s-icon">%s</span>.',
'_unavailable' => "This item is not available to players.", '_unavailable' => "This item is not available to players.",
'_rndEnchants' => "Random Enchantments", '_rndEnchants' => "Random Enchantments",
'_chance' => "(%s%% chance)", '_chance' => "(%s%% chance)",
'_reqLevel' => "Required level", '_reqLevel' => "Required level",
'slot' => "Slot", 'slot' => "Slot",
'_quality' => "Quality", '_quality' => "Quality",
'usableBy' => "Usable by", 'usableBy' => "Usable by",
'buyout' => "Buyout price", 'buyout' => "Buyout price",
'each' => "each", 'each' => "each",
'gems' => "Gems", 'gems' => "Gems",
'socketBonus' => "Socket Bonus", 'socketBonus' => "Socket Bonus",
'socket' => array( 'socket' => array(
"Meta Socket", "Red Socket", "Yellow Socket", "Blue Socket", -1 => "Prismatic Socket" "Meta Socket", "Red Socket", "Yellow Socket", "Blue Socket", -1 => "Prismatic Socket"
@@ -552,7 +570,7 @@ $lang = array(
null, "Shield", "Libram", "Idol", "Totem", null, "Shield", "Libram", "Idol", "Totem",
"Sigil" "Sigil"
), ),
'weaponSubClass' => array( 'weaponSubClass'=> array(
"Axe", "Axe", "Bow", "Gun", "Mace", "Axe", "Axe", "Bow", "Gun", "Mace",
"Mace", "Polearm", "Sword", "Sword", null, "Mace", "Polearm", "Sword", "Sword", null,
"Staff", null, null, "Fist Weapon", "Miscellaneous", "Staff", null, null, "Fist Weapon", "Miscellaneous",
@@ -562,8 +580,8 @@ $lang = array(
'projectileSubClass' => array( 'projectileSubClass' => array(
null, null, "Arrow", "Bullet", null null, null, "Arrow", "Bullet", null
), ),
'elixirType' => [null, "Battle", "Guardian"], 'elixirType' => [null, "Battle", "Guardian"],
'cat' => array( 'cat' => array( // ordered by content firts, then alphabeticaly
2 => "Weapons", // self::$spell['weaponSubClass'] 2 => "Weapons", // self::$spell['weaponSubClass']
4 => array("Armor", array( 4 => array("Armor", array(
1 => "Cloth Armor", 2 => "Leather Armor", 3 => "Mail Armor", 4 => "Plate Armor", 6 => "Shields", 7 => "Librams", 1 => "Cloth Armor", 2 => "Leather Armor", 3 => "Mail Armor", 4 => "Plate Armor", 6 => "Shields", 7 => "Librams",
@@ -575,8 +593,9 @@ $lang = array(
7 => "Leatherworking Bags", 6 => "Mining Bags", 1 => "Soul Bags" 7 => "Leatherworking Bags", 6 => "Mining Bags", 1 => "Soul Bags"
)), )),
0 => array("Consumables", array( 0 => array("Consumables", array(
7 => "Bandages", 0 => "Consumables", 2 => "Elixirs", 3 => "Flasks", 5 => "Food & Drinks", 6 => "Item Enhancements (Permanent)", -3 => "Item Enhancements (Temporary)", 6 => "Item Enhancements (Permanent)", 2 => ["Elixirs", [1 => "Battle Elixirs", 2 => "Guardian Elixirs"]],
-3 => "Item Enhancements (Temporary)", 1 => "Potions", 4 => "Scrolls", 8 => "Other (Consumables)" 1 => "Potions", 4 => "Scrolls", 7 => "Bandages", 0 => "Consumables", 3 => "Flasks", 5 => "Food & Drinks",
8 => "Other (Consumables)"
)), )),
16 => array("Glyphs", array( 16 => array("Glyphs", array(
1 => "Warrior Glyphs", 2 => "Paladin Glyphs", 3 => "Hunter Glyphs", 4 => "Rogue Glyphs", 5 => "Priest Glyphs", 6 => "Death Knight Glyphs", 1 => "Warrior Glyphs", 2 => "Paladin Glyphs", 3 => "Hunter Glyphs", 4 => "Rogue Glyphs", 5 => "Priest Glyphs", 6 => "Death Knight Glyphs",

View File

@@ -133,6 +133,8 @@ $lang = array(
'itemsets' => "Conjuntos de objetos", 'itemsets' => "Conjuntos de objetos",
'mechanic' => "Mecanica", 'mechanic' => "Mecanica",
'mechAbbr' => "Mec.", 'mechAbbr' => "Mec.",
'npc' => "PNJ",
'npcs' => "PNJs",
'pet' => "Mascota", 'pet' => "Mascota",
'pets' => "Mascotas de cazador", 'pets' => "Mascotas de cazador",
'profile' => "", 'profile' => "",
@@ -161,6 +163,7 @@ $lang = array(
'specs' => "Especializaciones", 'specs' => "Especializaciones",
'_roles' => ['Sanador', 'DPS cuerpo', 'DPS a distancia', 'Tanque'], '_roles' => ['Sanador', 'DPS cuerpo', 'DPS a distancia', 'Tanque'],
'modes' => ['Normal / Normal 10', 'Heroico / Normal 25', 'Heróico 10', 'Heróico 25'],
'expansions' => array("World of Warcraft", "The Burning Crusade", "Wrath of the Lich King"), 'expansions' => array("World of Warcraft", "The Burning Crusade", "Wrath of the Lich King"),
'stats' => array("Fuerza", "Agilidad", "Aguante", "Intelecto", "Espíritu"), 'stats' => array("Fuerza", "Agilidad", "Aguante", "Intelecto", "Espíritu"),
'languages' => array( 'languages' => array(
@@ -168,7 +171,7 @@ $lang = array(
11 => "Dracónico", 12 => "Kalimag", 13 => "Gnomótico", 14 => "Trol", 33 => "Viscerálico", 35 => "Draenei", 36 => "Zombie", 37 => "Binario gnomo", 38 => "Binario goblin" 11 => "Dracónico", 12 => "Kalimag", 13 => "Gnomótico", 14 => "Trol", 33 => "Viscerálico", 35 => "Draenei", 36 => "Zombie", 37 => "Binario gnomo", 38 => "Binario goblin"
), ),
'gl' => array(null, "Sublime", "Menor"), 'gl' => array(null, "Sublime", "Menor"),
'si' => array(-2 => "Horda solamente", -1 => "Alianza solamente", null, "Alianza", "Horda", "Ambos"), 'si' => array(1 => "Alianza", -1 => "Alianza solamente", 2 => "Horda", -2 => "Horda solamente", 3 => "Ambos"),
'resistances' => array(null, 'Resistencia a lo Sagrado', 'v', 'Resistencia a la Naturaleza', 'Resistencia a la Escarcha', 'Resistencia a las Sombras', 'Resistencia a lo Arcano'), 'resistances' => array(null, 'Resistencia a lo Sagrado', 'v', 'Resistencia a la Naturaleza', 'Resistencia a la Escarcha', 'Resistencia a las Sombras', 'Resistencia a lo Arcano'),
'sc' => array("Física", "Sagrado", "Fuego", "Naturaleza", "Escarcha", "Sombras", "Arcano"), 'sc' => array("Física", "Sagrado", "Fuego", "Naturaleza", "Escarcha", "Sombras", "Arcano"),
'dt' => array(null, "Magia", "Maldición", "Enfermedad", "Veneno", "Sigilo", "Invisibilidad", null, null, "Enfurecer"), 'dt' => array(null, "Magia", "Maldición", "Enfermedad", "Veneno", "Sigilo", "Invisibilidad", null, null, "Enfurecer"),
@@ -195,7 +198,6 @@ $lang = array(
"Alimaña", "Mecánico", "Sin especificar", "Tótem", "Mascota mansa", "Nube de gas" "Alimaña", "Mecánico", "Sin especificar", "Tótem", "Mascota mansa", "Nube de gas"
), ),
'fa' => array( 'fa' => array(
1 => "Lobo", 2 => "Felino", 3 => "Araña", 4 => "Oso", 5 => "Jabalí", 6 => "Crocolisco", 7 => "Carroñero", 8 => "Cangrejo", 1 => "Lobo", 2 => "Felino", 3 => "Araña", 4 => "Oso", 5 => "Jabalí", 6 => "Crocolisco", 7 => "Carroñero", 8 => "Cangrejo",
9 => "Gorila", 11 => "Raptor", 12 => "Zancaalta", 20 => "Escórpido", 21 => "Tortuga", 24 => "Murciélago", 25 => "Hiena", 26 => "Ave rapaz", 9 => "Gorila", 11 => "Raptor", 12 => "Zancaalta", 20 => "Escórpido", 21 => "Tortuga", 24 => "Murciélago", 25 => "Hiena", 26 => "Ave rapaz",
27 => "Serpiente alada", 30 => "Dracohalcón", 31 => "Devastador", 32 => "Acechador deformado",33 => "Esporiélago", 34 => "Raya abisal", 35 => "Serpiente", 37 => "Palomilla", 27 => "Serpiente alada", 30 => "Dracohalcón", 31 => "Devastador", 32 => "Acechador deformado",33 => "Esporiélago", 34 => "Raya abisal", 35 => "Serpiente", 37 => "Palomilla",
@@ -216,12 +218,12 @@ $lang = array(
'goForum' => "Feedback <a href=\"?forums&board=1\">forum</a>", 'goForum' => "Feedback <a href=\"?forums&board=1\">forum</a>",
), ),
'account' => [], 'account' => [],
'event' => array(
'category' => array("Sin categoría", "Vacacionales", "Periódicos", "Jugador contra Jugador")
),
'npc' => array( 'npc' => array(
'rank' => ['Normal', 'Élite', 'Élite raro', 'Jefe', 'Raro'] 'rank' => ['Normal', 'Élite', 'Élite raro', 'Jefe', 'Raro']
), ),
'event' => array(
'category' => array("Sin categoría", "Vacacionales", "Periódicos", "Jugador contra Jugador")
),
'achievement' => array( 'achievement' => array(
'criteria' => "Requisitos", 'criteria' => "Requisitos",
'points' => "Puntos", 'points' => "Puntos",
@@ -284,7 +286,7 @@ $lang = array(
), ),
'pet' => array( 'pet' => array(
'exotic' => "Exótica", 'exotic' => "Exótica",
"cat" => ["Ferocidad", "Tenacidad", "Astucia"] 'cat' => ["Ferocidad", "Tenacidad", "Astucia"]
), ),
'itemset' => array( 'itemset' => array(
'_desc' => "<b>%s</b> es el <b>%s</b>. Contiene %s piezas.", '_desc' => "<b>%s</b> es el <b>%s</b>. Contiene %s piezas.",
@@ -329,6 +331,8 @@ $lang = array(
'_interval' => "Intérvalo", '_interval' => "Intérvalo",
'_inSlot' => "en la casilla", '_inSlot' => "en la casilla",
'ppm' => "%s procs por minuto",
'procChance' => "Probabilidad de que accione",
'starter' => "Hechizo inicial", 'starter' => "Hechizo inicial",
'trainingCost' => "Costo de enseñanza", 'trainingCost' => "Costo de enseñanza",
'remaining' => "%s restantes", 'remaining' => "%s restantes",
@@ -346,6 +350,11 @@ $lang = array(
'pctCostOf' => "del %s base", 'pctCostOf' => "del %s base",
'costPerSec' => ", mas %s por segundo", 'costPerSec' => ", mas %s por segundo",
'costPerLevel' => ", mas %s por nivel", 'costPerLevel' => ", mas %s por nivel",
'_scaling' => "[Scaling]",
'scaling' => array(
'directSP' => "[+%.2f%% of spell power to direct component]", 'directAP' => "[+%.2f%% of attack power to direct component]",
'dotSP' => "[+%.2f%% of spell power per tick]", 'dotAP' => "[+%.2f%% of attack power per tick]"
),
'powerRunes' => ["Escarcha", "Profano", "Sangre", "Muerte"], 'powerRunes' => ["Escarcha", "Profano", "Sangre", "Muerte"],
'powerTypes' => array( // heat => spell 70174 'powerTypes' => array( // heat => spell 70174
-2 => "Salud", -1 => null, "Maná", "Ira", "Enfoque", "Energía", "[Happiness]", "Runa", "Poder rúnico", -2 => "Salud", -1 => null, "Maná", "Ira", "Enfoque", "Energía", "[Happiness]", "Runa", "Poder rúnico",
@@ -395,32 +404,53 @@ $lang = array(
0 => "Sin categoría" 0 => "Sin categoría"
), ),
'armorSubClass' => array( 'armorSubClass' => array(
"Misceláneo", "Armaduras de tela","Armaduras de cuero", "Armaduras de malla", "Armaduras de placas", "Misceláneo", "Armaduras de tela", "Armaduras de cuero", "Armaduras de malla", "Armaduras de placas",
null, "Escudos", "Tratados", "Ídolos", "Tótems", null, "Escudos", "Tratados", "Ídolos", "Tótems",
"Sigilos" "Sigilos"
), ),
'weaponSubClass' => array( 'weaponSubClass' => array(
"Hachas de una mano", "Hachas de dos manos","Arcos", "Armas de fuego", "Mazas de una mano", 13 => "Armas de puño", 15 => "Dagas", 0 => "Hachas de una mano", 7 => "Espadas de una mano", 4 => "Mazas de una mano",
"Mazas de dos manos", "Armas de asta", "Espadas de una mano", "Espadas de dos manos", null, 6 => "Armas de asta", 10 => "Bastones", 1 => "Hachas de dos manos", 8 => "Espadas de dos manos", 5 => "Mazas de dos manos",
"Bastones", null, null, "Armas de puño", "Misceláneo", 2 => "Arcos", 3 => "Armas de fuego", 16 => "Arrojadizas", 18 => "Ballestas", 19 => "Varitas",
"Dagas", "Arrojadizas", null, "Ballestas", "Varitas", 20 => "Cañas de pescar", 14 => "Misceláneo"
"Cañas de pescar"
), ),
'subClassMasks' => array( 'subClassMasks' => array(
0x02A5F3 => 'Arma cuerpo a cuerpo', 0x0060 => 'Escudo', 0x04000C => 'Arma de ataque a distancia', 0xA091 => 'Arma cuerpo a cuerpo 1M' 0x02A5F3 => 'Arma cuerpo a cuerpo', 0x0060 => 'Escudo', 0x04000C => 'Arma de ataque a distancia',0xA091 => 'Arma cuerpo a cuerpo 1M'
), ),
'traitShort' => array( 'traitShort' => array(
'atkpwr' => "PA", 'rgdatkpwr' => "PA", 'splpwr' => "PH", 'atkpwr' => "PA", 'rgdatkpwr' => "PA", 'splpwr' => "PH", 'arcsplpwr' => "PArc", 'firsplpwr' => "PFue",
'arcsplpwr' => "PArc", 'firsplpwr' => "PFue", 'frosplpwr' => "PEsc", 'frosplpwr' => "PEsc", 'holsplpwr' => "PSag", 'natsplpwr' => "PNat", 'shasplpwr' => "PSom", 'splheal' => "Sana"
'holsplpwr' => "PSag", 'natsplpwr' => "PNat", 'shasplpwr' => "PSom", ),
'splheal' => "Sana" 'spellModOp' => array(
) 'DAMAGE', 'DURATION', 'THREAT', 'EFFECT1', 'CHARGES',
'RANGE', 'RADIUS', 'CRITICAL_CHANCE', 'ALL_EFFECTS', 'NOT_LOSE_CASTING_TIME',
'CASTING_TIME', 'COOLDOWN', 'EFFECT2', 'IGNORE_ARMOR', 'COST',
'CRIT_DAMAGE_BONUS', 'RESIST_MISS_CHANCE', 'JUMP_TARGETS', 'CHANCE_OF_SUCCESS', 'ACTIVATION_TIME',
'DAMAGE_MULTIPLIER', 'GLOBAL_COOLDOWN', 'DOT', 'EFFECT3', 'BONUS_MULTIPLIER',
null, 'PROC_PER_MINUTE', 'VALUE_MULTIPLIER', 'RESIST_DISPEL_CHANCE', 'CRIT_DAMAGE_BONUS_2',
'SPELL_COST_REFUND_ON_FAIL'
),
'combatRating' => array(
'WEAPON_SKILL', 'DEFENSE_SKILL', 'DODGE', 'PARRY', 'BLOCK',
'HIT_MELEE', 'HIT_RANGED', 'HIT_SPELL', 'CRIT_MELEE', 'CRIT_RANGED',
'CRIT_SPELL', 'HIT_TAKEN_MELEE', 'HIT_TAKEN_RANGED', 'HIT_TAKEN_SPELL', 'CRIT_TAKEN_MELEE',
'CRIT_TAKEN_RANGED', 'CRIT_TAKEN_SPELL', 'HASTE_MELEE', 'HASTE_RANGED', 'HASTE_SPELL',
'WEAPON_SKILL_MAINHAND', 'WEAPON_SKILL_OFFHAND', 'WEAPON_SKILL_RANGED', 'EXPERTISE', 'ARMOR_PENETRATION'
),
'lockType' => array(
null, "Forzar cerradura", "Herboristería", "Minería", "Desactivar trampa",
"Abrir", "Tesoro (DND)", "Gemas cálcicas elfas (DND)", "Cerrar", "Activar trampa",
"Apertura rápida", "Cerrado rápido", "Abrir ajustando", "Abrir de rodillas", "Abrir atacando",
"Gahz'ridian (DND)", "Reventar", "Apertura JcJ", "Cierre JcJ", "Pescar",
"Inscripción", "Abrir desde vehículo"
),
'stealthType' => ['GENERAL', 'TRAP'],
'invisibilityType' => ['GENERAL', 3 => 'TRAP', 6 => 'DRUNK']
), ),
'item' => array( 'item' => array(
'armor' => "%s armadura", 'armor' => "%s armadura",
'block' => "%s bloqueo", 'block' => "%s bloqueo",
'charges' => "cargas", 'charges' => "cargas",
'expend' => "[expendable]", // drop this shit
'locked' => "Cerrado", 'locked' => "Cerrado",
'ratingString' => "%s&nbsp;@&nbsp;L%s", 'ratingString' => "%s&nbsp;@&nbsp;L%s",
'heroic' => "Heroico", 'heroic' => "Heroico",
@@ -433,7 +463,6 @@ $lang = array(
'addsDps' => "Añade", 'addsDps' => "Añade",
'fap' => "poder de ataque feral", 'fap' => "poder de ataque feral",
'durability' => "Durabilidad", 'durability' => "Durabilidad",
'duration' => "Duración",
'realTime' => "tiempo real", 'realTime' => "tiempo real",
'conjured' => "Objeto mágico", 'conjured' => "Objeto mágico",
'damagePhys' => "%s Daño", 'damagePhys' => "%s Daño",
@@ -443,17 +472,44 @@ $lang = array(
'itemLevel' => "Nivel de objeto", 'itemLevel' => "Nivel de objeto",
'randEnchant' => "&lt;Encantamiento aleatorio&gt", 'randEnchant' => "&lt;Encantamiento aleatorio&gt",
'readClick' => "&lt;Click derecho para leer&gt", 'readClick' => "&lt;Click derecho para leer&gt",
'openClick' => "&lt;Click derecho para abrir&gt",
'set' => "Conjunto", 'set' => "Conjunto",
'partyLoot' => "Despojo de grupo",
'smartLoot' => "Botín inteligente",
'indestructible'=> "No puede ser destruido",
'deprecated' => "Depreciado",
'useInShape' => "Se puede usar con cambio de forma",
'useInArena' => "Se puede usar en arenas",
'refundable' => "Se puede devolver",
'noNeedRoll' => "No se puede hacer una tirada por Necesidad",
'atKeyring' => "Se puede poner en el llavero",
'worth' => "Valor",
'consumable' => "Consumible",
'nonConsumable' => "No consumible",
'accountWide' => "Ligado a la cuenta",
'millable' => "Se puede moler",
'noEquipCD' => "No tiene tiempo de reutilización al equipar",
'prospectable' => "Prospectable",
'disenchantable'=> "Desencantable",
'cantDisenchant'=> "No se puede desencantar",
'repairCost' => "Coste de reparación",
'tool' => "Herramienta",
'cost' => "Coste",
'content' => "Contenido",
'_transfer' => 'Este objeto será convertido a <a href="?item=%d" class="q%d icontiny tinyspecial" style="background-image: url(images/icons/tiny/%s.gif)">%s</a> si lo transfieres a la <span class="%s-icon">%s</span>.',
'_unavailable' => "Este objeto no está disponible para los jugadores.",
'_rndEnchants' => "Encantamientos aleatorios", '_rndEnchants' => "Encantamientos aleatorios",
'_chance' => "(probabilidad %s%%)", '_chance' => "(probabilidad %s%%)",
'_reqLevel' => "Nivel requerido", '_reqLevel' => "Nivel requerido",
'slot' => "Casilla", 'slot' => "Casilla",
'_quality' => "Calidad", '_quality' => "Calidad",
'usableBy' => "Usable por", 'usableBy' => "Usable por",
'buyout' => "Precio de venta en subasta",
'each' => "cada uno",
'gems' => "Gemas", 'gems' => "Gemas",
'socketBonus' => "Bono de ranura", 'socketBonus' => "Bono de ranura",
'socket' => array( 'socket' => array(
"Ranura meta", "Ranura roja", "Ranura amarilla", "Ranura azul", -1 => "Ranura prismática " "Ranura meta", "Ranura roja", "Ranura amarilla", "Ranura azul", -1 => "Ranura prismática"
), ),
'quality' => array ( 'quality' => array (
"Pobre", "Común", "Poco Común", "Raro", "Pobre", "Común", "Poco Común", "Raro",
@@ -467,18 +523,18 @@ $lang = array(
"Se liga a la cuenta", "Se liga al recogerlo", "Se liga al equiparlo", "Se liga a la cuenta", "Se liga al recogerlo", "Se liga al equiparlo",
"Se liga al usarlo", "Objeto de misión", "Objeto de misión" "Se liga al usarlo", "Objeto de misión", "Objeto de misión"
), ),
"bagFamily" => array( 'bagFamily' => array(
"Bolsa", "Carcaj", "Bolsa de municiones", "Bolsa de almas", "Bolsa de peletería", "Bolsa", "Carcaj", "Bolsa de municiones", "Bolsa de almas", "Bolsa de peletería",
"Bolsa de inscripción", "Bolsa de hierbas", "Bolsa de encantamiento", "Bolsa de ingeniería", "Llave", "Bolsa de inscripción", "Bolsa de hierbas", "Bolsa de encantamiento", "Bolsa de ingeniería", null, /*Llave*/
"Bolsa de gemas", "Bolsa de minería" "Bolsa de gemas", "Bolsa de minería"
), ),
'inventoryType' => array( 'inventoryType' => array(
null, "Cabeza", "Cuello", "Hombro", "Camisa", null, "Cabeza", "Cuello", "Hombro", "Camisa",
"Pecho", "Cintura", "Piernas", "Pies", "Muñeca", "Pecho", "Cintura", "Piernas", "Pies", "Muñeca",
"Manos", "Dedo", "Abalorio", "Una mano", "Escudo", "Manos", "Dedo", "Abalorio", "Una mano", "Mano izquierda", /*Escudo*/
"A distancia", "Espalda", "Dos manos", "Bolsa", "Tabardo", "A distancia", "Espalda", "Dos manos", "Bolsa", "Tabardo",
"Pecho", "Mano derecha", "Mano izquierda", "Sostener con la mano izquierda", "Proyectiles", null, /*Robe*/ "Mano derecha", "Mano izquierda", "Sostener con la mano izquierda", "Proyectiles",
"Arrojadiza", "A distancia", "Carcaj", "Reliquia" "Arrojadiza", null, /*Ranged2*/ "Carcaj", "Reliquia"
), ),
'armorSubClass' => array( 'armorSubClass' => array(
"Misceláneo", "Tela", "Cuero", "Malla", "Placas", "Misceláneo", "Tela", "Cuero", "Malla", "Placas",
@@ -496,8 +552,50 @@ $lang = array(
null, null, "Flecha", "Bala", null null, null, "Flecha", "Bala", null
), ),
'elixirType' => [null, "Batalla", "Guardián"], 'elixirType' => [null, "Batalla", "Guardián"],
'cat' => array( 'cat' => array( // ordered by content firts, then alphabeticaly
), 2 => "Weapons", // self::$spell['weaponSubClass']
4 => array("Armor", array(
1 => "Cloth Armor", 2 => "Leather Armor", 3 => "Mail Armor", 4 => "Plate Armor", 6 => "Shields", 7 => "Librams",
8 => "Idols", 9 => "Totems", 10 => "Sigils", -6 => "Cloaks", -5 => "Off-hand Frills", -8 => "Shirts",
-7 => "Tabards", -3 => "Amulets", -2 => "Rings", -4 => "Trinkets", 0 => "Miscellaneous (Armor)",
)),
1 => array("Containers", array(
0 => "Bags", 3 => "Enchanting Bags", 4 => "Engineering Bags", 5 => "Gem Bags", 2 => "Herb Bags", 8 => "Inscription Bags",
7 => "Leatherworking Bags", 6 => "Mining Bags", 1 => "Soul Bags"
)),
0 => array("Consumables", array(
-3 => "Item Enhancements (Temporary)", 6 => "Item Enhancements (Permanent)", 2 => ["Elixirs", [1 => "Battle Elixirs", 2 => "Guardian Elixirs"]],
1 => "Potions", 4 => "Scrolls", 7 => "Bandages", 0 => "Consumables", 3 => "Flasks", 5 => "Food & Drinks",
8 => "Other (Consumables)"
)),
16 => array("Glyphs", array(
1 => "Warrior Glyphs", 2 => "Paladin Glyphs", 3 => "Hunter Glyphs", 4 => "Rogue Glyphs", 5 => "Priest Glyphs", 6 => "Death Knight Glyphs",
7 => "Shaman Glyphs", 8 => "Mage Glyphs", 9 => "Warlock Glyphs", 11 => "Druid Glyphs"
)),
7 => array("Trade Goods", array(
14 => "Armor Enchantments", 5 => "Cloth", 3 => "Devices", 10 => "Elemental", 12 => "Enchanting", 2 => "Explosives",
9 => "Herbs", 4 => "Jewelcrafting", 6 => "Leather", 13 => "Materials", 8 => "Meat", 7 => "Metal & Stone",
1 => "Parts", 15 => "Weapon Enchantments", 11 => "Other (Trade Goods)"
)),
6 => ["Projectiles", [ 2 => "Arrows", 3 => "Bullets" ]],
11 => ["Quivers", [ 2 => "Quivers", 3 => "Ammo Pouches"]],
9 => array("Recipes", array(
0 => "Books", 6 => "Alchemy Recipes", 4 => "Blacksmithing Plans", 5 => "Cooking Recipes", 8 => "Enchanting Formulae", 3 => "Engineering Schematics",
7 => "First Aid Books", 9 => "Fishing Books", 11 => "Inscription Techniques", 10 => "Jewelcrafting Designs", 1 => "Leatherworking Patterns",12 => "Mining Guides",
2 => "Tailoring Patterns"
)),
3 => array("Gems", array(
6 => "Meta Gems", 0 => "Red Gems", 1 => "Blue Gems", 2 => "Yellow Gems", 3 => "Purple Gems", 4 => "Green Gems",
5 => "Orange Gems", 8 => "Prismatic Gems", 7 => "Simple Gems"
)),
15 => array("Miscellaneous", array(
-2 => "Armor Tokens", 3 => "Holiday", 0 => "Junk", 1 => "Reagents", 5 => "Mounts", -7 => "Flying Mounts",
2 => "Small Pets", 4 => "Other (Miscellaneous)"
)),
10 => "Currency",
12 => "Quest",
13 => "Keys",
),
'statType' => array( 'statType' => array(
"Aumenta tu maná %d p.", "Aumenta tu maná %d p.",
"Aumenta tu salud %d p.", "Aumenta tu salud %d p.",

View File

@@ -133,6 +133,8 @@ $lang = array(
'itemsets' => "Ensembles d'objets", 'itemsets' => "Ensembles d'objets",
'mechanic' => "Mécanique", 'mechanic' => "Mécanique",
'mechAbbr' => "Mécan.", 'mechAbbr' => "Mécan.",
'npc' => "PNJ",
'npcs' => "PNJs",
'pet' => "Familier", 'pet' => "Familier",
'pets' => "Familiers de chasseur", 'pets' => "Familiers de chasseur",
'profile' => "", 'profile' => "",
@@ -161,6 +163,7 @@ $lang = array(
'specs' => "Specialisations", 'specs' => "Specialisations",
'_roles' => ['Soigneur', 'DPS mêlée', 'DPS à distance', 'Tank'], '_roles' => ['Soigneur', 'DPS mêlée', 'DPS à distance', 'Tank'],
'modes' => ['Standard / Normal 10', 'Héroïque / Normal 25', '10 héroïque', '25 héroïque'],
'expansions' => array("Classique", "The Burning Crusade", "Wrath of the Lich King"), 'expansions' => array("Classique", "The Burning Crusade", "Wrath of the Lich King"),
'stats' => array("Force", "Agilité", "Endurance", "Intelligence", "Esprit"), 'stats' => array("Force", "Agilité", "Endurance", "Intelligence", "Esprit"),
'languages' => array( 'languages' => array(
@@ -168,7 +171,7 @@ $lang = array(
11 => "Draconique", 12 => "Kalimag", 13 => "Gnome", 14 => "Troll", 33 => "Bas-parler", 35 => "Draeneï", 36 => "Zombie", 37 => "Binaire gnome", 38 => "Binaire gobelin" 11 => "Draconique", 12 => "Kalimag", 13 => "Gnome", 14 => "Troll", 33 => "Bas-parler", 35 => "Draeneï", 36 => "Zombie", 37 => "Binaire gnome", 38 => "Binaire gobelin"
), ),
'gl' => array(null, "Majeur", "Mineur"), 'gl' => array(null, "Majeur", "Mineur"),
'si' => array(-2 => "Horde seulement", -1 => "Alliance seulement", null, "Alliance", "Horde", "Les deux"), 'si' => array(1 => "Alliance", -1 => "Alliance seulement", 2 => "Horde", -2 => "Horde seulement", 3 => "Les deux"),
'resistances' => array(null, 'Résistance au Sacré', 'Résistance au Feu', 'Résistance à la Nature', 'Résistance au Givre', 'Résistance à l\'Ombre', 'Résistance aux Arcanes'), 'resistances' => array(null, 'Résistance au Sacré', 'Résistance au Feu', 'Résistance à la Nature', 'Résistance au Givre', 'Résistance à l\'Ombre', 'Résistance aux Arcanes'),
'dt' => array(null, "Magie", "Malédiction", "Maladie", "Poison", "Camouflage", "Invisibilité", null, null, "Enrager"), 'dt' => array(null, "Magie", "Malédiction", "Maladie", "Poison", "Camouflage", "Invisibilité", null, null, "Enrager"),
'sc' => array("Physique", "Sacré", "Feu", "Nature", "Givre", "Ombre", "Arcane"), 'sc' => array("Physique", "Sacré", "Feu", "Nature", "Givre", "Ombre", "Arcane"),
@@ -215,12 +218,12 @@ $lang = array(
'goForum' => "Feedback <a href=\"?forums&board=1\">forum</a>", 'goForum' => "Feedback <a href=\"?forums&board=1\">forum</a>",
), ),
'account' => [], 'account' => [],
'event' => array(
'category' => array("Non classés", "Vacances", "Récurrent", "Joueur ctr. Joueur")
),
'npc' => array( 'npc' => array(
'rank' => ['Standard', 'Élite', 'Élite rare', 'Boss', 'Rare'] 'rank' => ['Standard', 'Élite', 'Élite rare', 'Boss', 'Rare']
), ),
'event' => array(
'category' => array("Non classés", "Vacances", "Récurrent", "Joueur ctr. Joueur")
),
'achievement' => array( 'achievement' => array(
'criteria' => "Critères", 'criteria' => "Critères",
'points' => "Points", 'points' => "Points",
@@ -283,7 +286,7 @@ $lang = array(
), ),
'pet' => array( 'pet' => array(
'exotic' => "Exotique", 'exotic' => "Exotique",
"cat" => ["Férocité", "Tenacité", "Ruse"] 'cat' => ["Férocité", "Tenacité", "Ruse"]
), ),
'itemset' => array( 'itemset' => array(
'_desc' => "<b>%s</b> est le <b>%s</b>. Il contient %s pièces.", '_desc' => "<b>%s</b> est le <b>%s</b>. Il contient %s pièces.",
@@ -328,6 +331,8 @@ $lang = array(
'_interval' => "Intervalle", '_interval' => "Intervalle",
'_inSlot' => "dans l'emplacement", '_inSlot' => "dans l'emplacement",
'ppm' => "%s déclenchements par minute",
'procChance' => "Chance",
'starter' => "Sortilège initiaux", 'starter' => "Sortilège initiaux",
'trainingCost' => "Coût d'entraînement", 'trainingCost' => "Coût d'entraînement",
'remaining' => "%s restantes", 'remaining' => "%s restantes",
@@ -345,6 +350,11 @@ $lang = array(
'pctCostOf' => "de la %s de base", 'pctCostOf' => "de la %s de base",
'costPerSec' => ", plus %s par seconde", 'costPerSec' => ", plus %s par seconde",
'costPerLevel' => ", plus %s par niveau", 'costPerLevel' => ", plus %s par niveau",
'_scaling' => "[Scaling]",
'scaling' => array(
'directSP' => "[+%.2f%% of spell power to direct component]", 'directAP' => "[+%.2f%% of attack power to direct component]",
'dotSP' => "[+%.2f%% of spell power per tick]", 'dotAP' => "[+%.2f%% of attack power per tick]"
),
'powerRunes' => ["Givre", "Impie", "Sang", "Mort"], 'powerRunes' => ["Givre", "Impie", "Sang", "Mort"],
'powerTypes' => array( 'powerTypes' => array(
-2 => "vie", -1 => null, "mana", "rage", "focus", "énergie", "[Happiness]", "[Rune]", "puissance runique", -2 => "vie", -1 => null, "mana", "rage", "focus", "énergie", "[Happiness]", "[Rune]", "puissance runique",
@@ -399,27 +409,48 @@ $lang = array(
"Cachets" "Cachets"
), ),
'weaponSubClass' => array( 'weaponSubClass' => array(
"Haches à une main", "Haches à deux mains", "Arcs", "Armes à feu", "Masses à une main", 13 => "Armes de pugilat", 15 => "Dagues", 7 => "Epées à une main", 0 => "Haches à une main", 4 => "Masses à une main",
"Masses à deux mains", "Armes d'hast", "Epées à une main", "Epées à deux mains", null, 6 => "Armes d'hast", 10 => "Bâtons", 8 => "Epées à deux mains", 1 => "Haches à deux mains", 5 => "Masses à deux mains",
"Bâtons", null, null, "Armes de pugilat", "Divers", 18 => "Arbalètes", 2 => "Arcs", 3 => "Armes à feu", 16 => "Armes de jet", 19 => "Baguettes",
"Dagues", "Armes de jet", null, "Arbalètes", "Baguettes", 20 => "Cannes à pêche", 14 => "Divers"
"Cannes à pêche"
), ),
'subClassMasks' => array( 'subClassMasks' => array(
0x02A5F3 => 'Arme de mêlée', 0x0060 => 'Bouclier', 0x04000C => 'Arme à distance', 0xA091 => 'Arme de mêlée à une main' 0x02A5F3 => 'Arme de mêlée', 0x0060 => 'Bouclier', 0x04000C => 'Arme à distance', 0xA091 => 'Arme de mêlée à une main'
), ),
'traitShort' => array( 'traitShort' => array(
'atkpwr' => "PA", 'rgdatkpwr' => "PAD", 'splpwr' => "PS", 'atkpwr' => "PA", 'rgdatkpwr' => "PAD", 'splpwr' => "PS", 'arcsplpwr' => "PArc", 'firsplpwr' => "PFeu",
'arcsplpwr' => "PArc", 'firsplpwr' => "PFeu", 'frosplpwr' => "PGiv", 'frosplpwr' => "PGiv", 'holsplpwr' => "PSac", 'natsplpwr' => "PNat", 'shasplpwr' => "POmb", 'splheal' => "Soins"
'holsplpwr' => "PSac", 'natsplpwr' => "PNat", 'shasplpwr' => "POmb", ),
'splheal' => "Soins" 'spellModOp' => array(
) 'DAMAGE', 'DURATION', 'THREAT', 'EFFECT1', 'CHARGES',
'RANGE', 'RADIUS', 'CRITICAL_CHANCE', 'ALL_EFFECTS', 'NOT_LOSE_CASTING_TIME',
'CASTING_TIME', 'COOLDOWN', 'EFFECT2', 'IGNORE_ARMOR', 'COST',
'CRIT_DAMAGE_BONUS', 'RESIST_MISS_CHANCE', 'JUMP_TARGETS', 'CHANCE_OF_SUCCESS', 'ACTIVATION_TIME',
'DAMAGE_MULTIPLIER', 'GLOBAL_COOLDOWN', 'DOT', 'EFFECT3', 'BONUS_MULTIPLIER',
null, 'PROC_PER_MINUTE', 'VALUE_MULTIPLIER', 'RESIST_DISPEL_CHANCE', 'CRIT_DAMAGE_BONUS_2',
'SPELL_COST_REFUND_ON_FAIL'
),
'combatRating' => array(
'WEAPON_SKILL', 'DEFENSE_SKILL', 'DODGE', 'PARRY', 'BLOCK',
'HIT_MELEE', 'HIT_RANGED', 'HIT_SPELL', 'CRIT_MELEE', 'CRIT_RANGED',
'CRIT_SPELL', 'HIT_TAKEN_MELEE', 'HIT_TAKEN_RANGED', 'HIT_TAKEN_SPELL', 'CRIT_TAKEN_MELEE',
'CRIT_TAKEN_RANGED', 'CRIT_TAKEN_SPELL', 'HASTE_MELEE', 'HASTE_RANGED', 'HASTE_SPELL',
'WEAPON_SKILL_MAINHAND', 'WEAPON_SKILL_OFFHAND', 'WEAPON_SKILL_RANGED', 'EXPERTISE', 'ARMOR_PENETRATION'
),
'lockType' => array(
null, "Crochetage", "Herboristerie", "Minage", "Désarmement de piège",
"Ouverture", "Trésor (DND)", "Gemmes elfiques calcifiées (DND)", "Fermeture", "Pose de piège",
"Ouverture rapide", "Fermeture rapide", "Ouverture (bricolage)", "Ouverture (à genoux)", "Ouverture (en attaquant)",
"Gahz'ridienne (DND)", "Explosif", "Ouverture JcJ", "Fermeture JcJ", "Pêche",
"Calligraphie", "Ouverture à partir d'un véhicule",
),
'stealthType' => ['GENERAL', 'TRAP'],
'invisibilityType' => ['GENERAL', 3 => 'TRAP', 6 => 'DRUNK']
), ),
'item' => array( 'item' => array(
'armor' => "Armure : %s", 'armor' => "Armure : %s",
'block' => "Bloquer : %s", 'block' => "Bloquer : %s",
'charges' => "Charges", 'charges' => "Charges",
'expend' => "expendable",
'locked' => "Verrouillé", 'locked' => "Verrouillé",
'ratingString' => "%s&nbsp;@&nbsp;L%s", 'ratingString' => "%s&nbsp;@&nbsp;L%s",
'heroic' => "Héroïque", 'heroic' => "Héroïque",
@@ -432,7 +463,6 @@ $lang = array(
'addsDps' => "Ajoute", 'addsDps' => "Ajoute",
'fap' => "puissance d'attaque en combat farouche", 'fap' => "puissance d'attaque en combat farouche",
'durability' => "Durabilité", 'durability' => "Durabilité",
'duration' => "Durée",
'realTime' => "temps réel", 'realTime' => "temps réel",
'conjured' => "Objet invoqué", 'conjured' => "Objet invoqué",
'damagePhys' => "Dégâts : %s", 'damagePhys' => "Dégâts : %s",
@@ -442,13 +472,40 @@ $lang = array(
'itemLevel' => "Niveau d'objet", 'itemLevel' => "Niveau d'objet",
'randEnchant' => "&lt;Enchantement aléatoire&gt", 'randEnchant' => "&lt;Enchantement aléatoire&gt",
'readClick' => "&lt;Clique Droit pour Lire&gt", 'readClick' => "&lt;Clique Droit pour Lire&gt",
'openClick' => "&lt;Clic Droit pour Ouvrir&gt",
'set' => "Set", 'set' => "Set",
'partyLoot' => "Butin de groupe",
'smartLoot' => "Butin intelligent",
'indestructible'=> "Ne peut être détruit",
'deprecated' => "Désuet",
'useInShape' => "Utilisable lorsque transformé",
'useInArena' => "Utilisable en Aréna",
'refundable' => "Remboursable",
'noNeedRoll' => "Ne peut pas faire un jet de Besoin",
'atKeyring' => "Va dans le trousseau de clés",
'worth' => "Vaut",
'consumable' => "Consommable",
'nonConsumable' => "Non-consommable",
'accountWide' => "Portant sur le compte",
'millable' => "Pilable",
'noEquipCD' => "Aucun temps de recharge lorsqu'équipé",
'prospectable' => "Prospectable",
'disenchantable'=> "Desencantable",
'cantDisenchant'=> "Ne peut pas être désenchanté",
'repairCost' => "Cout de réparation",
'tool' => "Outil",
'cost' => "Coût",
'content' => "Contenu",
'_transfer' => 'Cet objet sera converti en <a href="?item=%d" class="q%d icontiny tinyspecial" style="background-image: url(images/icons/tiny/%s.gif)">%s</a> si vous transférez en <span class="%s-icon">%s</span>.',
'_unavailable' => "Este objeto no está disponible para los jugadores.",
'_rndEnchants' => "Enchantements aléatoires", '_rndEnchants' => "Enchantements aléatoires",
'_chance' => "(%s%% de chance)", '_chance' => "(%s%% de chance)",
'_reqLevel' => "Niveau requis", '_reqLevel' => "Niveau requis",
'slot' => "Emplacement", 'slot' => "Emplacement",
'_quality' => "Qualité", '_quality' => "Qualité",
'usableBy' => "Utilisable par", 'usableBy' => "Utilisable par",
'buyout' => "Vente immédiate",
'each' => "chacun",
'gems' => "Gemmes", 'gems' => "Gemmes",
'socketBonus' => "Bonus de châsse", 'socketBonus' => "Bonus de châsse",
'socket' => array( 'socket' => array(
@@ -459,7 +516,7 @@ $lang = array(
"Épique", "Légendaire", "Artefact", "Héritage" "Épique", "Légendaire", "Artefact", "Héritage"
), ),
'trigger' => array ( 'trigger' => array (
"Utilise: ", "Équipé : ", "Chances quand vous touchez : ", null, null, "Utilise : ", "Équipé : ", "Chances quand vous touchez : ", null, null,
null, null null, null
), ),
'bonding' => array ( 'bonding' => array (
@@ -468,16 +525,16 @@ $lang = array(
), ),
"bagFamily" => array( "bagFamily" => array(
"Sac", "Carquois", "Giberne", "Sac d'âmes", "Sac de travailleur du cuir", "Sac", "Carquois", "Giberne", "Sac d'âmes", "Sac de travailleur du cuir",
"Sac de calligraphie", "Sac d'herbes", "Sac d'enchanteur", "Sac d'ingénieur", "Clé", "Sac de calligraphie", "Sac d'herbes", "Sac d'enchanteur", "Sac d'ingénieur", null, /*Clé*/
"Sac de gemmes", "Sac de mineur" "Sac de gemmes", "Sac de mineur"
), ),
'inventoryType' => array( 'inventoryType' => array(
null, "Tête", "Cou", "Épaules", "Chemise", null, "Tête", "Cou", "Épaules", "Chemise",
"Torse", "Taille", "Jambes", "Pieds", "Poignets", "Torse", "Taille", "Jambes", "Pieds", "Poignets",
"Mains", "Doigt", "Bijou", "À une main", "Main gauche", "Mains", "Doigt", "Bijou", "À une main", "Main gauche", /*Shield*/
"À distance", "Dos", "Deux mains", "Sac", "Tabard", "À distance", "Dos", "Deux mains", "Sac", "Tabard",
"Torse", "Main droite", "Main gauche", "Tenu en main gauche", "Projectile", null, /*Robe*/ "Main droite", "Main gauche", "Tenu en main gauche", "Projectile",
"Armes de jet", "À distance", "Carquois", "Relique" "Armes de jet", null, /*Ranged2*/ "Carquois", "Relique"
), ),
'armorSubClass' => array( 'armorSubClass' => array(
"Divers", "Armures en tissu", "Armures en cuir", "Armures en mailles", "Armures en plaques", "Divers", "Armures en tissu", "Armures en cuir", "Armures en mailles", "Armures en plaques",
@@ -496,7 +553,49 @@ $lang = array(
), ),
'elixirType' => [null, "De bataille", "De gardien"], 'elixirType' => [null, "De bataille", "De gardien"],
'cat' => array( 'cat' => array(
), 2 => "Weapons", // self::$spell['weaponSubClass']
4 => array("Armor", array(
1 => "Cloth Armor", 2 => "Leather Armor", 3 => "Mail Armor", 4 => "Plate Armor", 6 => "Shields", 7 => "Librams",
8 => "Idols", 9 => "Totems", 10 => "Sigils", -6 => "Cloaks", -5 => "Off-hand Frills", -8 => "Shirts",
-7 => "Tabards", -3 => "Amulets", -2 => "Rings", -4 => "Trinkets", 0 => "Miscellaneous (Armor)",
)),
1 => array("Containers", array(
0 => "Bags", 3 => "Enchanting Bags", 4 => "Engineering Bags", 5 => "Gem Bags", 2 => "Herb Bags", 8 => "Inscription Bags",
7 => "Leatherworking Bags", 6 => "Mining Bags", 1 => "Soul Bags"
)),
0 => array("Consumables", array(
-3 => "Item Enhancements (Temporary)", 6 => "Item Enhancements (Permanent)", 2 => ["Elixirs", [1 => "Battle Elixirs", 2 => "Guardian Elixirs"]],
1 => "Potions", 4 => "Scrolls", 7 => "Bandages", 0 => "Consumables", 3 => "Flasks", 5 => "Food & Drinks",
8 => "Other (Consumables)"
)),
16 => array("Glyphs", array(
1 => "Warrior Glyphs", 2 => "Paladin Glyphs", 3 => "Hunter Glyphs", 4 => "Rogue Glyphs", 5 => "Priest Glyphs", 6 => "Death Knight Glyphs",
7 => "Shaman Glyphs", 8 => "Mage Glyphs", 9 => "Warlock Glyphs", 11 => "Druid Glyphs"
)),
7 => array("Trade Goods", array(
14 => "Armor Enchantments", 5 => "Cloth", 3 => "Devices", 10 => "Elemental", 12 => "Enchanting", 2 => "Explosives",
9 => "Herbs", 4 => "Jewelcrafting", 6 => "Leather", 13 => "Materials", 8 => "Meat", 7 => "Metal & Stone",
1 => "Parts", 15 => "Weapon Enchantments", 11 => "Other (Trade Goods)"
)),
6 => ["Projectiles", [ 2 => "Arrows", 3 => "Bullets" ]],
11 => ["Quivers", [ 2 => "Quivers", 3 => "Ammo Pouches"]],
9 => array("Recipes", array(
0 => "Books", 6 => "Alchemy Recipes", 4 => "Blacksmithing Plans", 5 => "Cooking Recipes", 8 => "Enchanting Formulae", 3 => "Engineering Schematics",
7 => "First Aid Books", 9 => "Fishing Books", 11 => "Inscription Techniques", 10 => "Jewelcrafting Designs", 1 => "Leatherworking Patterns",12 => "Mining Guides",
2 => "Tailoring Patterns"
)),
3 => array("Gems", array(
6 => "Meta Gems", 0 => "Red Gems", 1 => "Blue Gems", 2 => "Yellow Gems", 3 => "Purple Gems", 4 => "Green Gems",
5 => "Orange Gems", 8 => "Prismatic Gems", 7 => "Simple Gems"
)),
15 => array("Miscellaneous", array(
-2 => "Armor Tokens", 3 => "Holiday", 0 => "Junk", 1 => "Reagents", 5 => "Mounts", -7 => "Flying Mounts",
2 => "Small Pets", 4 => "Other (Miscellaneous)"
)),
10 => "Currency",
12 => "Quest",
13 => "Keys",
),
'statType' => array( 'statType' => array(
"Augmente vos points de mana de %d.", "Augmente vos points de mana de %d.",
"Augmente vos points de vie de %d.", "Augmente vos points de vie de %d.",

View File

@@ -133,6 +133,8 @@ $lang = array(
'itemsets' => "Комплекты", 'itemsets' => "Комплекты",
'mechanic' => "Механика", 'mechanic' => "Механика",
'mechAbbr' => "Механика", 'mechAbbr' => "Механика",
'npc' => "НИП",
'npcs' => "НИП",
'pet' => "Питомец", 'pet' => "Питомец",
'pets' => "Питомцы охотников", 'pets' => "Питомцы охотников",
'profile' => "", 'profile' => "",
@@ -161,6 +163,7 @@ $lang = array(
'specs' => "Ветки талантов", 'specs' => "Ветки талантов",
'_roles' => ['Лекарь', 'Боец ближнего боя', 'Боец дальнего боя', 'Танк'], '_roles' => ['Лекарь', 'Боец ближнего боя', 'Боец дальнего боя', 'Танк'],
'modes' => ['Обычный / 10-норм.', 'Героический / 25-норм.', '10-героич', '25-героич'],
'expansions' => array("World of Warcraft", "The Burning Crusade", "Wrath of the Lich King"), 'expansions' => array("World of Warcraft", "The Burning Crusade", "Wrath of the Lich King"),
'stats' => array("к силе", "к ловкости", "к выносливости", "к интеллекту", "к духу"), 'stats' => array("к силе", "к ловкости", "к выносливости", "к интеллекту", "к духу"),
'languages' => array( 'languages' => array(
@@ -215,12 +218,12 @@ $lang = array(
'goForum' => "Feedback <a href=\"?forums&board=1\">forum</a>", 'goForum' => "Feedback <a href=\"?forums&board=1\">forum</a>",
), ),
'account' => [], 'account' => [],
'event' => array(
'category' => array("Разное", "Праздники", "Периодические", "PvP")
),
'npc' => array( 'npc' => array(
'rank' => ['Обычный', 'Элитный', 'Редкий элитный', 'Босс', 'Редкий'] 'rank' => ['Обычный', 'Элитный', 'Редкий элитный', 'Босс', 'Редкий']
), ),
'event' => array(
'category' => array("Разное", "Праздники", "Периодические", "PvP")
),
'achievement' => array( 'achievement' => array(
'criteria' => "Критерий", 'criteria' => "Критерий",
'points' => "Очки", 'points' => "Очки",
@@ -262,7 +265,7 @@ $lang = array(
), ),
'quest' => array( 'quest' => array(
'level' => '%s-го уровня', 'level' => '%s-го уровня',
'daily' => '', // empty on purpose .. wtf guys?! 'daily' => 'Ежедневно',
'requirements' => 'Требования' 'requirements' => 'Требования'
), ),
'title' => array( 'title' => array(
@@ -283,7 +286,7 @@ $lang = array(
), ),
'pet' => array( 'pet' => array(
'exotic' => "Экзотический", 'exotic' => "Экзотический",
"cat" => ["Свирепость", "Упорство", "Хитрость"] 'cat' => ["Свирепость", "Упорство", "Хитрость"]
), ),
'itemset' => array( 'itemset' => array(
'_desc' => "<b>%s</b> — <b>%s</b>. Он состоит из %s предметов.", '_desc' => "<b>%s</b> — <b>%s</b>. Он состоит из %s предметов.",
@@ -328,6 +331,8 @@ $lang = array(
'_interval' => "Интервал", '_interval' => "Интервал",
'_inSlot' => "в слот", '_inSlot' => "в слот",
'ppm' => "Срабатывает %s раз в минуту",
'procChance' => "Шанс срабатывания",
'starter' => "Начальное заклинание", 'starter' => "Начальное заклинание",
'trainingCost' => "Цена обучения", 'trainingCost' => "Цена обучения",
'remaining' => "Осталось: %s", 'remaining' => "Осталось: %s",
@@ -340,11 +345,16 @@ $lang = array(
'meleeRange' => "Дистанция ближнего боя", 'meleeRange' => "Дистанция ближнего боя",
'unlimRange' => "Неограниченное расстояние", 'unlimRange' => "Неограниченное расстояние",
'reagents' => "Реагент", 'reagents' => "Реагент",
'home' => "%lt;Гостиница&gt;",
'tools' => "Инструменты", 'tools' => "Инструменты",
'home' => "%lt;Гостиница&gt;",
'pctCostOf' => "от базовой %s", 'pctCostOf' => "от базовой %s",
'costPerSec' => ", плюс %s в секунду", 'costPerSec' => ", плюс %s в секунду",
'costPerLevel' => ", плюс %s за уровень", 'costPerLevel' => ", плюс %s за уровень",
'_scaling' => "[Scaling]",
'scaling' => array(
'directSP' => "[+%.2f%% of spell power to direct component]", 'directAP' => "[+%.2f%% of attack power to direct component]",
'dotSP' => "[+%.2f%% of spell power per tick]", 'dotAP' => "[+%.2f%% of attack power per tick]"
),
'powerRunes' => ["Лед", "Руна льда", "Руна крови", "Смерти"], 'powerRunes' => ["Лед", "Руна льда", "Руна крови", "Смерти"],
'powerTypes' => array( 'powerTypes' => array(
-2 => "Здоровье", -1 => null, "Мана", "Ярость", "Тонус", "Энергия", "[Happiness]", "[Rune]", "Руническая сила", -2 => "Здоровье", -1 => null, "Мана", "Ярость", "Тонус", "Энергия", "[Happiness]", "[Rune]", "Руническая сила",
@@ -399,27 +409,48 @@ $lang = array(
"Печати" "Печати"
), ),
'weaponSubClass' => array( 'weaponSubClass' => array(
"Одноручные топоры", "Двуручные топоры", "Луки", "Огнестрельное", "Одноручное дробящее", 15 => "Кинжалы", 13 => "Кистевое", 0 => "Одноручные топоры", 4 => "Одноручное дробящее", 7 => "Одноручные мечи",
"Двуручное дробящее", "Древковое", "Одноручные мечи", "Двуручные мечи", null, 6 => "Древковое", 10 => "Посохи", 1 => "Двуручные топоры", 5 => "Двуручное дробящее", 8 => "Двуручные мечи",
"Посохи", null, null, "Кистевое", "Разное", 2 => "Луки", 18 => "Арбалеты", 3 => "Огнестрельное", 16 => "Метательное", 19 => "Жезлы",
"Кинжалы", "Метательное", null, "Арбалеты", "Жезлы", 20 => "Удочки", 14 => "Разное"
"Удочки"
), ),
'subClassMasks' => array( 'subClassMasks' => array(
0x02A5F3 => 'Оружие ближнего боя', 0x0060 => 'Щит', 0x04000C => 'Оружие дальнего боя', 0xA091 => 'Одноручное оружие ближнего боя' 0x02A5F3 => 'Оружие ближнего боя', 0x0060 => 'Щит', 0x04000C => 'Оружие дальнего боя', 0xA091 => 'Одноручное оружие ближнего боя'
), ),
'traitShort' => array( 'traitShort' => array(
'atkpwr' => "СА", 'rgdatkpwr' => "Сил", 'splpwr' => "СЗ", 'atkpwr' => "СА", 'rgdatkpwr' => "Сил", 'splpwr' => "СЗ", 'arcsplpwr' => "Урон", 'firsplpwr' => "Урон",
'arcsplpwr' => "Урон", 'firsplpwr' => "Урон", 'frosplpwr' => "Урон", 'frosplpwr' => "Урон", 'holsplpwr' => "Урон", 'natsplpwr' => "Урон", 'shasplpwr' => "Урон", 'splheal' => "Исцеление"
'holsplpwr' => "Урон", 'natsplpwr' => "Урон", 'shasplpwr' => "Урон", ),
'splheal' => "Исцеление" 'spellModOp' => array(
) 'DAMAGE', 'DURATION', 'THREAT', 'EFFECT1', 'CHARGES',
'RANGE', 'RADIUS', 'CRITICAL_CHANCE', 'ALL_EFFECTS', 'NOT_LOSE_CASTING_TIME',
'CASTING_TIME', 'COOLDOWN', 'EFFECT2', 'IGNORE_ARMOR', 'COST',
'CRIT_DAMAGE_BONUS', 'RESIST_MISS_CHANCE', 'JUMP_TARGETS', 'CHANCE_OF_SUCCESS', 'ACTIVATION_TIME',
'DAMAGE_MULTIPLIER', 'GLOBAL_COOLDOWN', 'DOT', 'EFFECT3', 'BONUS_MULTIPLIER',
null, 'PROC_PER_MINUTE', 'VALUE_MULTIPLIER', 'RESIST_DISPEL_CHANCE', 'CRIT_DAMAGE_BONUS_2',
'SPELL_COST_REFUND_ON_FAIL'
),
'combatRating' => array(
'WEAPON_SKILL', 'DEFENSE_SKILL', 'DODGE', 'PARRY', 'BLOCK',
'HIT_MELEE', 'HIT_RANGED', 'HIT_SPELL', 'CRIT_MELEE', 'CRIT_RANGED',
'CRIT_SPELL', 'HIT_TAKEN_MELEE', 'HIT_TAKEN_RANGED', 'HIT_TAKEN_SPELL', 'CRIT_TAKEN_MELEE',
'CRIT_TAKEN_RANGED', 'CRIT_TAKEN_SPELL', 'HASTE_MELEE', 'HASTE_RANGED', 'HASTE_SPELL',
'WEAPON_SKILL_MAINHAND', 'WEAPON_SKILL_OFFHAND', 'WEAPON_SKILL_RANGED', 'EXPERTISE', 'ARMOR_PENETRATION'
),
'lockType' => array(
null, "Взлом замков", "Травничество", "Горное дело", "Обезвреживание ловушки",
"Открытие", "Клад (DND)", "Эльфийские самоцветы (DND)", "Закрытие", "Установка",
"Быстрое открытие", "Быстрое закрытие", "Открытие: механика", "Открытие: наклон", "Открытие: атака",
"Газ'рилльское украшение", "Взрыв", "Медленное открытие (PvP)", "Медленное закрытие (PvP)", "Рыбная ловля (DND)",
"Начертание", "Открыть на ходу"
),
'stealthType' => ['GENERAL', 'TRAP'],
'invisibilityType' => ['GENERAL', 3 => 'TRAP', 6 => 'DRUNK']
), ),
'item' => array( 'item' => array(
'armor' => "Броня: %s", 'armor' => "Броня: %s",
'block' => "Блок: %s", 'block' => "Блок: %s",
'charges' => "зарядов", 'charges' => "зарядов",
'expend' => "expendable",
'locked' => "Заперт", 'locked' => "Заперт",
'ratingString' => "%s&nbsp;@&nbsp;L%s", 'ratingString' => "%s&nbsp;@&nbsp;L%s",
'heroic' => "Героический", 'heroic' => "Героический",
@@ -432,7 +463,6 @@ $lang = array(
'addsDps' => "Добавляет", 'addsDps' => "Добавляет",
'fap' => "Сила атаки зверя", 'fap' => "Сила атаки зверя",
'durability' => "Прочность:", 'durability' => "Прочность:",
'duration' => "Длительность:",
'realTime' => "реальное время", 'realTime' => "реальное время",
'conjured' => "Сотворенный предмет", 'conjured' => "Сотворенный предмет",
'damagePhys' => "Урон: %s", 'damagePhys' => "Урон: %s",
@@ -442,13 +472,40 @@ $lang = array(
'itemLevel' => "Уровень предмета:", 'itemLevel' => "Уровень предмета:",
'randEnchant' => "&lt;Случайное зачарование&gt", 'randEnchant' => "&lt;Случайное зачарование&gt",
'readClick' => "&lt;Щелкните правой кнопкой мыши, чтобы прочитать.&gt", 'readClick' => "&lt;Щелкните правой кнопкой мыши, чтобы прочитать.&gt",
'openClick' => "&lt;Щелкните правой кнопкой мыши, чтобы открыть.&gt",
'set' => "Набор", 'set' => "Набор",
'partyLoot' => "Добыча группы",
'smartLoot' => "Умное распределение добычи",
'indestructible'=> "Невозможно выбросить",
'deprecated' => "Устарело",
'useInShape' => "Используется в формах",
'useInArena' => "Используется на аренах",
'refundable' => "Подлежит возврату",
'noNeedRoll' => 'Нельзя говорить "Мне это нужно"',
'atKeyring' => "Может быть помещён в связку для ключей",
'worth' => "Деньги",
'consumable' => "Расходуется",
'nonConsumable' => "Не расходуется",
'accountWide' => "[Account-wide]", // 22.10. hm, check with 'source' later
'millable' => "Можно растолочь",
'noEquipCD' => "Нет отката при надевании",
'prospectable' => "Просеиваемое",
'disenchantable'=> "Распыляемый",
'cantDisenchant'=> "Нельзя распылить",
'repairCost' => "Цена починки",
'tool' => "Инструмент",
'cost' => "Цена",
'content' => "Материал",
'_transfer' => 'Этот предмет превратится в <a href="?item=%d" class="q%d icontiny tinyspecial" style="background-image: url(images/icons/tiny/%s.gif)">%s</a>, если вы перейдете за <span class="%s-icon">%s</span>.',
'_unavailable' => "Этот предмет не доступен игрокам.",
'_rndEnchants' => "Случайные улучшения", '_rndEnchants' => "Случайные улучшения",
'_chance' => "(шанс %s%%)", '_chance' => "(шанс %s%%)",
'_reqLevel' => "Требуется уровень", '_reqLevel' => "Требуется уровень",
'slot' => "Слот", 'slot' => "Слот",
'_quality' => "Качество", '_quality' => "Качество",
'usableBy' => "Используется (кем)", 'usableBy' => "Используется (кем)",
'buyout' => "Цена выкупа",
'each' => "каждый",
'gems' => "Самоцветы", 'gems' => "Самоцветы",
'socketBonus' => "При соответствии цвета", 'socketBonus' => "При соответствии цвета",
'socket' => array( 'socket' => array(
@@ -459,8 +516,8 @@ $lang = array(
"Эпический", "Легендарный", "Артефакт", "Фамильная черта" "Эпический", "Легендарный", "Артефакт", "Фамильная черта"
), ),
'trigger' => array ( 'trigger' => array (
"Использование: ", "Если на персонаже: ", "Возможный эффект при попадании: ", null, "Использование: ", "Если на персонаже: ", "Возможный эффект при попадании: ",
null, null, null null, null, null, null
), ),
'bonding' => array ( 'bonding' => array (
"Привязано к учетной записи", "Персональный при поднятии", "Становится персональным при надевании", "Привязано к учетной записи", "Персональный при поднятии", "Становится персональным при надевании",
@@ -468,16 +525,16 @@ $lang = array(
), ),
"bagFamily" => array( "bagFamily" => array(
"Сумка", "Колчан", "Подсумок", "Сумка душ", "Сумка кожевника", "Сумка", "Колчан", "Подсумок", "Сумка душ", "Сумка кожевника",
"Сумка начертателя", "Сумка травника", "Сумка зачаровывателя", "Сумка инженера", "Ключ", "Сумка начертателя", "Сумка травника", "Сумка зачаровывателя", "Сумка инженера", null, /*Ключ*/
"Сумка ювелира", "Сумка шахтера" "Сумка ювелира", "Сумка шахтера"
), ),
'inventoryType' => array( 'inventoryType' => array(
null, "Голова", "Шея", "Плечи", "Рубашка", null, "Голова", "Шея", "Плечи", "Рубашка",
"Грудь", "Пояс", "Ноги", "Ступни", "Запястья", "Грудь", "Пояс", "Ноги", "Ступни", "Запястья",
"Кисти рук", "Палец", "Аксессуар", "Одноручное", "Левая рука", "Кисти рук", "Палец", "Аксессуар", "Одноручное", "Левая рука", /*Shield*/
"Дальний бой", "Спина", "Двуручное", "Сумка", "Гербовая накидка", "Дальний бой", "Спина", "Двуручное", "Сумка", "Гербовая накидка",
"Грудь", "Правая рука", "Левая рука", "Левая рука", "Боеприпасы", null, /*Грудь*/ "Правая рука", "Левая рука", "Левая рука", "Боеприпасы",
"Метательное", "Спина", "Колчан", "Реликвия" "Метательное", null, /*Спина*/ "Колчан", "Реликвия"
), ),
'armorSubClass' => array( 'armorSubClass' => array(
"Разное", "Ткань", "Кожа", "Кольчуга", "Латы", "Разное", "Ткань", "Кожа", "Кольчуга", "Латы",
@@ -495,8 +552,50 @@ $lang = array(
null, null, "Стрелы", "Пули", null null, null, "Стрелы", "Пули", null
), ),
'elixirType' => [null, "Бой", "Охранный"], 'elixirType' => [null, "Бой", "Охранный"],
'cat' => array( 'cat' => array( // should be ordered by content firts, then alphabeticaly
), 2 => "Оружие", // self::$spell['weaponSubClass']
4 => array("Броня", array(
1 => "Тканевые", 2 => "Кожаные", 3 => "Кольчужные", 4 => "Латные", 7 => "Манускрипты", 8 => "Идолы",
9 => "Тотемы", 10 => "Печати", -6 => "Плащи", -5 => "Левая рука", 6 => "Щиты", -8 => "Рубашки",
-7 => "Гербовые накидки", -3 => "Ожерелья", -2 => "Кольца", -4 => "Аксессуары", 0 => "Разное (доспехи)",
)),
1 => array("Контейнеры", array(
0 => "Сумки", 1 => "Сумки душ", 3 => "Сумки зачаровывателя", 4 => "Сумки инженера", 7 => "Сумки кожевника", 8 => "Сумки начертателя",
2 => "Сумки травника", 6 => "Сумки шахтера", 5 => "Сумки ювелира",
)),
0 => array("Расходуемые", array(
7 => "Бинты", 5 => "Еда и напитки", 1 => "Зелья", 0 => "Расходуемые", 4 => "Свитки", -3 => "Улучшения (временные)",
6 => "Улучшения (постоянные)", 3 => "Фляги", 2 => ["Эликсиры", [1 => "Боевые", 2 => "Охранные"]], 8 => "Разное (расходуемые)"
)),
16 => array("Символы", array(
1 => "Символ воина", 2 => "Символ паладина", 3 => "Символ охотника", 4 => "Символ разбойника", 5 => "Символ жреца", 6 => "Символ рыцаря смерти",
7 => "Символ шамана", 8 => "Символ мага", 9 => "Символ чернокнижника", 11 => "Символ друида"
)),
7 => array("Хозяйственные товары", array(
14 => "Улучшения брони", 5 => "Ткань", 3 => "Устройства", 10 => "Элементаль", 12 => "Наложение чар", 2 => "Взрывчатка",
9 => "Травы", 4 => "Ювелирное дело", 6 => "Кожа", 13 => "Материалы", 8 => "Мясо", 7 => "Металл и камни",
1 => "Детали", 15 => "Улучшения оружия", 11 => "Разное (хозяйственные товары)"
)),
6 => ["Боеприпасы", [ 2 => "Стрелы", 3 => "Пули" ]],
11 => ["Колчаны", [ 3 => "Подсумки", 2 => "Колчаны" ]],
9 => array("Рецепты", array(
0 => "Книги", 6 => "Рецепты алхимии", 4 => "Кузнечное дело", 5 => "Рецепты кулинарии", 8 => "Зачаровывание", 3 => "Инженерное дело",
7 => "Первая помощь", 9 => "Рыбная ловля", 11 => "Технологии Начертания", 10 => "Ювелирное дело", 1 => "Кожевничество", 12 => "Руководства по Шахтерскому делу",
2 => "Портняжное дело"
)),
3 => array("Самоцветы", array(
6 => "Особые", 0 => "Красные", 1 => "Синие", 2 => "Желтые", 3 => "Фиолетовые", 4 => "Зелёные",
5 => "Оранжевые", 8 => "Радужные", 7 => "Простые"
)),
15 => array("Разное", array(
-2 => "Фрагмент доспехов", 3 => "Праздник", 0 => "Хлам", 1 => "Реагент", 5 => "Транспорт", -7 => "Летающий транспорт",
2 => "Спутники", 4 => "Разное"
)),
10 => "Валюта",
12 => "Задание",
13 => "Ключи",
),
'statType' => array( 'statType' => array(
"Увеличение запаса маны на %d ед.", "Увеличение запаса маны на %d ед.",
"Увеличение максимального запаса здоровья на %d ед.", "Увеличение максимального запаса здоровья на %d ед.",

View File

@@ -26,16 +26,16 @@ if (!$smarty->loadCache($cacheKey, $pageData))
switch ($cat) switch ($cat)
{ {
case 0: case 0:
$condition[] = ['e.holidayId', 0]; $condition[] = ['holidayId', 0];
break; break;
case 1: case 1:
$condition[] = ['h.scheduleType', -1]; $condition[] = ['scheduleType', -1];
break; break;
case 2: case 2:
$condition[] = ['h.scheduleType', [0, 1]]; $condition[] = ['scheduleType', [0, 1]];
break; break;
case 3: case 3:
$condition[] = ['h.scheduleType', 2]; $condition[] = ['scheduleType', 2];
break; break;
} }
} }

View File

@@ -86,10 +86,10 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
$quickInfo = Lang::getInfoBoxForFlags($item->getField('cuFlags')); $quickInfo = Lang::getInfoBoxForFlags($item->getField('cuFlags'));
if ($_slot) // itemlevel if (in_array($_class, [ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, ITEM_CLASS_AMMUNITION]) || $item->getField('gemEnchantmentId')) // itemlevel
$quickInfo[] = Lang::$game['level'].Lang::$colon.$item->getField('itemLevel'); $quickInfo[] = Lang::$game['level'].Lang::$colon.$item->getField('itemLevel');
if ($_flags & ITEM_FLAG_ACCOUNTBOUND ) // account-wide if ($_flags & ITEM_FLAG_ACCOUNTBOUND) // account-wide
$quickInfo[] = Lang::$item['accountWide']; $quickInfo[] = Lang::$item['accountWide'];
if ($si = $item->json[$_id]['side']) // side if ($si = $item->json[$_id]['side']) // side
@@ -110,7 +110,7 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
if ($item->getField('spellCharges'.$i) >= 0) if ($item->getField('spellCharges'.$i) >= 0)
continue; continue;
$tt = '[tooltip=tooltip_consumedonuse]'.Lang::$item['consumable'].'[/tooltip]'; // 2:Consommable 3:Verbrauchbar 6:Consumible 8:Расходуется $tt = '[tooltip=tooltip_consumedonuse]'.Lang::$item['consumable'].'[/tooltip]';
break; break;
} }
@@ -118,14 +118,15 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
$quickInfo[] = isset($tt) ? $tt : '[tooltip=tooltip_notconsumedonuse]'.Lang::$item['nonConsumable'].'[/tooltip]'; $quickInfo[] = isset($tt) ? $tt : '[tooltip=tooltip_notconsumedonuse]'.Lang::$item['nonConsumable'].'[/tooltip]';
} }
if ($hId = $item->getField('holidayId')) // 3:Werkzeug 6:Herramienta 8:Инструмент 2:Outil if ($hId = $item->getField('holidayId'))
if ($hName = DB::Aowow()->selectRow('SELECT * FROM ?_holidays WHERE id = ?d', $hId)) if ($hName = DB::Aowow()->selectRow('SELECT * FROM ?_holidays WHERE id = ?d', $hId))
$quickInfo[] = Lang::$game['eventShort'].Lang::$colon.'[url=?event='.$hId.']'.Util::localizedString($hName, 'name').'[/url]'; $quickInfo[] = Lang::$game['eventShort'].Lang::$colon.'[url=?event='.$hId.']'.Util::localizedString($hName, 'name').'[/url]';
if ($tId = $item->getField('totemCategory')) // 3:Werkzeug 6:Herramienta 8:Инструмент 2:Outil if ($tId = $item->getField('totemCategory'))
if ($tName = DB::Aowow()->selectRow('SELECT * FROM ?_totemCategory WHERE id = ?d', $tId)) if ($tName = DB::Aowow()->selectRow('SELECT * FROM ?_totemCategory WHERE id = ?d', $tId))
$quickInfo[] = Lang::$item['tool'].Lang::$colon.'[url=?items&filter=cr=91;crs='.$tId.';crv=0]'.Util::localizedString($tName, 'name').'[/url]'; $quickInfo[] = Lang::$item['tool'].Lang::$colon.'[url=?items&filter=cr=91;crs='.$tId.';crv=0]'.Util::localizedString($tName, 'name').'[/url]';
$each = $item->getField('stackable') > 1 ? '[color=q0] ('.Lang::$item['each'].')[/color]' : null;
$cost = ''; $cost = '';
if ($_ = $item->getField('buyPrice')) if ($_ = $item->getField('buyPrice'))
$cost .= '[money='.$_.']'; $cost .= '[money='.$_.']';
@@ -135,20 +136,20 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
$cost .= '[currency='.$c.' amount='.$qty.']'; $cost .= '[currency='.$c.' amount='.$qty.']';
if ($cost) if ($cost)
$quickInfo[] = Lang::$item['cost'].Lang::$colon.$cost.'[color=q0] ('.Lang::$item['each'].')[/color]'; // 2:Coût 3:Preis 6:Coste 8:Цена $quickInfo[] = Lang::$item['cost'].Lang::$colon.$cost.$each;
if ($_ = $item->getField('repairPrice')) // 3:Reparaturkosten 8:Цена починки 2:Cout de réparation 6:Coste de reparación if ($_ = $item->getField('repairPrice'))
$quickInfo[] = Lang::$item['repairCost'].Lang::$colon.'[money='.$_.']'; $quickInfo[] = Lang::$item['repairCost'].Lang::$colon.'[money='.$_.']';
if (in_array($item->getField('bonding'), [0, 2, 3])) // avg auction buyout if (in_array($item->getField('bonding'), [0, 2, 3])) // avg auction buyout
if ($_ = Util::getBuyoutForItem($_id)) if ($_ = Util::getBuyoutForItem($_id))
$quickInfo[] = '[tooltip=tooltip_buyoutprice]'.Lang::$item['buyout.'].'[/tooltip]'.Lang::$colon.'[money='.$_.'][color=q0] ('.Lang::$item['each'].')[/color]'; $quickInfo[] = '[tooltip=tooltip_buyoutprice]'.Lang::$item['buyout.'].'[/tooltip]'.Lang::$colon.'[money='.$_.']'.$each;
if ($_flags & ITEM_FLAG_OPENABLE) // avg money contained // 2:Vaut 8:Деньги 6:Valor 3:Wert if ($_flags & ITEM_FLAG_OPENABLE) // avg money contained
if ($_ = intVal(($item->getField('minMoneyLoot') + $item->getField('maxMoneyLoot')) / 2)) if ($_ = intVal(($item->getField('minMoneyLoot') + $item->getField('maxMoneyLoot')) / 2))
$quickInfo[] = Lang::$item['worth'].Lang::$colon.'[tooltip=tooltip_avgmoneycontained][money='.$_.'][/tooltip]'; $quickInfo[] = Lang::$item['worth'].Lang::$colon.'[tooltip=tooltip_avgmoneycontained][money='.$_.'][/tooltip]';
if ($_slot) // if it goes into a slot it may be disenchanted if ($_slot && $_class != ITEM_CLASS_CONTAINER) // if it goes into a slot it may be disenchanted
{ {
if ($item->getField('disenchantId')) if ($item->getField('disenchantId'))
{ {
@@ -156,47 +157,47 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
if ($_ < 1) // these are some items, that never went live .. extremely rough emulation here if ($_ < 1) // these are some items, that never went live .. extremely rough emulation here
$_ = intVal($item->getField('itemLevel') / 7.5) * 25; $_ = intVal($item->getField('itemLevel') / 7.5) * 25;
$quickInfo[] = Lang::$item['disenchantable'].'&nbsp;([tooltip=tooltip_reqenchanting]'.$_.'[/tooltip])'; // 35002 $quickInfo[] = Lang::$item['disenchantable'].'&nbsp;([tooltip=tooltip_reqenchanting]'.$_.'[/tooltip])';
} }
else else
$quickInfo[] = Lang::$item['cantDisenchant']; // 27978 $quickInfo[] = Lang::$item['cantDisenchant'];
} }
if (($_flags & ITEM_FLAG_MILLABLE) && $item->getField('requiredSkill') == 773) if (($_flags & ITEM_FLAG_MILLABLE) && $item->getField('requiredSkill') == 773)
$quickInfo[] = Lang::$item['millable'].'&nbsp;([tooltip=tooltip_reqinscription]'.$item->getField('requiredSkillRank').'[/tooltip])'; // 8:Можно растолочь 2:Pilable 6:Se puede moler 3:Mahlbar $quickInfo[] = Lang::$item['millable'].'&nbsp;([tooltip=tooltip_reqinscription]'.$item->getField('requiredSkillRank').'[/tooltip])';
if (($_flags & ITEM_FLAG_PROSPECTABLE) && $item->getField('requiredSkill') == 755) if (($_flags & ITEM_FLAG_PROSPECTABLE) && $item->getField('requiredSkill') == 755)
$quickInfo[] = Lang::$item['prospectable'].'&nbsp;([tooltip=tooltip_reqjewelcrafting]'.$item->getField('requiredSkillRank').'[/tooltip])'; // 3:Sondierbar 8:Просеиваемое 2:Prospectable 6:Prospectable $quickInfo[] = Lang::$item['prospectable'].'&nbsp;([tooltip=tooltip_reqjewelcrafting]'.$item->getField('requiredSkillRank').'[/tooltip])';
if ($_flags & ITEM_FLAG_DEPRECATED) if ($_flags & ITEM_FLAG_DEPRECATED)
$quickInfo[] = '[tooltip=tooltip_deprecated]'.Lang::$item['deprecated'].'[/tooltip]'; // 3:Nicht benutzt 6:Depreciado 8:Устарело 2:Désuet $quickInfo[] = '[tooltip=tooltip_deprecated]'.Lang::$item['deprecated'].'[/tooltip]';
if ($_flags & ITEM_FLAG_NO_EQUIPCD) if ($_flags & ITEM_FLAG_NO_EQUIPCD)
$quickInfo[] = '[tooltip=tooltip_noequipcooldown]'.Lang::$item['noEquipCD'].'[/tooltip]'; // 3:Keine Anlegabklingzeit 6:No tiene tiempo de reutilización al equipar 8:Нет отката при надевании 2:Aucun temps de recharge lorsqu'équipé $quickInfo[] = '[tooltip=tooltip_noequipcooldown]'.Lang::$item['noEquipCD'].'[/tooltip]';
if ($_flags & ITEM_FLAG_PARTYLOOT) if ($_flags & ITEM_FLAG_PARTYLOOT)
$quickInfo[] = '[tooltip=tooltip_partyloot]'.Lang::$item['partyLoot'].'[/tooltip]'; // 3:Gruppenloot 6:Despojo de grupo 8:Добыча группы 2:Butin de groupe $quickInfo[] = '[tooltip=tooltip_partyloot]'.Lang::$item['partyLoot'].'[/tooltip]';
if ($_flags & ITEM_FLAG_REFUNDABLE) if ($_flags & ITEM_FLAG_REFUNDABLE)
$quickInfo[] = '[tooltip=tooltip_refundable]'.Lang::$item['refundable'].'[/tooltip]'; // 3:Rückzahlbar 6:Se puede devolver 8:Подлежит возврату 2:Remboursable $quickInfo[] = '[tooltip=tooltip_refundable]'.Lang::$item['refundable'].'[/tooltip]';
if ($_flags & ITEM_FLAG_SMARTLOOT) if ($_flags & ITEM_FLAG_SMARTLOOT)
$quickInfo[] = '[tooltip=tooltip_smartloot]'.Lang::$item['smartLoot'].'[/tooltip]'; // 3:Intelligente Beuteverteilung 6:Botín inteligente 8:Умное распределение добычи 2:Butin intelligent $quickInfo[] = '[tooltip=tooltip_smartloot]'.Lang::$item['smartLoot'].'[/tooltip]';
if ($_flags & ITEM_FLAG_INDESTRUCTIBLE) if ($_flags & ITEM_FLAG_INDESTRUCTIBLE)
$quickInfo[] = Lang::$item['indestructible']; // 3:Kann nicht zerstört werden 6:No puede ser destruido 8:Невозможно выбросить 2:Ne peut être détruit $quickInfo[] = Lang::$item['indestructible'];
if ($_flags & ITEM_FLAG_USABLE_ARENA) if ($_flags & ITEM_FLAG_USABLE_ARENA)
$quickInfo[] = Lang::$item['useInArena']; // 3: Benutzbar in Arenen 2:Utilisable en Aréna 6:Se puede usar en arenas 8:Используется на аренах $quickInfo[] = Lang::$item['useInArena'];
if ($_flags & ITEM_FLAG_USABLE_SHAPED) if ($_flags & ITEM_FLAG_USABLE_SHAPED)
$quickInfo[] = Lang::$item['useInShape']; // 2:Utilisable lorsque transformé 3:Benutzbar in Gestaltwandlung 6:Se puede usar con cambio de forma 8:Используется в формах $quickInfo[] = Lang::$item['useInShape'];
if ($item->getField('flagsExtra') & 0x0100) // cant roll need if ($item->getField('flagsExtra') & 0x0100) // cant roll need
$quickInfo[] = '[tooltip=tooltip_cannotrollneed]'.Lang::$item['noNeedRoll'].'[/tooltip]'; // 3:Kann nicht für Bedarf werfen 6:No se puede hacer una tirada por Necesidad 2:Ne peut pas faire un jet de Besoin 8:Нельзя говорить "Мне это нужно" $quickInfo[] = '[tooltip=tooltip_cannotrollneed]'.Lang::$item['noNeedRoll'].'[/tooltip]';
if ($item->getField('bagFamily') & 0x0100) // fits into keyring if ($item->getField('bagFamily') & 0x0100) // fits into keyring
$quickInfo[] = Lang::$item['atKeyring']; // 2:(Va dans le trousseau de clés) 8:(Может быть помещён в связку для ключей) 6:(Se puede poner en el llavero) 3:(Passt in den Schlüsselbund) $quickInfo[] = Lang::$item['atKeyring'];
/****************/ /****************/
@@ -210,13 +211,13 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
'path' => [0, 0], 'path' => [0, 0],
'title' => [$item->getField('name', true), Util::ucFirst(Lang::$game['item'])], 'title' => [$item->getField('name', true), Util::ucFirst(Lang::$game['item'])],
'pageText' => [], 'pageText' => [],
'buttons' => in_array($_class, [ITEM_CLASS_WEAPON, ITEM_CLASS_GEM, ITEM_CLASS_ARMOR]), 'buttons' => in_array($_class, [ITEM_CLASS_WEAPON, ITEM_CLASS_ARMOR]) || $item->getField('gemEnchantmentId'),
'page' => array( 'page' => array(
'color' => Util::$rarityColorStings[$item->getField('quality')], 'color' => Util::$rarityColorStings[$item->getField('quality')],
'quality' => $item->getField('quality'), 'quality' => $item->getField('quality'),
'icon' => $item->getField('iconString'), 'icon' => $item->getField('iconString'),
'name' => $item->getField('name', true), 'name' => $item->getField('name', true),
'displayId' => $item->getField('displayId'), 'displayId' => in_array($_class, [ITEM_CLASS_WEAPON, ITEM_CLASS_ARMOR]) && $item->getField('displayId') ? $item->getField('displayId') : null,
'slot' => $_slot, 'slot' => $_slot,
'stack' => $item->getField('stackable'), 'stack' => $item->getField('stackable'),
'class' => $_class 'class' => $_class
@@ -266,6 +267,22 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
{ {
uaSort($item->subItems[$_id], function($a, $b) { return strcmp($a['name'], $b['name']); }); uaSort($item->subItems[$_id], function($a, $b) { return strcmp($a['name'], $b['name']); });
$pageData['page']['subItems'] = array_values($item->subItems[$_id]); $pageData['page']['subItems'] = array_values($item->subItems[$_id]);
// merge identical stats and names for normal users (e.g. spellPower of a specific school became generel spellPower with 3.0)
if (!User::isInGroup(U_GROUP_STAFF))
{
for ($i = 1; $i < count($pageData['page']['subItems']); $i++)
{
$prev = &$pageData['page']['subItems'][$i-1];
$cur = &$pageData['page']['subItems'][$i];
if ($prev['jsonequip'] == $cur['jsonequip'] && $prev['name'] == $cur['name'])
{
$prev['chance'] += $cur['chance'];
array_splice($pageData['page']['subItems'], $i , 1);
$i = 1;
}
}
}
} }
// factionchange-equivalent // factionchange-equivalent
@@ -291,10 +308,103 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
/* Extra Tabs */ /* Extra Tabs */
/**************/ /**************/
// dropped by creature $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', [], []]
);
$data = [];
$xCols = '';
$sources = Util::getLootSource($_id);
foreach ($sources as $lootTpl => $lootData)
{
// cap fetched entries to the sql-limit to guarantee, that the highest chance items get selected first
$ids = array_slice(array_keys($lootData), 0, $AoWoWconf['sqlLimit']);
switch ($lootTpl)
{
case LOOT_CREATURE:
$srcType = new CreatureList(array(['ct.lootId', $ids]));
$srcType->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$srcData = $srcType->getListviewData();
foreach ($srcType->iterate() as $_)
$data[5][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('lootId')]);
$sourceTabs[5][3][] = 'Listview.extraCols.percent';
break;
case LOOT_PICKPOCKET:
$srcType = new CreatureList(array(['ct.pickpocketLootId', $ids]));
$srcType->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$srcData = $srcType->getListviewData();
foreach ($srcType->iterate() as $_)
$data[6][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('pickpocketLootId')]);
$sourceTabs[6][3][] = 'Listview.extraCols.percent';
break;
case LOOT_SKINNING:
$srcType = new CreatureList(array(['ct.skinLootId', $ids]));
$srcType->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$srcData = $srcType->getListviewData();
foreach ($srcType->iterate() as $curTpl)
{
if ($curTpl['type_flags'] & NPC_TYPEFLAG_HERBLOOT)
{
$data[10][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('skinLootId')]);
$sourceTabs[10][3][] = 'Listview.extraCols.percent';
}
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';
}
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';
}
}
break;
case LOOT_FISHING:
// subAreas are currently ignored
$srcType = new ZoneList(array(['id', $ids]));
$srcType->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$srcData = $srcType->getListviewData();
foreach ($srcType->iterate() as $_)
$data[12][] = array_merge($srcData[$srcType->id], $lootData[$srcType->id]);
$sourceTabs[12][3][] = 'Listview.extraCols.percent';
break;
case LOOT_GAMEOBJECT:
// GO-loot // GO-loot
// diff between gathered from / mined from / contained in // contained in GO (chest)
// mined-from (vine)
// gathered-from (herb)
// like skinning with lock-properties instead of type_flags
// foreach($rows as $row) // foreach($rows as $row)
// { // {
// // Залежи руды // // Залежи руды
@@ -307,30 +417,91 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
// else // else
// $item['containedinobject'][] = array_merge(objectinfo2($row), $drop); // $item['containedinobject'][] = array_merge(objectinfo2($row), $drop);
// } // }
break;
case LOOT_PROSPECTING:
$sourceTab = 3;
case LOOT_MILLING:
if (!isset($sourceTab))
$sourceTab = 4;
case LOOT_ITEM:
if (!isset($sourceTab))
$sourceTab = 1;
// sold by [consult itemExtendedCost] $srcType = new ItemList(array(['i.id', $ids]));
$srcType->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$srcData = $srcType->getListviewData();
// Objective of (quest) foreach ($srcType->iterate() as $_)
$data[$sourceTab][] = array_merge($srcData[$srcType->id], $lootData[$srcType->id]);
// provided for (quest) $sourceTabs[$sourceTab][3][] = 'Listview.extraCols.percent';
break;
case LOOT_DISENCHANT:
$srcType = new ItemList(array(['i.disenchantId', $ids]));
$srcType->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$srcData = $srcType->getListviewData();
// reward of (quest) foreach ($srcType->iterate() as $_)
$data[2][] = array_merge($srcData[$srcType->id], $lootData[$srcType->getField('disenchantId')]);
// reward of (quest) [from mail-loot] $sourceTabs[2][3][] = 'Listview.extraCols.percent';
break;
case LOOT_QUEST:
// merge regular quest rewards into quest_mail_loot_template results
$conditions = array(
'OR', ['qt.RewardMailTemplateId', $ids],
['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
// contained in (item) [item_loot] break;
case LOOT_SPELL:
// merge with: created by [spell]
// contains [item_loot] break;
$itemLoot = Util::handleLoot(LOOT_ITEM, $item->id, $smarty, User::isInGroup(U_GROUP_STAFF)); }
}
foreach ($sourceTabs as $k => $tab)
{
if (empty($data[$k]))
continue;
$pageData['relTabs'][] = array(
'file' => $tab[0],
'data' => $data[$k],
'params' => [
'tabs' => '$tabsRelated',
'name' => $tab[1],
'id' => $tab[2],
'extraCols' => $tab[3] ? '$['.implode(', ', array_unique($tab[3])).']' : null,
'hiddenCols' => $tab[4] ? '$['.implode(', ', array_unique($tab[4])).']' : null
]
);
}
/* 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']]
);
foreach ($sourceFor as $sf)
{
$itemLoot = Util::handleLoot($sf[0], $sf[1], $smarty, User::isInGroup(U_GROUP_STAFF));
if ($itemLoot) if ($itemLoot)
{ {
$extraCols = ['Listview.extraCols.percent'];
if (User::isInGroup(U_GROUP_STAFF)) if (User::isInGroup(U_GROUP_STAFF))
{ {
$extraCols[] = "Listview.funcBox.createSimpleCol('group', 'group', '10%', 'group')"; $sf[4][] = "Listview.funcBox.createSimpleCol('group', 'Group', '10%', 'group')";
$extraCols[] = "Listview.funcBox.createSimpleCol('mode', LANG.compose_mode, '10%', 'mode')"; $sf[4][] = "Listview.funcBox.createSimpleCol('mode', 'Mode', '10%', 'mode')";
$extraCols[] = "Listview.funcBox.createSimpleCol('reference', LANG.finpcs.seploot + ' ' + LANG.button_link, '10%', 'reference')"; $sf[4][] = "Listview.funcBox.createSimpleCol('reference', 'Reference', '10%', 'reference')";
} }
$pageData['relTabs'][] = array( $pageData['relTabs'][] = array(
@@ -338,22 +509,20 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
'data' => $itemLoot, 'data' => $itemLoot,
'params' => [ 'params' => [
'tabs' => '$tabsRelated', 'tabs' => '$tabsRelated',
'name' => '$LANG.tab_contains', 'name' => $sf[2],
'id' => 'contains', 'id' => $sf[3],
'hiddenCols' => "$['side', 'slot', 'source', 'reqlevel']", 'extraCols' => $sf[4] ? "$[".implode(', ', $sf[4])."]" : null,
'extraCols' => "$[".implode(', ', $extraCols)."]", 'hiddenCols' => $sf[5] ? "$".json_encode($sf[5]) : null
] ]
); );
} }
}
// pickpocketed from // sold by [consult itemExtendedCost]
// skinning_loot skinned from & salvaged from // Objective of (quest)
// prospecting & prospected from // provided for (quest)
// milling & milled from
// disentchanting from & to
// can be placed in // can be placed in
// if($item['BagFamily'] == 256) // if($item['BagFamily'] == 256)
@@ -364,14 +533,8 @@ if (!$smarty->loadCache($cacheKeyPage, $item))
// reagent for // reagent for
// created by [spell]
// fished in
// currency for // currency for
// [spell_loot_template] ehh...
// criteria of // criteria of
// array(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM), // array(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM),

View File

@@ -4,13 +4,6 @@ if (!defined('AOWOW_REVISION'))
die('illegal access'); die('illegal access');
/*
item upgrade search: !
<a href="javascript:;" class="button-red" onclick="this.blur(); pr_showClassPresetMenu(this, 45498, 2, 17, event);">
<em><b><i>Find upgrades...</i></b><span>Find upgrades...</span></em>
</a>
*/
$cats = Util::extractURLParams($pageParam); $cats = Util::extractURLParams($pageParam);
$path = [0, 0]; $path = [0, 0];
$title = [Lang::$game['items']]; $title = [Lang::$game['items']];
@@ -86,11 +79,7 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
if ($cats[0] !== null) if ($cats[0] !== null)
$path = array_merge($path, $cats); $path = array_merge($path, $cats);
/* // display available submenu and slot, if applicable
display available submenu and slot, if applicable
todo: 'type' gets ignored if cats[1] is set
[$strArr, $keyMask]
*/
$type = $slot = [[], null]; $type = $slot = [[], null];
if ($cats[0] === null) if ($cats[0] === null)
{ {
@@ -99,7 +88,9 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
} }
else else
{ {
if (isset($cats[1])) if (isset($cats[2]))
$catList = Lang::$item['cat'][$cats[0]][1][$cats[1]][1][$cats[2]];
else if (isset($cats[1]))
$catList = Lang::$item['cat'][$cats[0]][1][$cats[1]]; $catList = Lang::$item['cat'][$cats[0]][1][$cats[1]];
else else
$catList = Lang::$item['cat'][$cats[0]]; $catList = Lang::$item['cat'][$cats[0]];
@@ -120,7 +111,7 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
break; break;
case 2: case 2:
if (!isset($cats[1])) if (!isset($cats[1]))
$type = [Lang::$item['cat'][2][1], null]; $type = [Lang::$spell['weaponSubClass'], null];
$slot = [Lang::$item['inventoryType'], 0x262A000]; $slot = [Lang::$item['inventoryType'], 0x262A000];
asort($slot[0]); asort($slot[0]);
@@ -139,10 +130,12 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
case 16: case 16:
if (!isset($cats[2])) if (!isset($cats[2]))
$visibleCols[] = 'glyph'; $visibleCols[] = 'glyph';
case 1:
if ($cats[0] == 1)
$visibleCols[] = 'slots';
case 3: case 3:
if (!isset($cats[1])) if (!isset($cats[1]))
asort($catList[1]); asort($catList[1]);
case 1:
case 7: case 7:
case 9: case 9:
$hiddenCols[] = 'slot'; $hiddenCols[] = 'slot';
@@ -169,6 +162,16 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
/* /*
set conditions set conditions
*/ */
/*
* todo (low): this is a long term issue.
* Filter is used as a subSystem to each TypeList
* but here we would need to preemptive check for $filter['gb']
* .. bummer .. this is to be removed when the issue is _really_ solved
*/
if (preg_match('/gb\=(1|2|3)/i', $_SERVER['QUERY_STRING'], $match))
$filter['gb'] = $match[1];
$conditions[] = ['i.class', $cats[0]]; $conditions[] = ['i.class', $cats[0]];
if (isset($cats[1])) if (isset($cats[1]))
$conditions[] = ['i.subClass', $cats[1]]; $conditions[] = ['i.subClass', $cats[1]];
@@ -207,11 +210,13 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
if (!empty($filter['upg'])) if (!empty($filter['upg']))
{ {
// uogarde-item got deleted by filter // upgrade-item got deleted by filter
if (empty($pageData['data'][$filter['upg']])) if (empty($pageData['data'][$filter['upg']]))
{ {
$w = $items->filterGetForm('setWeights', true); $w = $items->filterGetForm('setWeights', true);
$upgItem = new ItemList(array(['id', $filter['upg']]), false, ['wt' => $w[0], 'wtv' => $w[1]]); $upgItem = new ItemList(array(['id', $filter['upg']]), false, ['wt' => $w[0], 'wtv' => $w[1]]);
// still it may not be found if you apply really weired filters (e.g. search for a melee item with caster-weights) .. not my fault :[
if (!$upgItem->error) if (!$upgItem->error)
{ {
$upgItem->addGlobalsToJScript($smarty); $upgItem->addGlobalsToJScript($smarty);
@@ -224,7 +229,45 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
$pageData['params']['_upgradeIds'] = "$[".$filter['upg']."]"; $pageData['params']['_upgradeIds'] = "$[".$filter['upg']."]";
} }
/*
by level: max 10 itemlevel steps (Level X) +1x Other|Autre|Anderes|Otros|Другое levels
by slot: all slots available
by source: .. well .. no
template: 'item',
id: 'one-hand',
name: 'One-Hand',
tabs: tabsGroups,
parent: 'lkljbjkb574',
hideCount: 1,
note: $WH.sprintf(LANG.lvnote_viewmoreslot, '=2', 'sl=13;ub=10;cr=161;crs=1;crv=0;gm=3;rf=1;wt=23:123:24:103:96:170;wtv=100:85:75:60:50:40;upg=104585'),
customFilter: fi_filterUpgradeListview,
_upgradeIds: [104585],
extraCols: fi_getExtraCols(fi_extraCols, 3, 1, 0),
sort: ['-score', 'name'],
computeDataFunc: fi_scoreSockets,
onBeforeCreate: fi_initWeightedListview,
onAfterCreate: fi_addUpgradeIndicator,
hiddenCols: ['type', 'source'],
data: []
template: 'item',
id: 'two-hand',
name: 'Two-Hand',
tabs: tabsGroups,
parent: 'lkljbjkb574',
hideCount: 1,
note: $WH.sprintf(LANG.lvnote_viewmoreslot, '=2', 'sl=17;ub=10;cr=161;crs=1;crv=0;gm=3;rf=1;wt=23:123:24:103:96:170;wtv=100:85:75:60:50:40;upg=104585'),
customFilter: fi_filterUpgradeListview,
_upgradeIds: [104585],
extraCols: fi_getExtraCols(fi_extraCols, 3, 1, 0),
sort: ['-score', 'name'],
computeDataFunc: fi_scoreSockets,
onBeforeCreate: fi_initWeightedListview,
onAfterCreate: fi_addUpgradeIndicator,
hiddenCols: ['type', 'source'],
data: []
*/
if (!empty($filter['fi']['extraCols'])) if (!empty($filter['fi']['extraCols']))
{ {
$gem = empty($filter['gm']) ? 0 : $filter['gm']; $gem = empty($filter['gm']) ? 0 : $filter['gm'];
@@ -278,7 +321,7 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
} }
// create note if search limit was exceeded; overwriting 'note' is intentional // create note if search limit was exceeded; overwriting 'note' is intentional
if ($items->getMatches() > $AoWoWconf['sqlLimit']) if ($items->getMatches() > $AoWoWconf['sqlLimit'] && empty($filter['upg']))
{ {
$pageData['params']['note'] = sprintf(Util::$tryFilteringString, 'LANG.lvnote_itemsfound', $items->getMatches(), $AoWoWconf['sqlLimit']); $pageData['params']['note'] = sprintf(Util::$tryFilteringString, 'LANG.lvnote_itemsfound', $items->getMatches(), $AoWoWconf['sqlLimit']);
$pageData['params']['_truncated'] = 1; $pageData['params']['_truncated'] = 1;

View File

@@ -17,24 +17,23 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
if ($iSet->error) if ($iSet->error)
$smarty->notFound(Lang::$game['itemset']); $smarty->notFound(Lang::$game['itemset']);
$ta = $iSet->getField('contentGroup'); $_ta = $iSet->getField('contentGroup');
$ty = $iSet->getField('type'); $_ty = $iSet->getField('type');
$ev = $iSet->getField('holidayId'); $_ev = $iSet->getField('holidayId');
$sk = $iSet->getField('skillId'); $_sk = $iSet->getField('skillId');
$mask = $iSet->getField('classMask'); $_cl = $iSet->getField('classMask');
$rLvl = $iSet->getField('reqLevel'); $_lvl = $iSet->getField('reqLevel');
$name = $iSet->getField('name', true); $_na = $iSet->getField('name', true);
$cnt = count($iSet->getField('pieces')); $_cnt = count($iSet->getField('pieces'));
$unav = $iSet->getField('cuFlags') & CUSTOM_UNAVAILABLE;
$infobox = []; $infobox = [];
// unavailable (todo (low): set data) // unavailable (todo (low): set data)
if ($unav) if ($iSet->getField('cuFlags') & CUSTOM_UNAVAILABLE)
$infobox[] = Lang::$main['unavailable']; $infobox[] = Lang::$main['unavailable'];
// holiday // holiday
if ($ev) if ($_ev)
$infobox[] = Lang::$game['eventShort'].Lang::$colon.'[url=?event='.$ev.']'.WorldEventList::getName($ev).'[/url]'; $infobox[] = Lang::$game['eventShort'].Lang::$colon.'[url=?event='.$_ev.']'.WorldEventList::getName($_ev).'[/url]';
// itemLevel // itemLevel
if ($min = $iSet->getField('minLevel')) if ($min = $iSet->getField('minLevel'))
@@ -49,11 +48,11 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
} }
// class // class
if ($mask) if ($_cl)
{ {
$foo = []; $foo = [];
for ($i = 0; $i < 11; $i++) for ($i = 0; $i < 11; $i++)
if ($mask & (1 << $i)) if ($_cl & (1 << $i))
$foo[] = (!fMod(count($foo) + 1, 3) ? '\n' : null) . '[class='.($i + 1).']'; $foo[] = (!fMod(count($foo) + 1, 3) ? '\n' : null) . '[class='.($i + 1).']';
$t = count($foo) == 1 ? Lang::$game['class'] : Lang::$game['classes']; $t = count($foo) == 1 ? Lang::$game['class'] : Lang::$game['classes'];
@@ -61,16 +60,16 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
} }
// required level // required level
if ($rLvl) if ($_lvl)
$infobox[] = sprintf(Lang::$game['reqLevel'], $rLvl); $infobox[] = sprintf(Lang::$game['reqLevel'], $_lvl);
// type // type
if ($ty) if ($_ty)
$infobox[] = Lang::$game['type'].lang::$colon.Lang::$itemset['types'][$ty]; $infobox[] = Lang::$game['type'].lang::$colon.Lang::$itemset['types'][$_ty];
// tag // tag
if ($ta) if ($_ta)
$infobox[] = Lang::$itemset['_tag'].Lang::$colon.'[url=?itemsets&filter=ta='.$ta.']'.Lang::$itemset['notes'][$ta].'[/url]'; $infobox[] = Lang::$itemset['_tag'].Lang::$colon.'[url=?itemsets&filter=ta='.$_ta.']'.Lang::$itemset['notes'][$_ta].'[/url]';
// pieces + Summary // pieces + Summary
$pieces = []; $pieces = [];
@@ -145,13 +144,13 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
} }
// path // path
if ($mask) if ($_cl)
{ {
for ($i = 0; $i < 11; $i++) for ($i = 0; $i < 11; $i++)
{ {
if ($mask & (1 << $i)) if ($_cl & (1 << $i))
{ {
if ($mask == (1 << $i)) // only bit set, add path if ($_cl == (1 << $i)) // only bit set, add path
$path[] = $i + 1; $path[] = $i + 1;
break; // break anyway (cant set multiple classes) break; // break anyway (cant set multiple classes)
@@ -160,15 +159,15 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
} }
$skill = ''; $skill = '';
if ($sk) if ($_sk)
{ {
// todo (med): kill this Lang::monstrosity with Skills // todo (med): kill this Lang::monstrosity with Skills
$spellLink = sprintf('<a href="?spells=11.%s">%s</a> (%s)', $sk, Lang::$spell['cat'][11][$sk][0], $iSet->getField('skillLevel')); $spellLink = sprintf('<a href="?spells=11.%s">%s</a> (%s)', $_sk, Lang::$spell['cat'][11][$_sk][0], $iSet->getField('skillLevel'));
$skill = ' &ndash; <small><b>'.sprintf(Lang::$game['requires'], $spellLink).'</b></small>'; $skill = ' &ndash; <small><b>'.sprintf(Lang::$game['requires'], $spellLink).'</b></small>';
} }
$pageData = array( $pageData = array(
'title' => $name, // for header 'title' => $_na, // for header
'path' => $path, 'path' => $path,
'infobox' => $infobox ? '[ul][li]'.implode('[/li][li]', $infobox).'[/li][/ul]' : null, 'infobox' => $infobox ? '[ul][li]'.implode('[/li][li]', $infobox).'[/li][/ul]' : null,
'relTabs' => [], 'relTabs' => [],
@@ -176,47 +175,47 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
'spells' => $spells, 'spells' => $spells,
'view3D' => json_encode($eqList, JSON_NUMERIC_CHECK), 'view3D' => json_encode($eqList, JSON_NUMERIC_CHECK),
'compare' => array( 'compare' => array(
'qty' => $cnt, 'qty' => $_cnt,
'items' => $compare, 'items' => $compare,
'level' => $rLvl 'level' => $_lvl
), ),
'page' => array( 'page' => array(
'name' => $name, // for page content 'name' => $_na, // for page content
'id' => $_id, 'id' => $_id,
'bonusExt' => $skill, 'bonusExt' => $skill,
'description' => $ta ? sprintf(Lang::$itemset['_desc'], $name, Lang::$itemset['notes'][$ta], $cnt) : sprintf(Lang::$itemset['_descTagless'], $name, $cnt), 'description' => $_ta ? sprintf(Lang::$itemset['_desc'], $_na, Lang::$itemset['notes'][$_ta], $_cnt) : sprintf(Lang::$itemset['_descTagless'], $_na, $_cnt),
'unavailable' => $unav 'unavailable' => (bool)($iSet->getField('cuFlags') & CUSTOM_UNAVAILABLE)
) )
); );
$iSet->addGlobalsToJscript($smarty, GLOBALINFO_SELF); $iSet->addGlobalsToJscript($smarty);
// related sets (priority: 1: similar tag + class; 2: has event; 3: no tag + similar type, 4: similar type + profession) // related sets (priority: 1: similar tag + class; 2: has event; 3: no tag + similar type, 4: similar type + profession)
$rel = []; $rel = [];
if ($ta && count($path) == 3) if ($_ta && count($path) == 3)
{ {
$rel[] = ['id', $_id, '!']; $rel[] = ['id', $_id, '!'];
$rel[] = ['classMask', 1 << (end($path) - 1), '&']; $rel[] = ['classMask', 1 << (end($path) - 1), '&'];
$rel[] = ['contentGroup', (int)$ta]; $rel[] = ['contentGroup', (int)$_ta];
} }
else if ($ev) else if ($_ev)
{ {
$rel[] = ['id', $_id, '!']; $rel[] = ['id', $_id, '!'];
$rel[] = ['holidayId', 0, '!']; $rel[] = ['holidayId', 0, '!'];
} }
else if ($sk) else if ($_sk)
{ {
$rel[] = ['id', $_id, '!']; $rel[] = ['id', $_id, '!'];
$rel[] = ['contentGroup', 0]; $rel[] = ['contentGroup', 0];
$rel[] = ['skillId', 0, '!']; $rel[] = ['skillId', 0, '!'];
$rel[] = ['type', $ty]; $rel[] = ['type', $_ty];
} }
else if (!$ta && $ty) else if (!$_ta && $_ty)
{ {
$rel[] = ['id', $_id, '!']; $rel[] = ['id', $_id, '!'];
$rel[] = ['contentGroup', 0]; $rel[] = ['contentGroup', 0];
$rel[] = ['type', $ty]; $rel[] = ['type', $_ty];
$rel[] = ['skillId', 0]; $rel[] = ['skillId', 0];
} }

View File

@@ -43,7 +43,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
if (!$recipes->error) if (!$recipes->error)
{ {
// 1 recipes [spells] (crafted) // 1 recipes [spells] (crafted)
$recipes->addGlobalsToJscript($smarty); $recipes->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$pageData['relTabs'][] = array( $pageData['relTabs'][] = array(
'file' => 'spell', 'file' => 'spell',
@@ -85,7 +85,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
// 3 crafted items [items] // 3 crafted items [items]
$created = []; $created = [];
foreach ($recipes->iterate() as $__) foreach ($recipes->iterate() as $__)
if ($idx = $this->canCreateItem()) if ($idx = $recipes->canCreateItem())
foreach ($idx as $i) foreach ($idx as $i)
$created[] = $recipes->getField('effect'.$i.'CreateItemId'); $created[] = $recipes->getField('effect'.$i.'CreateItemId');

File diff suppressed because it is too large Load Diff

View File

@@ -103,6 +103,14 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
$visibleCols = []; $visibleCols = [];
$hiddenCols = []; $hiddenCols = [];
$pageData = array(
'page' => [],
'data' => [],
'title' => '',
'path' => '',
'params' => []
);
switch($cats[0]) switch($cats[0])
{ {
case -2: // Character Talents case -2: // Character Talents

View File

@@ -389,7 +389,7 @@ if ($searchMask & 0x80)
if ($data = $abilities->getListviewData()) if ($data = $abilities->getListviewData())
{ {
$abilities->addGlobalsToJscript($smarty); $abilities->addGlobalsToJscript($smarty, GLOBALINFO_SELF | GLOBALINFO_RELATED);
$vis = ['level', 'singleclass', 'schools']; $vis = ['level', 'singleclass', 'schools'];
if ($abilities->hasSetFields(['reagent1'])) if ($abilities->hasSetFields(['reagent1']))
@@ -1096,7 +1096,7 @@ else /* if ($searchMask & SEARCH_TYPE_REGULAR) */
{ {
$_ = array_pop($found); $_ = array_pop($found);
$type = Util::$typeStrings[$_['type']]; $type = Util::$typeStrings[$_['type']];
$typeId = key(array_pop($_)); $typeId = key($_['data']);
header("Location: ?".$type.'='.$typeId); header("Location: ?".$type.'='.$typeId);
die(); die();

View File

@@ -33,6 +33,9 @@
{if isset($curr.percent)} {if isset($curr.percent)}
percent:{$curr.percent}, percent:{$curr.percent},
{/if} {/if}
{if isset($curr.count)}
count:{$curr.count},
{/if}
{if isset($curr.cost)} {if isset($curr.cost)}
stock:{$curr.stock}, stock:{$curr.stock},
{if isset($curr.stack)} {if isset($curr.stack)}

View File

@@ -15,14 +15,11 @@
{foreach name=i from=$data item=curr} {foreach name=i from=$data item=curr}
{ldelim} {ldelim}
{foreach from=$curr key='name' item=val} {foreach from=$curr key='name' item=val}
{if $name != 'id' && $name != 'name' && $name != 'heroic'} {if $name != 'id' && $name != 'name'}
{$name}:{$val|@json_encode:$smarty.const.JSON_NUMERIC_CHECK}, {$name}:{$val|@json_encode:$smarty.const.JSON_NUMERIC_CHECK},
{/if} {/if}
{/foreach} {/foreach}
name:'{$curr.name|escape:"quotes"}', name:'{$curr.name|escape:"quotes"}',
{if isset($curr.heroic)}
heroic:1,
{/if}
id:{$curr.id} id:{$curr.id}
{rdelim} {rdelim}
{if $smarty.foreach.i.last}{else},{/if} {if $smarty.foreach.i.last}{else},{/if}

View File

@@ -14,75 +14,12 @@
data:[ data:[
{foreach name=i from=$data item=curr} {foreach name=i from=$data item=curr}
{ldelim} {ldelim}
name:'{$curr.quality}{$curr.name|escape:"javascript"}', {foreach from=$curr key='name' item=val}
{if isset($curr.level)}level:{$curr.level},{/if} {if $name != 'id' && $name != 'name' && $name != 'quality'}
school:{$curr.school}, {$name}:{$val|@json_encode:$smarty.const.JSON_NUMERIC_CHECK},
cat:{$curr.cat},
{if isset($curr.rank)}
rank:'{$curr.rank|escape:"javascript"}',
{/if} {/if}
{if isset($curr.type)}
type:'{$curr.type}',
{/if}
{if isset($curr.skill)}
skill:[
{section name=j loop=$curr.skill}
{$curr.skill[j]}
{if $smarty.section.j.last}{else},{/if}
{/section}
],
{/if}
{if isset($curr.reqclass)}
reqclass:{$curr.reqclass},
{/if}
{if isset($curr.reqrace)}
reqrace:{$curr.reqrace},
{/if}
{if isset($curr.glyphtype)}
glyphtype:{$curr.glyphtype},
{/if}
{if !empty($curr.source)}
source:{$curr.source},
{/if}
{if isset($curr.trainingcost)}
trainingcost:{$curr.trainingcost},
{/if}
{if !empty($curr.reagents)}
reagents:[
{foreach name=j from=$curr.reagents item=r}
[{$r[0]},{$r[1]}]
{if $smarty.foreach.j.last}{else},{/if}
{/foreach} {/foreach}
], name:'{$curr.quality}{$curr.name|escape:"javascript"}',
{/if}
{if isset($curr.creates)}
creates:[
{section name=j loop=$curr.creates}
{$curr.creates[j]}
{if $smarty.section.j.last}{else},{/if}
{/section}
],
{/if}
{if isset($curr.learnedat)}
learnedat:{$curr.learnedat},
{/if}
{if isset($curr.colors)}
colors:[
{section name=j loop=$curr.colors}
{$curr.colors[j]}
{if $smarty.section.j.last}{else},{/if}
{/section}
],
{/if}
{if isset($curr.percent)}
percent:{$curr.percent},
{/if}
{if isset($curr.stackRule)}
stackRule:{$curr.stackRule},
{/if}
{if isset($curr.linked)}
linked:{$curr.linked},
{/if}
id:{$curr.id} id:{$curr.id}
{rdelim} {rdelim}
{if $smarty.foreach.i.last}{else},{/if} {if $smarty.foreach.i.last}{else},{/if}

View File

@@ -26,7 +26,8 @@
{if isset($curr.reqlevel)},reqlevel:{$curr.reqlevel}{/if} {if isset($curr.reqlevel)},reqlevel:{$curr.reqlevel}{/if}
{if isset($curr.lfgReqLevel)},lfgReqLevel:{$curr.lfgReqLevel}{/if} {if isset($curr.lfgReqLevel)},lfgReqLevel:{$curr.lfgReqLevel}{/if}
{if isset($curr.heroicLevel)},heroicLevel:{$curr.heroicLevel}{/if} {if isset($curr.heroicLevel)},heroicLevel:{$curr.heroicLevel}{/if}
{* {if isset($curr.percent)},percent:{$curr.percent}{/if} what was that originaly for..? *} {if isset($curr.percent)},percent:{$curr.percent}{/if}
{if isset($curr.count)},count:{$curr.count}{/if}
{rdelim} {rdelim}
{if $smarty.foreach.i.last}{else},{/if} {if $smarty.foreach.i.last}{else},{/if}
{/foreach} {/foreach}

View File

@@ -70,6 +70,7 @@
{if !empty($lvData.pageText)} {if !empty($lvData.pageText)}
<div class="clear"></div> <div class="clear"></div>
<h3>{$lang.content}</h3> <h3>{$lang.content}</h3>
<div id="book-generic"></div> <div id="book-generic"></div>
<script>//<![CDATA[ <script>//<![CDATA[
{strip}new Book({ldelim} parent: 'book-generic', pages: [ {strip}new Book({ldelim} parent: 'book-generic', pages: [

View File

@@ -171,10 +171,24 @@
{/foreach} {/foreach}
//]]></script> //]]></script>
{if isset($lvData.data[0].params)}
<div id="tabs-generic"></div>
{/if}
<div id="lv-generic" class="listview"></div> <div id="lv-generic" class="listview"></div>
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
{if !empty($lvData.page.gemScores)}var fi_gemScores = {$lvData.page.gemScores};{/if} {if !empty($lvData.page.gemScores)}var fi_gemScores = {$lvData.page.gemScores};{/if}
{include file='bricks/listviews/item.tpl' data=$lvData.data params=$lvData.params}
{if isset($lvData.data[0].params)}
var tabsRelated = new Tabs({ldelim}parent: $WH.ge('tabs-generic'){rdelim});
{foreach from=$tabs item="tab"}
{if !empty($tab.data)}
{include file="bricks/listviews/item.tpl" data=$tab.data params=$tab.params}
{/if}
{/foreach}
tabsRelated.flush();
{else}
{include file='bricks/listviews/item.tpl' data=$lvData.data params=$lvData.params}
{/if}
//]]></script> //]]></script>
<div class="clear"></div> <div class="clear"></div>

View File

@@ -1018,11 +1018,9 @@ $WH.g_convertRatingToPercent = function(level, rating, value, classs) {
if (level < 0) { if (level < 0) {
level = 1; level = 1;
} }
else { else if (level > 80) {
if (level > 80) {
level = 80; level = 80;
} }
}
// Patch 2.4.3: Defense Skill, Dodge Rating, Parry Rating, Block Rating // Patch 2.4.3: Defense Skill, Dodge Rating, Parry Rating, Block Rating
if ((rating == 14 || rating == 12 || rating == 15) && level < 34) { if ((rating == 14 || rating == 12 || rating == 15) && level < 34) {

View File

@@ -157,7 +157,7 @@ var fi_filters = {
{ id: 142, name: 'icon', type: 'str' }, { id: 142, name: 'icon', type: 'str' },
{ id: 10, name: 'locked', type: 'yn' }, { id: 10, name: 'locked', type: 'yn' },
{ id: 159, name: 'millable', type: 'yn' }, { id: 159, name: 'millable', type: 'yn' },
{ id: 127, name: 'notavailable', type: 'yn' }, // { id: 127, name: 'notavailable', type: 'yn' }, redundant with 161
{ id: 85, name: 'objectivequest', type: 'side' }, { id: 85, name: 'objectivequest', type: 'side' },
{ id: 11, name: 'openable', type: 'yn' }, { id: 11, name: 'openable', type: 'yn' },
{ id: 12, name: 'partofset', type: 'yn' }, { id: 12, name: 'partofset', type: 'yn' },

View File

@@ -991,9 +991,9 @@ var g_item_slots = {
}; };
var g_item_classes = { var g_item_classes = {
0: 'Consommable', 0: 'Verbrauchbar',
1: 'Behälter', 1: 'Behälter',
2: 'Arme', 2: 'Waffe',
3: 'Edelstein', 3: 'Edelstein',
4: 'Rüstung', 4: 'Rüstung',
5: 'Reagenz', 5: 'Reagenz',

View File

@@ -117,6 +117,12 @@
<th><dfn title="{$lang._globCD}">{$lang._gcd}</dfn></th> <th><dfn title="{$lang._globCD}">{$lang._gcd}</dfn></th>
<td>{$lvData.page.gcd}</td> <td>{$lvData.page.gcd}</td>
</tr> </tr>
{if !empty($lvData.page.scaling)}
<tr>
<th>{$lang._scaling}</th>
<td colspan="3">{$lvData.page.scaling}</td>
</tr>
{/if}
{if !empty($lvData.page.stances)} {if !empty($lvData.page.stances)}
<tr> <tr>
<th>{$lang._forms}</th> <th>{$lang._forms}</th>
@@ -140,6 +146,7 @@
{if isset($lvData.page.effect[i].radius)}<br>{$lang._radius}{$lang.colon}{$lvData.page.effect[i].radius} {$lang._distUnit}{/if} {if isset($lvData.page.effect[i].radius)}<br>{$lang._radius}{$lang.colon}{$lvData.page.effect[i].radius} {$lang._distUnit}{/if}
{if isset($lvData.page.effect[i].interval)}<br>{$lang._interval}{$lang.colon}{$lvData.page.effect[i].interval}{/if} {if isset($lvData.page.effect[i].interval)}<br>{$lang._interval}{$lang.colon}{$lvData.page.effect[i].interval}{/if}
{if isset($lvData.page.effect[i].mechanic)}<br>{$lang.mechanic}{$lang.colon}{$lvData.page.effect[i].mechanic}{/if} {if isset($lvData.page.effect[i].mechanic)}<br>{$lang.mechanic}{$lang.colon}{$lvData.page.effect[i].mechanic}{/if}
{if isset($lvData.page.effect[i].procData)}<br>{if $lvData.page.effect[i].procData[0] < 0}{$lang.ppm|sprintf:$lvData.page.effect[i].procData[0]*-1}{else}{$lang.procChance}{$lang.colon}{$lvData.page.effect[i].procData[0]}%{/if}{if $lvData.page.effect[i].procData[1]} ({$lang.cooldown|sprintf:$lvData.page.effect[i].procData[1]}){/if}{/if}
</small> </small>
{if isset($lvData.page.effect[i].icon)} {if isset($lvData.page.effect[i].icon)}
<table class="icontab"> <table class="icontab">
@@ -148,7 +155,7 @@
{if isset($lvData.page.effect[i].icon.quality)} {if isset($lvData.page.effect[i].icon.quality)}
<td><span class="q{$lvData.page.effect[i].icon.quality}"><a href="?item={$lvData.page.effect[i].icon.id}">{$lvData.page.effect[i].icon.name}</a></span></td> <td><span class="q{$lvData.page.effect[i].icon.quality}"><a href="?item={$lvData.page.effect[i].icon.id}">{$lvData.page.effect[i].icon.name}</a></span></td>
{else} {else}
<td><a href="?spell={$lvData.page.effect[i].icon.id}">{$lvData.page.effect[i].icon.name}</a></td> <td>{if !$lvData.page.effect[i].icon.name|strpos:"#"}<a href="?spell={$lvData.page.effect[i].icon.id}">{/if}{$lvData.page.effect[i].icon.name}{if !$lvData.page.effect[i].icon.name|strpos:"#"}</a>{/if}</td>
{/if} {/if}
<th></th><td></td> <th></th><td></td>
</tr> </tr>