- preparing tooltips (locks to Util & localization)
quests & npcs:
 - implemented tooltips
spells:
 - fixed tooltip-header
 - stat gain inclued periodic healing auras (item: 17743 for example) and spellHeal no longer applies spellPower
achievements:
 - path is less prone to errors
events:
 - disabled tab as it was causing js-errors

obligatory cleaning up everywhere
This commit is contained in:
Sarjuuk
2013-06-19 21:28:53 +02:00
parent 513c9d9114
commit 08f4d84b6d
20 changed files with 1463 additions and 235 deletions

View File

@@ -6,6 +6,8 @@ if (!defined('AOWOW_REVISION'))
class CreatureList extends BaseType
{
use spawnHelper;
public $tooltips = [];
protected $setupQuery = 'SELECT *, ct.entry AS ARRAY_KEY, ct.entry AS id FROM creature_template ct LEFT JOIN locales_creature lc ON lc.entry = ct.entry LEFT JOIN creature_template_addon cta on cta.entry = ct.entry WHERE [filter] [cond]';

View File

@@ -524,34 +524,9 @@ class ItemList extends BaseType
$x .= '<br />'.sprintf(Lang::$game['requires'], '<a class="q1" href=?faction="'.$this->curTpl['RequiredReputationFaction'].'">'.Faction::getName($this->curTpl['RequiredReputationFaction']).'</a> - '.Lang::$game['rep'][$this->curTpl['RequiredReputationRank']]);
// locked
if ($this->curTpl['lockid'])
{
$lock = DB::Aowow()->selectRow('
SELECT
*
FROM
?_lock
WHERE
lockID = ?d',
$this->curTpl['lockid']
);
// only use first useful entry
for ($j = 1; $j <= 5; $j++)
{
if ($lock['type'.$j] == 1) // opened by item
{
$l = sprintf(Lang::$game['requires'], '<a class="q1" href="?item='.$lock['lockproperties'.$j].'">'.Util::getItemName($lock['lockproperties'.$j]).'</a>');
break;
}
else if ($lock['type'.$j] == 2) // opened by skill
{
$lockText = DB::Aowow()->selectRow('SELECT ?# FROM ?_locktype WHERE id = ?d', $lock['lockproperties'.$j]);
$l = sprintf(Lang::$game['requires'], Util::localizedString($lockText, 'name').' ('.$lock['requiredskill'.$j].')');
break;
}
}
$x .= '<br /><span class="q0">'.Lang::$item['locked'].'<br />'.$l.'</span>';
}
if ($lId = $this->curTpl['lockid'])
if ($locks = Lang::getLocks($lId))
$x .= '<br /><span class="q0">'.Lang::$item['locked'].'<br />'.implode('<br />', $locks).'</span>';
// upper table: done
if (!$subT)
@@ -819,10 +794,15 @@ class ItemList extends BaseType
// convert ItemMods
for ($h = 1; $h <= 10; $h++)
{
if (!$this->curTpl['stat_type'.$h])
$mod = $this->curTpl['stat_type'.$h];
$val = $this->curTpl['stat_value'.$h];
if (!$mod ||!$val)
continue;
@$this->itemMods[$this->id][$this->curTpl['stat_type'.$h]] += $this->curTpl['stat_value'.$h];
if ($mod == ITEM_MOD_ATTACK_POWER)
@$this->itemMods[$this->id][ITEM_MOD_RANGED_ATTACK_POWER] += $val;
@$this->itemMods[$this->id][$mod] += $val;
}
// convert Spells
@@ -855,7 +835,7 @@ class ItemList extends BaseType
$this->json[$this->id]['socketbonusstat'] = Util::parseItemEnchantment($enh);
// gather random Enchantments
// todo: !important! extremly high sql-load
// todo (high): extremly high sql-load
if (@$this->json[$this->id]['commondrop'] && isset($this->subItems[$this->id]))
{
foreach ($this->subItems[$this->id] as $k => $sI)

View File

@@ -8,8 +8,8 @@ class QuestList extends BaseType
public $cat1 = 0;
public $cat2 = 0;
protected $setupQuery = 'SELECT *, id AS ARRAY_KEY FROM quest_template a LEFT JOIN locales_quest b ON a.Id = b.entry WHERE [filter] [cond] ORDER BY Id ASC';
protected $matchQuery = 'SELECT COUNT(1) FROM quest_template a LEFT JOIN locales_quest b ON a.Id = b.entry WHERE [filter] [cond]';
protected $setupQuery = 'SELECT *, id AS ARRAY_KEY FROM quest_template qt LEFT JOIN locales_quest lq ON qt.Id = lq.entry WHERE [filter] [cond] ORDER BY Id ASC';
protected $matchQuery = 'SELECT COUNT(1) FROM quest_template WHERE [filter] [cond]';
// parent::__construct does the job
@@ -167,9 +167,100 @@ class QuestList extends BaseType
(new TitleList(array(['id', $titles])))->addGlobalsToJscript($refs);
}
private function parseText($type = 'Objectives')
{
$replace = array(
'$c' => '&lt;'.Util::ucFirst(Lang::$game['class']).'&gt;',
'$C' => '&lt;'.Util::ucFirst(Lang::$game['class']).'&gt;',
'$r' => '&lt;'.Util::ucFirst(Lang::$game['race']).'&gt;',
'$R' => '&lt;'.Util::ucFirst(Lang::$game['race']).'&gt;',
'$n' => '&lt;'.Util::ucFirst(Lang::$main['name']).'&gt;',
'$N' => '&lt;'.Util::ucFirst(Lang::$main['name']).'&gt;',
'$b' => '<br />',
'$B' => '<br />'
);
$text = $this->getField($type, true);
if (!$text)
return '';
$text = strtr($text, $replace);
// gender switch
$text = preg_replace('/$g([^:;]+):([^:;]+);/ui', '&lt;\1/\2&lt;', $text);
// nonesense, that the client apparently ignores
$text = preg_replace('/$t([^;]+);/ui', '', $text);
return Util::jsEscape($text);
}
public function renderTooltip()
{
// todo
if (!$this->curTpl)
return null;
if (isset($this->tooltips[$this->id]))
return $this->tooltips[$this->id];
$title = Util::jsEscape($this->getField('Title', true));
$level = $this->curTpl['Level'];
if ($level < 0)
$level = 0;
$x = '';
if ($level)
{
$level = sprintf(Lang::$quest['level'], $level);
if ($this->curTpl['Flags'] & 0x1000) // daily
$level .= ' '.Lang::$quest['daily'];
$x .= '<table><tr><td><table width="100%"><tr><td><b class="q">'.$title.'</b></td><th><b class="q0">'.$level.'</b></th></tr></table></td></tr></table>';
}
else
$x .= '<table><tr><td><b class="q">'.$title.'</b></td></tr></table>';
$x .= '<table><tr><td><br />'.$this->parseText('Objectives').'<br /><br /><span class="q">'.Lang::$quest['requirements'].Lang::$colon.'</span>';
for ($i = 1; $i < 5; $i++)
{
$ot = $this->getField('ObjectiveText'.$i, true);
$rng = $this->curTpl['RequiredNpcOrGo'.$i];
$rngQty = $this->curTpl['RequiredNpcOrGoCount'.$i];
if ($rngQty < 1 && (!$rng || $ot))
continue;
if ($ot)
$name = $ot;
else
$name = $rng > 0 ? CreatureList::getName($rng) : GameObjectList::getName(-$rng);
$x .= '<br /> - '.Util::jsEscape($name).($rngQty > 1 ? ' x '.$rngQty : null);
}
for ($i = 1; $i < 7; $i++)
{
$ri = $this->curTpl['RequiredItemId'.$i];
$riQty = $this->curTpl['RequiredItemCount'.$i];
if (!$ri || $riQty < 1)
continue;
$x .= '<br /> - '.Util::jsEscape(ItemList::getName($ri)).($riQty > 1 ? ' x '.$riQty : null);
}
if ($et = $this->getField('EndText', true))
$x .= '<br /> - '.$et;
$x .= '</td></tr></table>';
$this->tooltips[$this->id] = $x;
return $x;
}
public function addGlobalsToJScript(&$refs)

View File

@@ -70,7 +70,7 @@ class SpellList extends BaseType
foreach ($sources as $src)
{
$src = explode(':', $src);
if ($src[0] != -3) // todo: sourcemore - implement after items
if ($src[0] != -3) // todo (high): sourcemore - implement after items
$this->sources[$this->id][$src[0]][] = $src[1];
}
}
@@ -124,7 +124,7 @@ class SpellList extends BaseType
for ($i = 1; $i <= 3; $i++)
{
if (!in_array($this->curTpl["effect".$i."AuraId"], [13, 22, 29, 34, 35, 83, 84, 85, 99, 124, 135, 143, 158, 161, 189, 230, 235, 240, 250]))
if (!in_array($this->curTpl["effect".$i."AuraId"], [8, 13, 22, 29, 34, 35, 83, 84, 85, 99, 124, 135, 143, 158, 161, 189, 230, 235, 240, 250]))
continue;
$mv = $this->curTpl["effect".$i."MiscValue"];
@@ -197,7 +197,6 @@ class SpellList extends BaseType
}
case 135: // healing splpwr (healing & any) .. not as a mask..
{
@$stats[ITEM_MOD_SPELL_POWER] += $bp;
@$stats[ITEM_MOD_SPELL_HEALING_DONE] += $bp;
break;
@@ -271,7 +270,8 @@ class SpellList extends BaseType
}
}
break;
case 84: // hp5
case 8: // hp5
case 84:
case 161:
@$stats[ITEM_MOD_HEALTH_REGEN] += $bp;
break;
@@ -387,7 +387,7 @@ class SpellList extends BaseType
if ($this->curTpl['powerPerSecond'] > 0)
$str .= sprintf(Lang::$spell['costPerSec'], $this->curTpl['powerPerSecond']);
// append level cost (todo: (low) work in as scaling cost)
// append level cost (todo (low): work in as scaling cost)
if ($this->curTpl['powerCostPerLevel'] > 0)
$str .= sprintf(Lang::$spell['costPerLevel'], $this->curTpl['powerCostPerLevel']);
@@ -400,11 +400,11 @@ class SpellList extends BaseType
return Lang::$spell['channeled'];
else if ($this->curTpl['castTime'] > 0)
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))
else if ($noInstant && !in_array($this->curTpl['typeCat'], [7, -3, -8, 0]) && !($this->curTpl['cuFlags'] & SPELL_CU_TALENTSPELL))
// 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))
return '';
// SPELL_ATTR0_ABILITY instant ability.. yeah, wording thing only
else if ($this->curTpl['damageClass'] == 0 || $this->curTpl['attributes0'] & 0x10)
// SPELL_ATTR0_ABILITY instant ability.. yeah, wording thing only (todo (low): rule is imperfect)
else if ($this->curTpl['damageClass'] != 1 || $this->curTpl['attributes0'] & 0x10)
return Lang::$spell['instantPhys'];
else // instant cast
return Lang::$spell['instantMagic'];
@@ -437,7 +437,7 @@ class SpellList extends BaseType
$sps = $SPS = $this->interactive ? sprintf(Util::$dfnString, 'LANG.traits.shasplpwr[0]', Lang::$spell['traitShort']['shasplpwr']) : Lang::$spell['traitShort']['shasplpwr'];
$bh = $BH = $this->interactive ? sprintf(Util::$dfnString, 'LANG.traits.splheal[0]', Lang::$spell['traitShort']['splheal']) : Lang::$spell['traitShort']['splheal'];
$HND = $hnd = $this->interactive ? sprintf(Util::$dfnString, '[Hands required by weapon]', 'HND') : 'HND'; // todo: localize this one
$HND = $hnd = $this->interactive ? sprintf(Util::$dfnString, '[Hands required by weapon]', 'HND') : 'HND'; // todo (med): localize this one
$MWS = $mws = $this->interactive ? sprintf(Util::$dfnString, 'LANG.traits.mlespeed[0]', 'MWS') : 'MWS';
$mw = $this->interactive ? sprintf(Util::$dfnString, 'LANG.traits.dmgmin1[0]', 'mw') : 'mw';
$MW = $this->interactive ? sprintf(Util::$dfnString, 'LANG.traits.dmgmax1[0]', 'MW') : 'MW';
@@ -508,7 +508,7 @@ class SpellList extends BaseType
switch ($var)
{
case 'a': // EffectRadiusMin
case 'A': // EffectRadiusMax (ToDo)
case 'A': // EffectRadiusMax
if ($lookup)
$base = $this->refSpells[$lookup]->getField('effect'.$effIdx.'RadiusMax');
else
@@ -530,7 +530,7 @@ class SpellList extends BaseType
return $base;
case 'd': // SpellDuration
case 'D': // todo: min/max?; /w unit?
case 'D': // todo (med): min/max?; /w unit?
if ($lookup)
$base = $this->refSpells[$lookup]->getField('duration');
else
@@ -542,7 +542,6 @@ class SpellList extends BaseType
if ($op && is_numeric($oparg) && is_numeric($base))
eval("\$base = $base $op $oparg;");
// todo: determine WHEN the unit is needed >.<
return explode(' ', Util::formatTime(abs($base), true));
case 'e': // EffectValueMultiplier
case 'E':
@@ -997,7 +996,7 @@ class SpellList extends BaseType
}
// step 2: resolving conditions
// aura- or spell-conditions cant be resolved for our purposes, so force them to false for now (todo: strg+f "know" in aowowPower.js ^.^)
// aura- or spell-conditions cant be resolved for our purposes, so force them to false for now (todo (low): strg+f "know" in aowowPower.js ^.^)
// \1: full pattern match; \2: any sequence, that may include an aura/spell-ref; \3: any other sequence, between "?$" and "["
while (preg_match('/\$\?(([\W\D]*[as]\d+)|([^\[]*))/i', $data, $matches))
{
@@ -1017,7 +1016,7 @@ class SpellList extends BaseType
$condCurPos = $condStartPos;
}
else if (!empty($matches[2])) // aura/spell-condition .. use false; TODO (low priority) catch cases and port "know"-param for tooltips from 5.0
else if (!empty($matches[2])) // aura/spell-condition .. use false; TODO (low): catch cases and port "know"-param for tooltips from 5.0
{ // tooltip_enus: Charge to an enemy, stunning it <!--sp58377:0--><!--sp58377-->for <!--sp103828:0-->1 sec<!--sp103828-->.; spells_enus: {"58377": [["", "and 2 additional nearby targets "]], "103828": [["1 sec", "3 sec"]]};
$condStartPos = strpos($data, $matches[2]) - 2;
$condCurPos = $condStartPos;
@@ -1150,7 +1149,7 @@ class SpellList extends BaseType
// step 5: variable-depentant variable-text
// special case $lONE:ELSE;
// todo: russian uses THREE (wtf?! oO) cases ($l[singular]:[plural1]:[plural2]) .. explode() chooses always the first plural option :/
// todo (low): russian uses THREE (wtf?! oO) cases ($l[singular]:[plural1]:[plural2]) .. explode() chooses always the first plural option :/
while (preg_match('/([\d\.]+)([^\d]*)(\$l:*)([^:]*):([^;]*);/i', $str, $m))
$str = str_ireplace($m[1].$m[2].$m[3].$m[4].':'.$m[5].';', $m[1].$m[2].($m[1] == 1 ? $m[4] : explode(':', $m[5])[0]), $str);
@@ -1215,6 +1214,16 @@ class SpellList extends BaseType
$this->interactive = $interactive;
// fetch needed texts
$name = $this->getField('name', true);
$rank = $this->getField('rank', true);
$desc = $this->parseText('description', $level, $this->interactive);
$tools = $this->getToolsForCurrent();
$cool = $this->createCooldownForCurrent();
$cast = $this->createCastTimeForCurrent();
$cost = $this->createPowerCostForCurrent();
$range = $this->createRangesForCurrent();
// get reagents
$reagents = [];
for ($j = 1; $j <= 8; $j++)
@@ -1230,18 +1239,6 @@ class SpellList extends BaseType
}
$reagents = array_reverse($reagents);
// get tools
$tools = $this->getToolsForCurrent();
// get description
$desc = $this->parseText('description', $level, $this->interactive);
// get cooldown
$cool = $this->createCooldownForCurrent();
// get cast time
$cast = $this->createCastTimeForCurrent();
// get stances (check: SPELL_ATTR2_NOT_NEED_SHAPESHIFT)
$stances = '';
if ($this->curTpl['stanceMask'] && !($this->curTpl['attributes2'] & 0x80000))
@@ -1273,46 +1270,23 @@ class SpellList extends BaseType
}
}
$reqWrapper = $this->curTpl['rangeMaxHostile'] && ($this->curTpl['powerCost'] > 0 || $this->curTpl['powerCostPercent'] > 0 || ($this->curTpl['powerCostRunes'] & 0x333));
$reqWrapper2 = $reagents || $tools || $desc || $reqItems || $createItem;
$x = '';
$x .= '<table><tr><td>';
$rankText = Util::localizedString($this->curTpl, 'rank');
// name & rank
if ($rank)
$x .= '<table width="100%"><tr><td><b>'.$name.'</b></td><th><b class="q0">'.$rank.'</b></th></tr></table>';
else
$x .= '<b>'.$name.'</b><br />';
if (!empty($rankText))
$x .= '<table width="100%"><tr><td>';
// powerCost & ranges
if ($range && $cost)
$x .= '<table width="100%"><tr><td>'.$cost.'</td><th>'.$range.'</th></tr></table>';
else if ($cost || $range)
$x .= $range.$cost.'<br />';
// name
$x .= '<b>'.$this->getField('name', true).'</b>';
// rank
if (!empty($rankText))
$x .= '</td><th><b class="q0">'.$rankText.'</b></th></tr></table>';
// power cost
$c = $this->createPowerCostForCurrent();
// ranges
$r = $this->createRangesForCurrent();
if ($reqWrapper)
$x .= '<table width="100%"><tr><td>'.$c.'</td><th>'.$r.'</th></tr></table>';
else if ($c || $r)
{
if (empty($rankText))
$x .= '<br />';
$x .= $r;
if ($c && $r)
$x .= '<br />';
$x .= $c;
}
if ($cool) // tabled layout
// castTime & cooldown
if ($cast && $cool) // tabled layout
{
$x .= '<table width="100%">';
$x .= '<tr><td>'.$cast.'</td><th>'.$cool.'</th></tr>';
@@ -1321,91 +1295,68 @@ class SpellList extends BaseType
$x .= '</table>';
}
else if ($cast || $stances) // line-break layout
else if ($cast || $cool) // line-break layout
{
if (!$reqWrapper && !$c && empty($rankText))
$x .= '<br />';
$x .= $cast.$cool;
$x .= $cast;
if ($cast && $stances)
$x .= '<br />';
$x .= $stances;
if ($stances)
$x .= '<br />'.$stances;
}
$x .= '</td></tr></table>';
if ($reqWrapper2)
$x .= '<table><tr><td>';
$xTmp = [];
if ($tools)
{
$x .= Lang::$spell['tools'].':<br/><div class="indent q1">';
$_ = Lang::$spell['tools'].':<br/><div class="indent q1">';
while ($tool = array_pop($tools))
{
if (isset($tool['itemId']))
$x .= '<a href="?item='.$tool['itemId'].'">'.$tool['name'].'</a>';
$_ .= '<a href="?item='.$tool['itemId'].'">'.$tool['name'].'</a>';
else if (isset($tool['id']))
$x .= '<a href="?items&filter=cr=91;crs='.$tool['id'].';crv=0">'.$tool['name'].'</a>';
$_ .= '<a href="?items&filter=cr=91;crs='.$tool['id'].';crv=0">'.$tool['name'].'</a>';
else
$x .= $tool['name'];
$_ .= $tool['name'];
if (!empty($tools))
$x .= ', ';
$_ .= ', ';
else
$x .= '<br />';
$_ .= '<br />';
}
$x .= '</div>';
$xTmp[] = $_.'</div>';
}
if ($reagents)
{
if ($tools)
$x .= "<br />";
$x .= Lang::$spell['reagents'].':<br/><div class="indent q1">';
$_ = Lang::$spell['reagents'].':<br/><div class="indent q1">';
while ($reagent = array_pop($reagents))
{
$x .= '<a href="?item='.$reagent['id'].'">'.$reagent['name'].'</a>';
$_ .= '<a href="?item='.$reagent['id'].'">'.$reagent['name'].'</a>';
if ($reagent['count'] > 1)
$x .= ' ('.$reagent['count'].')';
$_ .= ' ('.$reagent['count'].')';
if(!empty($reagents))
$x .= ', ';
$_ .= ', ';
else
$x .= '<br />';
$_ .= '<br />';
}
$x .= '</div>';
$xTmp[] = $_.'</div>';
}
if ($reqItems)
{
if ($tools || $reagents)
$x .= "<br />";
$x .= Lang::$game['requires2'].' '.$reqItems;
}
$xTmp[] = Lang::$game['requires2'].' '.$reqItems;
if ($desc)
{
if ($tools || $reagents || $reqItems)
$x .= "<br />";
$x .= '<span class="q">'.$desc.'</span>';
}
$xTmp[] = '<span class="q">'.$desc.'</span>';
if ($createItem)
{
if ($tools || $reagents || $reqItems || $desc)
$x .= "<br />";
$x .= '<br />'.$createItem;
}
if ($reqWrapper2)
$x .= "</td></tr></table>";
$xTmp[] = '<br />'.$createItem;
if ($tools || $reagents || $reqItems || $desc || $createItem)
$x .= '<table><tr><td>'.implode('<br />', $xTmp).'</td></tr></table>';
$this->tooltips[$this->id] = $x;
@@ -1421,7 +1372,7 @@ class SpellList extends BaseType
$range = $this->createRangesForCurrent();
// cast times
$time = $this->createCastTimeForCurrent();
$cast = $this->createCastTimeForCurrent();
// cooldown or categorycooldown
$cool = $this->createCooldownForCurrent();
@@ -1435,16 +1386,16 @@ class SpellList extends BaseType
if ($cost && $range)
$x .= '<table width="100%"><tr><td>'.$cost.'</td><th>'.$range.'</th></tr></table>';
else
$x .= $cost . $range;
$x .= $cost.$range;
if (($cost xor $range) && ($time xor $cool))
if (($cost xor $range) && ($cast xor $cool))
$x .= '<br />';
// lower
if ($time && $cool)
$x .= '<table width="100%"><tr><td>'.$time.'</td><th>'.$cool.'</th></tr></table>';
if ($cast && $cool)
$x .= '<table width="100%"><tr><td>'.$cast.'</td><th>'.$cool.'</th></tr></table>';
else
$x .= $time . $cool;
$x .= $cast.$cool;
return $x;
}

