iterate()) { if (!$this->curTpl['iconString']) $this->templates[$this->id]['iconString'] = 'INV_Misc_QuestionMark'; //"rewards":[[11,137],[3,138]] [type, typeId] if (!empty($this->curTpl['rewardIds'])) { $rewards = []; $rewIds = explode(" ", $this->curTpl['rewardIds']); foreach ($rewIds as $rewId) $rewards[] = ($rewId > 0 ? [TYPE_ITEM => $rewId] : ($rewId < 0 ? [TYPE_TITLE => -$rewId] : NULL)); $this->templates[$this->id]['rewards'] = $rewards; } } $this->reset(); // restore 'iterator' } public function addRewardsToJScript(&$refs) { // collect Ids to execute in single query $lookup = []; while ($this->iterate()) { $rewards = explode(" ", $this->curTpl['rewardIds']); foreach ($rewards as $reward) { if ($reward > 0) $lookup['item'][] = $reward; else if ($reward < 0) $lookup['title'][] = -$reward; } } if (isset($lookup['item'])) (new ItemList(array(['i.entry', array_unique($lookup['item'])])))->addGlobalsToJscript($refs); if (isset($lookup['title'])) (new TitleList(array(['id', array_unique($lookup['title'])])))->addGlobalsToJscript($refs); } public function addGlobalsToJscript(&$refs) { if (!isset($refs['gAchievements'])) $refs['gAchievements'] = []; while ($this->iterate()) { $refs['gAchievements'][$this->id] = array( 'icon' => $this->curTpl['iconString'], 'name' => Util::localizedString($this->curTpl, 'name') ); } } public function getListviewData() { $data = []; while ($this->iterate()) { $data[$this->id] = array( 'id' => $this->id, 'name' => Util::localizedString($this->curTpl, 'name'), 'description' => Util::localizedString($this->curTpl, 'description'), 'points' => $this->curTpl['points'], 'faction' => $this->curTpl['faction'], 'category' => $this->curTpl['category'], 'parentCat' => $this->curTpl['parentCat'], ); // going out on a limb here: type = 1 if in level 3 of statistics tree, so, IF (statistic AND parentCat NOT statistic (1)) i guess if ($this->curTpl['flags'] & ACHIEVEMENT_FLAG_COUNTER && $this->curTpl['parentCat'] != 1) $data[$this->id]['type'] = 1; if (!empty($this->curTpl['rewards'])) { $rewards = []; foreach ($this->curTpl['rewards'] as $pair) $rewards[] = '['.key($pair).','.current($pair).']'; $data[$this->id]['rewards'] = '['.implode(',', $rewards).']'; } else if (!empty ($this->curTpl['reward'])) $data[$this->id]['reward'] = Util::localizedString($this->curTpl, 'reward'); } return $data; } // hmm, really needed? .. probably .. needs rename? .. also probably public function getDetailedData() { $data = []; while ($this->iterate()) { $data[$this->id] = array( 'id' => $this->id, 'name' => Util::localizedString($this->curTpl, 'name'), 'description' => Util::localizedString($this->curTpl, 'description'), 'points' => $this->curTpl['points'], 'iconname' => $this->curTpl['iconString'], 'count' => $this->curTpl['reqCriteriaCount'], 'reward' => empty($this->curTpl['reward_loc'.User::$localeId]) ? NULL : Util::localizedString($this->curTpl, 'reward') ); } return $data; } // only for current template public function getCriteria($idx = -1) { if (empty($this->criteria)) { $result = DB::Aowow()->Select('SELECT * FROM ?_achievementcriteria WHERE `refAchievement` = ? ORDER BY `order` ASC', $this->id); if (!$result) return []; if (is_array($result[0])) $this->criteria[$this->id] = $result; else $this->criteria[$this->id][] = $result; } if ($idx < 0) return $this->criteria[$this->id]; else return $this->criteria[$this->id][$idx]; } public function renderTooltip() { if (!empty($this->tooltip[$this->id])) return $this->tooltip[$this->id]; $criteria = $this->getCriteria(); $tmp = []; $rows = []; $i = 0; foreach ($criteria as $_row) { if ($i++ % 2) $tmp[] = $_row; else $rows[] = $_row; } if ($tmp) $rows = array_merge($rows, $tmp); $description = Util::localizedString($this->curTpl, 'description'); $name = Util::localizedString($this->curTpl, 'name'); $criteria = ''; $i = 0; foreach ($rows as $crt) { // we could show them, but the tooltips are cluttered if (($crt['complete_flags'] & ACHIEVEMENT_CRITERIA_FLAG_HIDDEN) && User::$perms <= 0) continue; $crtName = Util::jsEscape(Util::localizedString($crt, 'name')); switch ($crt['type']) { case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: if (!$crtName) $crtName = SpellList::getName($crt['value1']); break; case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: if (!$crtName) $crtName = ItemList::getName($crt['value1']); break; case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: if (!$crtName) $crtName = FactionList::getName($crt['value1']); $crtName .= ' ('.Lang::getReputationLevelForPoints($crt['value2']).')'; break; } if ($crt['complete_flags'] & ACHIEVEMENT_CRITERIA_FLAG_MONEY_COUNTER) $criteria .= '- '.Util::jsEscape(htmlspecialchars($crtName)).' '.number_format($crt['value2' ] / 10000).'
'; else $criteria .= '- '.Util::jsEscape(htmlspecialchars($crtName)).'
'; if (++$i == round(count($rows)/2)) $criteria .= ''; } $x = '
'; $x .= Util::jsEscape(htmlspecialchars($name)); $x .= '
'; if ($description || $criteria) $x .= '
'; if ($description) $x .= '
'.Util::jsEscape(htmlspecialchars($description)).'
'; if ($criteria) { $x .= '
'.Lang::$achievement['criteria'].':'; $x .= '
'.$criteria.'
'; } if ($description || $criteria) $x .= '
'; // Completed $this->tooltip[$this->id] = $x; return $this->tooltip[$this->id]; } public function getSourceData() { $data = []; while ($this->iterate()) { $data[$this->id] = array( "n" => Util::localizedString($this->curTpl, 'name'), "s" => $this->curTpl['faction'], "t" => TYPE_ACHIEVEMENT, "ti" => $this->id ); } return $data; } } ?>