diff --git a/includes/community.class.php b/includes/community.class.php index 42439b83..ef9d287b 100644 --- a/includes/community.class.php +++ b/includes/community.class.php @@ -140,10 +140,10 @@ class CommunityContent foreach ($comments as $idx => &$c) { - if ($subj = @$subjCache[$c['type']][$c['typeId']]) + if (!empty($subjCache[$c['type']][$c['typeId']])) { // apply subject - $c['subject'] = $subj; + $c['subject'] = $subjCache[$c['type']][$c['typeId']]; // format date $c['date'] = date(Util::$dateFormatInternal, $c['date']); diff --git a/includes/kernel.php b/includes/kernel.php index 6f0c33d4..df88e1bb 100644 --- a/includes/kernel.php +++ b/includes/kernel.php @@ -95,7 +95,44 @@ foreach ($sets as $k => $v) } +// handle occuring errors error_reporting($AoWoWconf && CFG_DEBUG ? (E_ALL & ~(E_DEPRECATED | E_USER_DEPRECATED | E_STRICT)) : 0); +$errHandled = false; +set_error_handler(function($errNo, $errStr, $errFile, $errLine) use (&$errHandled) { + $errName = 'unknown error'; // errors not in this list can not be handled by set_error_handler (as per documentation) or are ignored + if ($errNo == E_WARNING) // 0x0002 + $errName = 'E_WARNING'; + else if ($errNo == E_PARSE) // 0x0004 + $errName = 'E_PARSE'; + else if ($errNo == E_NOTICE) // 0x0008 + $errName = 'E_NOTICE'; + else if ($errNo == E_USER_ERROR) // 0x0100 + $errName = 'E_USER_ERROR'; + else if ($errNo == E_USER_WARNING) // 0x0200 + $errName = 'E_USER_WARNING'; + else if ($errNo == E_USER_NOTICE) // 0x0400 + $errName = 'E_USER_NOTICE'; + else if ($errNo == E_RECOVERABLE_ERROR) // 0x1000 + $errName = 'E_RECOVERABLE_ERROR'; + + if (User::isInGroup(U_GROUP_STAFF)) + { + if (!$errHandled) + { + Util::addNote(U_GROUP_STAFF, 'one or more php related error occured, while generating this page.'); + $errHandled = true; + } + + Util::addNote(U_GROUP_STAFF, $errName.' - '.$errStr.' @ '.$errFile. ':'.$errLine); + } + + DB::Aowow()->query('INSERT INTO ?_errors (`date`, `version`, `phpError`, `file`, `line`, `query`, `userGroups`, `message`) VALUES (UNIX_TIMESTAMP(), ?d, ?d, ?, ?d, ?, ?d, ?) ON DUPLICATE KEY UPDATE `date` = UNIX_TIMESTAMP()', + AOWOW_REVISION, $errNo, $errFile, $errLine, CLI ? 'CLI' : $_SERVER['QUERY_STRING'], User::$groups, $errStr + ); + + return !(User::isInGroup(U_GROUP_STAFF) && defined('CFG_DEBUG') && CFG_DEBUG); +}, E_ALL & ~(E_DEPRECATED | E_USER_DEPRECATED | E_STRICT)); + $secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || ($AoWoWconf && CFG_FORCE_SSL); if (defined('CFG_STATIC_HOST')) // points js to images & scripts @@ -141,8 +178,11 @@ if (!CLI) } // parse page-parameters .. sanitize before use! - @list($str, $trash) = explode('&', $_SERVER['QUERY_STRING'], 2); - @list($pageCall, $pageParam) = explode('=', $str, 2); + $str = explode('&', $_SERVER['QUERY_STRING'], 2)[0]; + $_ = explode('=', $str, 2); + $pageCall = $_[0]; + $pageParam = isset($_[1]) ? $_[1] : null; + Util::$wowheadLink = 'http://'.Util::$subDomains[User::$localeId].'.wowhead.com/'.$str; } else if ($AoWoWconf) diff --git a/includes/loot.class.php b/includes/loot.class.php index 51628c9b..84c01c27 100644 --- a/includes/loot.class.php +++ b/includes/loot.class.php @@ -89,7 +89,7 @@ class Loot if (!$tableName || !$lootId) return null; - $rows = DB::Aowow()->select('SELECT * FROM ?# WHERE entry = ?d{ AND groupid = ?d}', $tableName, $lootId, $groupId ?: DBSIMPLE_SKIP); + $rows = DB::World()->select('SELECT * FROM ?# WHERE entry = ?d{ AND groupid = ?d}', $tableName, $lootId, $groupId ?: DBSIMPLE_SKIP); if (!$rows) return null; @@ -167,7 +167,10 @@ class Loot } else if ($entry['GroupId'] && $entry['Chance']) { - @$groupChances[$entry['GroupId']] += $entry['Chance']; + if (empty($groupChances[$entry['GroupId']])) + $groupChances[$entry['GroupId']] = 0; + + $groupChances[$entry['GroupId']] += $entry['Chance']; $set['groupChance'] = $entry['Chance']; } else // shouldn't have happened @@ -184,7 +187,7 @@ class Loot $sum = $groupChances[$k]; if (!$sum) $sum = 0; - else if ($sum > 100) + else if ($sum >= 100.01) { Util::addNote(U_GROUP_EMPLOYEE, 'Loot::getByContainerRecursive: entry '.$lootId.' / group '.$k.' has a total chance of '.number_format($sum, 2).'%. Some items cannot drop!'); $sum = 100; @@ -298,9 +301,10 @@ class Loot { foreach ($fields as $idx => $field) { + $val = isset($foo[$field]) ? $foo[$field] : 0; if (!isset($base[$idx])) - $base[$idx] = @$foo[$field]; - else if ($base[$idx] != @$foo[$field]) + $base[$idx] = $val; + else if ($base[$idx] != $val) $set |= 1 << $idx; } @@ -422,7 +426,7 @@ class Loot /* get references containing the item */ - $newRefs = DB::Aowow()->select( + $newRefs = DB::World()->select( sprintf($query, 'lt1.item = ?d AND lt1.reference = 0'), LOOT_REFERENCE, LOOT_REFERENCE, $this->entry @@ -431,7 +435,7 @@ class Loot while ($newRefs) { $curRefs = $newRefs; - $newRefs = DB::Aowow()->select( + $newRefs = DB::World()->select( sprintf($query, 'lt1.reference IN (?a)'), LOOT_REFERENCE, LOOT_REFERENCE, array_keys($curRefs) @@ -445,7 +449,7 @@ class Loot */ for ($i = 1; $i < count($this->lootTemplates); $i++) { - $result = $calcChance(DB::Aowow()->select( + $result = $calcChance(DB::World()->select( sprintf($query, '{lt1.reference IN (?a) OR }(lt1.reference = 0 AND lt1.item = ?d)'), $this->lootTemplates[$i], $this->lootTemplates[$i], $refResults ? array_keys($refResults) : DBSIMPLE_SKIP, diff --git a/includes/types/achievement.class.php b/includes/types/achievement.class.php index 93fa8cf3..405357d9 100644 --- a/includes/types/achievement.class.php +++ b/includes/types/achievement.class.php @@ -13,11 +13,9 @@ class AchievementList extends BaseType public $criteria = []; - protected $queryBase = 'SELECT `a`.*, `ar`.*, `lar`.*, `a`.`id` AS ARRAY_KEY FROM ?_achievement a'; + protected $queryBase = 'SELECT `a`.*, `a`.`id` AS ARRAY_KEY FROM ?_achievement a'; protected $queryOpts = array( - 'a' => [['ar', 'lar', 'si'], 'o' => 'orderInGroup ASC'], - 'ar' => ['j' => ['achievement_reward ar ON ar.entry = a.id', true]], - 'lar' => ['j' => ['locales_achievement_reward lar ON lar.entry = a.id', true]], + 'a' => [['si'], 'o' => 'orderInGroup ASC'], 'si' => ['j' => ['?_spellicon si ON si.id = a.iconId', true], 's' => ', si.iconString'], 'ac' => ['j' => ['?_achievementcriteria AS `ac` ON `ac`.`refAchievementId` = `a`.`id`', true], 'g' => '`a`.`id`'] ); @@ -30,20 +28,31 @@ class AchievementList extends BaseType { parent::__construct($conditions, $miscData); + if ($this->error) + return; + // post processing - foreach ($this->iterate() as &$_curTpl) + $rewards = DB::World()->select(' + SELECT ar.entry AS ARRAY_KEY, ar.*, lar.* FROM achievement_reward ar LEFT JOIN locales_achievement_reward lar ON lar.entry = ar.entry WHERE ar.entry IN (?a)', + $this->getFoundIDs() + ); + + foreach ($this->iterate() as $_id => &$_curTpl) { + if (!empty($rewards[$_id])) + $_curTpl = array_merge($rewards[$_id], $_curTpl); + //"rewards":[[11,137],[3,138]] [type, typeId] $_curTpl['rewards'] = []; - if ($_ = $_curTpl['item']) - $_curTpl['rewards'][] = [TYPE_ITEM, $_]; - if ($_ = $_curTpl['itemExtra']) - $_curTpl['rewards'][] = [TYPE_ITEM, $_]; - if ($_ = $_curTpl['title_A']) - $_curTpl['rewards'][] = [TYPE_TITLE, $_]; - if ($_ = $_curTpl['title_H']) - if ($_ != $_curTpl['title_A']) - $_curTpl['rewards'][] = [TYPE_TITLE, $_]; + if (!empty($_curTpl['item'])) + $_curTpl['rewards'][] = [TYPE_ITEM, $_curTpl['item']]; + if (!empty($_curTpl['itemExtra'])) + $_curTpl['rewards'][] = [TYPE_ITEM, $_curTpl['itemExtra']]; + if (!empty($_curTpl['title_A'])) + $_curTpl['rewards'][] = [TYPE_TITLE, $_curTpl['title_A']]; + if (!empty($_curTpl['title_H'])) + if (empty($_curTpl['title_A']) || $_curTpl['title_A'] != $_curTpl['title_H']) + $_curTpl['rewards'][] = [TYPE_TITLE, $_curTpl['title_H']]; // icon $_curTpl['iconString'] = $_curTpl['iconString'] ?: 'trade_engineering'; @@ -285,7 +294,7 @@ class AchievementListFilter extends Filter case 6: // last in series [yn] return $this->int2Bool($cr[1]) ? ['AND', ['series', 0, '!'], [['series', 0xFFFF, '&'], 0]] : [['series', 0xFFFF, '&'], 0, '!']; case 11: // Related Event [enum] - $_ = @$this->enums[$cr[0]][$cr[1]]; + $_ = isset($this->enums[$cr[0]][$cr[1]]) ? $this->enums[$cr[0]][$cr[1]] : null; if ($_ !== null) { if (is_int($_)) diff --git a/includes/types/basetype.class.php b/includes/types/basetype.class.php index fd83f47c..132064bc 100644 --- a/includes/types/basetype.class.php +++ b/includes/types/basetype.class.php @@ -498,7 +498,6 @@ trait listviewHelper return false; } - } /* @@ -516,11 +515,7 @@ trait spawnHelper SPAWNINFO_ZONES => null ); - /* - todo (med): map in tooltips is activated by either '#map' as anchor (will automatic open mapviewer, when hovering link) in the href or as parameterless rel-parameter e.g. rel="map" in the anchor - */ - - private function createShortSpawns() // [zoneId, floor, [[x1, y1], [x2, y2], ..]] as tooltip2 if enabled by (one area, one floor, one creature, no survivor) + private function createShortSpawns() // [zoneId, floor, [[x1, y1], [x2, y2], ..]] as tooltip2 if enabled by or anchor #map (one area, one floor, one creature, no survivors) { // first get zone/floor with the most spawns if ($res = DB::Aowow()->selectRow('SELECT areaId, floor FROM ?_spawns WHERE type = ?d && typeId = ?d GROUP BY areaId, floor ORDER BY count(1) DESC LIMIT 1', self::$type, $this->id)) @@ -547,7 +542,7 @@ trait spawnHelper foreach ($spawns as $s) { // check, if we can attach waypoints to creature - // we will get a nice clusterfuck of dots if we do this for more GUIDs, than we have colors + // we will get a nice clusterfuck of dots if we do this for more GUIDs, than we have colors though if (count($spawns) < 6 && self::$type == TYPE_NPC) { if ($wPoints = DB::Aowow()->select('SELECT * FROM ?_creature_waypoints WHERE creatureOrPath = ?d AND floor = ?d', $s['pathId'] ? -$s['pathId'] : $this->id, $s['floor'])) @@ -566,7 +561,10 @@ trait spawnHelper $set['lines'] = [[$wPoints[$i - 1]['posX'], $wPoints[$i - 1]['posY']]]; $data[$s['areaId']][$s['floor']]['coords'][] = [$p['posX'], $p['posY'], $set]; - @$wpSum[$s['areaId']][$s['floor']]++; + if (empty($wpSum[$s['areaId']][$s['floor']])) + $wpSum[$s['areaId']][$s['floor']] = 1; + else + $wpSum[$s['areaId']][$s['floor']]++; } $wpIdx++; } diff --git a/includes/types/creature.class.php b/includes/types/creature.class.php index 09d67480..354f8b5c 100644 --- a/includes/types/creature.class.php +++ b/includes/types/creature.class.php @@ -13,13 +13,10 @@ class CreatureList extends BaseType protected $queryBase = 'SELECT ct.*, ct.id AS ARRAY_KEY FROM ?_creature ct'; public $queryOpts = array( - 'ct' => [['ft', 'clsMin', 'clsMax', 'qse']], + 'ct' => [['ft', 'qse']], 'ft' => ['j' => '?_factiontemplate ft ON ft.id = ct.faction', 's' => ', ft.A, ft.H, ft.factionId'], - 'clsMin' => ['j' => 'creature_classlevelstats clsMin ON ct.unitClass = clsMin.class AND ct.minLevel = clsMin.level', 's' => ', clsMin.attackpower AS mleAtkPwrMin, clsMin.rangedattackpower AS rngAtkPwrMin, clsMin.baseArmor * ct.armorMod AS armorMin, (CASE ct.exp WHEN 0 THEN clsMin.damage_base WHEN 1 THEN clsMin.damage_exp1 ELSE clsMin.damage_exp2 END) AS dmgMin, (CASE ct.exp WHEN 0 THEN clsMin.basehp0 WHEN 1 THEN clsMin.basehp1 ELSE clsMin.basehp2 END) * ct.healthMod AS healthMin, clsMin.baseMana * ct.manaMod AS manaMin'], - 'clsMax' => ['j' => 'creature_classlevelstats clsMax ON ct.unitClass = clsMax.class AND ct.maxLevel = clsMax.level', 's' => ', clsMax.attackpower AS mleAtkPwrMax, clsMax.rangedattackpower AS rngAtkPwrMax, clsMax.baseArmor * ct.armorMod AS armorMax, (CASE ct.exp WHEN 0 THEN clsMin.damage_base WHEN 1 THEN clsMin.damage_exp1 ELSE clsMin.damage_exp2 END) AS dmgMax, (CASE ct.exp WHEN 0 THEN clsMax.basehp0 WHEN 1 THEN clsMax.basehp1 ELSE clsMax.basehp2 END) * ct.healthMod AS healthMax, clsMax.baseMana * ct.manaMod AS manaMax'], 'qse' => ['j' => ['?_quests_startend qse ON qse.type = 1 AND qse.typeId = ct.id', true], 's' => ', IF(min(qse.method) = 1 OR max(qse.method) = 3, 1, 0) AS startsQuests, IF(min(qse.method) = 2 OR max(qse.method) = 3, 1, 0) AS endsQuests', 'g' => 'ct.id'], 'qt' => ['j' => '?_quests qt ON qse.questId = qt.id'], - 'rep' => ['j' => ['creature_onkill_reputation rep ON rep.creature_id = ct.id', true]], 's' => ['j' => '?_spawns s ON s.type = 1 AND s.typeId = ct.id'] ); @@ -48,19 +45,7 @@ class CreatureList extends BaseType public static function getName($id) { - $n = DB::Aowow()->SelectRow(' - SELECT - name_loc0, - name_loc2, - name_loc3, - name_loc6, - name_loc8 - FROM - ?_creature - WHERE - id = ?d', - $id - ); + $n = DB::Aowow()->SelectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 FROM ?_creature WHERE id = ?d', $id); return Util::localizedString($n, 'name'); } @@ -134,6 +119,7 @@ class CreatureList extends BaseType public function getBaseStats($type) { + // i'm aware of the BaseVariance/RangedVariance fields ... i'm just totaly unsure about the whole damage calculation switch ($type) { case 'health': @@ -171,7 +157,7 @@ class CreatureList extends BaseType /* looks like this data differs per occasion * * NPCINFO_TAMEABLE (0x1): include texture & react - * NPCINFO_MODEL (0x2): + * NPCINFO_MODEL (0x2): */ $data = []; @@ -325,20 +311,19 @@ class CreatureListFilter extends Filter switch ($cr[1]) { case '=': // min > max is totally possible - $this->extraOpts['clsMin']['h'][] = 'IF(healthMin > healthMax, healthMax, healthMin) <= '.$cr[2]; - $this->extraOpts['clsMax']['h'][] = 'IF(healthMin > healthMax, healthMin, healthMax) >= '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'healthMin = healthMax AND healthMin = '.$cr[2]; break; case '>': - $this->extraOpts['clsMin']['h'][] = 'IF(healthMin > healthMax, healthMax, healthMin) > '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(healthMin > healthMax, healthMax, healthMin) > '.$cr[2]; break; case '>=': - $this->extraOpts['clsMin']['h'][] = 'IF(healthMin > healthMax, healthMax, healthMin) >= '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(healthMin > healthMax, healthMax, healthMin) >= '.$cr[2]; break; case '<': - $this->extraOpts['clsMax']['h'][] = 'IF(healthMin > healthMax, healthMin, healthMax) < '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(healthMin > healthMax, healthMin, healthMax) < '.$cr[2]; break; case '<=': - $this->extraOpts['clsMax']['h'][] = 'IF(healthMin > healthMax, healthMin, healthMax) <= '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(healthMin > healthMax, healthMin, healthMax) <= '.$cr[2]; break; } return [1]; // always true, use post-filter @@ -350,20 +335,19 @@ class CreatureListFilter extends Filter switch ($cr[1]) { case '=': - $this->extraOpts['clsMin']['h'][] = 'IF(manaMin > manaMax, manaMax, manaMin) <= '.$cr[2]; - $this->extraOpts['clsMax']['h'][] = 'IF(manaMin > manaMax, manaMin, manaMax) => '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'manaMin = manaMax AND manaMin = '.$cr[2]; break; case '>': - $this->extraOpts['clsMax']['h'][] = 'IF(manaMin > manaMax, manaMin, manaMax) > '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(manaMin > manaMax, manaMin, manaMax) > '.$cr[2]; break; case '>=': - $this->extraOpts['clsMax']['h'][] = 'IF(manaMin > manaMax, manaMin, manaMax) >= '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(manaMin > manaMax, manaMin, manaMax) >= '.$cr[2]; break; case '<': - $this->extraOpts['clsMin']['h'][] = 'IF(manaMin > manaMax, manaMax, manaMin) < '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(manaMin > manaMax, manaMax, manaMin) < '.$cr[2]; break; case '<=': - $this->extraOpts['clsMin']['h'][] = 'IF(manaMin > manaMax, manaMax, manaMin) <= '.$cr[2]; + $this->extraOpts['ct']['h'][] = 'IF(manaMin > manaMax, manaMax, manaMin) <= '.$cr[2]; break; } return [1]; // always true, use post-filter @@ -419,29 +403,42 @@ class CreatureListFilter extends Filter if ($cr[1] == FILTER_ENUM_ANY) { - $cGuids = DB::Aowow()->selectCol('SELECT DISTINCT gec.guid FROM game_event_creature gec JOIN ?_events e ON e.id = ABS(gec.eventEntry) WHERE e.holidayId <> 0'); + $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); + $cGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_creature WHERE eventEntry IN (?a)', $eventIds); return ['s.guid', $cGuids]; } else if ($cr[1] == FILTER_ENUM_NONE) { - $cGuids = DB::Aowow()->selectCol('SELECT DISTINCT gec.guid FROM game_event_creature gec JOIN ?_events e ON e.id = ABS(gec.eventEntry) WHERE e.holidayId <> 0'); + $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); + $cGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_creature WHERE eventEntry IN (?a)', $eventIds); return ['s.guid', $cGuids, '!']; } else if ($cr[1]) { - $cGuids = DB::Aowow()->selectCol('SELECT DISTINCT gec.guid FROM game_event_creature gec JOIN ?_events e ON e.id = ABS(gec.eventEntry) WHERE e.holidayId = ?d', $cr[1]); + $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId = ?d', $cr[1]); + $cGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_creature WHERE eventEntry IN (?a)', $eventIds); return ['s.guid', $cGuids]; } break; case 42: // increasesrepwith [enum] if (in_array($cr[1], $this->enums[3])) // reuse - return ['OR', ['AND', ['rep.RewOnKillRepFaction1', $cr[1]], ['rep.RewOnKillRepValue1', 0, '>']], ['AND', ['rep.RewOnKillRepFaction2', $cr[1]], ['rep.RewOnKillRepValue2', 0, '>']]]; + { + if ($cIds = DB::World()->selectCol('SELECT creature_id FROM creature_onkill_reputation WHERE (RewOnKillRepFaction1 = ?d AND RewOnKillRepValue1 > 0) OR (RewOnKillRepFaction2 = ?d AND RewOnKillRepValue2 > 0)', $cr[1], $cr[1])) + return ['id', $cIds]; + else + return [0]; + } break; case 43: // decreasesrepwith [enum] if (in_array($cr[1], $this->enums[3])) // reuse - return ['OR', ['AND', ['rep.RewOnKillRepFaction1', $cr[1]], ['rep.RewOnKillRepValue1', 0, '<']], ['AND', ['rep.RewOnKillRepFaction2', $cr[1]], ['rep.RewOnKillRepValue2', 0, '<']]]; + { + if ($cIds = DB::World()->selectCol('SELECT creature_id FROM creature_onkill_reputation WHERE (RewOnKillRepFaction1 = ?d AND RewOnKillRepValue1 < 0) OR (RewOnKillRepFaction2 = ?d AND RewOnKillRepValue2 < 0)', $cr[1], $cr[1])) + return ['id', $cIds]; + else + return [0]; + } break; case 12: // averagemoneydropped [op] [int] diff --git a/includes/types/faction.class.php b/includes/types/faction.class.php index 0e95860d..f6d5881f 100644 --- a/includes/types/faction.class.php +++ b/includes/types/faction.class.php @@ -36,19 +36,7 @@ class FactionList extends BaseType public static function getName($id) { - $n = DB::Aowow()->SelectRow(' - SELECT - name_loc0, - name_loc2, - name_loc3, - name_loc6, - name_loc8 - FROM - ?_factions - WHERE - id = ?d', - $id - ); + $n = DB::Aowow()->SelectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 FROM ?_factions WHERE id = ?d', $id); return Util::localizedString($n, 'name'); } diff --git a/includes/types/gameobject.class.php b/includes/types/gameobject.class.php index c59309ef..f93681f5 100644 --- a/includes/types/gameobject.class.php +++ b/includes/types/gameobject.class.php @@ -58,19 +58,7 @@ class GameObjectList extends BaseType public static function getName($id) { - $n = DB::Aowow()->SelectRow(' - SELECT - name, - name_loc2, - name_loc3, - name_loc6, - name_loc8 - FROM - ?_objects - WHERE - id = ?d', - $id - ); + $n = DB::Aowow()->SelectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 FROM ?_objects WHERE id = ?d', $id); return Util::localizedString($n, 'name'); } @@ -104,7 +92,7 @@ class GameObjectList extends BaseType $x = ''; $x .= ''; - if ($_ = @Lang::$gameObject['type'][$this->curTpl['typeCat']]) + if ($_ = Lang::gameObject('type', $this->curTpl['typeCat'])) $x .= ''; if (isset($this->curTpl['lockId'])) @@ -216,23 +204,26 @@ class GameObjectListFilter extends Filter return [1]; } break; - case 16; // relatedevent + case 16; // relatedevent (ignore removed by event) if (!$this->isSaneNumeric($cr[1])) break; if ($cr[1] == FILTER_ENUM_ANY) { - $goGuids = DB::Aowow()->selectCol('SELECT DISTINCT geo.guid FROM game_event_gameobject geo JOIN ?_events e ON e.id = ABS(geo.eventEntry) WHERE e.holidayId <> 0'); + $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); + $goGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_gameobject WHERE eventEntry IN (?a)', $eventIds); return ['s.guid', $goGuids]; } else if ($cr[1] == FILTER_ENUM_NONE) { - $goGuids = DB::Aowow()->selectCol('SELECT DISTINCT geo.guid FROM game_event_gameobject geo JOIN ?_events e ON e.id = ABS(geo.eventEntry) WHERE e.holidayId <> 0'); + $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId <> 0'); + $goGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_gameobject WHERE eventEntry IN (?a)', $eventIds); return ['s.guid', $goGuids, '!']; } else if ($cr[1]) { - $goGuids = DB::Aowow()->selectCol('SELECT DISTINCT geo.guid FROM game_event_gameobject geo JOIN ?_events e ON e.id = ABS(geo.eventEntry) WHERE e.holidayId = ?d', $cr[1]); + $eventIds = DB::Aowow()->selectCol('SELECT id FROM ?_events WHERE holidayId = ?d', $cr[1]); + $goGuids = DB::World()->selectCol('SELECT DISTINCT guid FROM game_event_gameobject WHERE eventEntry IN (?a)', $eventIds); return ['s.guid', $goGuids]; } diff --git a/includes/types/item.class.php b/includes/types/item.class.php index 97f81409..38c2e6d6 100644 --- a/includes/types/item.class.php +++ b/includes/types/item.class.php @@ -25,9 +25,9 @@ class ItemList extends BaseType protected $queryBase = 'SELECT i.*, `is`.*, i.id AS id, i.id AS ARRAY_KEY FROM ?_items i'; protected $queryOpts = array( + 'i' => [['is', 'src'], 'o' => 'i.quality DESC, i.itemLevel DESC'], 'is' => ['j' => ['?_item_stats AS `is` ON `is`.`id` = `i`.`id`', true]], 's' => ['j' => ['?_spell AS `s` ON s.effect1CreateItemId = i.id', true], 'g' => 'i.id'], - 'i' => [['is', 'src'], 'o' => 'i.quality DESC, i.itemLevel DESC'], 'src' => ['j' => ['?_source src ON type = 3 AND typeId = i.id', true], 's' => ', moreType, moreTypeId, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10, src11, src12, src13, src14, src15, src16, src17, src18, src19, src20, src21, src22, src23, src24'] ); @@ -73,15 +73,7 @@ class ItemList extends BaseType // use if you JUST need the name public static function getName($id) { - $n = DB::Aowow()->selectRow(' - SELECT - name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 - FROM - ?_items - WHERE - id = ?d', - $id - ); + $n = DB::Aowow()->selectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 FROM ?_items WHERE id = ?d', $id); return Util::localizedString($n, 'name'); } @@ -91,54 +83,65 @@ class ItemList extends BaseType { if (empty($this->vendors)) { - $ids = array_keys($this->templates); - $itemz = DB::Aowow()->select(' - SELECT nv.item AS ARRAY_KEY1, nv.entry AS ARRAY_KEY2, 0 AS eventId, nv.maxcount, iec.* FROM npc_vendor nv LEFT JOIN ?_itemextendedcost iec ON nv.extendedCost = iec.id WHERE {nv.entry IN (?a) AND} nv.item IN (?a) + $itemz = DB::World()->select(' + SELECT nv.item AS ARRAY_KEY1, nv.entry AS ARRAY_KEY2, 0 AS eventId, nv.maxcount, nv.extendedCost FROM npc_vendor nv WHERE {nv.entry IN (?a) AND} nv.item IN (?a) UNION - SELECT genv.item AS ARRAY_KEY1, c.id AS ARRAY_KEY2, IFNULL(IF(e.holidayId, e.holidayId, -e.id), 0) AS eventId, genv.maxcount, iec.* FROM game_event_npc_vendor genv JOIN creature c ON c.guid = genv.guid LEFT JOIN ?_events e ON genv.eventEntry = e.id LEFT JOIN ?_itemextendedcost iec ON genv.extendedCost = iec.id {JOIN creature c ON c.guid = genv.guid AND 1= ?d} WHERE {c.id IN (?a) AND} genv.item IN (?a)', + SELECT genv.item AS ARRAY_KEY1, c.id AS ARRAY_KEY2, IFNULL(IF(ge.holiday, ge.holiday, -ge.eventEntry), 0) AS eventId, genv.maxcount, genv.extendedCost FROM game_event_npc_vendor genv LEFT JOIN game_event ge ON genv.eventEntry = ge.eventEntry JOIN creature c ON c.guid = genv.guid WHERE {c.id IN (?a) AND} genv.item IN (?a)', empty($filter[TYPE_NPC]) || !is_array($filter[TYPE_NPC]) ? DBSIMPLE_SKIP : $filter[TYPE_NPC], - $ids, - empty($filter[TYPE_NPC]) || !is_array($filter[TYPE_NPC]) ? DBSIMPLE_SKIP : 1, + array_keys($this->templates), empty($filter[TYPE_NPC]) || !is_array($filter[TYPE_NPC]) ? DBSIMPLE_SKIP : $filter[TYPE_NPC], - $ids + array_keys($this->templates) ); + $xCosts = []; + foreach ($itemz as $i => $vendors) + $xCosts = array_merge($xCosts, array_column($vendors, 'extendedCost')); + + if ($xCosts) + $xCosts = DB::Aowow()->select('SELECT *, id AS ARRAY_KEY FROM ?_itemextendedcost WHERE id IN (?a)', $xCosts); + $cItems = []; foreach ($itemz as $k => $vendors) { - foreach ($vendors as $l => $costs) + foreach ($vendors as $l => $vInfo) { - $data = array( - 'stock' => $costs['maxcount'] ? $costs['maxcount'] : -1, - 'event' => $costs['eventId'], - 'reqRtg' => $costs['reqPersonalRating'] + $costs = []; + if (!empty($xCosts[$vInfo['extendedCost']])) + $costs = $xCosts[$vInfo['extendedCost']]; + + $data = array( + 'stock' => $vInfo['maxcount'] ?: -1, + 'event' => $vInfo['eventId'], + 'reqRtg' => $costs ? $costs['reqPersonalRating'] : 0 ); - if ($_ = $this->getField('buyPrice')) // somewhat nonsense.. is identical for all vendors (obviously) - $data[0] = $_; - // hardcode arena(103) & honor(104) - if ($_ = @$costs['reqArenaPoints']) + if (!empty($costs['reqArenaPoints'])) { - $data[-103] = $_; + $data[-103] = $costs['reqArenaPoints']; $this->jsGlobals[TYPE_CURRENCY][103] = 103; } - if ($_ = @$costs['reqHonorPoints']) + if (!empty($costs['reqHonorPoints'])) { - $data[-104] = $_; + $data[-104] = $costs['reqHonorPoints']; $this->jsGlobals[TYPE_CURRENCY][104] = 104; } for ($i = 1; $i < 6; $i++) { - if (($_ = @$costs['reqItemId'.$i]) && $costs['itemCount'.$i] > 0) + if (!empty($costs['reqItemId'.$i]) && $costs['itemCount'.$i] > 0) { - $data[$_] = $costs['itemCount'.$i]; - $cItems[] = $_; + $data[$costs['reqItemId'.$i]] = $costs['itemCount'.$i]; + $cItems[] = $costs['reqItemId'.$i]; } } + // no extended cost or additional gold required + if (!$costs || $this->getField('flagsExtra') & 0x04) + if ($_ = $this->getField('buyPrice')) + $data[0] = $_; + $vendors[$l] = $data; } @@ -189,8 +192,8 @@ class ItemList extends BaseType $result = $this->vendors; // apply filter if given - $tok = @$filter[TYPE_ITEM]; - $cur = @$filter[TYPE_CURRENCY]; + $tok = !empty($filter[TYPE_ITEM]) ? $filter[TYPE_ITEM] : null; + $cur = !empty($filter[TYPE_CURRENCY]) ? $filter[TYPE_CURRENCY] : null; foreach ($result as $itemId => &$data) { @@ -289,10 +292,12 @@ class ItemList extends BaseType { // just use the first results // todo (med): dont use first result; search for the right one - if ($cost = @reset($this->getExtendedCost($miscData)[$this->id])) + if (!empty($this->getExtendedCost($miscData)[$this->id])) { + $cost = reset($this->getExtendedCost($miscData)[$this->id]); $currency = []; $tokens = []; + foreach ($cost as $k => $qty) { if (is_string($k)) @@ -306,7 +311,7 @@ class ItemList extends BaseType $data[$this->id]['stock'] = $cost['stock']; // display as column in lv $data[$this->id]['avail'] = $cost['stock']; // display as number on icon - $data[$this->id]['cost'] = [$this->getField('buyPrice')]; + $data[$this->id]['cost'] = [empty($cost[0]) ? 0 : $cost[0]]; if ($cost['event']) { @@ -320,8 +325,8 @@ class ItemList extends BaseType if ($tokens) $data[$this->id]['cost'][] = $tokens; - if ($_ = @$this->getExtendedCost($miscData)[$this->id]['reqRating']) - $data[$this->id]['reqarenartng'] = $_; + if (!empty($cost['reqRating'])) + $data[$this->id]['reqarenartng'] = $cost['reqRating']; } if ($x = $this->curTpl['buyPrice']) @@ -799,7 +804,7 @@ class ItemList extends BaseType $x .= sprintf(Lang::$game['reqLevel'], $_reqLvl).'
'; // required arena team rating / personal rating / todo (low): sort out what kind of rating - if (@$this->getExtendedCost([], $reqRating)[$this->id] && $reqRating) + if (!empty($this->getExtendedCost([], $reqRating)[$this->id]) && $reqRating) $x .= sprintf(Lang::$item['reqRating'], $reqRating).'
'; // item level @@ -1140,11 +1145,18 @@ class ItemList extends BaseType $this->itemMods[$this->id] = []; foreach (Util::$itemMods as $mod) + { if (isset($this->curTpl[$mod]) && ($_ = floatVal($this->curTpl[$mod]))) - @$this->itemMods[$this->id][$mod] += $_; + { + if (!isset($this->itemMods[$this->id][$mod])) + $this->itemMods[$this->id][$mod] = 0; + + $this->itemMods[$this->id][$mod] += $_; + } + } // fetch and add socketbonusstats - if (@$this->json[$this->id]['socketbonus'] > 0) + if (!empty($this->json[$this->id]['socketbonus'])) $enchantments[$this->json[$this->id]['socketbonus']][] = $this->id; // Item is a gem (don't mix with sockets) @@ -1163,9 +1175,8 @@ class ItemList extends BaseType { if ($item > 0) // apply socketBonus $this->json[$item]['socketbonusstat'] = $stats; - else /* if ($item < 0) */ - foreach ($stats as $mod => $qty) // apply gemEnchantment - @$this->json[-$item][$mod] += $qty; + else /* if ($item < 0) */ // apply gemEnchantment + Util::arraySumByKey($this->json[-$item][$mod], $stats); } } } @@ -1199,8 +1210,7 @@ class ItemList extends BaseType { $eqpSplList = new SpellList(array(['s.id', $useSpells])); foreach ($eqpSplList->getStatGain() as $stat) - foreach ($stat as $mId => $qty) - @$onUseStats[$mId] += $qty; + Util::arraySumByKey($onUseStats, $stat); } return $onUseStats; @@ -1353,19 +1363,45 @@ class ItemList extends BaseType if (!array_keys($this->templates)) return; - $ire = DB::Aowow()->select(' - SELECT i.id AS ARRAY_KEY_1, ire.id AS ARRAY_KEY_2, iet.chance, ire.* - FROM ?_items i - JOIN item_enchantment_template iet ON iet.entry = ABS(i.randomenchant) - JOIN ?_itemrandomenchant ire ON IF(i.randomenchant > 0, ire.id = iet.ench, ire.id = -iet.ench) - WHERE i.id IN (?a)', - array_keys($this->templates) + $subItemIds = []; + foreach ($this->iterate() as $__) + if ($_ = $this->getField('randomEnchant')) + $subItemIds[abs($_)] = $_; + + if (!$subItemIds) + return; + + // remember: id < 0: randomSuffix; id > 0: randomProperty + $subItemTpls = DB::World()->select(' + SELECT CAST( entry as SIGNED) AS ARRAY_KEY, CAST( ench as SIGNED) AS ARRAY_KEY2, chance FROM item_enchantment_template WHERE entry IN (?a) UNION + SELECT CAST(-entry as SIGNED) AS ARRAY_KEY, CAST(-ench as SIGNED) AS ARRAY_KEY2, chance FROM item_enchantment_template WHERE entry IN (?a)', + array_keys(array_filter($subItemIds, function ($v) { return $v > 0; })) ?: [0], + array_keys(array_filter($subItemIds, function ($v) { return $v < 0; })) ?: [0] ); - foreach ($ire as $mstItem => $subItem) + $randIds = []; + foreach ($subItemTpls as $tpl) + $randIds = array_merge($randIds, array_keys($tpl)); + + if (!$randIds) + return; + + $randEnchants = DB::Aowow()->select('SELECT *, id AS ARRAY_KEY FROM ?_itemrandomenchant WHERE id IN (?a)', $randIds); + + foreach ($this->iterate() as $mstItem => $__) { - foreach ($subItem as $subId => $data) + if (!$this->getField('randomEnchant')) + continue; + + if (empty($subItemTpls[$this->getField('randomEnchant')])) + continue; + + foreach ($subItemTpls[$this->getField('randomEnchant')] as $subId => $data) { + if (empty($randEnchants[$subId])) + continue; + + $data = array_merge($randEnchants[$subId], $data); $jsonEquip = []; $jsonText = []; $enchIds = []; @@ -1419,7 +1455,8 @@ class ItemList extends BaseType ); } - $this->json[$mstItem]['subitems'] = $this->subItems[$mstItem]; + if (!empty($this->subItems[$mstItem])) + $this->json[$mstItem]['subitems'] = $this->subItems[$mstItem]; } } @@ -1508,8 +1545,8 @@ class ItemList extends BaseType class ItemListFilter extends Filter { private $ubFilter = []; // usable-by - limit weapon/armor selection per CharClass - itemClass => available itemsubclasses - private $extCostQuery = 'SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE %s UNION - SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE %1$s'; + private $extCostQuery = 'SELECT item FROM npc_vendor WHERE extendedCost IN (?a) UNION + SELECT item FROM game_event_npc_vendor WHERE extendedCost IN (?a)'; private $otFields = [18 => 4, 68 => 15, 69 => 16, 70 => 17, 72 => 2, 73 => 19, 75 => 21, 76 => 23, 88 => 20, 92 => 5, 93 => 3, 143 => 18, 171 => 8, 172 => 12]; public $extraOpts = []; // score for statWeights @@ -1715,8 +1752,8 @@ class ItemListFilter extends Filter foreach ($data['wt'] as $k => $v) { - @$str = Util::$itemFilter[$v]; - $qty = intVal($data['wtv'][$k]); + $str = isset(Util::$itemFilter[$v]) ? Util::$itemFilter[$v] : null; + $qty = intVal($data['wtv'][$k]); if ($str && $qty) { @@ -1828,7 +1865,7 @@ class ItemListFilter extends Filter break; case 107: // effecttext [str] not yet parsed ['effectsParsed_loc'.User::$localeId, $cr[2]] /* todo */ return [1]; - case 132: // glyphtype [enum] susubclass not yet set + case 132: // glyphtype [enum] switch ($cr[1]) { case 1: // Major @@ -1837,12 +1874,14 @@ class ItemListFilter extends Filter } break; case 124: // randomenchants [str] - // joining this in one step results in hell .. so .. two steps - // todo (low): in _theory_ Filter::modularizeString() should also be applied here - $randIds = DB::Aowow()->selectCol('SELECT IF (ire.id > 0, iet.entry, -iet.entry) FROM item_enchantment_template iet JOIN ?_itemrandomenchant ire ON ABS(ire.id) = iet.ench WHERE ire.name_loc'.User::$localeId.' LIKE ?', '%'.$cr[2].'%'); + $randIds = DB::Aowow()->selectCol('SELECT id AS ARRAY_KEY, ABS(id) FROM ?_itemrandomenchant WHERE name_loc?d LIKE ?', User::$localeId, '%'.$cr[2].'%'); + $tplIds = $randIds ? DB::World()->select('SELECT entry, ench FROM item_enchantment_template WHERE ench IN (?a)', $randIds) : []; + foreach ($tplIds as $k => &$set) + if (array_search($set['ench'], $randIds) < 0) + $set['entry'] *= -1; - if ($randIds) - return ['randomEnchant', $randIds]; + if ($tplIds) + return ['randomEnchant', array_column($tplIds, 'entry')]; else return [0]; // no results aren't really input errors case 125: // reqarenartng [op] [int] todo (low): find out, why "IN (W, X, Y) AND IN (X, Y, Z)" doesn't result in "(X, Y)" @@ -1850,12 +1889,13 @@ class ItemListFilter extends Filter break; $this->formData['extraCols'][] = $cr[0]; - $query = sprintf($this->extCostQuery, 'iec.reqPersonalrating '.$cr[1].' '.$cr[2]); - return ['id', DB::Aowow()->selectCol($query)]; + $costs = DB::Aowow()->selectCol('SELECT id FROM ?_itemextendedcost WHERE reqPersonalrating '.$cr[1].' '.$cr[2]); + $items = DB::World()->selectCol($this->extCostQuery, $costs, $costs); + return ['id', $items]; case 160: // relatedevent [enum] like 169 .. crawl though npc_vendor and loot_templates of event-related spawns /* todo */ return [1]; case 152: // classspecific [enum] - $_ = @$this->enums[$cr[0]][$cr[1]]; + $_ = isset($this->enums[$cr[0]][$cr[1]]) ? $this->enums[$cr[0]][$cr[1]] : null; if ($_ !== null) { if (is_bool($_)) @@ -1865,7 +1905,7 @@ class ItemListFilter extends Filter } break; case 153: // racespecific [enum] - $_ = @$this->enums[$cr[0]][$cr[1]]; + $_ = isset($this->enums[$cr[0]][$cr[1]]) ? $this->enums[$cr[0]][$cr[1]] : null; if ($_ !== null) { if (is_bool($_)) @@ -1886,7 +1926,7 @@ class ItemListFilter extends Filter $this->formData['extraCols'][] = $cr[0]; return ['AND', ['armordamagemodifier', $cr[2], $cr[1]], ['class', ITEM_CLASS_ARMOR]]; case 86: // craftedprof [enum] - $_ = @$this->enums[99][$cr[1]]; // recycled enum + $_ = isset($this->enums[99][$cr[1]]) ? $this->enums[99][$cr[1]] : null; if (is_bool($_)) return ['src.src1', null, $_ ? '!' : null]; else if (is_int($_)) @@ -1959,32 +1999,35 @@ class ItemListFilter extends Filter else break; - $query = sprintf($this->extCostQuery, 'iec.reqItemId1 IN (?a) OR iec.reqItemId2 IN (?a) OR iec.reqItemId3 IN (?a) OR iec.reqItemId4 IN (?a) OR iec.reqItemId5 IN (?a)'); - if ($foo = DB::Aowow()->selectCol($query, $_, $_, $_, $_, $_, $_, $_, $_, $_, $_)) - return ['id', $foo]; + $costs = DB::Aowow()->selectCol( + 'SELECT id FROM ?_itemextendedcost WHERE reqItemId1 IN (?a) OR reqItemId2 IN (?a) OR reqItemId3 IN (?a) OR reqItemId4 IN (?a) OR reqItemId5 IN (?a)', + $_, $_, $_, $_, $_ + ); + if ($items = DB::World()->selectCol($this->extCostQuery, $costs, $costs)) + return ['id', $items]; break; case 144: // purchasablewithhonor [yn] if ($this->int2Bool($cr[1])) { - $query = sprintf($this->extCostQuery, 'iec.reqHonorPoints > 0'); - if ($foo = DB::Aowow()->selectCol($query)) - return ['id', $foo, $cr[1] ? null : '!']; + $costs = DB::Aowow()->selectCol('SELECT id FROM ?_itemextendedcost WHERE reqHonorPoints > 0'); + if ($items = DB::World()->selectCol($this->extCostQuery, $costs, $costs)) + return ['id', $items, $cr[1] ? null : '!']; } break; case 145: // purchasablewitharena [yn] if ($this->int2Bool($cr[1])) { - $query = sprintf($this->extCostQuery, 'iec.reqArenaPoints > 0'); - if ($foo = DB::Aowow()->selectCol($query)) - return ['id', $foo, $cr[1] ? null : '!']; + $costs = DB::Aowow()->selectCol('SELECT id FROM ?_itemextendedcost WHERE reqArenaPoints > 0'); + if ($items = DB::World()->selectCol($this->extCostQuery, $costs, $costs)) + return ['id', $items, $cr[1] ? null : '!']; } break; case 129: // soldbynpc [str-small] if (!$this->isSaneNumeric($cr[2], true)) break; - if ($iIds = DB::Aowow()->selectCol('SELECT item FROM npc_vendor WHERE entry = ?d UNION SELECT item FROM game_event_npc_vendor v JOIN creature c ON c.guid = v.guid WHERE c.id = ?d', $cr[2], $cr[2])) + if ($iIds = DB::World()->selectCol('SELECT item FROM npc_vendor WHERE entry = ?d UNION SELECT item FROM game_event_npc_vendor v JOIN creature c ON c.guid = v.guid WHERE c.id = ?d', $cr[2], $cr[2])) return ['i.id', $iIds]; else return [0]; @@ -2023,7 +2066,7 @@ class ItemListFilter extends Filter case 85: // objectivequest [side] /* todo */ return [1]; case 87: // reagentforability [enum] - $_ = @$this->enums[99][$cr[1]]; // recycled enum + $_ = isset($this->enums[99][$cr[1]]) ? $this->enums[99][$cr[1]] : null; if ($_ !== null) { $ids = []; @@ -2063,7 +2106,7 @@ class ItemListFilter extends Filter } break; case 128: // source [enum] - $_ = @$this->enums[$cr[0]][$cr[1]]; + $_ = isset($this->enums[$cr[0]][$cr[1]]) ? $this->enums[$cr[0]][$cr[1]] : null; if ($_ !== null) { if (is_int($_)) // specific diff --git a/includes/types/profile.class.php b/includes/types/profile.class.php index 417ff50a..184653d4 100644 --- a/includes/types/profile.class.php +++ b/includes/types/profile.class.php @@ -166,7 +166,7 @@ class ProfileList extends BaseType private function getTalentDistribution() { if (!empty($this->tDistribution)) - $this->tDistribution[$this->curTpl['classId']] = DB::Aowow()->selectCol('SELECT COUNT(t.id) FROM dbc.talent t JOIN dbc.talenttab tt ON t.tabId = tt.id WHERE tt.classMask & ?d GROUP BY tt.id ORDER BY tt.tabNumber ASC', 1 << ($this->curTpl['classId'] - 1)); + $this->tDistribution[$this->curTpl['classId']] = DB::Aowow()->selectCol('SELECT COUNT(t.id) FROM dbc_talent t JOIN dbc_talenttab tt ON t.tabId = tt.id WHERE tt.classMask & ?d GROUP BY tt.id ORDER BY tt.tabNumber ASC', 1 << ($this->curTpl['classId'] - 1)); $result = []; $start = 0; diff --git a/includes/types/quest.class.php b/includes/types/quest.class.php index 7e3d6c67..8c601d88 100644 --- a/includes/types/quest.class.php +++ b/includes/types/quest.class.php @@ -368,8 +368,11 @@ class QuestList extends BaseType $data[TYPE_TITLE][$this->curTpl['rewardTitleId']] = $this->curTpl['rewardTitleId']; // currencies - if ($_ = @$this->rewards[$this->id][TYPE_CURRENCY]) + if (!empty($this->rewards[$this->id][TYPE_CURRENCY])) + { + $_ = $this->rewards[$this->id][TYPE_CURRENCY]; $data[TYPE_CURRENCY] = array_combine(array_keys($_), array_keys($_)); + } } if ($addMask & GLOBALINFO_SELF) @@ -509,7 +512,7 @@ class QuestListFilter extends Filter break; case 37: // classspecific [enum] - $_ = @$this->enums[$cr[0]][$cr[1]]; + $_ = isset($this->enums[$cr[0]][$cr[1]]) ? $this->enums[$cr[0]][$cr[1]] : null; if ($_ !== null) { if ($_ === true) @@ -521,7 +524,7 @@ class QuestListFilter extends Filter } break; case 38: // racespecific [enum] - $_ = @$this->enums[$cr[0]][$cr[1]]; + $_ = isset($this->enums[$cr[0]][$cr[1]]) ? $this->enums[$cr[0]][$cr[1]] : null; if ($_ !== null) { if ($_ === true) diff --git a/includes/types/skill.class.php b/includes/types/skill.class.php index 805b17d2..fdd6149d 100644 --- a/includes/types/skill.class.php +++ b/includes/types/skill.class.php @@ -32,19 +32,7 @@ class SkillList extends BaseType public static function getName($id) { - $n = DB::Aowow()->SelectRow(' - SELECT - name_loc0, - name_loc2, - name_loc3, - name_loc6, - name_loc8 - FROM - ?_skillline - WHERE - id = ?d', - $id - ); + $n = DB::Aowow()->SelectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 FROM ?_skillline WHERE id = ?d', $id); return Util::localizedString($n, 'name'); } diff --git a/includes/types/spell.class.php b/includes/types/spell.class.php index d5651831..ff99c41b 100644 --- a/includes/types/spell.class.php +++ b/includes/types/spell.class.php @@ -125,13 +125,13 @@ class SpellList extends BaseType } if ($foo) - $this->relItems = new ItemList(array(['i.id', array_unique($foo)], 0)); + $this->relItems = new ItemList(array(['i.id', array_unique($foo)], CFG_SQL_LIMIT_NONE)); } // use if you JUST need the name public static function getName($id) { - $n = DB::Aowow()->SelectRow('SELECT * FROM ?_spell WHERE id = ?d', $id ); + $n = DB::Aowow()->SelectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 FROM ?_spell WHERE id = ?d', $id ); return Util::localizedString($n, 'name'); } // end static use @@ -167,10 +167,10 @@ class SpellList extends BaseType if ($mv < 0) // all stats { for ($j = 0; $j < 5; $j++) - @$stats[ITEM_MOD_AGILITY + $j] += $pts; + Util::arraySumByKey($stats, [(ITEM_MOD_AGILITY + $j) => $pts]); } else // one stat - @$stats[ITEM_MOD_AGILITY + $mv] += $pts; + Util::arraySumByKey($stats, [(ITEM_MOD_AGILITY + $mv) => $pts]); break; } @@ -178,7 +178,7 @@ class SpellList extends BaseType case 230: case 250: { - @$stats[ITEM_MOD_HEALTH] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_HEALTH => $pts]); break; } case 13: // damage splpwr + physical (dmg & any) @@ -186,80 +186,80 @@ class SpellList extends BaseType // + weapon damage if ($mv == (1 << SPELL_SCHOOL_NORMAL)) { - @$stats[ITEM_MOD_WEAPON_DMG] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_WEAPON_DMG => $pts]); break; } // full magic mask, also counts towards healing if ($mv == 0x7E) { - @$stats[ITEM_MOD_SPELL_POWER] += $pts; - @$stats[ITEM_MOD_SPELL_DAMAGE_DONE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_SPELL_POWER => $pts]); + Util::arraySumByKey($stats, [ITEM_MOD_SPELL_DAMAGE_DONE => $pts]); } else { // HolySpellpower (deprecated; still used in randomproperties) if ($mv & (1 << SPELL_SCHOOL_HOLY)) - @$stats[ITEM_MOD_HOLY_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_HOLY_POWER => $pts]); // FireSpellpower (deprecated; still used in randomproperties) if ($mv & (1 << SPELL_SCHOOL_FIRE)) - @$stats[ITEM_MOD_FIRE_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_FIRE_POWER => $pts]); // NatureSpellpower (deprecated; still used in randomproperties) if ($mv & (1 << SPELL_SCHOOL_NATURE)) - @$stats[ITEM_MOD_NATURE_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_NATURE_POWER => $pts]); // FrostSpellpower (deprecated; still used in randomproperties) if ($mv & (1 << SPELL_SCHOOL_FROST)) - @$stats[ITEM_MOD_FROST_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_FROST_POWER => $pts]); // ShadowSpellpower (deprecated; still used in randomproperties) if ($mv & (1 << SPELL_SCHOOL_SHADOW)) - @$stats[ITEM_MOD_SHADOW_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_SHADOW_POWER => $pts]); // ArcaneSpellpower (deprecated; still used in randomproperties) if ($mv & (1 << SPELL_SCHOOL_ARCANE)) - @$stats[ITEM_MOD_ARCANE_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_ARCANE_POWER => $pts]); } break; } case 135: // healing splpwr (healing & any) .. not as a mask.. { - @$stats[ITEM_MOD_SPELL_HEALING_DONE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_SPELL_HEALING_DONE => $pts]); break; } case 35: // ModPower - MiscVal:type see defined Powers only energy/mana in use { if ($mv == POWER_HEALTH) - @$stats[ITEM_MOD_HEALTH] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_HEALTH => $pts]); if ($mv == POWER_ENERGY) - @$stats[ITEM_MOD_ENERGY] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_ENERGY => $pts]); else if ($mv == POWER_MANA) - @$stats[ITEM_MOD_MANA] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_MANA => $pts]); else if ($mv == POWER_RUNIC_POWER) - @$stats[ITEM_MOD_RUNIC_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_RUNIC_POWER => $pts]); break; } case 189: // CombatRating MiscVal:ratingMask case 220: if ($mod = Util::itemModByRatingMask($mv)) - @$stats[$mod] += $pts; + Util::arraySumByKey($stats, [$mod => $pts]); break; case 143: // Resistance MiscVal:school case 83: case 22: if ($mv == 1) // Armor only if explicitly specified { - @$stats[ITEM_MOD_ARMOR] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_ARMOR => $pts]); break; } if ($mv == 2) // holy-resistance ONLY if explicitly specified (shouldn't even exist...) { - @$stats[ITEM_MOD_HOLY_RESISTANCE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_HOLY_RESISTANCE => $pts]); break; } @@ -271,19 +271,19 @@ class SpellList extends BaseType switch ($j) { case 2: - @$stats[ITEM_MOD_FIRE_RESISTANCE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_FIRE_RESISTANCE => $pts]); break; case 3: - @$stats[ITEM_MOD_NATURE_RESISTANCE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_NATURE_RESISTANCE => $pts]); break; case 4: - @$stats[ITEM_MOD_FROST_RESISTANCE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_FROST_RESISTANCE => $pts]); break; case 5: - @$stats[ITEM_MOD_SHADOW_RESISTANCE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_SHADOW_RESISTANCE => $pts]); break; case 6: - @$stats[ITEM_MOD_ARCANE_RESISTANCE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_ARCANE_RESISTANCE => $pts]); break; } } @@ -291,22 +291,22 @@ class SpellList extends BaseType case 8: // hp5 case 84: case 161: - @$stats[ITEM_MOD_HEALTH_REGEN] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_HEALTH_REGEN => $pts]); break; case 85: // mp5 - @$stats[ITEM_MOD_MANA_REGENERATION] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_MANA_REGENERATION => $pts]); break; case 99: // atkpwr - @$stats[ITEM_MOD_ATTACK_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_ATTACK_POWER => $pts]); break; // ?carries over to rngatkpwr? case 124: // rngatkpwr - @$stats[ITEM_MOD_RANGED_ATTACK_POWER] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_RANGED_ATTACK_POWER => $pts]); break; case 158: // blockvalue - @$stats[ITEM_MOD_BLOCK_VALUE] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_BLOCK_VALUE => $pts]); break; case 240: // ModExpertise - @$stats[ITEM_MOD_EXPERTISE_RATING] += $pts; + Util::arraySumByKey($stats, [ITEM_MOD_EXPERTISE_RATING => $pts]); break; } } @@ -490,7 +490,10 @@ class SpellList extends BaseType } } - return $targetId ? @$results[$targetId] : $results; + if ($targetId) + return !empty($results[$targetId]) ? $results[$targetId] : 0; + + return $results; } private function createRangesForCurrent() @@ -679,7 +682,10 @@ class SpellList extends BaseType private function resolveEvaluation($formula) { // see Traits in javascript locales - $pl = $PL = $this->charLevel; + + // if (character level is set manually (profiler only)) + // $pl = $PL = $this->charLevel; + $PlayerName = Lang::$main['name']; $ap = $AP = $this->interactive ? sprintf(Util::$dfnString, 'LANG.traits.atkpwr[0]', Lang::$spell['traitShort']['atkpwr']) : Lang::$spell['traitShort']['atkpwr']; $rap = $RAP = $this->interactive ? sprintf(Util::$dfnString, 'LANG.traits.rgdatkpwr[0]', Lang::$spell['traitShort']['rgdatkpwr']) : Lang::$spell['traitShort']['rgdatkpwr']; @@ -715,7 +721,7 @@ class SpellList extends BaseType foreach ($vars[0] as $var) // oh lord, forgive me this sin .. but is_callable seems to bug out and function_exists doesn't find lambda-functions >.< { - $eval = eval('return '.$var.';'); + $eval = eval('return @'.$var.';'); // attention: error suppression active here if (getType($eval) == 'object') continue; else if (is_numeric($eval)) @@ -1085,7 +1091,7 @@ class SpellList extends BaseType $formCurPos++; } - if (@$formula[++$formCurPos] == '.') + if (isset($formula[++$formCurPos]) && $formula[$formCurPos] == '.') { $formPrecision = (int)$formula[++$formCurPos]; ++$formCurPos; // for some odd reason the precision decimal survives if wo dont increment further.. @@ -1743,11 +1749,11 @@ Lasts 5 min. $?$gte($pl,68)[][Cannot be used on items level 138 and higher.] if ($addInfoMask & ITEMINFO_MODEL) { - if ($mi = @$modelInfo[$this->id]) + if (!empty($modelInfo[$this->id])) { - $data[$this->id]['npcId'] = $mi['typeId']; - $data[$this->id]['displayId'] = $mi['displayId']; - $data[$this->id]['displayName'] = $mi['displayName']; + $data[$this->id]['npcId'] = $modelInfo[$this->id]['typeId']; + $data[$this->id]['displayId'] = $modelInfo[$this->id]['displayId']; + $data[$this->id]['displayName'] = $modelInfo[$this->id]['displayName']; } } } @@ -1801,9 +1807,9 @@ spells / buffspells = { $extra[$id] = array( 'id' => $id, 'tooltip' => $tTip[0], - 'buff' => @$buff[0], + 'buff' => !empty($buff[0]) ? $buff[0] : null, 'spells' => $tTip[1], - 'buffspells' => @$buff[1] + 'buffspells' => !empty($buff[1]) ? $buff[1] : null ); } } @@ -1964,7 +1970,7 @@ class SpellListFilter extends Filter return ['OR', ['AND', ['powerType', [1, 6]], ['powerCost', (10 * $cr[2]), $cr[1]]], ['AND', ['powerType', [1, 6], '!'], ['powerCost', $cr[2], $cr[1]]]]; case 9: // source [enum] - $_ = @$this->enums[$cr[0]][$cr[1]]; + $_ = isset($this->enums[$cr[0]][$cr[1]]) ? $this->enums[$cr[0]][$cr[1]] : null; if ($_ !== null) { if (is_int($_)) // specific diff --git a/includes/types/zone.class.php b/includes/types/zone.class.php index 57c9fde0..3a1c3009 100644 --- a/includes/types/zone.class.php +++ b/includes/types/zone.class.php @@ -14,15 +14,7 @@ class ZoneList extends BaseType // use if you JUST need the name public static function getName($id) { - $n = DB::Aowow()->selectRow(' - SELECT - name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 - FROM - ?_zones - WHERE - id = ?d', - $id - ); + $n = DB::Aowow()->selectRow('SELECT name_loc0, name_loc2, name_loc3, name_loc6, name_loc8 FROM ?_zones WHERE id = ?d', $id ); return Util::localizedString($n, 'name'); } diff --git a/includes/utilities.php b/includes/utilities.php index db0c5261..c8cfb807 100644 --- a/includes/utilities.php +++ b/includes/utilities.php @@ -711,7 +711,7 @@ class Util $notes = []; foreach (self::$notes as $data) - if (!$restricted || ($data[0] && User::isInGroup($data[0]))) + if (!$restricted || !$data[0] || User::isInGroup($data[0])) $notes[] = $data[1]; return $notes; @@ -1164,49 +1164,57 @@ class Util switch ($e['type'.$h]) { case 2: - @$jsonStats[ITEM_MOD_WEAPON_DMG] += $val; + $obj = ITEM_MOD_WEAPON_DMG; break; case 3: case 7: - $spl = new SpellList(array(['s.id', $obj])); + $spl = new SpellList(array(['s.id', $obj])); if ($spl->error) break; - $gains = $spl->getStatGain(); - - foreach ($gains as $gain) - foreach ($gain as $k => $v) // array_merge screws up somehow... - @$jsonStats[$k] += $v; + Util::arraySumByKey($jsonStats, $spl->getStatGain()[$obj]); + $obj = null; break; case 4: switch ($obj) { - case 0: // Physical - @$jsonStats[ITEM_MOD_ARMOR] += $val; + case 0: // Physical + $obj = ITEM_MOD_ARMOR; break; - case 1: // Holy - @$jsonStats[ITEM_MOD_HOLY_RESISTANCE] += $val; + case 1: // Holy + $obj = ITEM_MOD_HOLY_RESISTANCE; break; - case 2: // Fire - @$jsonStats[ITEM_MOD_FIRE_RESISTANCE] += $val; + case 2: // Fire + $obj = ITEM_MOD_FIRE_RESISTANCE; break; - case 3: // Nature - @$jsonStats[ITEM_MOD_NATURE_RESISTANCE] += $val; + case 3: // Nature + $obj = ITEM_MOD_NATURE_RESISTANCE; break; - case 4: // Frost - @$jsonStats[ITEM_MOD_FROST_RESISTANCE] += $val; + case 4: // Frost + $obj = ITEM_MOD_FROST_RESISTANCE; break; - case 5: // Shadow - @$jsonStats[ITEM_MOD_SHADOW_RESISTANCE] += $val; + case 5: // Shadow + $obj = ITEM_MOD_SHADOW_RESISTANCE; break; - case 6: // Arcane - @$jsonStats[ITEM_MOD_ARCANE_RESISTANCE] += $val; + case 6: // Arcane + $obj = ITEM_MOD_ARCANE_RESISTANCE; break; + default: + $obj = null; } break; case 5: - @$jsonStats[$obj] += $val; break; + default: // skip assignment below + $obj = null; + } + + if ($obj) + { + if (!isset($jsonStats[$obj])) + $jsonStats[$obj] = 0; + + $jsonStats[$obj] += $val; } } @@ -1321,8 +1329,8 @@ class Util // note: omits required spell and chance in skill_discovery_template $data = array_merge( - DB::Aowow()->selectCol('SELECT spellId FROM spell_learn_spell WHERE entry IN (?a)', $lookup), - DB::Aowow()->selectCol('SELECT spellId FROM skill_discovery_template WHERE reqSpell IN (?a)', $lookup), + DB::World()->selectCol('SELECT spellId FROM spell_learn_spell WHERE entry IN (?a)', $lookup), + DB::World()->selectCol('SELECT spellId FROM skill_discovery_template WHERE reqSpell IN (?a)', $lookup), $extraIds ); @@ -1570,8 +1578,8 @@ class Util if (empty(self::$alphaMapCache[$areaId])) self::$alphaMapCache[$areaId] = imagecreatefrompng($file); - // alphaMaps are 1000 x 1000, adapt points [0 => black => valid point] - if (imagecolorat(self::$alphaMapCache[$areaId], $set['posX'] * 10, $set['posY'] * 10)) + // alphaMaps are 1000 x 1000, adapt points [black => valid point] + if (!imagecolorat(self::$alphaMapCache[$areaId], $set['posX'] * 10, $set['posY'] * 10)) $set = null; return true; @@ -1585,7 +1593,7 @@ class Util $result = []; $jsGlobals = []; - $conditions = DB::Aowow()->select( + $conditions = DB::World()->select( 'SELECT SourceTypeOrReferenceId, SourceEntry, SourceGroup, ElseGroup, ConditionTypeOrReference, ConditionTarget, ConditionValue1, ConditionValue2, ConditionValue3, NegativeCondition FROM conditions diff --git a/localization/lang.class.php b/localization/lang.class.php index 366ce0bd..29899580 100644 --- a/localization/lang.class.php +++ b/localization/lang.class.php @@ -40,6 +40,24 @@ class Lang self::$item['cat'][2][1][14] .= ' ('.self::$item['cat'][2][0].')'; } + // todo: make static props private and access through this + public static function __callStatic($name, $args) + { + if (!isset(self::$$name)) + return null; + + $var = self::$$name; + foreach ($args as $key) + { + if (!isset($var[$key])) + return null; + + $var = $var[$key]; + } + + return $var; + } + // todo: expand public static function getInfoBoxForFlags($flags) { diff --git a/localization/locale_dede.php b/localization/locale_dede.php index 5be497cf..4b3e6bad 100644 --- a/localization/locale_dede.php +++ b/localization/locale_dede.php @@ -381,7 +381,8 @@ $lang = array( 'trap' => "Falle", 'triggeredBy' => "Ausgelöst durch", 'capturePoint' => "Eroberungspunkt", - 'foundIn' => "Dieses Objekt befindet sich in" + 'foundIn' => "Dieses Objekt befindet sich in", + 'restock' => "Wird alle %s wieder aufgefüllt." ), 'npc' => array( 'classification'=> "Einstufung", @@ -435,7 +436,8 @@ $lang = array( 'itemReward' => "Ihr bekommt", 'titleReward' => 'Euch wird der Titel "%s" verliehen', 'slain' => "getötet", - 'reqNumCrt' => "Benötigt" + 'reqNumCrt' => "Benötigt", + '_transfer' => 'Dieser Erfolg wird mit %s vertauscht, wenn Ihr zur %s wechselt.', ), 'class' => array( 'racialLeader' => "Volksanführer", @@ -474,6 +476,8 @@ $lang = array( ) ), 'quest' => array( + '_transfer' => 'Dieses Quest wird mit %s vertauscht, wenn Ihr zur %s wechselt.', + 'questLevel' => "Stufe %s", 'requirements' => "Anforderungen", 'reqMoney' => "Benötigtes Geld", @@ -603,6 +607,7 @@ $lang = array( ) ), 'title' => array( + '_transfer' => 'Dieser Titel wird mit %s vertauscht, wenn Ihr zur %s wechselt.', 'cat' => array( "Allgemein", "Spieler gegen Spieler", "Ruf", "Dungeon & Schlachtzug", "Quests", "Berufe", "Weltereignisse" ) @@ -628,6 +633,8 @@ $lang = array( 'spilloverDesc' => "Für diese Fraktion erhaltener Ruf wird zusätzlich mit den unten aufgeführten Fraktionen anteilig verrechnet.", 'maxStanding' => "Max. Ruf", 'quartermaster' => "Rüstmeister", + 'customRewRate' => "Abweichende Belohnungsraten", + '_transfer' => 'Die Reputation mit dieser Fraktion wird mit dem für %s vertauscht, wenn Ihr zur %s wechselt.', 'cat' => array( 1118 => ["Classic", 469 => "Allianz", 169 => "Dampfdruckkartell", 67 => "Horde", 891 => "Streitkräfte der Allianz", 892 => "Streitkräfte der Horde"], 980 => ["The Burning Crusade", 936 => "Shattrath"], @@ -679,7 +686,7 @@ $lang = array( '_inSlot' => "im Platz", '_collapseAll' => "Alle einklappen", '_expandAll' => "Alle ausklappen", - + '_transfer' => 'Dieser Zauber wird mit %s vertauscht, wenn Ihr zur %s wechselt.', 'discovered' => "Durch Geistesblitz erlernt", 'ppm' => "%s Auslösungen pro Minute", 'procChance' => "Procchance", diff --git a/localization/locale_enus.php b/localization/locale_enus.php index d52f652c..55159615 100644 --- a/localization/locale_enus.php +++ b/localization/locale_enus.php @@ -376,7 +376,8 @@ $lang = array( 'trap' => "Trap", 'triggeredBy' => "Triggered by", 'capturePoint' => "Capture Point", - 'foundIn' => "This object can be found in" + 'foundIn' => "This object can be found in", + 'restock' => "Restocks every %s." ), 'npc' => array( 'classification'=> "Classification", @@ -430,7 +431,8 @@ $lang = array( 'itemReward' => "You will receive", 'titleReward' => 'You shall be granted the title "%s"', 'slain' => "slain", - 'reqNumCrt' => "Requires" + 'reqNumCrt' => "Requires", + '_transfer' => 'This achievement will be converted to %s if you transfer to %s.', ), 'class' => array( 'racialLeader' => "Racial leader", @@ -469,6 +471,8 @@ $lang = array( ) ), 'quest' => array( + '_transfer' => 'This quest will be converted to %s if you transfer to %s.', + 'questLevel' => "Level %s", 'requirements' => "Requirements", 'reqMoney' => "Required money", @@ -598,6 +602,7 @@ $lang = array( ) ), 'title' => array( + '_transfer' => 'This title will be converted to %s if you transfer to %s.', 'cat' => array( "General", "Player vs. Player", "Reputation", "Dungeons & Raids", "Quests", "Professions", "World Events" ) @@ -620,9 +625,11 @@ $lang = array( ), 'faction' => array( 'spillover' => "Reputation Spillover", - 'spilloverDesc' => "Gaining Reputation with this faction also yields a proportional gain with the factions listed below.", + 'spilloverDesc' => "Gaining reputation with this faction also yields a proportional gain with the factions listed below.", 'maxStanding' => "Max. Standing", 'quartermaster' => "Quartermaster", + 'customRewRate' => "Custom Reward Rate", + '_transfer' => 'The reputation with this faction will be converted to %s if you transfer to %s.', 'cat' => array( 1118 => ["Classic", 469 => "Alliance", 169 => "Steamwheedle Cartel", 67 => "Horde", 891 => "Alliance Forces", 892 => "Horde Forces"], 980 => ["The Burning Crusade", 936 => "Shattrath City"], @@ -674,7 +681,7 @@ $lang = array( '_inSlot' => "in slot", '_collapseAll' => "Collapse All", '_expandAll' => "Expand All", - + '_transfer' => 'This spell will be converted to %s if you transfer to %s.', 'discovered' => "Learned via discovery", 'ppm' => "%s procs per minute", 'procChance' => "Proc chance", diff --git a/localization/locale_eses.php b/localization/locale_eses.php index e0bf8ef5..9d0b9ee0 100644 --- a/localization/locale_eses.php +++ b/localization/locale_eses.php @@ -381,7 +381,8 @@ $lang = array( 'focusDesc' => "[Spells requiring this Focus can be cast near this Object]", 'trap' => "Trampa", 'triggeredBy' => "Accionado por", - 'capturePoint' => "Punto de captura" + 'capturePoint' => "Punto de captura", + 'restock' => "[Restocks every %s.]" ), 'npc' => array( 'classification'=> "Clasificación", @@ -434,7 +435,8 @@ $lang = array( 'itemReward' => "Recibirás", 'titleReward' => 'Deberías obtener el título "%s"', 'slain' => "matado", - 'reqNumCrt' => "Requiere" + 'reqNumCrt' => "Requiere", + '_transfer' => 'Este logro será convertido a %s si lo transfieres a la %s.', ), 'class' => array( 'racialLeader' => "Lider racial", @@ -473,6 +475,8 @@ $lang = array( ) ), 'quest' => array( + '_transfer' => 'Esta misión será convertido a %s si lo transfieres a la %s.', + 'questLevel' => 'Nivel %s', 'requirements' => 'Requisitos', 'reqMoney' => 'Dinero necesario', @@ -602,6 +606,7 @@ $lang = array( ) ), 'title' => array( + '_transfer' => 'Este título será convertido a %s si lo transfieres a la %s.', 'cat' => array( "General", "Jugador contra Jugador", "Reputación", "Mazmorras y bandas", "Misiones", "Profesiones", "Eventos del mundo" ) @@ -624,9 +629,11 @@ $lang = array( ), 'faction' => array( 'spillover' => "[Reputation Spillover]", - 'spilloverDesc' => "[Gaining Reputation with this faction also yields a proportional gain with the factions listed below.]", + 'spilloverDesc' => "[Gaining reputation with this faction also yields a proportional gain with the factions listed below.]", 'maxStanding' => "Posición máxima", 'quartermaster' => "Intendente", + 'customRewRate' => "[Custom Reward Rate]", + '_transfer' => '[The reputation with this faction will be converted to %s if you transfer to %s.]', 'cat' => array( 1118 => ["Clásicas", 469 => "Alianza", 169 => "Cártel Bonvapor", 67 => "Horda", 891 => "Fuerzas de la Alianza", 892 => "Fuerzas de la Horda"], 980 => ["The Burning Crusade", 936 => "Ciudad de Shattrath"], @@ -678,7 +685,7 @@ $lang = array( '_inSlot' => "en la casilla", '_collapseAll' => "Contraer todo", '_expandAll' => "Expandier todo", - + '_transfer' => 'Este hechizo será convertido a %s si lo transfieres a la %s.', 'discovered' => "Aprendido via descubrimiento", 'ppm' => "%s procs por minuto", 'procChance' => "Probabilidad de que accione", diff --git a/localization/locale_frfr.php b/localization/locale_frfr.php index 89baf887..b57b44ac 100644 --- a/localization/locale_frfr.php +++ b/localization/locale_frfr.php @@ -380,7 +380,8 @@ $lang = array( 'focusDesc' => "[Spells requiring this Focus can be cast near this Object]", 'trap' => "Piège", 'triggeredBy' => "Déclenché par", - 'capturePoint' => "Point de capture" + 'capturePoint' => "Point de capture", + 'restock' => "[Restocks every %s.]" ), 'npc' => array( 'classification'=> "Classification", @@ -433,7 +434,8 @@ $lang = array( 'itemReward' => "Vous recevrez", 'titleReward' => "Vous devriez recevoir le titre \"%s\"", 'slain' => "tué", - 'reqNumCrt' => "Nécessite" + 'reqNumCrt' => "Nécessite", + '_transfer' => 'Cet haut fait sera converti en %s si vous transférez en %s.', ), 'class' => array( 'racialLeader' => "Leader racial", @@ -472,6 +474,8 @@ $lang = array( ) ), 'quest' => array( + '_transfer' => 'Cette quête sera converti en %s si vous transférez en %s.', + 'questLevel' => "Niveau %s", 'requirements' => "Conditions", 'reqMoney' => "Argent requis", @@ -600,6 +604,7 @@ $lang = array( ) ), 'title' => array( + '_transfer' => 'Ce titre sera converti en %s si vous transférez en %s.', 'cat' => array( "Général", "Joueur ctr. Joueur", "Réputation", "Donjons & raids", "Quêtes", "Métiers", "Évènements mondiaux" ) @@ -622,9 +627,11 @@ $lang = array( ), 'faction' => array( 'spillover' => "[Reputation Spillover]", - 'spilloverDesc' => "[Gaining Reputation with this faction also yields a proportional gain with the factions listed below.]", + 'spilloverDesc' => "[Gaining reputation with this faction also yields a proportional gain with the factions listed below.]", 'maxStanding' => "Niveau maximum", 'quartermaster' => "Intendant", + 'customRewRate' => "[Custom Reward Rate]", + '_transfer' => '[The reputation with this faction will be converted to %s if you transfer to %s.]', 'cat' => array( 1118 => ["Classique", 469 => "Alliance", 169 => "Cartel Gentepression", 67 => "Horde", 891 => "Forces de l'Alliance", 892 => "Forces de la Horde"], 980 => ["The Burning Crusade", 936 => "Shattrath"], @@ -676,7 +683,7 @@ $lang = array( '_inSlot' => "dans l'emplacement", '_collapseAll' => "Replier Tout", '_expandAll' => "Déplier Tout", - + '_transfer' => 'Cet sort sera converti en %s si vous transférez en %s.', 'discovered' => "Appris via une découverte", 'ppm' => "%s déclenchements par minute", 'procChance' => "Chance", diff --git a/localization/locale_ruru.php b/localization/locale_ruru.php index a87d98f0..5cfab211 100644 --- a/localization/locale_ruru.php +++ b/localization/locale_ruru.php @@ -380,7 +380,8 @@ $lang = array( 'focusDesc' => "[Spells requiring this Focus can be cast near this Object]", 'trap' => "Ловушки", 'triggeredBy' => "Срабатывает от", - 'capturePoint' => "Точка захвата" + 'capturePoint' => "Точка захвата", + 'restock' => "[Restocks every %s.]" ), 'npc' => array( 'classification'=> "Классификация", @@ -433,7 +434,8 @@ $lang = array( 'itemReward' => "Вы получите", 'titleReward' => 'Наградное звание: "%s"', 'slain' => "убито", - 'reqNumCrt' => "Требуется" + 'reqNumCrt' => "Требуется", + '_transfer' => 'Этот предмет превратится в %s, если вы перейдете за %s.', ), 'class' => array( 'racialLeader' => "Лидер расы", @@ -472,6 +474,8 @@ $lang = array( ) ), 'quest' => array( + '_transfer' => 'Этот предмет превратится в %s, если вы перейдете за %s.', + 'questLevel' => "%s-го уровня", 'requirements' => "Требования", 'reqMoney' => "Требуется денег", @@ -601,6 +605,7 @@ $lang = array( ) ), 'title' => array( + '_transfer' => 'Этот предмет превратится в %s, если вы перейдете за %s.', 'cat' => array( 'Общее", "PvP", "Репутация", "Подземелья и рейды", "Задания", "Профессии", "Игровые события' ) @@ -623,9 +628,11 @@ $lang = array( ), 'faction' => array( 'spillover' => "[Reputation Spillover]", - 'spilloverDesc' => "[Gaining Reputation with this faction also yields a proportional gain with the factions listed below.]", + 'spilloverDesc' => "[Gaining reputation with this faction also yields a proportional gain with the factions listed below.]", 'maxStanding' => "Макс Уровень", 'quartermaster' => "Интендант", + 'customRewRate' => "[Custom Reward Rate]", + '_transfer' => '[The reputation with this faction will be converted to %s if you transfer to %s.]', 'cat' => array( 1118 => ["World of Warcraft", 469 => "Альянс", 169 => "Картель Хитрая Шестеренка", 67 => "Орда", 891 => "Силы Альянса", 892 => "Силы Орды"], 980 => ["The Burning Crusade", 936 => "Город Шаттрат"], @@ -675,8 +682,9 @@ $lang = array( '_radius' => "Радиус действия", '_interval' => "Интервал", '_inSlot' => "в слот", - '_collapseAll' => "[Collapse All]", - '_expandAll' => "[Expand All]", + '_collapseAll' => "Свернуть все", + '_expandAll' => "Развернуть все", + '_transfer' => 'Этот предмет превратится в %s, если вы перейдете за %s.', 'discovered' => "Изучается путём освоения местности", 'ppm' => "Срабатывает %s раз в минуту", diff --git a/pages/account.php b/pages/account.php index 0411da19..59185fa4 100644 --- a/pages/account.php +++ b/pages/account.php @@ -24,6 +24,14 @@ class AccountPage extends GenericPage protected $error = ''; protected $next = ''; + private $_post = array( + 'username' => [FILTER_SANITIZE_SPECIAL_CHARS, 0xC], // FILTER_FLAG_STRIP_LOW | *_HIGH + 'password' => [FILTER_UNSAFE_RAW, null], + 'c_password' => [FILTER_UNSAFE_RAW, null], + 'remember_me' => [FILTER_CALLBACK, ['options' => 'AccountPage::rememberCallback']], + 'email' => [FILTER_SANITIZE_EMAIL, null] + ); + public function __construct($pageCall, $pageParam) { if ($pageParam) @@ -31,6 +39,9 @@ class AccountPage extends GenericPage parent::__construct($pageCall, $pageParam); + foreach ($this->_post as $k => &$v) + $v = !empty($_POST[$k]) ? filter_input(INPUT_POST, $k, $v[0], $v[1]) : null; + if ($pageParam) { // requires auth && not authed @@ -42,6 +53,11 @@ class AccountPage extends GenericPage } } + private function rememberCallback($val) + { + return $val == 'yes' ? $val : null; + } + protected function generateContent() { if (!$this->category) @@ -71,16 +87,16 @@ class AccountPage extends GenericPage $this->tpl = 'acc-recover'; $this->resetPass = false; - if (isset($_POST['email'])) + if ($this->_post['email']) { - if (!Util::isValidEmail($_POST['email'])) + if (!Util::isValidEmail($this->_post['email'])) $this->error = Lang::$account['emailInvalid']; - else if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE email = ?', $_POST['email'])) + else if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE email = ?', $this->_post['email'])) $this->error = Lang::$account['emailNotFound']; - else if ($err = $this->doRecoverUser($_POST['email'])) + else if ($err = $this->doRecoverUser()) $this->error = $err; else - $this->text = sprintf(Lang::$account['recovUserSent']. $_POST['email']); + $this->text = sprintf(Lang::$account['recovUserSent']. $this->_post['email']); } $this->head = Lang::$account['recoverUser']; @@ -88,7 +104,7 @@ class AccountPage extends GenericPage case 'signin': $this->tpl = 'acc-signIn'; $this->next = $this->getNext(); - if (isset($_POST['username']) || isset($_POST['password'])) + if ($this->_post['username'] || $this->_post['password']) { if ($err = $this->doSignIn()) $this->error = $err; @@ -108,14 +124,14 @@ class AccountPage extends GenericPage $this->tpl = 'acc-signUp'; $nStep = 1; - if (isset($_POST['username']) || isset($_POST['password']) || isset($_POST['c_password']) || isset($_POST['email'])) + if ($this->_post['username'] || $this->_post['password'] || $this->_post['c_password'] || $this->_post['email']) { if ($err = $this->doSignUp()) $this->error = $err; else { $nStep = 1.5; - $this->text = sprintf(Lang::$account['createAccSent'], $_POST['email']); + $this->text = sprintf(Lang::$account['createAccSent'], $this->_post['email']); } } else if (!empty($_GET['token']) && ($newId = DB::Aowow()->selectCell('SELECT id FROM ?_account WHERE status = ?d AND token = ?', ACC_STATUS_NEW, $_GET['token']))) @@ -275,18 +291,18 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup { $step = 1; - if (isset($_POST['email'])) // step 1 + if ($this->_post['email']) // step 1 { - if (!Util::isValidEmail($_POST['email'])) + if (!Util::isValidEmail($this->_post['email'])) $this->error = Lang::$account['emailInvalid']; - else if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE email = ?', $_POST['email'])) + else if (!DB::Aowow()->selectCell('SELECT 1 FROM ?_account WHERE email = ?', $this->_post['email'])) $this->error = Lang::$account['emailNotFound']; - else if ($err = $this->doRecoverPass($_POST['email'])) + else if ($err = $this->doRecoverPass()) $this->error = $err; else { $step = 1.5; - $this->text = sprintf(Lang::$account['recovPassSent'], $_POST['email']); + $this->text = sprintf(Lang::$account['recovPassSent'], $this->_post['email']); } } else if (isset($_GET['token'])) // step 2 @@ -295,7 +311,7 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup $this->resetPass = true; $this->token = $_GET['token']; } - else if (isset($_POST['token']) && isset($_POST['email']) && isset($_POST['password']) && isset($_POST['c_password'])) + else if ($this->_post['token'] && $this->_post['email'] && $this->_post['password'] && $this->_post['c_password']) { $step = 2; $this->resetPass = true; @@ -312,19 +328,15 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup private function doSignIn() { - $username = @$_POST['username']; - $password = @$_POST['password']; - $doExpire = @$_POST['remember_me'] != 'yes'; - // check username - if (!User::isValidName($username)) + if (!User::isValidName($this->_post['username'])) return Lang::$account['userNotFound']; // check password - if (!User::isValidPass($password)) + if (!User::isValidPass($this->_post['password'])) return Lang::$account['wrongPass']; - switch (User::Auth($username, $password)) + switch (User::Auth($this->_post['username'], $this->_post['password'])) { case AUTH_OK: if (!User::$ip) @@ -333,8 +345,8 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup // reset account status, update expiration DB::Aowow()->query('UPDATE ?_account SET prevIP = IF(curIp = ?, prevIP, curIP), curIP = IF(curIp = ?, curIP, ?), allowExpire = ?d, status = 0, statusTimer = 0, token = "" WHERE user = ?', User::$ip, User::$ip, User::$ip, - $doExpire, - $username + $this->_post['remember_me'] != 'yes', + $this->_post['username'] ); if (User::init()) @@ -367,25 +379,19 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup private function doSignUp() { - $username = @$_POST['username']; - $password = @$_POST['password']; - $cPassword = @$_POST['c_password']; - $email = @$_POST['email']; - $doExpire = @$_POST['remember_me'] != 'yes'; - // check username - if (!User::isValidName($username, $e)) + if (!User::isValidName($this->_post['username'], $e)) return Lang::$account[$e == 1 ? 'errNameLength' : 'errNameChars']; // check password - if (!User::isValidPass($password, $e)) + if (!User::isValidPass($this->_post['password'], $e)) return Lang::$account[$e == 1 ? 'errPassLength' : 'errPassChars']; - if ($password != $cPassword) + if ($this->_post['password'] != $this->_post['c_password']) return Lang::$account['passMismatch']; // check email - if (!Util::isValidEmail($email)) + if (!Util::isValidEmail($this->_post['email'])) return Lang::$account['emailInvalid']; // check ip @@ -401,18 +407,18 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup } // username taken - if ($_ = DB::Aowow()->SelectCell('SELECT user FROM ?_account WHERE (user = ? OR email = ?) AND (status <> ?d OR (status = ?d AND statusTimer > UNIX_TIMESTAMP()))', $username, $email, ACC_STATUS_NEW, ACC_STATUS_NEW)) - return $_ == $username ? Lang::$account['nameInUse'] : Lang::$account['mailInUse']; + if ($_ = DB::Aowow()->SelectCell('SELECT user FROM ?_account WHERE (user = ? OR email = ?) AND (status <> ?d OR (status = ?d AND statusTimer > UNIX_TIMESTAMP()))', $this->_post['username'], $email, ACC_STATUS_NEW, ACC_STATUS_NEW)) + return $_ == $this->_post['username'] ? Lang::$account['nameInUse'] : Lang::$account['mailInUse']; // create.. $token = Util::createHash(); $id = DB::Aowow()->query('REPLACE INTO ?_account (user, passHash, displayName, email, joindate, curIP, allowExpire, locale, status, statusTimer, token) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(), ?, ?d, ?d, ?d, UNIX_TIMESTAMP() + ?d, ?)', - $username, - User::hashCrypt($_POST['password']), - Util::ucFirst($username), - $email, + $this->_post['username'], + User::hashCrypt($this->_post['password']), + Util::ucFirst($this->_post['username']), + $this->_post['email'], User::$ip, - $doExpire, + $this->_post['remember_me'] != 'yes', User::$localeId, ACC_STATUS_NEW, CFG_ACCOUNT_CREATE_SAVE_DECAY, @@ -420,7 +426,7 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup ); if (!$id) // something went wrong return Lang::$main['intError']; - else if ($_ = $this->sendMail($email, Lang::$mail['accConfirm'][0], sprintf(Lang::$mail['accConfirm'][1], $token), CFG_ACCOUNT_CREATE_SAVE_DECAY)) + else if ($_ = $this->sendMail(Lang::$mail['accConfirm'][0], sprintf(Lang::$mail['accConfirm'][1], $token), CFG_ACCOUNT_CREATE_SAVE_DECAY)) { // success:: update ip-bans if (!$ip || $ip['unbanDate'] < time()) @@ -432,61 +438,63 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup } } - private function doRecoverPass($target) + private function doRecoverPass() { - if ($_ = $this->initRecovery(ACC_STATUS_RECOVER_PASS, $target, CFG_ACCOUNT_RECOVERY_DECAY, $token)) + if ($_ = $this->initRecovery(ACC_STATUS_RECOVER_PASS, CFG_ACCOUNT_RECOVERY_DECAY, $token)) return $_; // send recovery mail - return $this->sendMail($target, Lang::$mail['resetPass'][0], sprintf(Lang::$mail['resetPass'][1], $token), CFG_ACCOUNT_RECOVERY_DECAY); + return $this->sendMail(Lang::$mail['resetPass'][0], sprintf(Lang::$mail['resetPass'][1], $token), CFG_ACCOUNT_RECOVERY_DECAY); } private function doResetPass() { - $token = $_POST['token']; - $email = $_POST['email']; - $pass = $_POST['password']; - $cPass = $_POST['c_password']; - - if ($pass != $cPass) + if ($this->_post['password'] != $this->_post['c_password']) return Lang::$account['passCheckFail']; - $uRow = DB::Aowow()->selectRow('SELECT id, user, passHash FROM ?_account WHERE token = ? AND email = ? AND status = ?d AND statusTimer > UNIX_TIMESTAMP()', $token, $email, ACC_STATUS_RECOVER_PASS); - if (!$uRow) + if (!Util::isValidEmail($this->_post['email'])) + return Lang::$account['emailInvalid']; + + $uId = DB::Aowow()->selectCell('SELECT id FROM ?_account WHERE token = ? AND email = ? AND status = ?d AND statusTimer > UNIX_TIMESTAMP()', + $this->_post['token'], + $this->_post['email'], + ACC_STATUS_RECOVER_PASS + ); + if (!$uId) return Lang::$account['emailNotFound']; // assume they didn't meddle with the token if (!User::verifyCrypt($newPass)) return Lang::$account['newPassDiff']; - if (!DB::Aowow()->query('UPDATE ?_account SET passHash = ?, status = ?d WHERE id = ?d', User::hashcrypt($newPass), ACC_STATUS_OK, $uRow['id'])) + if (!DB::Aowow()->query('UPDATE ?_account SET passHash = ?, status = ?d WHERE id = ?d', User::hashcrypt($newPass), ACC_STATUS_OK, $uId)) return Lang::$main['intError']; } - private function doRecoverUser($target) + private function doRecoverUser() { - if ($_ = $this->initRecovery(ACC_STATUS_RECOVER_USER, $target, CFG_ACCOUNT_RECOVERY_DECAY, $token)) + if ($_ = $this->initRecovery(ACC_STATUS_RECOVER_USER, CFG_ACCOUNT_RECOVERY_DECAY, $token)) return $_; // send recovery mail - return $this->sendMail($target, Lang::$mail['recoverUser'][0], sprintf(Lang::$mail['recoverUser'][1], $token), CFG_ACCOUNT_RECOVERY_DECAY); + return $this->sendMail(Lang::$mail['recoverUser'][0], sprintf(Lang::$mail['recoverUser'][1], $token), CFG_ACCOUNT_RECOVERY_DECAY); } - private function initRecovery($type, $target, $delay, &$token) + private function initRecovery($type, $delay, &$token) { if (!$type) return Lang::$main['intError']; // check if already processing - if ($_ = DB::Aowow()->selectCell('SELECT statusTimer - UNIX_TIMESTAMP() FROM ?_account WHERE email = ? AND status <> ?d AND statusTimer > UNIX_TIMESTAMP()', $target, ACC_STATUS_OK)) + if ($_ = DB::Aowow()->selectCell('SELECT statusTimer - UNIX_TIMESTAMP() FROM ?_account WHERE email = ? AND status <> ?d AND statusTimer > UNIX_TIMESTAMP()', $this->_post['email'], ACC_STATUS_OK)) return sprintf(lang::$account['isRecovering'], Util::formatTime($_ * 1000)); // create new token and write to db $token = Util::createHash(); - if (!DB::Aowow()->query('UPDATE ?_account SET token = ?, status = ?d, statusTimer = UNIX_TIMESTAMP() + ?d WHERE email = ?', $token, $type, $delay, $target)) + if (!DB::Aowow()->query('UPDATE ?_account SET token = ?, status = ?d, statusTimer = UNIX_TIMESTAMP() + ?d WHERE email = ?', $token, $type, $delay, $this->_post['email'])) return Lang::$main['intError']; } - private function sendMail($target, $subj, $msg, $delay = 300) + private function sendMail($subj, $msg, $delay = 300) { // send recovery mail $subj = CFG_NAME_SHORT.Lang::$main['colon'] . $subj; @@ -495,7 +503,7 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup 'Reply-To: '.CFG_CONTACT_EMAIL . "\r\n" . 'X-Mailer: PHP/' . phpversion(); - if (!mail($target, $subj, $msg, $header)) + if (!mail($this->_post['email'], $subj, $msg, $header)) return sprintf(Lang::$main['intError2'], 'send mail'); } diff --git a/pages/achievement.php b/pages/achievement.php index 86f30f96..76ae9777 100644 --- a/pages/achievement.php +++ b/pages/achievement.php @@ -183,7 +183,23 @@ class AchievementPage extends GenericPage $this->rewards['text'] = $this->subject->getField('reward', true); - // todo (low): create pendant from player_factionchange_achievement + // factionchange-equivalent + if ($pendant = DB::World()->selectCell('SELECT IF(horde_id = ?d, alliance_id, -horde_id) FROM player_factionchange_achievement WHERE alliance_id = ?d OR horde_id = ?d', $this->typeId, $this->typeId, $this->typeId)) + { + $altAcv = new AchievementList(array(['id', abs($pendant)])); + if (!$altAcv->error) + { + $this->transfer = sprintf( + Lang::$achievement['_transfer'], + $altAcv->id, + 1, // quality + $altAcv->getField('iconString'), + $altAcv->getField('name', true), + $pendant > 0 ? 'alliance' : 'horde', + $pendant > 0 ? Lang::$game['si'][1] : Lang::$game['si'][2] + ); + } + } /**************/ /* Extra Tabs */ diff --git a/pages/class.php b/pages/class.php index c347a2b1..24e62ed0 100644 --- a/pages/class.php +++ b/pages/class.php @@ -43,6 +43,8 @@ class ClassPage extends GenericPage protected function generateContent() { + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + $infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags')); $_mask = 1 << ($this->typeId - 1); $tcClassId = [null, 8, 3, 1, 5, 4, 9, 6, 2, 7, null, 0]; // see TalentCalc.js diff --git a/pages/currency.php b/pages/currency.php index 10e8f8da..3f29f050 100644 --- a/pages/currency.php +++ b/pages/currency.php @@ -42,6 +42,8 @@ class CurrencyPage extends GenericPage protected function generateContent() { + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + $_itemId = $this->subject->getField('itemId'); /***********/ @@ -59,7 +61,7 @@ class CurrencyPage extends GenericPage /* Main Content */ /****************/ - $this->infobox = '[ul][li]'.implode('[/li][li]', $infobox).'[/li][/ul]'; + $this->infobox = $infobox ? '[ul][li]'.implode('[/li][li]', $infobox).'[/li][/ul]' : null; $this->name = $this->subject->getField('name', true); $this->headIcons = $this->typeId == 104 ? ['inv_bannerpvp_02', 'inv_bannerpvp_01'] : [$this->subject->getField('iconString')]; $this->redButtons = array( @@ -98,8 +100,9 @@ class CurrencyPage extends GenericPage // tab: sold by $itemObj = new ItemList(array(['id', $_itemId])); - if ($vendors = @$itemObj->getExtendedCost()[$_itemId]) + if (!empty($itemObj->getExtendedCost()[$_itemId])) { + $vendors = $itemObj->getExtendedCost()[$_itemId]; $this->extendGlobalData($itemObj->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_RELATED)); $soldBy = new CreatureList(array(['id', array_keys($vendors)])); @@ -183,30 +186,29 @@ class CurrencyPage extends GenericPage if ($this->typeId == 103) { $n = '?items&filter=cr=145;crs=1;crv=0'; - $w = 'iec.reqArenaPoints > 0'; + $w = 'reqArenaPoints > 0'; } else if ($this->typeId == 104) { $n = '?items&filter=cr=144;crs=1;crv=0'; - $w = 'iec.reqHonorPoints > 0'; + $w = 'reqHonorPoints > 0'; } else { $n = in_array($this->typeId, [42, 61, 81, 241, 121, 122, 123, 125, 126, 161, 201, 101, 102, 221, 301, 341]) ? '?items&filter=cr=158;crs='.$_itemId.';crv=0' : null; - $w = 'iec.reqItemId1 = '.$_itemId.' OR iec.reqItemId2 = '.$_itemId.' OR iec.reqItemId3 = '.$_itemId.' OR iec.reqItemId4 = '.$_itemId.' OR iec.reqItemId5 = '.$_itemId; + $w = 'reqItemId1 = '.$_itemId.' OR reqItemId2 = '.$_itemId.' OR reqItemId3 = '.$_itemId.' OR reqItemId4 = '.$_itemId.' OR reqItemId5 = '.$_itemId; } - $boughtBy = DB::Aowow()->selectCol(' - SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE '.$w.' - UNION - SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE '.$w - ); - + $xCosts = DB::Aowow()->selectCol('SELECT id FROM ?_itemextendedcost WHERE '.$w); + $boughtBy = DB::World()->selectCol('SELECT item FROM npc_vendor WHERE extendedCost IN (?a) UNION SELECT item FROM game_event_npc_vendor WHERE extendedCost IN (?a)', $xCosts, $xCosts); if ($boughtBy) { $boughtBy = new ItemList(array(['id', $boughtBy])); if (!$boughtBy->error) { + if ($boughtBy->getMatches() <= CFG_SQL_LIMIT_DEFAULT) + $n = null; + $this->lvTabs[] = array( 'file' => 'item', 'data' => $boughtBy->getListviewData(ITEMINFO_VENDOR, [TYPE_CURRENCY => $this->typeId]), diff --git a/pages/event.php b/pages/event.php index aea4e8ae..f58cb29f 100644 --- a/pages/event.php +++ b/pages/event.php @@ -61,6 +61,8 @@ class EventPage extends GenericPage protected function generateContent() { + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + /***********/ /* Infobox */ /***********/ @@ -101,7 +103,7 @@ class EventPage extends GenericPage $hasFilter = in_array($this->hId, [372, 283, 285, 353, 420, 400, 284, 201, 374, 409, 141, 324, 321, 424, 335, 327, 341, 181, 404, 398, 301]); // tab: npcs - if ($npcIds = DB::Aowow()->selectCol('SELECT id AS ARRAY_KEY, IF(ec.eventEntry > 0, 1, 0) AS added FROM creature c, game_event_creature ec WHERE ec.guid = c.guid AND ABS(ec.eventEntry) = ?d', $this->eId)) + if ($npcIds = DB::World()->selectCol('SELECT id AS ARRAY_KEY, IF(ec.eventEntry > 0, 1, 0) AS added FROM creature c, game_event_creature ec WHERE ec.guid = c.guid AND ABS(ec.eventEntry) = ?d', $this->eId)) { $creatures = new CreatureList(array(['id', array_keys($npcIds)])); if (!$creatures->error) @@ -119,7 +121,7 @@ class EventPage extends GenericPage } // tab: objects - if ($objectIds = DB::Aowow()->selectCol('SELECT id AS ARRAY_KEY, IF(eg.eventEntry > 0, 1, 0) AS added FROM gameobject g, game_event_gameobject eg WHERE eg.guid = g.guid AND ABS(eg.eventEntry) = ?d', $this->eId)) + if ($objectIds = DB::World()->selectCol('SELECT id AS ARRAY_KEY, IF(eg.eventEntry > 0, 1, 0) AS added FROM gameobject g, game_event_gameobject eg WHERE eg.guid = g.guid AND ABS(eg.eventEntry) = ?d', $this->eId)) { $objects = new GameObjectList(array(['id', array_keys($objectIds)])); if (!$objects->error) @@ -193,7 +195,7 @@ class EventPage extends GenericPage { // vendor $cIds = $creatures->getFoundIDs(); - if ($sells = DB::Aowow()->selectCol('SELECT item FROM npc_vendor nv WHERE entry IN (?a) UNION SELECT item FROM game_event_npc_vendor genv JOIN creature c ON genv.guid = c.guid WHERE c.id IN (?a)', $cIds, $cIds)) + if ($sells = DB::World()->selectCol('SELECT item FROM npc_vendor nv WHERE entry IN (?a) UNION SELECT item FROM game_event_npc_vendor genv JOIN creature c ON genv.guid = c.guid WHERE c.id IN (?a)', $cIds, $cIds)) $itemCnd[] = ['id', $sells]; } @@ -215,7 +217,7 @@ class EventPage extends GenericPage } // tab: see also (event conditions) - if ($rel = DB::Aowow()->selectCol('SELECT IF(eventEntry = prerequisite_event, NULL, IF(eventEntry = ?d, -prerequisite_event, eventEntry)) FROM game_event_prerequisite WHERE prerequisite_event = ?d OR eventEntry = ?d', $this->eId, $this->eId, $this->eId)) + if ($rel = DB::World()->selectCol('SELECT IF(eventEntry = prerequisite_event, NULL, IF(eventEntry = ?d, -prerequisite_event, eventEntry)) FROM game_event_prerequisite WHERE prerequisite_event = ?d OR eventEntry = ?d', $this->eId, $this->eId, $this->eId)) { $list = []; array_walk($rel, function($v, $k) use (&$list) { diff --git a/pages/faction.php b/pages/faction.php index 1e3e53b6..bc94cff4 100644 --- a/pages/faction.php +++ b/pages/faction.php @@ -48,6 +48,8 @@ class FactionPage extends GenericPage protected function generateContent() { + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + /***********/ /* Infobox */ /***********/ @@ -91,7 +93,7 @@ class FactionPage extends GenericPage // Spillover Effects /* todo (low): also check on reputation_spillover_template (but its data is identical to calculation below - $rst = DB::Aowow()->selectRow('SELECT + $rst = DB::World()->selectRow('SELECT CONCAT_WS(" ", faction1, faction2, faction3, faction4) AS faction, CONCAT_WS(" ", rate_1, rate_2, rate_3, rate_4) AS rate, CONCAT_WS(" ", rank_1, rank_2, rank_3, rank_4) AS rank @@ -100,14 +102,14 @@ class FactionPage extends GenericPage $conditions = array( - ['id', $this->typeId, '!'], // not self + ['id', $this->typeId, '!'], // not self ['reputationIndex', -1, '!'] // only gainable ); - if ($p = $this->subject->getField('parentFactionId')) // linked via parent + if ($p = $this->subject->getField('parentFactionId')) // linked via parent $conditions[] = ['OR', ['id', $p], ['parentFactionId', $p]]; - else - $conditions[] = ['parentFactionId', $this->typeId]; // self as parent + else // self as parent + $conditions[] = ['parentFactionId', $this->typeId]; $spillover = new FactionList($conditions); $this->extendGlobalData($spillover->getJSGlobals()); @@ -121,8 +123,8 @@ class FactionPage extends GenericPage $this->extraText .= '[h3 class=clear]'.Lang::$faction['spillover'].'[/h3][div margin=15px]'.Lang::$faction['spilloverDesc'].'[/div][table class=grid width=400px][tr][td width=150px][b]'.Util::ucFirst(Lang::$game['faction']).'[/b][/td][td width=100px][b]'.Lang::$spell['_value'].'[/b][/td][td width=150px][b]'.Lang::$faction['maxStanding'].'[/b][/td][/tr]'.$buff.'[/table]'; - // reward rates - if ($rates = DB::Aowow()->selectRow('SELECT * FROM reputation_reward_rate WHERE faction = ?d', $this->typeId)) + // reward rates (ultimately this should be calculated into each reward display) + if ($rates = DB::World()->selectRow('SELECT * FROM reputation_reward_rate WHERE faction = ?d', $this->typeId)) { $buff = ''; foreach ($rates as $k => $v) @@ -140,14 +142,28 @@ class FactionPage extends GenericPage case 'spell_rate': $buff .= '[tr][td]'.Lang::$game['spells'].Lang::$main['colon'].'[/td]'; break; } - $buff .= '[td width=30px align=right]x'.number_format($v, 1).'[/td][/tr]'; + $buff .= '[td width=35px align=right][span class=q'.($v < 1 ? '10]' : '2]+').intVal(($v - 1) * 100).'%[/span][/td][/tr]'; } if ($buff) - $this->extraText .= '[h3 class=clear][Custom Reward Rate][/h3][table]'.$buff.'[/table]'; + $this->extraText .= '[h3 class=clear]'.Lang::faction('customRewRate').'[/h3][table]'.$buff.'[/table]'; } - // todo (low): create pendant from player_factionchange_reputations + // factionchange-equivalent + if ($pendant = DB::World()->selectCell('SELECT IF(horde_id = ?d, alliance_id, -horde_id) FROM player_factionchange_reputations WHERE alliance_id = ?d OR horde_id = ?d', $this->typeId, $this->typeId, $this->typeId)) + { + $altFac = new FactionList(array(['id', abs($pendant)])); + if (!$altFac->error) + { + $this->transfer = sprintf( + Lang::faction('_transfer'), + $altFac->id, + $altFac->getField('name', true), + $pendant > 0 ? 'alliance' : 'horde', + $pendant > 0 ? Lang::$game['si'][1] : Lang::$game['si'][2] + ); + } + } /**************/ /* Extra Tabs */ @@ -178,11 +194,12 @@ class FactionPage extends GenericPage // tab: creatures with onKill reputation if ($this->subject->getField('reputationIndex') != -1) // only if you can actually gain reputation by kills { - $cIds = DB::Aowow()->selectCol('SELECT DISTINCT cor.creature_id FROM creature_onkill_reputation cor, ?_factions f WHERE - (cor.RewOnKillRepValue1 > 0 AND (cor.RewOnKillRepFaction1 = ?d OR (cor.RewOnKillRepFaction1 = f.id AND f.parentFactionId = ?d AND cor.IsTeamAward1 <> 0))) OR - (cor.RewOnKillRepValue2 > 0 AND (cor.RewOnKillRepFaction2 = ?d OR (cor.RewOnKillRepFaction2 = f.id AND f.parentFactionId = ?d AND cor.IsTeamAward2 <> 0)))', - $this->typeId, $this->subject->getField('parentFactionId'), - $this->typeId, $this->subject->getField('parentFactionId') + // inherit siblings/children from $spillover + $cIds = DB::World()->selectCol('SELECT DISTINCT creature_id FROM creature_onkill_reputation WHERE + (RewOnKillRepValue1 > 0 AND (RewOnKillRepFaction1 = ?d OR (RewOnKillRepFaction1 IN (?a) AND IsTeamAward1 <> 0))) OR + (RewOnKillRepValue2 > 0 AND (RewOnKillRepFaction2 = ?d OR (RewOnKillRepFaction2 IN (?a) AND IsTeamAward2 <> 0)))', + $this->typeId, $spillover->getFoundIDs(), + $this->typeId, $spillover->getFoundIDs() ); if ($cIds) diff --git a/pages/genericPage.class.php b/pages/genericPage.class.php index aacc197c..9ce86e00 100644 --- a/pages/genericPage.class.php +++ b/pages/genericPage.class.php @@ -82,6 +82,7 @@ class GenericPage private $cacheLoaded = []; private $skipCache = 0x0; private $memcached = null; + private $mysql = ['time' => 0, 'count' => 0]; public function __construct($pageCall/*, $pageParam */) { @@ -216,7 +217,7 @@ class GenericPage } $this->time = microtime(true) - $this->time; - $this->mysql = DB::Aowow()->getStatistics(); + Util::arraySumByKey($this->mysql, DB::Aowow()->getStatistics(), DB::World()->getStatistics()); } public function addJS($name, $unshift = false) @@ -363,8 +364,8 @@ class GenericPage public function notFound($typeStr) // unknown ID { $this->typeStr = $typeStr; - $this->mysql = DB::Aowow()->getStatistics(); $this->hasComContent = false; + Util::arraySumByKey($this->mysql, DB::Aowow()->getStatistics(), DB::World()->getStatistics()); if (isset($this->tabId)) $this->pageTemplate['activeTab'] = $this->tabId; @@ -384,7 +385,7 @@ class GenericPage $this->addArticle(); - $this->mysql = DB::Aowow()->getStatistics(); + Util::arraySumByKey($this->mysql, DB::Aowow()->getStatistics(), DB::World()->getStatistics()); $this->display('text-page-generic'); exit(); @@ -758,7 +759,10 @@ class GenericPage $cache = explode("\n", $cache, 2); $data = $cache[1]; - @list($time, $rev, $type) = explode(' ', $cache[0]); + if (substr_count($cache[0], ' ') < 2) + return false; + + list($time, $rev, $type) = explode(' ', $cache[0]); if ($time + CFG_CACHE_DECAY <= time() || $rev < AOWOW_REVISION) $cache = null; diff --git a/pages/item.php b/pages/item.php index 296b56b0..3aa4c56b 100644 --- a/pages/item.php +++ b/pages/item.php @@ -111,7 +111,7 @@ class ItemPage extends genericPage protected function generateContent() { - $this->addJS('?data=weight-presets&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + $this->addJS('?data=weight-presets.zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); $_flags = $this->subject->getField('flags'); $_slot = $this->subject->getField('slot'); @@ -177,12 +177,13 @@ class ItemPage extends genericPage $infobox[] = Lang::$item['tool'].Lang::$main['colon'].'[url=?items&filter=cr=91;crs='.$tId.';crv=0]'.Util::localizedString($tName, 'name').'[/url]'; // extendedCost - if ($_ = @$this->subject->getExtendedCost([], $_reqRating)[$this->subject->id]) + if (!empty($this->subject->getExtendedCost([], $_reqRating)[$this->subject->id])) { + $vendors = $this->subject->getExtendedCost()[$this->subject->id]; $each = $this->subject->getField('stackable') > 1 ? '[color=q0] ('.Lang::$item['each'].')[/color]' : null; $handled = []; $costList = []; - foreach ($_ as $npcId => $data) + foreach ($vendors as $npcId => $data) { $tokens = []; $currency = []; @@ -348,7 +349,7 @@ class ItemPage extends genericPage while ($next) { - $row = DB::Aowow()->selectRow('SELECT *, text as Text_loc0 FROM page_text pt LEFT JOIN locales_page_text lpt ON pt.entry = lpt.entry WHERE pt.entry = ?d', $next); + $row = DB::World()->selectRow('SELECT *, text as Text_loc0 FROM page_text pt LEFT JOIN locales_page_text lpt ON pt.entry = lpt.entry WHERE pt.entry = ?d', $next); $next = $row['next_page']; $this->pageText[] = Util::parseHtmlText(Util::localizedString($row, 'Text')); } @@ -382,7 +383,7 @@ class ItemPage extends genericPage } // factionchange-equivalent - if ($pendant = DB::Aowow()->selectCell('SELECT IF(horde_id = ?d, alliance_id, -horde_id) FROM player_factionchange_items WHERE alliance_id = ?d OR horde_id = ?d', $this->typeId, $this->typeId, $this->typeId)) + if ($pendant = DB::World()->selectCell('SELECT IF(horde_id = ?d, alliance_id, -horde_id) FROM player_factionchange_items WHERE alliance_id = ?d OR horde_id = ?d', $this->typeId, $this->typeId, $this->typeId)) { $altItem = new ItemList(array(['id', abs($pendant)])); if (!$altItem->error) @@ -761,9 +762,10 @@ class ItemPage extends genericPage } // tab: sold by - if ($vendors = @$this->subject->getExtendedCost([], $_reqRating)[$this->subject->id]) + if (!empty($this->subject->getExtendedCost([], $_reqRating)[$this->subject->id])) { - $soldBy = new CreatureList(array(['id', array_keys($vendors)])); + $vendors = $this->subject->getExtendedCost()[$this->subject->id]; + $soldBy = new CreatureList(array(['id', array_keys($vendors)])); if (!$soldBy->error) { $sbData = $soldBy->getListviewData(); @@ -794,7 +796,7 @@ class ItemPage extends genericPage $this->extendGlobalIds(TYPE_ITEM, array_column($tokens, 0)); $row['stock'] = $vendors[$k]['stock']; - $row['cost'] = [$this->subject->getField('buyPrice')]; + $row['cost'] = [empty($vendors[$k][0]) ? 0 : $vendors[$k][0]]; if ($e = $vendors[$k]['event']) { @@ -838,22 +840,31 @@ class ItemPage extends genericPage // tab: currency for // some minor trickery: get arenaPoints(43307) and honorPoints(43308) directly if ($this->typeId == 43307) - $w = 'iec.reqArenaPoints > 0'; + { + $n = '?items&filter=cr=145;crs=1;crv=0'; + $w = 'reqArenaPoints > 0'; + } else if ($this->typeId == 43308) - $w = 'iec.reqHonorPoints > 0'; + { + $n = '?items&filter=cr=144;crs=1;crv=0'; + $w = 'reqHonorPoints > 0'; + } else - $w = 'iec.reqItemId1 = '.$this->typeId.' OR iec.reqItemId2 = '.$this->typeId.' OR iec.reqItemId3 = '.$this->typeId.' OR iec.reqItemId4 = '.$this->typeId.' OR iec.reqItemId5 = '.$this->typeId; + { + $n = in_array($this->typeId, [42, 61, 81, 241, 121, 122, 123, 125, 126, 161, 201, 101, 102, 221, 301, 341]) ? '?items&filter=cr=158;crs='.$_itemId.';crv=0' : null; + $w = 'reqItemId1 = '.$this->typeId.' OR reqItemId2 = '.$this->typeId.' OR reqItemId3 = '.$this->typeId.' OR reqItemId4 = '.$this->typeId.' OR reqItemId5 = '.$this->typeId; + } - $boughtBy = DB::Aowow()->selectCol(' - SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE '.$w.' - UNION - SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE '.$w - ); + $xCosts = DB::Aowow()->selectCol('SELECT id FROM ?_itemextendedcost WHERE '.$w); + $boughtBy = $xCosts ? DB::World()->selectCol('SELECT item FROM npc_vendor WHERE extendedCost IN (?a) UNION SELECT item FROM game_event_npc_vendor WHERE extendedCost IN (?a)', $xCosts, $xCosts) : null; if ($boughtBy) { $boughtBy = new ItemList(array(['id', $boughtBy])); if (!$boughtBy->error) { + if ($boughtBy->getMatches() <= CFG_SQL_LIMIT_DEFAULT) + $n = null; + $iCur = new CurrencyList(array(['itemId', $this->typeId])); $filter = $iCur->error ? [TYPE_ITEM => $this->typeId] : [TYPE_CURRENCY => $iCur->id]; @@ -863,7 +874,8 @@ class ItemPage extends genericPage 'params' => [ 'name' => '$LANG.tab_currencyfor', 'id' => 'currency-for', - 'extraCols' => "$[Listview.funcBox.createSimpleCol('stack', 'stack', '10%', 'stack'), Listview.extraCols.cost]" + 'extraCols' => "$[Listview.funcBox.createSimpleCol('stack', 'stack', '10%', 'stack'), Listview.extraCols.cost]", + 'note' => $n ? sprintf(Util::$filterResultString, $n) : null ] ); $this->extendGlobalData($boughtBy->getJSGlobals(GLOBALINFO_ANY)); @@ -977,9 +989,12 @@ class ItemPage extends genericPage $json = ''; foreach ($fields as $f) { - if (($_ = @$this->subject->json[$this->subject->id][$f]) !== null) + if (isset($this->subject->json[$this->subject->id][$f])) { - $_ = $f == 'name' ? (7 - $this->subject->getField('quality')).$_ : $_; + $_ = $this->subject->json[$this->subject->id][$f]; + if ($f == 'name') + $_ = (7 - $this->subject->getField('quality')).$_; + $json .= ',"'.$f.'":'.$_; } } diff --git a/pages/items.php b/pages/items.php index 771e5b33..c7f052c1 100644 --- a/pages/items.php +++ b/pages/items.php @@ -108,7 +108,7 @@ class ItemsPage extends GenericPage $conditions[] = $_; $this->filter = array_merge($this->filterObj->getForm('form'), $this->filter); - $this->filter['query'] = @$_GET['filter'] ?: NULL; + $this->filter['query'] = isset($_GET['filter']) ? $_GET['filter'] : null; $this->filter['fi'] = $this->filterObj->getForm(); $menu = $this->createExtraMenus(); @@ -213,7 +213,7 @@ class ItemsPage extends GenericPage ); $groups = []; $nameSource = []; - $grouping = @$this->filter['gb']; + $grouping = isset($this->filter['gb']) ? $this->filter['gb'] : null; $extraOpts = []; $maxResults = CFG_SQL_LIMIT_DEFAULT; @@ -438,9 +438,9 @@ class ItemsPage extends GenericPage if (!$this->category) return; - if (isset($this->category[2])) + if (isset($this->category[2]) && is_array(Lang::$item['cat'][$this->category[0]][1][$this->category[1]])) $tPart = Lang::$item['cat'][$this->category[0]][1][$this->category[1]][1][$this->category[2]]; - else if (isset($this->category[1])) + else if (isset($this->category[1]) && is_array(Lang::$item['cat'][$this->category[0]])) $tPart = Lang::$item['cat'][$this->category[0]][1][$this->category[1]]; else $tPart = Lang::$item['cat'][$this->category[0]]; @@ -453,10 +453,10 @@ class ItemsPage extends GenericPage foreach ($this->category as $c) $this->path[] = $c; - // if slot-dropdown is available && Armor && $path points to Armor-Class - $form = $this->filterObj->getForm('form'); - if (count($this->path) == 4 && $this->category[0] == 4 && isset($form['sl']) && !is_array($form['sl'])) - $this->path[] = $form['sl']; + // if slot-dropdown is available && Armor && $path points to Armor-Class + $form = $this->filterObj->getForm('form'); + if (count($this->path) == 4 && $this->category[0] == 4 && isset($form['sl']) && !is_array($form['sl'])) + $this->path[] = $form['sl']; } // fetch best possible gems for chosen weights @@ -524,9 +524,9 @@ class ItemsPage extends GenericPage } else { - if (isset($this->category[2])) + if (isset($this->category[2]) && is_array(Lang::$item['cat'][$this->category[0]][1][$this->category[1]])) $catList = Lang::$item['cat'][$this->category[0]][1][$this->category[1]][1][$this->category[2]]; - else if (isset($this->category[1])) + else if (isset($this->category[1]) && is_array(Lang::$item['cat'][$this->category[0]])) $catList = Lang::$item['cat'][$this->category[0]][1][$this->category[1]]; else $catList = Lang::$item['cat'][$this->category[0]]; diff --git a/pages/more.php b/pages/more.php index 8a7abf39..c5123971 100644 --- a/pages/more.php +++ b/pages/more.php @@ -32,8 +32,10 @@ class MorePage extends GenericPage parent::__construct($pageCall, $subPage); // chack if page is valid - if ($_ = @$this->validPages[$pageCall]) + if (isset($this->validPages[$pageCall])) { + $_ = $this->validPages[$pageCall]; + // check if subpage is valid if (!isset($_[1])) { diff --git a/pages/npc.php b/pages/npc.php index 5e21277c..1df5c4a7 100644 --- a/pages/npc.php +++ b/pages/npc.php @@ -108,15 +108,15 @@ class NpcPage extends GenericPage $infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags')); - // Event - if ($_ = DB::Aowow()->selectCol('SELECT DISTINCT IF(holidayId, holidayId, -e.id) FROM ?_events e, game_event_creature gec, creature c WHERE e.id = ABS(gec.eventEntry) AND c.guid = gec.guid AND c.id = ?d', $this->typeId)) + // Event (ignore events, where the object only gets removed) + if ($_ = DB::World()->selectCol('SELECT DISTINCT IF(ge.holiday, ge.holiday, -ge.eventEntry) FROM game_event ge, game_event_creature gec, creature c WHERE ge.eventEntry = gec.eventEntry AND c.guid = gec.guid AND c.id = ?d', $this->typeId)) { $this->extendGlobalIds(TYPE_WORLDEVENT, $_); $ev = []; - foreach ($_ as $idx => $id) - $ev[] = ($ev && !fmod(count($ev), 2) ? '[br]' : '') . '[event='.$id.']'; + foreach ($_ as $i => $e) + $ev[] = ($i % 2 ? '[br]' : ' ') . '[event='.$e.']'; - $infobox[] = Util::ucFirst(Lang::$game['eventShort']).Lang::$main['colon'].implode(', ', $ev); + $infobox[] = Util::ucFirst(Lang::$game['eventShort']).Lang::$main['colon'].implode(',', $ev); } // Level @@ -286,7 +286,7 @@ class NpcPage extends GenericPage // tab: abilities / tab_controlledabilities (dep: VehicleId) // SMART_SCRIPT_TYPE_CREATURE = 0; SMART_ACTION_CAST = 11; SMART_ACTION_ADD_AURA = 75; SMART_ACTION_INVOKER_CAST = 85; SMART_ACTION_CROSS_CAST = 86 - $smartSpells = DB::Aowow()->selectCol('SELECT action_param1 FROM smart_scripts WHERE source_type = 0 AND action_type IN (11, 75, 85, 86) AND entryOrGUID = ?d', $this->typeId); + $smartSpells = DB::World()->selectCol('SELECT action_param1 FROM smart_scripts WHERE source_type = 0 AND action_type IN (11, 75, 85, 86) AND entryOrGUID = ?d', $this->typeId); $tplSpells = []; $conditions = ['OR']; @@ -411,7 +411,7 @@ class NpcPage extends GenericPage WHERE t1.entry = ?d '; - if ($tSpells = DB::Aowow()->select($teachQuery, $this->typeId)) + if ($tSpells = DB::World()->select($teachQuery, $this->typeId)) { $teaches = new SpellList(array(['id', array_keys($tSpells)])); if (!$teaches->error) @@ -463,7 +463,7 @@ class NpcPage extends GenericPage } // tab: sells - if ($sells = DB::Aowow()->selectCol('SELECT item FROM npc_vendor nv WHERE entry = ?d UNION SELECT item FROM game_event_npc_vendor genv JOIN creature c ON genv.guid = c.guid WHERE c.id = ?d', $this->typeId, $this->typeId)) + if ($sells = DB::World()->selectCol('SELECT item FROM npc_vendor nv WHERE entry = ?d UNION SELECT item FROM game_event_npc_vendor genv JOIN creature c ON genv.guid = c.guid WHERE c.id = ?d', $this->typeId, $this->typeId)) { $soldItems = new ItemList(array(['id', $sells])); if (!$soldItems->error) @@ -472,7 +472,7 @@ class NpcPage extends GenericPage if ($soldItems->hasSetFields(['condition'])) $extraCols[] = 'Listview.extraCols.condition'; - $lvData = $soldItems->getListviewData(ITEMINFO_VENDOR, [TYPE_NPC => $this->typeId]); + $lvData = $soldItems->getListviewData(ITEMINFO_VENDOR, [TYPE_NPC => [$this->typeId]]); $sc = Util::getServerConditions(CND_SRC_NPC_VENDOR, $this->typeId); if (!empty($sc[0])) @@ -695,7 +695,7 @@ class NpcPage extends GenericPage } // tab: passengers - if ($_ = DB::World()->selectCol('SELECT accessory_entry as ARRAY_KEY, GROUP_CONCAT(seat_id) FROM vehicle_template_accessory WHERE entry = ?d', $this->typeId)) + if ($_ = DB::World()->selectCol('SELECT accessory_entry AS ARRAY_KEY, GROUP_CONCAT(seat_id) FROM vehicle_template_accessory WHERE entry = ?d GROUP BY accessory_entry', $this->typeId)) { $passengers = new CreatureList(array(['id', array_keys($_)])); if (!$passengers->error) @@ -768,27 +768,34 @@ class NpcPage extends GenericPage private function getRepForId($entries, &$spillover) { - $result = []; - $q = 'SELECT f.id, f.parentFactionId, cor.creature_id AS npc, - IF(f.id = RewOnKillRepFaction1, RewOnKillRepValue1, RewOnKillRepValue2) AS qty, - IF(f.id = RewOnKillRepFaction1, MaxStanding1, MaxStanding2) AS maxRank, - IF(f.id = RewOnKillRepFaction1, isTeamAward1, isTeamAward2) AS spillover - FROM ?_factions f JOIN creature_onkill_reputation cor ON f.Id = cor.RewOnKillRepFaction1 OR f.Id = cor.RewOnKillRepFaction2 WHERE cor.creature_id IN (?a)'; + $rows = DB::World()->select(' + SELECT creature_id AS npc, RewOnKillRepFaction1 AS faction, RewOnKillRepValue1 AS qty, MaxStanding1 AS maxRank, isTeamAward1 AS spillover + FROM creature_onkill_reputation WHERE creature_id IN (?a) AND RewOnKillRepFaction1 > 0 UNION + SELECT creature_id AS npc, RewOnKillRepFaction2 As faction, RewOnKillRepValue2 AS qty, MaxStanding2 AS maxRank, isTeamAward2 AS spillover + FROM creature_onkill_reputation WHERE creature_id IN (?a) AND RewOnKillRepFaction2 > 0', + (array)$entries, (array)$entries + ); - foreach (DB::Aowow()->select($q, (array)$entries) as $_) + $factions = new FactionList(array(['id', array_column($rows, 'faction')])); + $result = []; + + foreach ($rows as $row) { + if (!$factions->getEntry($row['faction'])) + continue; + $set = array( - 'id' => $_['id'], - 'qty' => $_['qty'], - 'name' => FactionList::getName($_['id']), // << this sucks .. maybe format this whole table with markdown and add name via globals? - 'npc' => $_['npc'], - 'cap' => $_['maxRank'] && $_['maxRank'] < REP_EXALTED ? Lang::$game['rep'][$_['maxRank']] : null + 'id' => $row['faction'], + 'qty' => $row['qty'], + 'name' => $factions->getField('name', true), + 'npc' => $row['npc'], + 'cap' => $row['maxRank'] && $row['maxRank'] < REP_EXALTED ? Lang::$game['rep'][$row['maxRank']] : null ); - if ($_['spillover']) + if ($row['spillover']) { - $spillover[$_['parentFactionId']] = [intVal($_['qty'] / 2), $_['maxRank']]; - $set['spillover'] = $_['parentFactionId']; + $spillover[$factions->getField('cat')] = [intVal($row['qty'] / 2), $row['maxRank']]; + $set['spillover'] = $factions->getField('cat'); } $result[] = $set; @@ -884,7 +891,7 @@ class NpcPage extends GenericPage WHERE ct.entry = ?d'; - foreach (DB::Aowow()->select($quoteQuery, $this->typeId) as $text) + foreach (DB::World()->select($quoteQuery, $this->typeId) as $text) { $group = []; foreach ($text as $t) diff --git a/pages/object.php b/pages/object.php index 14f3dd81..1eaf6f33 100644 --- a/pages/object.php +++ b/pages/object.php @@ -62,11 +62,15 @@ class ObjectPage extends GenericPage $infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags')); - // Event - if ($_ = DB::Aowow()->selectCell('SELECT IF(holidayId, holidayId, -e.id) FROM ?_events e, game_event_gameobject geg, gameobject g WHERE e.id = ABS(geg.eventEntry) AND g.guid = geg.guid AND g.id = ?d', $this->typeId)) + // Event (ignore events, where the object only gets removed) + if ($_ = DB::World()->selectCol('SELECT DISTINCT IF(ge.holiday, ge.holiday, -ge.eventEntry) FROM game_event ge, game_event_gameobject geg, gameobject g WHERE ge.eventEntry = geg.eventEntry AND g.guid = geg.guid AND g.id = ?d', $this->typeId)) { $this->extendGlobalIds(TYPE_WORLDEVENT, $_); - $infobox[] = Util::ucFirst(Lang::$game['eventShort']).Lang::$main['colon'].'[event='.$_.']'; + $ev = []; + foreach ($_ as $i => $e) + $ev[] = ($i % 2 ? '[br]' : ' ') . '[event='.$e.']'; + + $infobox[] = Util::ucFirst(Lang::$game['eventShort']).Lang::$main['colon'].implode(',', $ev); } // Reaction @@ -137,7 +141,7 @@ class ObjectPage extends GenericPage $buff .= Lang::$game['valueDelim'].$_[1]; // since Veins don't have charges anymore, the timer is questionable - $infobox[] = $_[2] > 1 ? '[tooltip name=restock][Recharges every '.Util::formatTime($_[2] * 1000).'][/tooltip][span class=tip tooltip=restock]'.$buff.'[/span]' : $buff; + $infobox[] = $_[2] > 1 ? '[tooltip name=restock]'.sprintf(Lang::gameObject('restock'), Util::formatTime($_[2] * 1000)).'[/tooltip][span class=tip tooltip=restock]'.$buff.'[/span]' : $buff; } // meeting stone [minLevel, maxLevel, zone] @@ -202,7 +206,7 @@ class ObjectPage extends GenericPage { while ($next) { - $row = DB::Aowow()->selectRow('SELECT *, text as Text_loc0 FROM page_text pt LEFT JOIN locales_page_text lpt ON pt.entry = lpt.entry WHERE pt.entry = ?d', $next); + $row = DB::World()->selectRow('SELECT *, text as Text_loc0 FROM page_text pt LEFT JOIN locales_page_text lpt ON pt.entry = lpt.entry WHERE pt.entry = ?d', $next); $next = $row['next_page']; $pageText[] = Util::parseHtmlText(Util::localizedString($row, 'Text')); } @@ -460,7 +464,7 @@ class ObjectPage extends GenericPage $x = '$WowheadPower.registerObject('.$this->typeId.', '.User::$localeId.", {\n"; $x .= "\tname_".User::$localeString.": '".Util::jsEscape($this->subject->getField('name', true))."',\n"; - $x .= "\ttooltip_".User::$localeString.": '".Util::jsEscape($this->subject->renderTooltip())."'\n"; + $x .= "\ttooltip_".User::$localeString.": '".Util::jsEscape($this->subject->renderTooltip())."',\n"; $x .= "\tmap: ".($s ? Util::toJSON(['zone' => $s[0], 'coords' => [$s[1] => $s[2]]]) : '{}')."\n"; $x .= "});"; diff --git a/pages/pet.php b/pages/pet.php index 21435b4d..cfd0a1df 100644 --- a/pages/pet.php +++ b/pages/pet.php @@ -43,6 +43,8 @@ class PetPage extends GenericPage protected function generateContent() { + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + /***********/ /* Infobox */ /***********/ diff --git a/pages/profile.php b/pages/profile.php index 28fa0685..ee57ddb7 100644 --- a/pages/profile.php +++ b/pages/profile.php @@ -86,7 +86,7 @@ class ProfilePage extends GenericPage if ($asError) return $x."});"; - @include('datasets/ProfilerExampleChar'); // tmp char data + @include('datasets/ProfilerExampleChar'); // tmp char data $name = $character['name']; $guild = $character['guild']; diff --git a/pages/profiles.php b/pages/profiles.php index 5c70d8d7..822f4b74 100644 --- a/pages/profiles.php +++ b/pages/profiles.php @@ -120,7 +120,7 @@ class ProfilesPage extends GenericPage private function getTalentDistribution($tString) { $classMask = 1 << ($this->character['classs'] - 1); - $distrib = DB::Aowow()->selectCol('SELECT COUNT(t.id) FROM dbc.talent t JOIN dbc.talenttab tt ON t.tabId = tt.id WHERE tt.classMask & ?d GROUP BY tt.id ORDER BY tt.tabNumber ASC', $classMask); + $distrib = DB::Aowow()->selectCol('SELECT COUNT(t.id) FROM dbc_talent t JOIN dbc_talenttab tt ON t.tabId = tt.id WHERE tt.classMask & ?d GROUP BY tt.id ORDER BY tt.tabNumber ASC', $classMask); $result = []; $start = 0; diff --git a/pages/quest.php b/pages/quest.php index 0f49b146..6df62375 100644 --- a/pages/quest.php +++ b/pages/quest.php @@ -512,6 +512,8 @@ class QuestPage extends GenericPage /* Mapper */ /**********/ + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + /* TODO (GODDAMNIT): jeez.. */ @@ -547,7 +549,21 @@ class QuestPage extends GenericPage if ($maTab) $this->lvTabs[] = $maTab; - // todo (low): create pendant from player_factionchange_quests + // factionchange-equivalent + if ($pendant = DB::World()->selectCell('SELECT IF(horde_id = ?d, alliance_id, -horde_id) FROM player_factionchange_quests WHERE alliance_id = ?d OR horde_id = ?d', $this->typeId, $this->typeId, $this->typeId)) + { + $altQuest = new QuestList(array(['id', abs($pendant)])); + if (!$altQuest->error) + { + $this->transfer = sprintf( + Lang::quest('_transfer'), + $altQuest->id, + $altQuest->getField('name', true), + $pendant > 0 ? 'alliance' : 'horde', + $pendant > 0 ? Lang::$game['si'][1] : Lang::$game['si'][2] + ); + } + } /**************/ /* Extra Tabs */ @@ -690,8 +706,9 @@ class QuestPage extends GenericPage $rewards['money'] = sprintf(Lang::$quest['expConvert2'], Util::formatMoney($questMoney + $comp), MAX_LEVEL); // itemChoices - if ($c = @$this->subject->choices[$this->typeId][TYPE_ITEM]) + if (!empty($this->subject->choices[$this->typeId][TYPE_ITEM])) { + $c = $this->subject->choices[$this->typeId][TYPE_ITEM]; $choiceItems = new ItemList(array(['id', array_keys($c)])); if (!$choiceItems->error) { @@ -711,8 +728,9 @@ class QuestPage extends GenericPage } // itemRewards - if ($ri = @$this->subject->rewards[$this->typeId][TYPE_ITEM]) + if (!empty($this->subject->rewards[$this->typeId][TYPE_ITEM])) { + $ri = $this->subject->rewards[$this->typeId][TYPE_ITEM]; $rewItems = new ItemList(array(['id', array_keys($ri)])); if (!$rewItems->error) { @@ -731,8 +749,9 @@ class QuestPage extends GenericPage } } - if ($rc = @$this->subject->rewards[$this->typeId][TYPE_ITEM][TYPE_CURRENCY]) + if (!empty($this->subject->rewards[$this->typeId][TYPE_ITEM][TYPE_CURRENCY])) { + $rc = $this->subject->rewards[$this->typeId][TYPE_ITEM][TYPE_CURRENCY]; $rewCurr = new CurrencyList(array(['id', array_keys($rc)])); if (!$rewCurr->error) { diff --git a/pages/race.php b/pages/race.php index 2ced14fc..3dbade82 100644 --- a/pages/race.php +++ b/pages/race.php @@ -46,10 +46,10 @@ class RacePage extends GenericPage $infobox = []; $_mask = 1 << ($this->typeId - 1); $mountVendors = array( // race => [starter, argent tournament] - null, [384, 33307], [3362, 33553], [1261, 33310], - [4730, 33653], [4731, 33555], [3685, 33556], [7955, 33650], - [7952, 33554], null, [16264, 33557], [17584, 33657] - ); + null, [384, 33307], [3362, 33553], [1261, 33310], + [4730, 33653], [4731, 33555], [3685, 33556], [7955, 33650], + [7952, 33554], null, [16264, 33557], [17584, 33657] + ); /***********/ /* Infobox */ @@ -178,7 +178,7 @@ class RacePage extends GenericPage // Mounts // ok, this sucks, but i rather hardcode the trainer, than fetch items by namepart - $items = isset($mountVendors[$this->typeId]) ? DB::Aowow()->selectCol('SELECT item FROM npc_vendor WHERE entry IN (?a)', $mountVendors[$this->typeId]) : 0; + $items = isset($mountVendors[$this->typeId]) ? DB::World()->selectCol('SELECT item FROM npc_vendor WHERE entry IN (?a)', $mountVendors[$this->typeId]) : 0; $conditions = array( ['i.id', $items], diff --git a/pages/screenshot.php b/pages/screenshot.php index 20117fb9..8aa58465 100644 --- a/pages/screenshot.php +++ b/pages/screenshot.php @@ -23,7 +23,8 @@ class ScreenshotPage extends GenericPage parent::__construct($pageCall, $pageParam); $this->name = Lang::$main['ssEdit']; - $this->caption = @$_POST['screenshotcaption']; // do not htmlEscape. It's applied as textnode + // do not htmlEscape caption. It's applied as textnode + $this->caption = !empty($_POST['screenshotcaption']) ? $_POST['screenshotcaption'] : ''; // what are its other uses..? (finalize is custom) if ($pageParam == 'finalize') @@ -37,7 +38,7 @@ class ScreenshotPage extends GenericPage // get screenshot destination foreach ($_GET as $k => $v) { - if ($v) // taret delivered as empty type.typeId key + if ($v) // target delivered as empty type.typeId key continue; $x = explode('_', $k); // . => _ as array key diff --git a/pages/search.php b/pages/search.php index ab1827e8..30fc04f7 100644 --- a/pages/search.php +++ b/pages/search.php @@ -78,7 +78,7 @@ class SearchPage extends GenericPage if ($_ = intVal($this->search)) // allow for search by Id $this->query = $_; - $type = @intVal($_GET['type']); + $type = isset($_GET['type']) ? intVal($_GET['type']) : 0; if (!empty($_GET['slots'])) $this->searchMask |= SEARCH_TYPE_JSON | 0x40; @@ -249,19 +249,21 @@ class SearchPage extends GenericPage if (!$asError) { - if ($itemData = @$this->lvTabs[6]['data']) + // items + if (!empty($this->lvTabs[6]['data'])) { $items = []; - foreach ($itemData as $k => $v) + foreach ($this->lvTabs[6]['data'] as $k => $v) $items[] = Util::toJSON($v); $outItems = "\t".implode(",\n\t", $items)."\n"; } - if ($setData = @$this->lvTabs[5]['data']) + // sets + if (!empty($this->lvTabs[5]['data'])) { $sets = []; - foreach ($setData as $k => $v) + foreach ($this->lvTabs[5]['data'] as $k => $v) { unset($v['quality']); if (!$v['heroic']) @@ -586,7 +588,7 @@ class SearchPage extends GenericPage if (($this->searchMask & SEARCH_TYPE_JSON) && ($this->searchMask & 0x20) && !empty($shared['pcsToSet'])) { $cnd = [['i.id', array_keys($shared['pcsToSet'])], CFG_SQL_LIMIT_NONE]; - $miscData = ['pcsToSet' => @$shared['pcsToSet']]; + $miscData = ['pcsToSet' => $shared['pcsToSet']]; } else if (($this->searchMask & SEARCH_TYPE_JSON) && ($this->searchMask & 0x40)) { @@ -594,7 +596,7 @@ class SearchPage extends GenericPage $cnd[] = ['i.class', [ITEM_CLASS_WEAPON, ITEM_CLASS_GEM, ITEM_CLASS_ARMOR]]; $cnd[] = $cndAdd; - $slots = @explode(':', $_GET['slots']); + $slots = isset($_GET['slots']) ? explode(':', $_GET['slots']) : []; array_walk($slots, function(&$v, $k) { $v = intVal($v); }); if ($_ = array_filter($slots)) $cnd[] = ['slot', $_]; diff --git a/pages/skill.php b/pages/skill.php index 67cef337..9cf71958 100644 --- a/pages/skill.php +++ b/pages/skill.php @@ -246,8 +246,8 @@ class SkillPage extends GenericPage if (in_array($this->cat, [-5, 6, 7, 8, 9, 11])) { $list = []; - if (@$tt = Util::$trainerTemplates[TYPE_SKILL][$this->typeId]) - $list = DB::Aowow()->selectCol('SELECT DISTINCT entry FROM npc_trainer WHERE spell IN (?a) AND entry < 200000', $tt); + if (!empty(Util::$trainerTemplates[TYPE_SKILL][$this->typeId])) + $list = DB::World()->selectCol('SELECT DISTINCT entry FROM npc_trainer WHERE spell IN (?a) AND entry < 200000', Util::$trainerTemplates[TYPE_SKILL][$this->typeId]); else { $mask = 0; @@ -255,19 +255,26 @@ class SkillPage extends GenericPage if ($pair[1] == $this->typeId) $mask |= 1 << $idx; - $list = DB::Aowow()->selectCol(' + $spellIds = DB::Aowow()->selectCol( + 'SELECT id FROM ?_spell WHERE typeCat IN (-11, 9) AND (skillLine1 = ?d OR (skillLine1 > 0 AND skillLine2OrMask = ?d) {OR (skillLine1 = -3 AND skillLine2OrMask = ?d)})', + $this->typeId, + $this->typeId, + $mask ?: DBSIMPLE_SKIP + ); + + $list = $spellIds ? DB::World()->selectCol(' SELECT IF(t1.entry > 200000, t2.entry, t1.entry) FROM npc_trainer t1 - JOIN ?_spell s ON s.id = t1.spell LEFT JOIN npc_trainer t2 ON t2.spell = -t1.entry - WHERE s.typeCat IN (-11, 9) AND (s.skillLine1 = ?d OR (s.skillLine1 > 0 AND s.skillLine2OrMask = ?d) '.($mask ? ' OR (s.skilllIne1 = -3 AND s.skillLine2OrMask = '.$mask.')' : null).')', - $this->typeId, - $this->typeId - ); + WHERE t1.spell IN (?a)', + $spellIds + ) : []; } if ($list) { + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + $trainer = new CreatureList(array(CFG_SQL_LIMIT_NONE, ['ct.id', $list], ['ct.spawns', 0, '>'], ['ct.npcflag', 0x10, '&'])); if (!$trainer->error) diff --git a/pages/spell.php b/pages/spell.php index 9d2ae70c..b437f19d 100644 --- a/pages/spell.php +++ b/pages/spell.php @@ -117,8 +117,16 @@ class SpellPage extends GenericPage protected function generateContent() { + $this->addJS('?data=zones&locale='.User::$localeId.'&t='.$_SESSION['dataKey']); + $_cat = $this->subject->getField('typeCat'); + $redButtons = array( + BUTTON_LINKS => ['color' => 'ff71d5ff', 'linkId' => Util::$typeStrings[TYPE_SPELL].':'.$this->typeId], + BUTTON_VIEW3D => false, + BUTTON_WOWHEAD => true + ); + /***********/ /* Infobox */ /***********/ @@ -203,17 +211,14 @@ class SpellPage extends GenericPage } } - // accquisition.. - if ($_ = @$this->subject->sources[$this->subject->id]) - { - if (array_key_exists(10, $_)) // ..starter spell - $infobox[] = '[li]'.Lang::$spell['starter'].'[/li]'; - else if (array_key_exists(7, $_)) // ..discovery - $infobox[] = '[li]'.Lang::$spell['discovered'].'[/li]'; - } + // accquisition.. 10: starter spell; 7: discovery + if (isset($this->subject->sources[$this->subject->id][10])) + $infobox[] = '[li]'.Lang::$spell['starter'].'[/li]'; + else if (isset($this->subject->sources[$this->subject->id][7])) + $infobox[] = '[li]'.Lang::$spell['discovered'].'[/li]'; // training cost - if ($cost = DB::Aowow()->selectCell('SELECT spellcost FROM npc_trainer WHERE spell = ?d', $this->subject->id)) + if ($cost = DB::World()->selectCell('SELECT spellcost FROM npc_trainer WHERE spell = ?d', $this->subject->id)) $infobox[] = '[li]'.Lang::$spell['trainingCost'].Lang::$main['colon'].'[money='.$cost.'][/li]'; // used in mode @@ -231,20 +236,14 @@ class SpellPage extends GenericPage $glyphId = $this->subject->getField('effect'.$i.'MiscValue'); if ($_ = DB::Aowow()->selectCell('SELECT si.iconString FROM ?_glyphproperties gp JOIN ?_spellicon si ON gp.iconId = si.id WHERE gp.spellId = ?d { OR gp.id = ?d }', $this->typeId, $glyphId ?: DBSIMPLE_SKIP)) - if (file_exists('static/images/wow/interface/Spellbook/'.$_.'.png')) - $infobox .= '[img src='.STATIC_URL.'/images/wow/interface/Spellbook/'.$_.'.png border=0 float=center margin=15]'; + if (file_exists('static/images/wow/Interface/Spellbook/'.$_.'.png')) + $infobox .= '[img src='.STATIC_URL.'/images/wow/Interface/Spellbook/'.$_.'.png border=0 float=center margin=15]'; /****************/ /* Main Content */ /****************/ - $redButtons = array( - BUTTON_LINKS => ['color' => 'ff71d5ff', 'linkId' => Util::$typeStrings[TYPE_SPELL].':'.$this->typeId], - BUTTON_VIEW3D => false, - BUTTON_WOWHEAD => true - ); - $this->reagents = $this->createReagentList(); $this->scaling = $this->createScalingData(); $this->items = $this->createRequiredItems(); @@ -280,23 +279,22 @@ class SpellPage extends GenericPage $this->duration = Util::formatTime($_); // factionchange-equivalent - /* nyi - $pendant = DB::Aowow()->selectCell('SELECT IF(hordethis->typeId = ?d, alliancethis->typeId, -hordethis->typeId) FROM player_factionchange_spells WHERE alliancethis->typeId = ?d OR hordethis->typeId = ?d', $this->typeId, $this->typeId, $this->typeId); - if ($pendant) + if ($pendant = DB::World()->selectCell('SELECT IF(horde_id = ?d, alliance_id, -horde_id) FROM player_factionchange_spells WHERE alliance_id = ?d OR horde_id = ?d', $this->typeId, $this->typeId, $this->typeId)) + { + $altSpell = new SpellList(array(['id', abs($pendant)])); + if (!$altSpell->error) { - $altiSpell = new SpellList(array(['id', abs($pendant)])); - if (!$altSpell->error) - { - $this->transfer = array( - 'id' => $altItem->id, - 'icon' => $altItem->getField('iconString'), - 'name' => $altItem->getField('name', true), - 'facInt' => $pendant > 0 ? 'alliance' : 'horde', - 'facName' => $pendant > 0 ? Lang::$game['si'][1] : Lang::$game['si'][2] - ); - ) + $this->transfer = sprintf( + Lang::$spell['_transfer'], + $altSpell->id, + 1, // quality + $altSpell->getField('iconString'), + $altSpell->getField('name', true), + $pendant > 0 ? 'alliance' : 'horde', + $pendant > 0 ? Lang::$game['si'][1] : Lang::$game['si'][2] + ); } - */ + } /**************/ /* Extra Tabs */ @@ -561,7 +559,7 @@ class SpellPage extends GenericPage // tab: contains // spell_loot_template & skill_extra_item_template - $extraItem = DB::Aowow()->selectRow('SELECT * FROM skill_extra_item_template WHERE spellid = ?d', $this->subject->id); + $extraItem = DB::World()->selectRow('SELECT * FROM skill_extra_item_template WHERE spellid = ?d', $this->subject->id); $spellLoot = new Loot(); if ($spellLoot->getByContainer(LOOT_SPELL, $this->subject->id) || $extraItem) @@ -610,7 +608,7 @@ class SpellPage extends GenericPage // tab: exclusive with if ($this->firstRank) { - $linkedSpells = DB::Aowow()->selectCol( // dont look too closely ..... please..? + $linkedSpells = DB::World()->selectCol( // dont look too closely ..... please..? 'SELECT IF(sg2.spell_id < 0, sg2.id, sg2.spell_id) AS ARRAY_KEY, IF(sg2.spell_id < 0, sg2.spell_id, sr.stack_rule) FROM spell_group sg1 JOIN spell_group sg2 @@ -629,7 +627,7 @@ class SpellPage extends GenericPage if ($v > 0) continue; - $extraSpells += DB::Aowow()->selectCol( // recursive case (recursive and regular ids are not mixed in a group) + $extraSpells += DB::World()->selectCol( // recursive case (recursive and regular ids are not mixed in a group) 'SELECT sg2.spell_id AS ARRAY_KEY, sr.stack_rule FROM spell_group sg1 JOIN spell_group sg2 @@ -673,7 +671,7 @@ class SpellPage extends GenericPage } // tab: linked with - $rows = DB::Aowow()->select(' + $rows = DB::World()->select(' SELECT spell_trigger AS `trigger`, spell_effect AS effect, type, @@ -753,7 +751,7 @@ class SpellPage extends GenericPage ['spell1', $this->typeId], ['spell2', $this->typeId], ['spell3', $this->typeId], ['spell4', $this->typeId], ['spell5', $this->typeId], ['spell6', $this->typeId], ['spell7', $this->typeId], ['spell8', $this->typeId] ); - if ($_ = DB::Aowow()->selectCol('SELECT entryOrGUID FROM smart_scripts WHERE entryorguid > 0 AND source_type = 0 AND action_type IN (11, 75, 85, 86) AND action_param1 = ?d', $this->typeId)) + if ($_ = DB::World()->selectCol('SELECT entryOrGUID FROM smart_scripts WHERE entryorguid > 0 AND source_type = 0 AND action_type IN (11, 75, 85, 86) AND action_param1 = ?d', $this->typeId)) $conditions[] = ['id', $_]; $ubCreature = new CreatureList($conditions); @@ -772,7 +770,7 @@ class SpellPage extends GenericPage } // tab: zone - if ($areas = DB::Aowow()->select('SELECT * FROM spell_area WHERE spell = ?d', $this->typeId)) + if ($areas = DB::World()->select('SELECT * FROM spell_area WHERE spell = ?d', $this->typeId)) { $zones = new ZoneList(array(['id', array_column($areas, 'area')])); if (!$zones->error) @@ -955,26 +953,27 @@ class SpellPage extends GenericPage } // tab: taught by npc (source:6 => trainer) - $src = @$this->subject->sources[$this->typeId]; - if (!empty($src) && in_array(6, array_keys($src))) + if (!empty($this->subject->sources[$this->typeId][6])) { + $src = $this->subject->sources[$this->typeId][6]; $list = []; - if (count($src[6]) == 1 && $src[6][0] == 0) // multiple trainer + if (count($src) == 1 && $src[0] == 0) // multiple trainer { $tt = null; // Professions - if (in_array($_cat, [9, 11])) - $tt = @Util::$trainerTemplates[TYPE_SKILL][$this->subject->getField('skillLines')[0]]; + if (in_array($_cat, [9, 11]) && isset(Util::$trainerTemplates[TYPE_SKILL][$this->subject->getField('skillLines')[0]])) + $tt = Util::$trainerTemplates[TYPE_SKILL][$this->subject->getField('skillLines')[0]]; // Class Spells else if ($_cat == 7 && $this->subject->getField('reqClassMask')) { $clId = log($this->subject->getField('reqClassMask'), 2) + 1 ; if (intVal($clId) == $clId) // only one class was set, so float == int - $tt = @Util::$trainerTemplates[TYPE_CLASS][$clId]; + if (isset(Util::$trainerTemplates[TYPE_CLASS][$clId])) + $tt = Util::$trainerTemplates[TYPE_CLASS][$clId]; } if ($tt) - $list = DB::Aowow()->selectCol('SELECT DISTINCT entry FROM npc_trainer WHERE spell IN (?a) AND entry < 200000', $tt); + $list = DB::World()->selectCol('SELECT DISTINCT entry FROM npc_trainer WHERE spell IN (?a) AND entry < 200000', $tt); else { $mask = 0; @@ -982,7 +981,7 @@ class SpellPage extends GenericPage if ($pair[1] == $this->typeId) $mask |= 1 << $idx; - $list = DB::Aowow()->selectCol(' + $list = DB::World()->selectCol(' SELECT IF(t1.entry > 200000, t2.entry, t1.entry) FROM npc_trainer t1 LEFT JOIN npc_trainer t2 ON t2.spell = -t1.entry @@ -991,8 +990,8 @@ class SpellPage extends GenericPage ); } } - else if ($src[6]) - $list = array_values($src[6]); + else if ($src) + $list = array_values($src); if ($list) { @@ -1328,7 +1327,7 @@ class SpellPage extends GenericPage 'directAP' => 0, 'dotAP' => 0 ), - (array)DB::Aowow()->selectRow('SELECT direct_bonus AS directSP, dot_bonus AS dotSP, ap_bonus AS directAP, ap_dot_bonus AS dotAP FROM spell_bonus_data WHERE entry = ?d', $this->firstRank) + (array)DB::World()->selectRow('SELECT direct_bonus AS directSP, dot_bonus AS dotSP, ap_bonus AS directAP, ap_dot_bonus AS dotAP FROM spell_bonus_data WHERE entry = ?d', $this->firstRank) ); if (!$this->subject->isDamagingSpell() && !$this->subject->isHealingSpell()) @@ -1482,7 +1481,7 @@ class SpellPage extends GenericPage private function createEffects(&$infobox, &$redButtons) { // proc data .. maybe use more information..? - $procData = DB::Aowow()->selectRow('SELECT IF(ppmRate > 0, -ppmRate, customChance) AS chance, cooldown FROM spell_proc_event WHERE entry = ?d', $this->typeId); + $procData = DB::World()->selectRow('SELECT IF(ppmRate > 0, -ppmRate, customChance) AS chance, cooldown FROM spell_proc_event WHERE entry = ?d', $this->typeId); if (!isset($procData['cooldown'])) $procData['cooldown'] = 0; @@ -1574,14 +1573,13 @@ class SpellPage extends GenericPage $procData['cooldown'] ? Util::formatTime($procData['cooldown'] * 1000, true) : null ); - // parse masks and indizes switch ($effId) { case 8: // Power Drain case 30: // Energize case 137: // Energize Pct - $_ = @Lang::$spell['powerTypes'][$effMV]; + $_ = Lang::spell('powerTypes', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) $_ = sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_); else if (!$_) @@ -1611,7 +1609,7 @@ class SpellPage extends GenericPage $foo['name'] .= Lang::$main['colon'].$_; break; case 33: // Open Lock - $_ = @Lang::$spell['lockType'][$effMV]; + $_ = Lang::spell('lockType', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) $_ = sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_); else if (!$_) @@ -1629,7 +1627,7 @@ class SpellPage extends GenericPage break; case 38: // Dispel [miscValue => Types] case 126: // Steal Aura - $_ = @Lang::$game['dt'][$effMV]; + $_ = Lang::game('dt', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) $_ = sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_); else if (!$_) @@ -1638,7 +1636,7 @@ class SpellPage extends GenericPage $foo['name'] .= ' ('.$_.')'; break; case 39: // Learn Language - $_ = @Lang::$game['languages'][$effMV]; + $_ = Lang::game('languages', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) $_ = sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_); else if (!$_) @@ -1690,7 +1688,7 @@ class SpellPage extends GenericPage $foo['name'] .= ' ('.$_.')'; break; case 108: // Dispel Mechanic - $_ = @Lang::$game['me'][$effMV]; + $_ = Lang::game('me', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) $_ = sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_); else if (!$_) @@ -1705,7 +1703,7 @@ class SpellPage extends GenericPage $foo['name'] .= Lang::$main['colon'].Util::ucFirst(Lang::$game['skill']).' #'.$effMV;; break; case 146: // Activate Rune - $_ = @Lang::$spell['powerRunes'][$effMV]; + $_ = Lang::spell('powerRunes', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) $_ = sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_); else if (!$_) @@ -1737,12 +1735,12 @@ class SpellPage extends GenericPage switch ($effAura) { case 17: // Mod Stealth Detection - if ($_ = @Lang::$spell['stealthType'][$effMV]) + if ($_ = Lang::spell('stealthType', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; case 19: // Mod Invisibility Detection - if ($_ = @Lang::$spell['invisibilityType'][$effMV]) + if ($_ = Lang::spell('invisibilityType', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; @@ -1751,7 +1749,7 @@ class SpellPage extends GenericPage case 35: // Mod Increase Power case 85: // Mod Power Regeneration case 110: // Mod Power Regeneration Pct - if ($_ = @Lang::$spell['powerTypes'][$effMV]) + if ($_ = Lang::spell('powerTypes', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; @@ -1788,34 +1786,40 @@ class SpellPage extends GenericPage } break; case 37: // Effect immunity - if ($_ = @Util::$spellEffectStrings[$effMV]) + if (isset(Util::$spellEffectStrings[$effMV])) + { + $_ = Util::$spellEffectStrings[$effMV]; $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; + } break; case 38: // Aura immunity - if ($_ = @Util::$spellAuraStrings[$effMV]) + if (isset(Util::$spellAuraStrings[$effMV])) + { + $_ = Util::$spellAuraStrings[$effMV]; $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; + } break; case 41: // Dispel Immunity case 178: // Mod Debuff Resistance case 245: // Mod Aura Duration By Dispel - if ($_ = @Lang::$game['dt'][$effMV]) + if ($_ = Lang::game('dt', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; case 44: // Track Creature - if ($_ = @Lang::$game['ct'][$effMV]) + if ($_ = Lang::game('ct', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; case 45: // Track Resource - if ($_ = @Lang::$spell['lockType'][$effMV]) + if ($_ = Lang::spell('lockType', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; case 75: // Language - if ($_ = @Lang::$game['languages'][$effMV]) + if ($_ = Lang::game('languages', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; @@ -1825,7 +1829,7 @@ class SpellPage extends GenericPage case 234: // Mod Mechanic Duration (no stack) case 255: // Mod Mechanic Damage Taken Pct case 276: // Mod Mechanic Damage Done Percent - if ($_ = @Lang::$game['me'][$effMV]) + if ($_ = Lang::game('me', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].Util::asHex($effMV), $_) : $_; break; @@ -1889,7 +1893,7 @@ class SpellPage extends GenericPage break; case 107: // Flat Modifier case 108: // Pct Modifier - if ($_ = @Lang::$spell['spellModOp'][$effMV]) + if ($_ = Lang::spell('spellModOp', $effMV)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$effMV, $_) : $_; break; @@ -1917,7 +1921,7 @@ class SpellPage extends GenericPage break; case 249: // Convert Rune $x = $this->subject->getField('effect'.$i.'MiscValueB'); - if ($_ = @Lang::$spell['powerRunes'][$x]) + if ($_ = Lang::spell('powerRunes', $x)) $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::$spell['_value'].Lang::$main['colon'].$x, $_) : $_; break; diff --git a/pages/spells.php b/pages/spells.php index b7b3d006..8796e168 100644 --- a/pages/spells.php +++ b/pages/spells.php @@ -284,8 +284,9 @@ class SpellsPage extends GenericPage ['AND', ['s.skillLine1', 0, '>'], ['s.skillLine2OrMask', $this->category[1]]] ]; - if ($sf = @$this->shortFilter[$this->category[1]]) + if (!empty($this->shortFilter[$this->category[1]])) { + $sf = $this->shortFilter[$this->category[1]]; $txt = ''; if ($sf[0] && $sf[1]) $txt = sprintf(Lang::$spell['relItems']['crafted'], $sf[0]) . Lang::$spell['relItems']['link'] . sprintf(Lang::$spell['relItems']['recipes'], $sf[1]); @@ -323,8 +324,9 @@ class SpellsPage extends GenericPage { $conditions[] = ['s.skillLine1', $this->category[1]]; - if ($sf = @$this->shortFilter[$this->category[1]]) + if (!empty($this->shortFilter[$this->category[1]])) { + $sf = $this->shortFilter[$this->category[1]]; $txt = ''; if ($sf[0] && $sf[1]) $txt = sprintf(Lang::$spell['relItems']['crafted'], $sf[0]) . Lang::$spell['relItems']['link'] . sprintf(Lang::$spell['relItems']['recipes'], $sf[1]); diff --git a/pages/title.php b/pages/title.php index 6d538fe6..997b74a4 100644 --- a/pages/title.php +++ b/pages/title.php @@ -80,7 +80,21 @@ class TitlePage extends GenericPage BUTTON_LINKS => ['name' => $this->nameFixed] ); - // todo (low): create pendant from player_factionchange_titles + // factionchange-equivalent + if ($pendant = DB::World()->selectCell('SELECT IF(horde_id = ?d, alliance_id, -horde_id) FROM player_factionchange_titles WHERE alliance_id = ?d OR horde_id = ?d', $this->typeId, $this->typeId, $this->typeId)) + { + $altTitle = new TitleList(array(['id', abs($pendant)])); + if (!$altTitle->error) + { + $this->transfer = sprintf( + Lang::title('_transfer'), + $altTitle->id, + $altTitle->getHtmlizedName(), + $pendant > 0 ? 'alliance' : 'horde', + $pendant > 0 ? Lang::$game['si'][1] : Lang::$game['si'][2] + ); + } + } /**************/ /* Extra Tabs */ diff --git a/pages/zone.php b/pages/zone.php index e3864280..3cf659b5 100644 --- a/pages/zone.php +++ b/pages/zone.php @@ -291,7 +291,14 @@ class ZonePage extends GenericPage $data = array_values($data); if (!in_array($what, ['vein', 'herb', 'rare'])) - $dataz = array_column($dataz, 0); + { + $foo = []; + foreach ($dataz as $d) + foreach ($d as $_) + $foo[] = $_; + + $dataz = $foo; + } } // append paths between nodes diff --git a/setup/tools/filegen/complexImg.func.php b/setup/tools/filegen/complexImg.func.php index 4674c3d3..7b0d11c5 100644 --- a/setup/tools/filegen/complexImg.func.php +++ b/setup/tools/filegen/complexImg.func.php @@ -51,6 +51,7 @@ if (!defined('AOWOW_REVISION')) $mapWidth = 1002; $mapHeight = 668; + $threshold = 95; // alpha threshold to define subZones: set it too low and you have unspawnable areas inside a zone; set it too high and the border regions overlap $runTime = ini_get('max_execution_time'); $locStr = null; $dbcPath = FileGen::$srcDir.'%sDBFilesClient/'; @@ -69,10 +70,12 @@ if (!defined('AOWOW_REVISION')) $bgColor = imagecolorallocatealpha($img, 0, 0, 0, 127); imagefilledrectangle($img, 0, 0, imagesx($img) - 1, imagesy($img) - 1, $bgColor); - imagecolordeallocate($img, $bgColor); + imagecolortransparent($img, $bgColor); imagealphablending($img, true); + imagecolordeallocate($img, $bgColor); + return $img; }; @@ -161,7 +164,7 @@ if (!defined('AOWOW_REVISION')) return $ok; }; - $createSpawnMap = function($img, $zoneId) use ($mapHeight, $mapWidth) + $createSpawnMap = function($img, $zoneId) use ($mapHeight, $mapWidth, $threshold) { FileGen::status(' - creating spawn map'); @@ -174,7 +177,7 @@ if (!defined('AOWOW_REVISION')) for ($x = 0; $x < 1000; $x++) { $a = imagecolorat($img, ($x * $mapWidth) / 1000, ($y * $mapHeight) / 1000) >> 24; - imagesetpixel($tmp, $x, $y, $a < 30 ? $cfg : $cbg); + imagesetpixel($tmp, $x, $y, $a < $threshold ? $cfg : $cbg); } } @@ -480,7 +483,7 @@ if (!defined('AOWOW_REVISION')) for ($my = 0; $my < imagesy($img); $my++) for ($mx = 0; $mx < imagesx($img); $mx++) - if ((imagecolorat($img, $mx, $my) >> 24) < 30) + if ((imagecolorat($img, $mx, $my) >> 24) < $threshold) imagesetpixel($row['maskimage'], $x + $mx, $y + $my, $row['maskcolor']); } @@ -566,7 +569,6 @@ if (!defined('AOWOW_REVISION')) if (!$multiLeveled) { - imagecolortransparent($overlay, imagecolorat($overlay, imagesx($overlay)-1, imagesy($overlay)-1)); imagecopymerge($map, $overlay, 0, 0, 0, 0, imagesx($overlay), imagesy($overlay), 100); imagedestroy($overlay); } @@ -635,7 +637,7 @@ if (!defined('AOWOW_REVISION')) if ($modeMask & 0x08) // optional tidbits (not used by default) { - if (FileGen::writeDir($destDir.'interface/Glues/Credits/')) + if (FileGen::writeDir($destDir.'Interface/Glues/Credits/')) { // tile ordering $order = array( @@ -692,7 +694,7 @@ if (!defined('AOWOW_REVISION')) $sum++; $done = ' - '.str_pad($sum.'/'.$total, 8).str_pad('('.number_format($sum * 100 / $total, 2).'%)', 9); - $name = $destDir.'interface/Glues/Credits/'.$file; + $name = $destDir.'Interface/Glues/Credits/'.$file; if (!isset(FileGen::$cliOpts['force']) && file_exists($name.'.png')) { diff --git a/setup/tools/filegen/simpleImg.func.php b/setup/tools/filegen/simpleImg.func.php index c19f36ab..b7ad71a6 100644 --- a/setup/tools/filegen/simpleImg.func.php +++ b/setup/tools/filegen/simpleImg.func.php @@ -95,13 +95,13 @@ if (!defined('AOWOW_REVISION')) 'ui-paperdoll-slot-waist' => 'inventoryslot_waist', 'ui-paperdoll-slot-wrists' => 'inventoryslot_wrists' ), - 3 => array( - ['race_human_male', 'race_dwarf_male', 'race_gnome_male', 'race_nightelf_male', 'race_draenai_male' ], - ['race_tauren_male', 'race_undead_male', 'race_troll_male', 'race_orc_male', 'race_bloodelf_male' ], - ['race_human_female', 'race_dwarf_female', 'race_gnome_female', 'race_nightelf_female', 'race_draenai_female' ], - ['race_tauren_female', 'race_undead_female', 'race_troll_female', 'race_orc_female', 'race_bloodelf_female'] + 3 => array( // uses nameINT from ChrRaces.dbc + ['race_human_male', 'race_dwarf_male', 'race_gnome_male', 'race_nightelf_male', 'race_draenei_male' ], + ['race_tauren_male', 'race_scourge_male', 'race_troll_male', 'race_orc_male', 'race_bloodelf_male' ], + ['race_human_female', 'race_dwarf_female', 'race_gnome_female', 'race_nightelf_female', 'race_draenei_female' ], + ['race_tauren_female', 'race_scourge_female', 'race_troll_female', 'race_orc_female', 'race_bloodelf_female'] ), - 4 => array( + 4 => array( // uses nameINT from ChrClasses.dbc ['class_warrior', 'class_mage', 'class_rogue', 'class_druid' ], ['class_hunter', 'class_shaman', 'class_priest', 'class_warlock'], ['class_paladin', 'class_deathknight' ] diff --git a/setup/tools/filegen/templates/power.js.in b/setup/tools/filegen/templates/power.js.in index fa503107..f6b50fe1 100644 --- a/setup/tools/filegen/templates/power.js.in +++ b/setup/tools/filegen/templates/power.js.in @@ -673,9 +673,9 @@ if (typeof $WowheadPower == "undefined") { zoom: 3, zoomable: false, buttons: false - }); + }, true); } - arr[id].map.update(json.map); + arr[id].map.update(json.map, true); delete json.map; } diff --git a/setup/updates/06_creature.sql b/setup/updates/06_creature.sql new file mode 100644 index 00000000..a4a6828b --- /dev/null +++ b/setup/updates/06_creature.sql @@ -0,0 +1,52 @@ +ALTER TABLE `aowow_creature` + ADD COLUMN `dmgMin` FLOAT UNSIGNED NOT NULL DEFAULT '0' AFTER `trainerRace`, + ADD COLUMN `dmgMax` FLOAT UNSIGNED NOT NULL DEFAULT '0' AFTER `dmgMin`, + ADD COLUMN `mleAtkPwrMin` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `dmgMax`, + ADD COLUMN `mleAtkPwrMax` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `mleAtkPwrMin`, + ADD COLUMN `rngAtkPwrMin` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `mleAtkPwrMax`, + ADD COLUMN `rngAtkPwrMax` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `rngAtkPwrMin` + ADD COLUMN `healthMin` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `aiName` + ADD COLUMN `healthMax` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `healthMin` + ADD COLUMN `manaMin` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `healthMax` + ADD COLUMN `manaMax` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `manaMin` + ADD COLUMN `armorMin` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `manaMax` + ADD COLUMN `armorMax` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `armorMin` +; + +-- merge creature_classlevelstats into ?_creature to be searchable +-- edit the table names to fit +-- for min stats +/* +UPDATE + aowow.aowow_creature ac, + world.creature_template ct, + world.creature_classlevelstats cls +SET + ac.healthMin = (CASE ct.exp WHEN 0 THEN cls.basehp0 WHEN 1 THEN cls.basehp1 ELSE cls.basehp2 END) * ct.Health_mod, + ac.manaMin = cls.basemana * ct.Mana_mod, + ac.armorMin = cls.basearmor * ct.Armor_mod, + ac.rngAtkPwrMin = cls.rangedattackpower, + ac.mleAtkPwrMin = cls.attackpower, + ac.dmgMin = (CASE ct.exp WHEN 0 THEN cls.damage_base WHEN 1 THEN cls.damage_exp1 ELSE cls.damage_exp2 END) +WHERE + ac.id = ct.entry AND + ct.unit_class = cls.class AND + ct.minlevel = cls.level; + +-- for max stats +UPDATE + aowow.aowow_creature ac, + world.creature_template ct, + world.creature_classlevelstats cls +SET + ac.healthMax = (CASE ct.exp WHEN 0 THEN cls.basehp0 WHEN 1 THEN cls.basehp1 ELSE cls.basehp2 END) * ct.Health_mod, + ac.manaMax = cls.basemana * ct.Mana_mod, + ac.armorMax = cls.basearmor * ct.Armor_mod, + ac.rngAtkPwrMax = cls.rangedattackpower, + ac.mleAtkPwrMax = cls.attackpower, + ac.dmgMax = (CASE ct.exp WHEN 0 THEN cls.damage_base WHEN 1 THEN cls.damage_exp1 ELSE cls.damage_exp2 END) +WHERE + ac.id = ct.entry AND + ct.unit_class = cls.class AND + ct.maxlevel = cls.level; +*/ diff --git a/setup/updates/06_errors.sql b/setup/updates/06_errors.sql new file mode 100644 index 00000000..99bd65a5 --- /dev/null +++ b/setup/updates/06_errors.sql @@ -0,0 +1,11 @@ +CREATE TABLE `aowow_errors` ( + `date` INT(10) UNSIGNED NULL DEFAULT NULL, + `version` SMALLINT(5) UNSIGNED NOT NULL, + `phpError` SMALLINT(5) UNSIGNED NOT NULL, + `file` VARCHAR(250) NOT NULL, + `line` SMALLINT(5) UNSIGNED NOT NULL, + `query` VARCHAR(250) NOT NULL, + `userGroups` SMALLINT(5) UNSIGNED NOT NULL, + `message` TEXT NULL, + PRIMARY KEY (`file`, `line`, `phpError`, `version`, `userGroups`) +) COLLATE='utf8_general_ci' ENGINE=MyISAM; diff --git a/static/images/wow/icons/tiny/side_alliance.gif b/static/images/wow/icons/tiny/side_alliance.gif new file mode 100644 index 00000000..3c139884 Binary files /dev/null and b/static/images/wow/icons/tiny/side_alliance.gif differ diff --git a/static/images/wow/icons/tiny/side_horde.gif b/static/images/wow/icons/tiny/side_horde.gif new file mode 100644 index 00000000..18bd188d Binary files /dev/null and b/static/images/wow/icons/tiny/side_horde.gif differ diff --git a/static/js/locale_dede.js b/static/js/locale_dede.js index 0e84cfe0..5a58b0da 100644 --- a/static/js/locale_dede.js +++ b/static/js/locale_dede.js @@ -164,7 +164,7 @@ var mn_items = [ [9,"Hexenmeister",,[[1,"Erhebliche"],[2,"Geringe"]],{className:"c9",tinyIcon:"class_warlock"}], [1,"Krieger",,[[1,"Erhebliche"],[2,"Geringe"]],{className:"c1",tinyIcon:"class_warrior"}] ]], - [7,"Trade Goods",,[ + [7,"Handwerkswaren",,[ [14,"Rüstungsverzauberungen"], [5,"Stoff"], [3,"Geräte"], diff --git a/template/bricks/rewards.tpl.php b/template/bricks/rewards.tpl.php index 01710a90..642490f5 100644 --- a/template/bricks/rewards.tpl.php +++ b/template/bricks/rewards.tpl.php @@ -28,7 +28,7 @@ if ($rewards): diff --git a/template/pages/achievement.tpl.php b/template/pages/achievement.tpl.php index 360a132d..981aed31 100644 --- a/template/pages/achievement.tpl.php +++ b/template/pages/achievement.tpl.php @@ -39,12 +39,12 @@ foreach ($this->criteria['data'] as $i => $cr): echo '
'.$this->getField('name', true).'
'.$_.'
'; - if ($l = @$cr['link']): - echo ''.Util::htmlEscape($l['text']).''; + if (!empty($cr['link'])): + echo ''.Util::htmlEscape($cr['link']['text']).''; endif; - if (!empty($l['count']) && $l['count'] > 1): - echo ' ('.$l['count'].')'; + if (!empty($cr['link']['count']) && $cr['link']['count'] > 1): + echo ' ('.$cr['link']['count'].')'; endif; if (isset($cr['extraText'])): @@ -69,7 +69,7 @@ endforeach; @@ -99,6 +99,10 @@ endif; $this->brick('mail'); +if (!empty($this->transfer)): + echo "
\n ".$this->transfer."\n"; +endif; + ?>

diff --git a/template/pages/detail-page-generic.tpl.php b/template/pages/detail-page-generic.tpl.php index fac6e1ed..d397d86b 100644 --- a/template/pages/detail-page-generic.tpl.php +++ b/template/pages/detail-page-generic.tpl.php @@ -46,6 +46,11 @@ if (isset($this->unavailable)): transfer)): + echo "
\n ".$this->transfer."\n"; +endif; + ?>