View File

@@ -354,6 +354,43 @@ class Lang
return $tmp;
}
public static function getLocks($lockId, $interactive = false)
{
$locks = [];
$lock = DB::Aowow()->selectRow('SELECT * FROM ?_lock WHERE id = ?d', $this->curTpl['lockid']);
for ($i = 1; $i <= 5; $i++)
{
$prop = $lock['lockproperties'.$i];
$rnk = $lock['requiredskill'.$i];
$name = '';
if ($lock['type'.$i] == 1) // opened by item
{
$name = ItemList::getName($prop);
if (!$name)
continue;
if ($interactive)
$name = '<a class="q1" href="?item='.$prop.'">'.$name.'</a>';
}
else if ($lock['type'.$i] == 2) // opened by skill
{
$txt = DB::Aowow()->selectRow('SELECT * FROM ?_locktype WHERE id = ?d', $prop); // todo (low): convert to static text
$name = Util::localizedString($txts, 'name');
if (!$name)
continue;
if ($rnk > 0)
$name .= ' ('.$rnk.')';
}
$locks[] = sprintf(Lang::$game['requires'], $n);
}
return $locks;
}
public static function getReputationLevelForPoints($pts)
{
if ($pts >= 41999)

View File

@@ -83,6 +83,8 @@ $lang = array(
'tryAgain' => "Bitte versucht es mit anderen Suchbegriffen oder überprüft deren Schreibweise.",
),
'game' => array(
'achievement' => "Erfolg",
'achievements' => "Erfolge",
'class' => "Klasse",
'classes' => "Klassen",
'currency' => "Währung",
@@ -90,6 +92,8 @@ $lang = array(
'difficulty' => "Modus",
'dispelType' => "Bannart",
'duration' => "Dauer",
'gameObject' => "Objekt",
'gameObjects' => "Objekte",
'glyphType' => "Glyphenart",
'race' => "Volk",
'races' => "Völker",
@@ -218,9 +222,7 @@ $lang = array(
'rank' => ['Normal', 'Elite', 'Rar Elite', 'Boss', 'Rar']
),
'achievement' => array(
'achievements' => "Erfolge",
'criteria' => "Kriterien",
'achievement' => "Erfolg",
'points' => "Punkte",
'series' => "Reihe",
'outOf' => "von",
@@ -263,6 +265,11 @@ $lang = array(
"Schlachtfelder", null, "Scherbenwelt", "Arenen", "Nordend"
)
),
'quest' => array(
'level' => 'Stufe %s',
'daily' => 'Täglich',
'requirements' => 'Anforderungen'
),
'title' => array(
'cat' => array(
'Allgemein', 'Spieler gegen Spieler', 'Ruf', 'Dungeon & Schlachtzug', 'Quests', 'Berufe', 'Weltereignisse'

View File

@@ -78,6 +78,8 @@ $lang = array(
'tryAgain' => "Please try some different keywords or check your spelling.",
),
'game' => array(
'achievement' => "achievement",
'achievements' => "Achievements",
'class' => "class",
'classes' => "Classes",
'currency' => "currency",
@@ -85,6 +87,8 @@ $lang = array(
'difficulty' => "Difficulty",
'dispelType' => "Dispel type",
'duration' => "Duration",
'gameObject' => "objects",
'gameObjects' => "Objects",
'glyphType' => "Glyph type",
'race' => "race",
'races' => "Races",
@@ -213,9 +217,7 @@ $lang = array(
'category' => array("Uncategorized", "Holidays", "Recurring", "Player vs. Player")
),
'achievement' => array(
'achievements' => "achievements",
'criteria' => "Criteria",
'achievement' => "achievement",
'points' => "Points",
'series' => "Series",
'outOf' => "out of",
@@ -258,6 +260,11 @@ $lang = array(
"Battlegrounds", null, "Outland", "Arenas", "Northrend"
)
),
'quest' => array(
'level' => 'Level %s',
'daily' => 'Daily',
'requirements' => 'Requirements'
),
'title' => array(
'cat' => array(
'General', 'Player vs. Player', 'Reputation', 'Dungeons & Raids', 'Quests', 'Professions', 'World Events'

View File

@@ -75,6 +75,8 @@ $lang = array(
'tryAgain' => "Por favor, introduzca otras palabras claves o verifique el término ingresado.",
),
'game' => array(
'achievement' => "logro",
'achievements' => "Logros",
'class' => "clase",
'classes' => "Clases",
'currency' => "monedas",
@@ -82,6 +84,8 @@ $lang = array(
'difficulty' => "Dificultad",
'dispelType' => "Tipo de disipación",
'duration' => "Duración",
'gameObject' => "entidad",
'gameObjects' => "Entidades",
'glyphType' => "Tipo de glifo",
'race' => "raza",
'races' => "Razas",
@@ -171,9 +175,7 @@ $lang = array(
'rank' => ['Normal', 'Élite', 'Élite raro', 'Jefe', 'Raro']
),
'achievement' => array(
'achievements' => "logros",
'criteria' => "Requisitos",
'achievement' => "logro",
'points' => "Puntos",
'series' => "Serie",
'outOf' => "de",
@@ -216,6 +218,11 @@ $lang = array(
"Campos de batalla", null, "Terrallende", "Arenas", "Rasganorte"
)
),
'quest' => array(
'level' => 'Nivel %s',
'daily' => 'Diaria',
'requirements' => 'Requisitos'
),
'title' => array(
'cat' => array(
'General', 'Jugador contra Jugador', 'Reputación', 'Mazmorras y bandas', 'Misiones', 'Profesiones', 'Eventos del mundo'

View File

@@ -75,6 +75,8 @@ $lang = array(
'tryAgain' => "Veuillez essayer d'autres mots ou vérifiez l'orthographe des termes de recherche.",
),
'game' => array (
'achievement' => "haut fait",
'achievements' => "Hauts faits",
'class' => "classe",
'classes' => "Classes",
'currency' => "monnaies",
@@ -82,6 +84,8 @@ $lang = array(
'difficulty' => "Difficulté",
'dispelType' => "Type de dissipation",
'duration' => "Durée",
'gameObject' => "entité",
'gameObjects' => "Entités",
'glyphType' => "Type de glyphe",
'race' => "race",
'races' => "Races",
@@ -170,9 +174,7 @@ $lang = array(
'rank' => ['Standard', 'Élite', 'Élite rare', 'Boss', 'Rare']
),
'achievement' => array(
'achievements' => "hauts faits",
'criteria' => "Critères",
'achievement' => "haut fait",
'points' => "Points",
'series' => "Série",
'outOf' => "sur",
@@ -215,6 +217,11 @@ $lang = array(
"Champs de bataille", null, "Outreterre", "Arènes", "Norfendre"
)
),
'quest' => array(
'level' => 'Niveau %s',
'daily' => 'Journalière',
'requirements' => 'Conditions'
),
'title' => array(
'cat' => array(
'Général', 'Joueur ctr. Joueur', 'Réputation', 'Donjons & raids', 'Quêtes', 'Métiers', 'Évènements mondiaux'

View File

@@ -75,6 +75,8 @@ $lang = array(
'tryAgain' => "Пожалуйста, попробуйте другие ключевые слова или проверьте правильность запроса.",
),
'game' => array(
'achievement' => "достижение",
'achievements' => "Достижения",
'class' => "класс",
'classes' => "Классы",
'currency' => "валюта",
@@ -82,6 +84,8 @@ $lang = array(
'difficulty' => "Сложность",
'dispelType' => "Тип рассеивания",
'duration' => "Длительность",
'gameObject' => "объект",
'gameObjects' => "Объекты",
'glyphType' => "Тип символа",
'race' => "раса",
'races' => "Расы",
@@ -170,9 +174,7 @@ $lang = array(
'rank' => ['Обычный', 'Элитный', 'Редкий элитный', 'Босс', 'Редкий']
),
'achievement' => array(
'achievements' => "достижения",
'criteria' => "Критерий",
'achievement' => "достижение",
'points' => "Очки",
'series' => "Серии",
'outOf' => "из",
@@ -215,6 +217,11 @@ $lang = array(
"Поля боя", null, "Запределье", "Арены", "Нордскол"
)
),
'quest' => array(
'level' => '%s-го уровня',
'daily' => '', // empty on purpose .. wtf guys?!
'requirements' => 'Требования'
),
'title' => array(
'cat' => array(
'Общее', 'PvP', 'Репутация', 'Подземелья и рейды', 'Задания', 'Профессии', 'Игровые события'

View File

@@ -22,7 +22,6 @@ if (!defined('AOWOW_REVISION'))
require 'includes/class.community.php';
$id = intVal($pageParam);
$acv = new AchievementList(array(['id', $id]));
$cacheKeyPage = implode('_', [CACHETYPE_PAGE, TYPE_ACHIEVEMENT, $id, -1, User::$localeId]);
$cacheKeyTooltip = implode('_', [CACHETYPE_TOOLTIP, TYPE_ACHIEVEMENT, $id, -1, User::$localeId]);
@@ -34,15 +33,16 @@ if (isset($_GET['power']))
Util::powerUseLocale(@$_GET['domain']);
if (!$smarty->loadCache($cacheKeyTooltip, $x))
{
$acv = new AchievementList(array(['id', $id]));
if ($acv->error)
die('$WowheadPower.registerAchievement(\''.$id.'\', '.User::$localeId.', {})');
if (!$smarty->loadCache($cacheKeyTooltip, $x))
{
$x = '$WowheadPower.registerAchievement('.$id.', '.User::$localeId.",{\n";
$x .= "\tname_".User::$localeString.": '".Util::jsEscape($acv->getField('name', true))."',\n";
$x .= "\ticon: '".$acv->getField('iconString')."',\n";
$x .= "\ttooltip_".User::$localeString.': \''.$acv->renderTooltip()."'\n";
$x .= "\ticon: '".Util::jsEscape($acv->getField('iconString'))."',\n";
$x .= "\ttooltip_".User::$localeString.": '".$acv->renderTooltip()."'\n";
$x .= "});";
$smarty->saveCache($cacheKeyTooltip, $x);
@@ -53,22 +53,25 @@ if (isset($_GET['power']))
// regular page
if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$acv = new AchievementList(array(['id', $id]));
if ($acv->error)
$smarty->notFound(Lang::$achievement['achievement']);
$smarty->notFound(Lang::$game['achievement']);
$pageData['path'] = [];
$pageData['title'] = [Util::ucfirst(Lang::$achievement['achievement'])];
$pageData['path'] = [0, 9];
$pageData['title'] = [Util::ucfirst(Lang::$game['achievement'])];
// create page title and path
$curCat = $acv->getField('category');
$tmpPath = [];
do
{
$pageData['path'][] = $curCat;
$tmpPath[] = $curCat;
$curCat = DB::Aowow()->SelectCell('SELECT parentCategory FROM ?_achievementcategory WHERE id = ?d', $curCat);
}
while ($curCat > 0);
$pageData['path'] = array_reverse(array_merge($pageData['path'], [9, 0]));
if (!empty($tmpPath))
$pageData['path'] = array_merge($pageData['path'], array_reverse($tmpPath));
array_unshift($pageData['title'], $acv->getField('name', true));
@@ -370,20 +373,24 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$smarty->saveCache($cacheKeyPage, $pageData);
}
$vars = array(
// menuId 9: Achievement g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'title' => implode(" - ", $pageData['title']),
'path' => "[".implode(", ", $pageData['path'])."]",// menuId 9: Achievement (g_initPath)
'tab' => 0, // tabId 0: Database for g_initHeader($tab)
'path' => json_encode($pageData['path'], JSON_NUMERIC_CHECK),
'tab' => 0,
'type' => TYPE_ACHIEVEMENT,
'typeId' => $id,
);
'typeId' => $id
));
$smarty->updatePageVars($vars);
$smarty->assign('community', CommunityContent::getAll(TYPE_ACHIEVEMENT, $id)); // comments, screenshots, videos
$smarty->assign('lang', array_merge(Lang::$main, Lang::$game, Lang::$achievement));
$smarty->assign('lvData', $pageData);
// Mysql query execution statistics
$smarty->assign('mysql', DB::Aowow()->getStatistics());
// load the page
$smarty->display('achievement.tpl');
?>

View File

@@ -72,7 +72,7 @@ if (!$smarty->loadCache($cacheKey, $pageData, $filter))
$path[] = $cat['id'];
$title[] = Util::localizedString($cat, 'name');
}
array_unshift($title, Util::ucFirst(Lang::$achievement['achievements']));
array_unshift($title, Util::ucFirst(Lang::$game['achievements']));
}
// fill g_items, g_titles, g_achievements

View File

@@ -53,7 +53,7 @@ if (!$smarty->loadCache($cacheKey, $pageData))
'deps' => $deps,
'calendar' => false, // todo (med): fix it Felix!
'params' => array(
'tabs' => '$myTabs'
// 'tabs' => '$myTabs'
)
);

View File

@@ -4,20 +4,16 @@ if (!defined('AOWOW_REVISION'))
die('illegal access');
// require 'includes/game.php';
// require 'includes/allquests.php';
// require 'includes/allnpcs.php';
// require 'includes/allobjects.php';
// require 'includes/class.community.php'; // wo dont need those .. yet
$id = intVal($pageParam);
$item = new ItemList(array(['i.entry', $id]));
$cacheKeyPage = implode('_', [CACHETYPE_PAGE, TYPE_ITEM, $id, -1, User::$localeId]);
if (isset($_GET['xml']))
die('unsupported, as i do not see the point');
require 'includes/class.community.php';
$id = intVal($pageParam);
$cacheKeyPage = implode('_', [CACHETYPE_PAGE, TYPE_ITEM, $id, -1, User::$localeId]);
// AowowPower-request
if (isset($_GET['power']))
{
header('Content-type: application/x-javascript; charsetUTF-8');
@@ -53,6 +49,7 @@ if (isset($_GET['power']))
// output json for tooltips
if (!$smarty->loadCache($cacheKeyTooltip, $x))
{
$item = new ItemList(array(['i.entry', $id]));
if ($item->error)
die('$WowheadPower.registerItem(\''.$itemString.'\', '.User::$localeId.', {})');
@@ -69,19 +66,25 @@ if (isset($_GET['power']))
die($x);
}
// didn't die...
// build regular page
// v there be dragons v
$cacheKey = generateCacheKey($id);
if(!$smarty->loadCache($cacheKeyPage, $item))
// regular page
if (!$smarty->loadCache($cacheKeyPage, $item))
{
$item = new ItemList(array(['i.entry', $id]));
if ($item->error)
$smarty->notFound(Lang::$game['item']);
// not yet implemented -> chicken out
$smarty->error();
unset($item);
// Информация о вещи...
$item = iteminfo($id, 1);
$path = [0, 0, $item['classs'], $item['subclass'], $item['type']];
// Поиск мобов с которых эта вещь лутится
$drops_cr = drop('creature_loot_template', $item['entry']);
@@ -803,25 +806,28 @@ if(!$smarty->loadCache($cacheKeyPage, $item))
$item['color'] = colorByQuality($item['quality']);
$smarty->saveCache($cacheKeyPage, $item);
$smarty->saveCache($cacheKeyPage, $pageData);
}
$page = array(
'Book' => $item['pagetext'] ? true : false,
'Title' => $item['name'].' - '.$smarty->get_config_vars('Items'),
// menuId 0: Item g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'book' => $pageData['page']['pagetext'] ? true : false,
'title' => implode(" - ", $pageData['title']),
'path' => json_encode($pageData['path'], JSON_NUMERIC_CHECK),
'tab' => 0,
'type' => 3,
'typeid' => $item['entry'],
'path' => path(0, 0, $item['classs'], $item['subclass'], $item['type'])
);
'type' => TYPE_ITEM,
'typeid' => $id
));
$smarty->updatePageVars($page);
$smarty->assign('community', CommunityContent::getAll(TYPE_ITEM, $id)); // comments, screenshots, videos
$smarty->assign('lang', array_merge(Lang::$main, Lang::$game, Lang::$item, ['colon' => Lang::$colon]));
$smarty->assign('lvData', $pageData);
// Комментарии
$smarty->assign('community', Community::getAll($page['type'], $page['typeid']));
// Количество MySQL запросов
// Mysql query execution statistics
$smarty->assign('mysql', $DB->getStatistics());
$smarty->assign('item', $item);
// load the page
$smarty->display('item.tpl');
?>

View File

@@ -15,6 +15,11 @@ if (!$smarty->loadCache($cacheKey, $pageData))
{
$itemsets = new ItemsetList([], true); // class selection is via filter, nothing applies here
$pageData = array(
'data' => $itemsets->getListviewData(), // listview content
'params' => []
);
$itemsets->addGlobalsToJscript($pageData);
// recreate form selection
@@ -25,9 +30,6 @@ if (!$smarty->loadCache($cacheKey, $pageData))
if (isset($filter['cl']))
$path[] = $filter['cl'];
// listview content
$pageData['data'] = $itemsets->getListviewData();
// create note if search limit was exceeded
if ($itemsets->getMatches() > $AoWoWconf['sqlLimit'])
{

491
pages/npc.php Normal file
View File

@@ -0,0 +1,491 @@
<?php
if (!defined('AOWOW_REVISION'))
die('illegal access');
require 'includes/class.community.php';
$id = intVal($pageParam);
$cacheKeyPage = implode('_', [CACHETYPE_PAGE, TYPE_NPC, $id, -1, User::$localeId]);
$cacheKeyTooltip = implode('_', [CACHETYPE_TOOLTIP, TYPE_NPC, $id, -1, User::$localeId]);
// AowowPower-request
if (isset($_GET['power']))
{
header('Content-type: application/x-javascript; charsetUTF-8');
Util::powerUseLocale(@$_GET['domain']);
if (!$smarty->loadCache($cacheKeyTooltip, $x))
{
$npc = new CreatureList(array(['ct.entry', $id]));
if ($npc->error)
die('$WowheadPower.registerNpc(\''.$id.'\', '.User::$localeId.', {})');
$s = $npc->getSpawns(true);
$x = '$WowheadPower.registerNpc('.$id.', '.User::$localeId.", {\n";
$x .= "\tname_".User::$localeString.": '".Util::jsEscape($npc->getField('name', true))."',\n";
$x .= "\ttooltip_".User::$localeString.': \''.$npc->renderTooltip()."',\n";
$x .= "\tmap: ".($s ? '{zone: '.$s[0].', coords: {0:'.json_encode($s[1], JSON_NUMERIC_CHECK).'}' : '{}')."\n";
$x .= "});";
$smarty->saveCache($cacheKeyTooltip, $x);
}
die($x);
}
// regular page
if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$npc = new CreatureList(array(['ct.entry', $id]));
if ($npc->error)
$smarty->notFound(Lang::$game['npc']);
// not yet implemented -> chicken out
$smarty->error();
unset($npc);
// Ищем NPC:
$npc = array();
$path = [0, 4, $npc['type']];
$row = $DB->selectRow('
SELECT
?#, c.entry, c.name,
{
l.name_loc'.$_SESSION['locale'].' as `name_loc`,
l.subname_loc'.$_SESSION['locale'].' as `subname_loc`,
?,
}
f.name_loc'.$_SESSION['locale'].' as `faction-name`, ft.factionID as `factionID`,
((CASE exp WHEN 0 THEN mincls.basehp0 WHEN 1 THEN mincls.basehp1 WHEN 2 THEN mincls.basehp2 END)*Health_mod) AS minhealth,
((CASE exp WHEN 0 THEN maxcls.basehp0 WHEN 1 THEN maxcls.basehp1 WHEN 2 THEN maxcls.basehp2 END)*Health_mod) AS maxhealth,
(mincls.basemana*Mana_mod) AS minmana,
(maxcls.basemana*Mana_mod) AS maxmana,
(maxcls.basearmor*Armor_mod) AS armor
FROM ?_factiontemplate ft, ?_factions f, creature_template c
LEFT JOIN creature_classlevelstats mincls ON mincls.level=minlevel AND mincls.class=unit_class
LEFT JOIN creature_classlevelstats maxcls ON maxcls.level=maxlevel AND maxcls.class=unit_class
{
LEFT JOIN (locales_creature l)
ON l.entry = c.entry AND ?
}
WHERE
c.entry = ?
AND ft.factiontemplateID = c.faction_A
AND f.factionID = ft.factionID
LIMIT 1
',
$npc_cols[1],
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$id
);
if($row)
{
$npc = $row;
$npc['name'] = localizedName($row);
$npc['subname'] = localizedName($row, 'subname');
if($npc['rank'] == 3)
{
$npc['minlevel'] = '??';
$npc['maxlevel'] = '??';
}
$npc['mindmg'] = round(($row['mindmg'] + $row['attackpower']) * $row['dmg_multiplier']);
$npc['maxdmg'] = round(($row['maxdmg'] + $row['attackpower']) * $row['dmg_multiplier']);
$toDiv = array('minhealth', 'maxmana', 'minmana', 'maxhealth', 'armor', 'mindmg', 'maxdmg');
// Разделяем на тысячи (ххххххххх => ххх,ххх,ххх)
foreach($toDiv as $e)
$npc[$e] = number_format($npc[$e]);
$npc['rank'] = $smarty->get_config_vars('rank'.$npc['rank']);
// faction_A = faction_H
$npc['faction_num'] = $row['factionID'];
$npc['faction'] = $row['faction-name'];
// Деньги
$money = ($row['mingold']+$row['maxgold']) / 2;
$npc = array_merge($npc, money2coins($money));
// Героик/нормал копия НПС
if($npc['difficulty_entry_1'])
{
// это нормал НПС, ищем героика
if($tmp = creatureinfo($npc['difficulty_entry_1']))
{
$npc['heroic'] = array(
'type' => 0,
'entry' => $tmp['entry'],
'name' => str_replace(LOCALE_HEROIC, '', $tmp['name'])
);
unset($tmp);
}
}
else
{
// А может быть героик НПС одним для нескольких нормалов?
// считаем что нет
$tmp = $DB->selectRow('
SELECT c.entry, c.name
{
, l.name_loc?d as `name_loc`
}
FROM creature_template c
{
LEFT JOIN (locales_creature l)
ON l.entry = c.entry AND ?
}
WHERE
c.difficulty_entry_1 = ?d
LIMIT 1
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$npc['entry']
);
if($tmp)
{
$npc['heroic'] = array(
'type' => 1,
'entry' => $tmp['entry'],
'name' => localizedName($tmp)
);
$npc['name'] = str_replace(' (1)', '', $npc['name']);
$normal_entry = $tmp['entry'];
unset($tmp);
}
}
// Дроп
$lootid=$row['lootid'];
$skinid=$row['skinloot'];
$pickpocketid=$row['pickpocketloot'];
// Используемые спеллы
$npc['ablities'] = array();
$tmp = array();
for($j=0;$j<=4;++$j)
{
if($row['spell'.$j] && !in_array($row['spell'.$j], $tmp))
{
$tmp[] = $row['spell'.$j];
if($data = spellinfo($row['spell'.$j], 0))
{
if($data['name'])
$npc['abilities'][] = $data;
}
}
}
for($j=1;$j<4;$j++)
{
$tmp2 = $DB->select('
SELECT action?d_param1
FROM creature_ai_scripts
WHERE
creature_id=?d
AND action?d_type=11
',
$j,
$npc['entry'],
$j
);
if($tmp2)
foreach($tmp2 as $i=>$tmp3)
if(!in_array($tmp2[$i]['action'.$j.'_param1'], $tmp))
{
$tmp[] = $tmp2[$i]['action'.$j.'_param1'];
if($data = spellinfo($tmp2[$i]['action'.$j.'_param1'], 0))
{
if($data['name'])
$npc['abilities'][] = $data;
}
}
}
if(!$npc['ablities'])
unset($npc['ablities']);
// Обучает:
// Если это пет со способностью:
/* // Временно закомментировано
$row = $DB->selectRow('
SELECT Spell1, Spell2, Spell3, Spell4
FROM petcreateinfo_spell
WHERE
entry=?d
',
$npc['entry']
);
if($row)
{
$npc['teaches'] = array();
for($j=1;$j<=4;$j++)
if($row['Spell'.$j])
for($k=1;$k<=3;$k++)
{
$spellrow = $DB->selectRow('
SELECT ?#, spellID
FROM ?_spell, ?_spellicons
WHERE
spellID=(SELECT effect'.$k.'triggerspell FROM ?_spell WHERE spellID=?d AND (effect'.$k.'id IN (36,57)))
AND id=spellicon
LIMIT 1
',
$spell_cols[2],
$row['Spell'.$j]
);
if($spellrow)
{
$num = count($npc['teaches']);
$npc['teaches'][$num] = array();
$npc['teaches'][$num] = spellinfo2($spellrow);
}
}
}
unset ($row);*/
// Если это просто тренер
$teachspells = $DB->select('
SELECT ?#, spellID
FROM npc_trainer, ?_spell, ?_spellicons
WHERE
(
-entry IN (SELECT spell FROM npc_trainer WHERE entry = ?)
OR (entry = ? AND npc_trainer.spell > 0)
)
AND spellID = npc_trainer.spell
AND id=spellicon
',
$spell_cols[2],
$npc['entry'],
$npc['entry']
);
if($teachspells)
{
if(!(IsSet($npc['teaches'])))
$npc['teaches'] = array();
foreach($teachspells as $teachspell)
{
$num = count($npc['teaches']);
$npc['teaches'][$num] = array();
$npc['teaches'][$num] = spellinfo2($teachspell);
}
}
unset ($teachspells);
// Продает:
$rows_s = $DB->select('
SELECT ?#, i.entry, i.maxcount, n.`maxcount` as `drop-maxcount`, n.ExtendedCost
{, l.name_loc?d AS `name_loc`}
FROM npc_vendor n, ?_icons, item_template i
{LEFT JOIN (locales_item l) ON l.entry=i.entry AND ?d}
WHERE
n.entry=?
AND i.entry=n.item
AND id=i.displayid
',
$item_cols[2],
($_SESSION['locale'])? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale'])? 1: DBSIMPLE_SKIP,
$id
);
if($rows_s)
{
$npc['sells'] = array();
foreach($rows_s as $numRow=>$row)
{
$npc['sells'][$numRow] = array();
$npc['sells'][$numRow] = iteminfo2($row);
$npc['sells'][$numRow]['maxcount'] = $row['drop-maxcount'];
$npc['sells'][$numRow]['cost'] = array();
if($row['ExtendedCost'])
{
$extcost = $DB->selectRow('SELECT * FROM ?_item_extended_cost WHERE extendedcostID=?d LIMIT 1', abs($row['ExtendedCost']));
if($extcost['reqhonorpoints']>0)
$npc['sells'][$numRow]['cost']['honor'] = (($npc['A']==1)? 1: -1) * $extcost['reqhonorpoints'];
if($extcost['reqarenapoints']>0)
$npc['sells'][$numRow]['cost']['arena'] = $extcost['reqarenapoints'];
$npc['sells'][$numRow]['cost']['items'] = array();
for($j=1;$j<=5;$j++)
if(($extcost['reqitem'.$j]>0) and ($extcost['reqitemcount'.$j]>0))
{
allitemsinfo($extcost['reqitem'.$j], 0);
$npc['sells'][$numRow]['cost']['items'][] = array('item' => $extcost['reqitem'.$j], 'count' => $extcost['reqitemcount'.$j]);
}
}
if($row['BuyPrice']>0)
$npc['sells'][$numRow]['cost']['money'] = $row['BuyPrice'];
}
unset ($row);
unset ($numRow);
unset ($extcost);
}
unset ($rows_s);
// Дроп
if(!($npc['drop'] = loot('creature_loot_template', $lootid)))
unset ($npc['drop']);
// Кожа
if(!($npc['skinning'] = loot('skinning_loot_template', $skinid)))
unset ($npc['skinning']);
// Воруеццо
if(!($npc['pickpocketing'] = loot('pickpocketing_loot_template', $pickpocketid)))
unset ($npc['pickpocketing']);
// Начиниают квесты...
$rows_qs = $DB->select('
SELECT q.?#
FROM quest_template q
LEFT JOIN creature_questrelation c on q.id = c.quest
WHERE
c.id=?
',
$quest_cols[2],
$id
);
if($rows_qs)
{
$npc['starts'] = array();
foreach($rows_qs as $numRow=>$row) {
$npc['starts'][] = GetQuestInfo($row, 0xFFFFFF);
}
}
unset ($rows_qs);
// Начиниают event-only квесты...
$rows_qse = event_find(array('quest_creature_id' => $id));
if($rows_qse)
{
if (!isset($npc['starts']))
$npc['starts'] = array();
foreach($rows_qse as $event)
foreach($event['creatures_quests_id'] as $ids)
$npc['starts'][] = GetDBQuestInfo($ids['quest'], 0xFFFFFF);
}
unset ($rows_qse);
// Заканчивают квесты...
$rows_qe = $DB->select('
SELECT q.?#
FROM quest_template q
LEFT JOIN creature_involvedrelation c on q.id = c.quest
WHERE
c.id=?
',
$quest_cols[2],
$id
);
if($rows_qe)
{
$npc['ends'] = array();
foreach($rows_qe as $numRow=>$row) {
$npc['ends'][] = GetQuestInfo($row, 0xFFFFFF);
}
}
unset ($rows_qe);
// Необходимы для квеста..
$rows_qo = $DB->select('
SELECT ?#
FROM quest_template
WHERE
RequiredNpcOrGo1=?
OR RequiredNpcOrGo2=?
OR RequiredNpcOrGo3=?
OR RequiredNpcOrGo4=?
',
$quest_cols[2],
$id, $id, $id, $id
);
if($rows_qo)
{
$npc['objectiveof'] = array();
foreach($rows_qo as $numRow=>$row)
$npc['objectiveof'][] = GetQuestInfo($row, 0xFFFFFF);
}
unset ($rows_qo);
// Цель критерии
$rows = $DB->select('
SELECT a.id, a.faction, a.name_loc?d AS name, a.description_loc?d AS description, a.category, a.points, s.iconname, z.areatableID
FROM ?_spellicons s, ?_achievementcriteria c, ?_achievement a
LEFT JOIN (?_zones z) ON a.map != -1 AND a.map = z.mapID
WHERE
a.icon = s.id
AND a.id = c.refAchievement
AND c.type IN (?a)
AND c.value1 = ?d
GROUP BY a.id
ORDER BY a.name_loc?d
',
$_SESSION['locale'],
$_SESSION['locale'],
array(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE),
$npc['entry'],
$_SESSION['locale']
);
if($rows)
{
$npc['criteria_of'] = array();
foreach($rows as $row)
{
allachievementsinfo2($row['id']);
$npc['criteria_of'][] = achievementinfo2($row);
}
}
// Положения созданий божих (для героик НПС не задана карта, юзаем из нормала):
if($normal_entry)
// мы - героик НПС, определяем позицию по нормалу
$npc['position'] = position($normal_entry, 'creature', 2);
else
// мы - нормал НПС или НПС без сложности
$npc['position'] = position($npc['entry'], 'creature', 1);
// Исправить type, чтобы подсвечивались event-овые NPC
if ($npc['position'])
foreach ($npc['position'] as $z => $zone)
foreach ($zone['points'] as $p => $pos)
if ($pos['type'] == 0 && ($events = event_find(array('creature_guid' => $pos['guid']))))
{
$names = array_select_key(event_name($events), 'name');
$npc['position'][$z]['points'][$p]['type'] = 4;
$npc['position'][$z]['points'][$p]['events'] = implode(", ", $names);
}
}
$smarty->saveCache($cacheKeyPage, $pageData);
}
// menuId 4: Npc g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'mapper' => true,
'title' => implode(" - ", $pageData['title']),
'path' => json_encode($pageData['path'], JSON_NUMERIC_CHECK),
'tab' => 0,
'type' => TYPE_NPC,
'typeId' => $id
));
$smarty->assign('community', CommunityContent::getAll(TYPE_NPC, $id)); // comments, screenshots, videos
$smarty->assign('lang', array_merge(Lang::$main, Lang::$game, Lang::$npc, ['colon' => Lang::$colon]));
$smarty->assign('lvData', $pageData);
// Mysql query execution statistics
$smarty->assign('mysql', $DB->getStatistics());
// load the page
$smarty->display('npc.tpl');
?>

622
pages/quest.php Normal file
View File

@@ -0,0 +1,622 @@
<?php
if (!defined('AOWOW_REVISION'))
die('illegal access');
require 'includes/class.community.php';
$id = intVal($pageParam);
$cacheKeyPage = implode('_', [CACHETYPE_PAGE, TYPE_QUEST, $id, -1, User::$localeId]);
$cacheKeyTooltip = implode('_', [CACHETYPE_TOOLTIP, TYPE_QUEST, $id, -1, User::$localeId]);
// AowowPower-request
if (isset($_GET['power']))
{
header('Content-type: application/x-javascript; charsetUTF-8');
Util::powerUseLocale(@$_GET['domain']);
if (!$smarty->loadCache($cacheKeyTooltip, $x))
{
$quest = new QuestList(array(['qt.id', $id]));
if ($quest->error)
die('$WowheadPower.registerQuest(\''.$id.'\', '.User::$localeId.', {})');
$x = '$WowheadPower.registerQuest('.$id.', '.User::$localeId.", {\n";
$x .= "\tname_".User::$localeString.": '".Util::jsEscape($quest->getField('Title', true))."',\n";
$x .= "\ttooltip_".User::$localeString.': \''.$quest->renderTooltip()."'\n"; // daily: 1 ... not used in wowheadPower => omitted here
$x .= "});";
$smarty->saveCache($cacheKeyTooltip, $x);
}
die($x);
}
// regular page
if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$quest = new QuestList(array(['qt.id', $id]));
if ($quest->error)
$smarty->notFound(Lang::$game['quest']);
// not yet implemented -> chicken out
$smarty->error();
unset($quest);
// Основная инфа
$quest = GetDBQuestInfo($id, 0xFFFFFF);
$path = [0, 3]; // TODO
/* ЦЕПОЧКА КВЕСТОВ */
// Добавляем сам квест в цепочку
$quest['series'] = array(
array(
'Id' => $quest['Id'],
'Title' => $quest['Title'],
'NextQuestIdChain' => $quest['NextQuestIdChain']
)
);
// Квесты в цепочке до этого квеста
$tmp = $quest['series'][0];
while($tmp)
{
$tmp = $DB->selectRow('
SELECT q.Id, q.Title
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?d}
WHERE q.NextQuestIdChain=?d
LIMIT 1
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['series'][0]['Id']
);
if($tmp)
{
$tmp['Title'] = localizedName($tmp, 'Title');
array_unshift($quest['series'], $tmp);
}
}
// Квесты в цепочке после этого квеста
$tmp = end($quest['series']);
while($tmp)
{
$tmp = $DB->selectRow('
SELECT q.Id, q.Title, q.NextQuestIdChain
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?}
WHERE q.Id=?d
LIMIT 1
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['series'][count($quest['series'])-1]['NextQuestIdChain']
);
if($tmp)
{
$tmp['Title'] = localizedName($tmp, 'Title');
array_push($quest['series'], $tmp);
}
}
unset($tmp);
if(count($quest['series'])<=1)
unset($quest['series']);
/* ДРУГИЕ КВЕСТЫ */
// (после их нахождения проверяем их тайтлы на наличие локализации)
// Квесты, которые необходимо выполнить, что бы получить этот квест
if(!$quest['req'] = $DB->select('
SELECT q.Id, q.Title, q.NextQuestIdChain
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?}
WHERE
(q.NextQuestId=?d AND q.ExclusiveGroup<0)
OR (q.Id=?d AND q.NextQuestIdChain<>?d)
LIMIT 20',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id'], $quest['PrevQuestId'], $quest['Id']
)
)
unset($quest['req']);
else
$questItems[] = 'req';
// Квесты, которые становятся доступными, только после того как выполнен этот квест (необязательно только он)
if(!$quest['open'] = $DB->select('
SELECT q.Id, q.Title
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?}
WHERE
(q.PrevQuestId=?d AND q.Id<>?d)
OR q.Id=?d
LIMIT 20',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id'], $quest['NextQuestIdChain'], $quest['NextQuestId']
)
)
unset($quest['open']);
else
$questItems[] = 'open';
// Квесты, которые становятся недоступными после выполнения этого квеста
if($quest['ExclusiveGroup']>0)
if(!$quest['closes'] = $DB->select('
SELECT q.Id, q.Title
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?}
WHERE
q.ExclusiveGroup=?d AND q.Id<>?d
LIMIT 20
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['ExclusiveGroup'], $quest['Id']
)
)
unset($quest['closes']);
else
$questItems[] = 'closes';
// Требует выполнения одного из квестов, на выбор:
if(!$quest['reqone'] = $DB->select('
SELECT q.Id, q.Title
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?}
WHERE
q.ExclusiveGroup>0 AND q.NextQuestId=?d
LIMIT 20
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id']
)
)
unset($quest['reqone']);
else
$questItems[] = 'reqone';
// Квесты, которые доступны, только во время выполнения этого квеста
if(!$quest['enables'] = $DB->select('
SELECT q.Id, q.Title
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?}
WHERE q.PrevQuestId=?d
LIMIT 20
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
-$quest['Id']
)
)
unset($quest['enables']);
else
$questItems[] = 'enables';
// Квесты, во время выполнения которых доступен этот квест
if($quest['PrevQuestId']<0)
if(!$quest['enabledby'] = $DB->select('
SELECT q.Id, q.Title
{, l.Title_loc?d as Title_loc}
FROM quest_template q
{LEFT JOIN (locales_quest l) ON l.Id=q.Id AND ?}
WHERE q.Id=?d
LIMIT 20
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
-$quest['PrevQuestId']
)
)
unset($quest['enabledby']);
else
$questItems[] = 'enabledby';
// Теперь локализуем все тайтлы квестов
if($questItems)
foreach($questItems as $item)
foreach($quest[$item] as $i => $x)
$quest[$item][$i]['Title'] = localizedName($quest[$item][$i], 'Title');
/* НАГРАДЫ И ТРЕБОВАНИЯ */
if($quest['RequiredSkillPoints']>0 && $quest['SkillOrClassMask']>0)
{
// Требуемый уровень скилла, что бы получить квест
/*
$skills = array(
-264 => 197, // Tailoring
-182 => 165, // Leatherworking
-24 => 182, // Herbalism
-101 => 356, // Fishing
-324 => 129, // First Aid
-201 => 202, // Engineering
-304 => 185, // Cooking
-121 => 164, // Blacksmithing
-181 => 171 // Alchemy
);
*/
// TODO: skill localization
$quest['reqskill'] = array(
'name' => $DB->selectCell('SELECT name_loc'.$_SESSION['locale'].' FROM ?_skill WHERE skillID=?d LIMIT 1',$quest['SkillOrClassMask']),
'value' => $quest['RequiredSkillPoints']
);
}
elseif($quest['SkillOrClassMask']<0)
{
$s = array();
foreach($classes as $i => $class)
if (intval(-$quest['SkillOrClassMask'])==$i)
$s[] = $class;
if (!count($s) == 0)
// Требуемый класс, что бы получить квест
$quest['reqclass'] = implode(", ", $s);
}
// Требуемые отношения с фракциями, что бы начать квест
if($quest['RequiredMinRepFaction'])
$quest['RequiredMinRep'] = array(
'name' => $DB->selectCell('SELECT name_loc'.$_SESSION['locale'].' FROM ?_factions WHERE factionID=?d LIMIT 1', $quest['RequiredMinRepFaction']),
'entry' => $quest['RequiredMinRepFaction'],
'value' => reputations($quest['RequiredMinRepValue'])
);
if($quest['RequiredMaxRepFaction'])
$quest['RequiredMaxRep'] = array(
'name' => $DB->selectCell('SELECT name_loc'.$_SESSION['locale'].' FROM ?_factions WHERE factionID=?d LIMIT 1', $quest['RequiredMaxRepFaction']),
'entry' => $quest['RequiredMaxRepFaction'],
'value' => reputations($quest['RequiredMaxRepValue'])
);
// Спеллы не требуют локализации, их инфа берется из базы
// Хранить в базе все локализации - задачка на будующее
// Спелл, кастуемый на игрока в начале квеста
if($quest['SourceSpell'])
{
$tmp = $DB->selectRow('
SELECT ?#, s.spellname_loc'.$_SESSION['locale'].'
FROM ?_spell s, ?_spellicons si
WHERE
s.spellID=?d
AND si.id=s.spellicon
LIMIT 1',
$spell_cols[0],
$quest['SourceSpell']
);
if($tmp)
{
$quest['SourceSpell'] = array(
'name' => $tmp['spellname_loc'.$_SESSION['locale']],
'entry' => $tmp['spellID']);
allspellsinfo2($tmp);
}
unset($tmp);
}
// Итем, выдаваемый игроку в начале квеста
if($quest['SourceItemId'])
{
$quest['SourceItemId'] = iteminfo($quest['SourceItemId']);
$quest['SourceItemId']['SourceItemCount'] = $quest['SourceItemCount'];
}
// Дополнительная информация о квесте (флаги, повторяемость, скрипты)
$quest['flagsdetails'] = GetFlagsDetails($quest);
if (!$quest['flagsdetails'])
unset($quest['flagsdetails']);
// Спелл, кастуемый на игрока в награду за выполнение
if($quest['RewardSpellCast']>0 || $quest['RewardSpell']>0)
{
$tmp = $DB->SelectRow('
SELECT ?#, s.spellname_loc'.$_SESSION['locale'].'
FROM ?_spell s, ?_spellicons si
WHERE
s.spellID=?d
AND si.id=s.spellicon
LIMIT 1',
$spell_cols[0],
$quest['RewardSpell']>0?$quest['RewardSpell']:$quest['RewardSpellCast']
);
if($tmp)
{
$quest['spellreward'] = array(
'name' => $tmp['spellname_loc'.$_SESSION['locale']],
'entry' => $tmp['spellID'],
'realentry' => $quest['RewardSpellCast']>0 ? $quest['RewardSpellCast'] : $quest['RewardSpell']);
allspellsinfo2($tmp);
}
unset($tmp);
}
// Создания, необходимые для квеста
//$quest['creaturereqs'] = array();
//$quest['objectreqs'] = array();
$quest['coreqs'] = array();
for($i=0;$i<=4;++$i)
{
//echo $quest['ReqCreatureOrGOCount'.$i].'<br />';
if($quest['RequiredNpcOrGo'.$i] != 0 && $quest['RequiredNpcOrGoCount'.$i] != 0)
{
if($quest['RequiredNpcOrGo'.$i] > 0)
{
// Необходимо какое-либо взамодействие с созданием
$quest['coreqs'][$i] = array_merge(
creatureinfo($quest['RequiredNpcOrGo'.$i]),
array('req_type' => 'npc')
);
}
else
{
// необходимо какое-то взаимодействие с объектом
$quest['coreqs'][$i] = array_merge(
objectinfo(-$quest['RequiredNpcOrGo'.$i]),
array('req_type' => 'object')
);
}
// Количество
$quest['coreqs'][$i]['count'] = $quest['RequiredNpcOrGoCount'.$i];
// Спелл
if($quest['RequiredSpellCast'.$i])
$quest['coreqs'][$i]['spell'] = array(
'name' => $DB->selectCell('SELECT spellname_loc'.$_SESSION['locale'].' FROM ?_spell WHERE spellid=?d LIMIT 1', $quest['RequiredSpellCast'.$i]),
'entry' => $quest['RequiredSpellCast'.$i]
);
}
}
if(!$quest['coreqs'])
unset($quest['coreqs']);
// Вещи, необходимые для квеста
$quest['itemreqs'] = array();
for($i=0;$i<=4;++$i)
{
if($quest['RequiredItemId'.$i]!=0 && $quest['RequiredItemCount'.$i]!=0)
$quest['itemreqs'][] = array_merge(iteminfo($quest['RequiredItemId'.$i]), array('count' => $quest['RequiredItemCount'.$i]));
}
if(!$quest['itemreqs'])
unset($quest['itemreqs']);
// Фракции необходимые для квеста
if($quest['RepObjectiveFaction']>0)
{
$quest['factionreq'] = array(
'name' => $DB->selectCell('SELECT name_loc'.$_SESSION['locale'].' FROM ?_factions WHERE factionID=?d LIMIT 1', $quest['RepObjectiveFaction']),
'entry' => $quest['RepObjectiveFaction'],
'value' => reputations($quest['RepObjectiveValue'])
);
}
/* КВЕСТГИВЕРЫ И КВЕСТТЕЙКЕРЫ */
// КВЕСТГИВЕРЫ
// НПС
$rows = $DB->select('
SELECT c.entry, c.name, A, H
{, l.name_loc?d AS name_loc}
FROM creature_questrelation q, ?_factiontemplate, creature_template c
{LEFT JOIN (locales_creature l) ON l.entry=c.entry AND ?}
WHERE
q.quest=?d
AND c.entry=q.id
AND factiontemplateID=c.faction_A
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id']
);
if($rows)
{
foreach($rows as $tmp)
{
$tmp['name'] = localizedName($tmp);
if($tmp['A'] == -1 && $tmp['H'] == 1)
$tmp['side'] = 'horde';
elseif($tmp['A'] == 1 && $tmp['H'] == -1)
$tmp['side'] = 'alliance';
$quest['start'][] = array_merge($tmp, array('type' => 'npc'));
}
}
unset($rows);
// НПС-ивентовые
$rows = event_find(array('quest_id' => $quest['Id']));
if ($rows)
{
foreach ($rows as $event)
foreach ($event['creatures_quests_id'] as $ids)
if ($ids['quest'] == $quest['Id'])
{
$tmp = creatureinfo($ids['creature']);
if($tmp['react'] == '-1,1')
$tmp['side'] = 'horde';
elseif($tmp['react'] == '1,-1')
$tmp['side'] = 'alliance';
$tmp['type'] = 'npc';
$tmp['event'] = $event['entry'];
$quest['start'][] = $tmp;
}
}
unset($rows);
// ГО
$rows = $DB->select('
SELECT g.entry, g.name
{, l.name_loc?d AS name_loc}
FROM gameobject_questrelation q, gameobject_template g
{LEFT JOIN (locales_gameobject l) ON l.entry = g.entry AND ?}
WHERE
q.quest=?d
AND g.entry=q.id
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id']
);
if($rows)
{
foreach($rows as $tmp)
{
$tmp['name'] = localizedName($tmp);
$quest['start'][] = array_merge($tmp, array('type' => 'object'));
}
}
unset($rows);
// итем
$rows = $DB->select('
SELECT i.name, i.entry, i.quality, LOWER(a.iconname) AS iconname
{, l.name_loc?d AS name_loc}
FROM ?_icons a, item_template i
{LEFT JOIN (locales_item l) ON l.entry=i.entry AND ?}
WHERE
startquest = ?d
AND id = displayid
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id']
);
if($rows)
{
foreach($rows as $tmp)
{
$tmp['name'] = localizedName($tmp);
$quest['start'][] = array_merge($tmp, array('type' => 'item'));
}
}
unset($rows);
// КВЕСТТЕЙКЕРЫ
// НПС
$rows = $DB->select('
SELECT c.entry, c.name, A, H
{, l.name_loc?d AS name_loc}
FROM creature_involvedrelation q, ?_factiontemplate, creature_template c
{LEFT JOIN (locales_creature l) ON l.entry=c.entry AND ?}
WHERE
q.quest=?d
AND c.entry=q.id
AND factiontemplateID=c.faction_A
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id']
);
if($rows)
{
foreach($rows as $tmp)
{
$tmp['name'] = localizedName($tmp);
if($tmp['A'] == -1 && $tmp['H'] == 1)
$tmp['side'] = 'horde';
elseif($tmp['A'] == 1 && $tmp['H'] == -1)
$tmp['side'] = 'alliance';
$quest['end'][] = array_merge($tmp, array('type' => 'npc'));
}
}
unset($rows);
// ГО
$rows = $DB->select('
SELECT g.entry, g.name
{, l.name_loc?d AS name_loc}
FROM gameobject_involvedrelation q, gameobject_template g
{LEFT JOIN (locales_gameobject l) ON l.entry = g.entry AND ?}
WHERE
q.quest=?d
AND g.entry=q.id
',
($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
$quest['Id']
);
if($rows)
{
foreach($rows as $tmp)
{
$tmp['name'] = localizedName($tmp);
$quest['end'][] = array_merge($tmp, array('type' => 'object'));
}
}
unset($rows);
// Цель критерии
$rows = $DB->select('
SELECT a.id, a.faction, a.name_loc?d AS name, a.description_loc?d AS description, a.category, a.points, s.iconname, z.areatableID
FROM ?_spellicons s, ?_achievementcriteria c, ?_achievement a
LEFT JOIN (?_zones z) ON a.map != -1 AND a.map = z.mapID
WHERE
a.icon = s.id
AND a.id = c.refAchievement
AND c.type IN (?a)
AND c.value1 = ?d
GROUP BY a.id
ORDER BY a.name_loc?d
',
$_SESSION['locale'],
$_SESSION['locale'],
array(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST),
$quest['Id'],
$_SESSION['locale']
);
if($rows)
{
$quest['criteria_of'] = array();
foreach($rows as $row)
{
allachievementsinfo2($row['id']);
$quest['criteria_of'][] = achievementinfo2($row);
}
}
// Награды и благодарности, присылаемые почтой
if ($quest['RewardMailTemplateId'])
{
if(!($quest['mailrewards'] = loot('mail_loot_template', $quest['RewardMailTemplateId'])))
unset ($quest['mailrewards']);
}
if ($quest['RewardMailDelay'])
$quest['maildelay'] = sec_to_time($quest['RewardMailDelay']);
$smarty->saveCache($cacheKeyPage, $pageData);
}
// menuId 3: Quest g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'title' => implode(" - ", $pageData['title']),
'path' => json_encode($pageData['path'], JSON_NUMERIC_CHECK),
'tab' => 0,
'type' => TYPE_QUEST,
'typeId' => $id
));
$smarty->assign('community', CommunityContent::getAll(TYPE_QUEST, $id)); // comments, screenshots, videos
$smarty->assign('lang', array_merge(Lang::$main, Lang::$game, Lang::$quest, ['colon' => Lang::$colon]));
$smarty->assign('lvData', $pageData);
// Mysql query execution statistics
$smarty->assign('mysql', $DB->getStatistics());
// load the page
$smarty->display('quest.tpl');
?>

View File

@@ -4,13 +4,14 @@ if (!defined('AOWOW_REVISION'))
die('illegal access');
require 'includes/class.community.php'; // not needed .. yet
require 'includes/class.community.php';
$id = intVal($pageParam);
$cacheKeyPage = implode('_', [CACHETYPE_PAGE, TYPE_SPELL, $id, -1, User::$localeId]);
$cacheKeyTooltip = implode('_', [CACHETYPE_TOOLTIP, TYPE_SPELL, $id, -1, User::$localeId]);
// AowowPower-request
if (isset($_GET['power']))
{
header('Content-type: application/x-javascript; charsetUTF-8');
@@ -20,7 +21,6 @@ if (isset($_GET['power']))
if (!$smarty->loadCache($cacheKeyTooltip, $x))
{
$spell = new SpellList(array(['s.id', $id]));
if ($spell->error)
die('$WowheadPower.registerSpell('.$id.', '.User::$localeId.', {});');
@@ -42,6 +42,7 @@ if (isset($_GET['power']))
die($x);
}
// regular page
if (!$smarty->loadCache($cacheKeyPage, $pageData))
{
$spell = new SpellList(array(['s.id', $id]));
@@ -711,12 +712,14 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData))
$smarty->saveCache($cacheKeyPage, $pageData);
}
// menuId 1: Spell g_initPath()
// tabId 0: Database g_initHeader()
$smarty->updatePageVars(array(
'title' => implode(" - ", $pageData['title']),
'path' => "[".implode(", ", $pageData['path'])."]",
'tab' => 0, // for g_initHeader($tab)
'path' => json_encode($pageData['path'], JSON_NUMERIC_CHECK),
'tab' => 0,
'type' => TYPE_SPELL,
'typeId' => $id,
'typeId' => $id
));
$smarty->assign('community', CommunityContent::getAll(TYPE_SPELL, $id)); // comments, screenshots, videos

View File

@@ -13,6 +13,7 @@ $validCats = array(
1 => true,
2 => [0, 1, 2],
3 => [0, 1, 2],
4 => true,
6 => true,
8 => true,
9 => true,

View File

@@ -132,9 +132,9 @@ if (!defined('AOWOW_REVISION'))
$ench['jsonequip']['reqlevel'] = $enchant['requiredLevel'];
// check if the spell has an entry in skill_line_ability -> Source:Profession
if ($skill = DB::Aowow()->SelectCell('SELECT skillId FROM ?_skill_line_ability WHERE spellId = ?d', $enchantSpells->id))
if ($skill = DB::Aowow()->SelectCell('SELECT skillLineId FROM dbc.skillLineAbility WHERE spellId = ?d', $enchantSpells->id))
{
$ench['name'][] = Util::jsEscape($enchantSpells->getField('name', true)));
$ench['name'][] = $enchantSpells->getField('name', true);
$ench['source'][] = $enchantSpells->id;
$ench['skill'] = $skill;
$ench['slots'][] = $slot;
@@ -144,10 +144,10 @@ if (!defined('AOWOW_REVISION'))
if (!isset($castItems[$enchantSpells->id]))
$castItems[$enchantSpells->id] = new ItemList([['spellid_1', $enchantSpells->id], ['name', 'Scroll of Enchant%', '!']]); // do not reuse enchantment scrolls
$cI &= $castItems[$enchantSpells->id]; // this construct is a bit .. unwieldy
$cI = &$castItems[$enchantSpells->id]; // this construct is a bit .. unwieldy
while ($cI->iterate())
{
$ench['name'][] = Util::jsEscape($cI->getField('name', true));
$ench['name'][] = $cI->getField('name', true);
$ench['source'][] = -$cI->id;
$ench['icon'] = strTolower($cI->getField('icon'));
$ench['slots'][] = $slot;