diff --git a/template/pages/items.tpl.php b/template/pages/items.tpl.php index 9b322fb1..ae68762d 100644 --- a/template/pages/items.tpl.php +++ b/template/pages/items.tpl.php @@ -35,7 +35,7 @@ if (!empty($f['slot'])):
- $str): echo ' \n"; @@ -52,7 +52,7 @@ if (!empty($f['type'])):
- $str): echo ' \n"; diff --git a/template/pages/quest.tpl.php b/template/pages/quest.tpl.php index 94cea92c..fe29b12c 100644 --- a/template/pages/quest.tpl.php +++ b/template/pages/quest.tpl.php @@ -154,7 +154,7 @@ if ($r = $this->rewards): echo "
\n"; endif; - $addData = ['rewards' => @$r['items'], 'offset' => $offset, 'extra' => @$r['money']]; + $addData = ['rewards' => !empty($r['items']) ? $r['items'] : null, 'offset' => $offset, 'extra' => !empty($r['money']) ? $r['money'] : null]; $addData['rewTitle'] = empty($r['choice']) ? Lang::$quest['receiveItems'] : Lang::$quest['receiveAlso']; $this->brick('rewards', $addData); @@ -190,6 +190,10 @@ endif; $this->brick('mail'); +if (!empty($this->transfer)): + echo "
\n ".$this->transfer."\n"; +endif; + ?>

diff --git a/template/pages/spell.tpl.php b/template/pages/spell.tpl.php index f24bff65..1e38d834 100644 --- a/template/pages/spell.tpl.php +++ b/template/pages/spell.tpl.php @@ -63,12 +63,10 @@ endif; brick('article'); ?> - - {$lang._transfer|sprintf:$transfer.id:´´:$transfer.icon:$transfer.name:$transfer.facInt:$transfer.facName} -{/if} -*/ +transfer)): + echo "
\n ".$this->transfer."\n"; +endif; ?>