protected function generateContent() { /***********/ /* Infobox */ /***********/ $infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags')); // points if ($_ = $this->subject->getField('points')) { $infobox[] = Lang::achievement('points') . Lang::main('colon') . '[achievementpoints=' . $_ . ']'; } // location // todo (low) // faction switch ($this->subject->getField('faction')) { case 1: $infobox[] = Lang::main('side') . Lang::main('colon') . '[span class=icon-alliance]' . Lang::game('si', SIDE_ALLIANCE) . '[/span]'; break; case 2: $infobox[] = Lang::main('side') . Lang::main('colon') . '[span class=icon-horde]' . Lang::game('si', SIDE_HORDE) . '[/span]'; break; default: // case 3 $infobox[] = Lang::main('side') . Lang::main('colon') . Lang::game('si', SIDE_BOTH); } // realm first available? if ($this->subject->getField('flags') & 0x100 && DB::isConnectable(DB_AUTH)) { $avlb = []; foreach (DB::Auth()->selectCol('SELECT id AS ARRAY_KEY, name FROM realmlist WHERE allowedSecurityLevel = 0 AND gamebuild = ?d', WOW_VERSION) as $rId => $name) { if (!DB::isConnectable(DB_CHARACTERS . $rId)) { continue; } if (!DB::Characters($rId)->selectCell('SELECT 1 FROM character_achievement WHERE achievement = ?d LIMIT 1', $this->typeId)) { $avlb[] = $name; } } if ($avlb) { $infobox[] = Lang::achievement('rfAvailable') . implode(', ', $avlb); } } /**********/ /* Series */ /**********/ $series = []; if ($c = $this->subject->getField('chainId')) { $chainAcv = new AchievementList(array(['chainId', $c])); foreach ($chainAcv->iterate() as $aId => $__) { $pos = $chainAcv->getField('chainPos'); if (!isset($series[$pos])) { $series[$pos] = []; } $series[$pos][] = array('side' => $chainAcv->getField('faction'), 'typeStr' => Util::$typeStrings[TYPE_ACHIEVEMENT], 'typeId' => $aId, 'name' => $chainAcv->getField('name', true)); } } /****************/ /* Main Content */ /****************/ $this->mail = $this->createMail($reqBook); $this->headIcons = [$this->subject->getField('iconString')]; $this->infobox = $infobox ? '[ul][li]' . implode('[/li][li]', $infobox) . '[/li][/ul]' : null; $this->series = $series ? [[$series, null]] : null; $this->description = $this->subject->getField('description', true); $this->redButtons = array(BUTTON_LINKS => ['color' => 'ffffff00', 'linkId' => Util::$typeStrings[TYPE_ACHIEVEMENT] . ':' . $this->typeId . ':"..UnitGUID("player")..":0:0:0:0:0:0:0:0'], BUTTON_WOWHEAD => !($this->subject->getField('cuFlags') & CUSTOM_SERVERSIDE)); $this->criteria = array('reqQty' => $this->subject->getField('reqCriteriaCount'), 'icons' => [], 'data' => []); if ($reqBook) { $this->addCss(['path' => 'Book.css']); } // create rewards if ($foo = $this->subject->getField('rewards')) { array_walk($foo, function (&$item) { $item = $item[0] != TYPE_ITEM ? null : $item[1]; }); $bar = new ItemList(array(['i.id', $foo])); foreach ($bar->iterate() as $id => $__) { $this->rewards['item'][] = array('name' => $bar->getField('name', true), 'quality' => $bar->getField('quality'), 'typeStr' => Util::$typeStrings[TYPE_ITEM], 'id' => $id, 'globalStr' => 'g_items'); } } if ($foo = $this->subject->getField('rewards')) { array_walk($foo, function (&$item) { $item = $item[0] != TYPE_TITLE ? null : $item[1]; }); $bar = new TitleList(array(['id', $foo])); foreach ($bar->iterate() as $__) { $this->rewards['title'][] = sprintf(Lang::achievement('titleReward'), $bar->id, trim(str_replace('%s', '', $bar->getField('male', true)))); } } $this->rewards['text'] = $this->subject->getField('reward', true); // 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, $altAcv->getField('iconString'), $altAcv->getField('name', true), $pendant > 0 ? 'alliance' : 'horde', $pendant > 0 ? Lang::game('si', 1) : Lang::game('si', 2)); } } /**************/ /* Extra Tabs */ /**************/ // tab: see also $conditions = array(['name_loc' . User::$localeId, $this->subject->getField('name', true)], ['id', $this->typeId, '!']); $saList = new AchievementList($conditions); $this->lvTabs[] = array('file' => 'achievement', 'data' => $saList->getListviewData(), 'params' => array('id' => 'see-also', 'name' => '$LANG.tab_seealso', 'visibleCols' => "\$['category']")); $this->extendGlobalData($saList->getJSGlobals()); // tab: criteria of $refs = DB::Aowow()->SelectCol('SELECT refAchievementId FROM ?_achievementcriteria WHERE Type = ?d AND value1 = ?d', ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, $this->typeId); if (!empty($refs)) { $coList = new AchievementList(array(['id', $refs])); $this->lvTabs[] = array('file' => 'achievement', 'data' => $coList->getListviewData(), 'params' => array('id' => 'criteria-of', 'name' => '$LANG.tab_criteriaof', 'visibleCols' => "\$['category']")); $this->extendGlobalData($coList->getJSGlobals()); } /*****************/ /* Criteria List */ /*****************/ $iconId = 1; $rightCol = []; foreach ($this->subject->getCriteria() as $i => $crt) { // hide hidden criteria for regular users (really do..?) // if (($crt['completionFlags'] & ACHIEVEMENT_CRITERIA_FLAG_HIDDEN) && User::$perms > 0) // continue; // alternative display option $displayMoney = $crt['completionFlags'] & ACHIEVEMENT_CRITERIA_FLAG_MONEY_COUNTER; $crtName = Util::localizedString($crt, 'name'); $tmp = array('id' => $crt['id'], 'name' => $crtName, 'type' => $crt['type']); $obj = (int) $crt['value1']; $qty = (int) $crt['value2']; switch ($crt['type']) { // link to npc case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: $tmp['link'] = array('href' => '?npc=' . $obj, 'text' => $crtName); $tmp['extraText'] = Lang::achievement('slain'); break; // link to area (by map) // link to area (by map) case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: if ($zoneId = DB::Aowow()->selectCell('SELECT id FROM ?_zones WHERE mapId = ? LIMIT 1', $obj)) { $tmp['link'] = array('href' => '?zone=' . $zoneId, 'text' => $crtName); } else { $tmp['extraText'] = $crtName; } break; // link to area // link to area case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE: case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: $tmp['link'] = array('href' => '?zone=' . $obj, 'text' => $crtName); break; // link to skills // link to skills case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE: $tmp['link'] = array('href' => '?skill=' . $obj, 'text' => $crtName); break; // link to class // link to class case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS: $tmp['link'] = array('href' => '?class=' . $obj, 'text' => $crtName); break; // link to race // link to race case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE: $tmp['link'] = array('href' => '?race=' . $obj, 'text' => $crtName); break; // link to title - todo (low): crosslink // link to title - todo (low): crosslink case ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE: $tmp['extraText'] = Util::ucFirst(Lang::game('title')) . Lang::main('colon') . $crtName; break; // link to achivement (/w icon) // link to achivement (/w icon) case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: $tmp['link'] = array('href' => '?achievement=' . $obj, 'text' => $crtName); $tmp['icon'] = $iconId; $this->criteria['icons'][] = array('itr' => $iconId++, 'type' => 'g_achievements', 'id' => $obj); $this->extendGlobalIds(TYPE_ACHIEVEMENT, $obj); break; // link to quest // link to quest case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // $crtName = ; $tmp['link'] = array('href' => '?quest=' . $obj, 'text' => $crtName ?: QuestList::getName($obj)); break; // link to spell (/w icon) // link to spell (/w icon) 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: $tmp['link'] = array('href' => '?spell=' . $obj, 'text' => $crtName ?: SpellList::getName($obj)); $this->extendGlobalIds(TYPE_SPELL, $obj); $tmp['icon'] = $iconId; $this->criteria['icons'][] = array('itr' => $iconId++, 'type' => 'g_spells', 'id' => $obj); break; // link to item (/w icon) // link to item (/w icon) case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: $crtItm = new ItemList(array(['i.id', $obj])); $tmp['link'] = array('href' => '?item=' . $obj, 'text' => $crtName ?: $crtItm->getField('name', true), 'quality' => $crtItm->getField('quality'), 'count' => $qty); $this->extendGlobalData($crtItm->getJSGlobals()); $tmp['icon'] = $iconId; $this->criteria['icons'][] = array('itr' => $iconId++, 'type' => 'g_items', 'id' => $obj, 'count' => $qty); break; // link to faction (/w target reputation) // link to faction (/w target reputation) case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: $tmp['link'] = array('href' => '?faction=' . $obj, 'text' => $crtName ?: FactionList::getName($obj)); $tmp['extraText'] = ' (' . Lang::getReputationLevelForPoints($qty) . ')'; break; // link to GObject // link to GObject case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: $tmp['link'] = array('href' => '?object=' . $obj, 'text' => $crtName); break; default: // Add a gold coin icon if required $tmp['extraText'] = $displayMoney ? Util::formatMoney($qty) : $crtName; break; } // If the right column if ($i % 2) { $this->criteria['data'][] = $tmp; } else { $rightCol[] = $tmp; } } // If you found the second column - merge data from it to the end of the main body if ($rightCol) { $this->criteria['data'] = array_merge($this->criteria['data'], $rightCol); } }
private function createEffects(&$infobox, &$redButtons) { // proc data .. maybe use more information..? $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; } $effects = []; $spellIdx = array_unique(array_merge($this->subject->canTriggerSpell(), $this->subject->canTeachSpell())); $itemIdx = $this->subject->canCreateItem(); // Iterate through all effects: for ($i = 1; $i < 4; $i++) { if ($this->subject->getField('effect' . $i . 'Id') <= 0) { continue; } $effId = (int) $this->subject->getField('effect' . $i . 'Id'); $effMV = (int) $this->subject->getField('effect' . $i . 'MiscValue'); $effBP = (int) $this->subject->getField('effect' . $i . 'BasePoints'); $effDS = (int) $this->subject->getField('effect' . $i . 'DieSides'); $effRPPL = $this->subject->getField('effect' . $i . 'RealPointsPerLevel'); $effAura = (int) $this->subject->getField('effect' . $i . 'AuraId'); $foo =& $effects[]; // Icons: // .. from item if (in_array($i, $itemIdx)) { $_ = $this->subject->getField('effect' . $i . 'CreateItemId'); foreach ($this->subject->relItems->iterate() as $itemId => $__) { if ($itemId != $_) { continue; } $foo['icon'] = array('id' => $this->subject->relItems->id, 'name' => $this->subject->relItems->getField('name', true), 'quality' => $this->subject->relItems->getField('quality'), 'count' => $effDS + $effBP, 'icon' => $this->subject->relItems->getField('iconString')); break; } if ($effDS > 1) { $foo['icon']['count'] = "'" . ($effBP + 1) . '-' . $foo['icon']['count'] . "'"; } } else { if (in_array($i, $spellIdx) || $effId == 133) { $_ = $this->subject->getField('effect' . $i . 'TriggerSpell'); if (!$_) { $_ = $this->subject->getField('effect' . $i . 'MiscValue'); } $trig = new SpellList(array(['s.id', (int) $_])); $foo['icon'] = array('id' => $_, 'name' => $trig->error ? Util::ucFirst(Lang::game('spell')) . ' #' . $_ : $trig->getField('name', true), 'count' => 0); $this->extendGlobalData($trig->getJSGlobals(GLOBALINFO_SELF | GLOBALINFO_RELATED)); } } // Effect Name $foo['name'] = (User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, 'EffectId: ' . $effId, Util::$spellEffectStrings[$effId]) : Util::$spellEffectStrings[$effId]) . Lang::main('colon'); if ($this->subject->getField('effect' . $i . 'RadiusMax') > 0) { $foo['radius'] = $this->subject->getField('effect' . $i . 'RadiusMax'); } if (!in_array($i, $itemIdx) && !in_array($i, $spellIdx) && !in_array($effAura, [225, 227])) { $foo['value'] = ($effDS && $effDS != 1 ? $effBP + 1 . Lang::game('valueDelim') : null) . ($effBP + $effDS); } if ($effRPPL != 0) { $foo['value'] = (isset($foo['value']) ? $foo['value'] : '0') . sprintf(Lang::spell('costPerLevel'), $effRPPL); } if ($this->subject->getField('effect' . $i . 'Periode') > 0) { $foo['interval'] = Util::formatTime($this->subject->getField('effect' . $i . 'Periode')); } if ($_ = $this->subject->getField('effect' . $i . 'Mechanic')) { $foo['mechanic'] = Lang::game('me', $_); } if (!empty($procData['chance'])) { $foo['procData'] = array($procData['chance'], $procData['cooldown'] ? Util::formatTime($procData['cooldown'] * 1000, true) : null); } else { if (in_array($i, $this->subject->canTriggerSpell()) && $this->subject->getField('procChance')) { $foo['procData'] = array($this->subject->getField('procChance'), $procData['cooldown'] ? Util::formatTime($procData['cooldown'] * 1000, true) : null); } } // parse masks and indizes switch ($effId) { case 8: // Power Drain // Power Drain case 30: // Energize // Energize case 137: // Energize Pct $_ = Lang::spell('powerTypes', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) { $_ = sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_); } else { if (!$_) { $_ = $effMV; } } if ($effMV == POWER_RAGE || $effMV == POWER_RUNIC_POWER) { $foo['value'] = ($effDS && $effDS != 1 ? ($effBP + 1) / 10 . Lang::game('valueDelim') : null) . ($effBP + $effDS) / 10; } $foo['name'] .= ' (' . $_ . ')'; break; case 16: // QuestComplete if ($_ = QuestList::getName($effMV)) { $foo['name'] .= '(<a href="?quest=' . $effMV . '">' . $_ . '</a>)'; } else { $foo['name'] .= Util::ucFirst(Lang::game('quest')) . ' #' . $effMV; } break; case 28: // Summon // Summon case 90: // Kill Credit // Kill Credit case 134: // Kill Credit2 $_ = Lang::game('npc') . ' #' . $effMV; if ($summon = $this->subject->getModelInfo($this->typeId, $i)) { $_ = $summon['typeId'] ? ' (<a href="?npc=' . $summon['typeId'] . '">' . $summon['displayName'] . '</a>)' : ' (#0)'; $redButtons[BUTTON_VIEW3D] = ['type' => TYPE_NPC, 'displayId' => $summon['displayId']]; } $foo['name'] .= $_; break; case 33: // Open Lock $_ = $effMV ? Lang::spell('lockType', $effMV) : $effMV; if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) { $_ = sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_); } else { if (!$_) { $_ = $effMV; } } $foo['name'] .= ' (' . $_ . ')'; break; case 53: // Enchant Item Perm // Enchant Item Perm case 54: // Enchant Item Temp // Enchant Item Temp case 92: // Enchant Held Item // Enchant Held Item case 156: // Enchant Item Prismatic if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_itemenchantment WHERE id = ?d', $effMV)) { $foo['name'] .= ' (<a href="?enchantment=' . $effMV . '" class="q2">' . Util::localizedString($_, 'name') . '</a>)'; } else { $foo['name'] .= ' #' . $effMV; } break; case 38: // Dispel [miscValue => Types] // Dispel [miscValue => Types] case 126: // Steal Aura $_ = Lang::game('dt', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) { $_ = sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_); } else { if (!$_) { $_ = $effMV; } } $foo['name'] .= ' (' . $_ . ')'; break; case 39: // Learn Language $_ = Lang::game('languages', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) { $_ = sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_); } else { if (!$_) { $_ = $effMV; } } $foo['name'] .= ' (' . $_ . ')'; break; case 50: // Trans Door // Trans Door case 76: // Summon Object (Wild) // case 86: // Activate Object // Summon Object (Wild) // case 86: // Activate Object case 104: // Summon Object (slot 1) // Summon Object (slot 1) case 105: // Summon Object (slot 2) // Summon Object (slot 2) case 106: // Summon Object (slot 3) // Summon Object (slot 3) case 107: // Summon Object (slot 4) $_ = Util::ucFirst(Lang::game('object')) . ' #' . $effMV; if ($summon = $this->subject->getModelInfo($this->typeId, $i)) { $_ = $summon['typeId'] ? ' (<a href="?object=' . $summon['typeId'] . '">' . $summon['displayName'] . '</a>)' : ' (#0)'; $redButtons[BUTTON_VIEW3D] = ['type' => TYPE_OBJECT, 'displayId' => $summon['displayId']]; } $foo['name'] .= $_; break; case 74: // Apply Glyph if ($_ = DB::Aowow()->selectCell('SELECT spellId FROM ?_glyphproperties WHERE id = ?d', $effMV)) { if ($n = SpellList::getName($_)) { $foo['name'] .= '(<a href="?spell=' . $_ . '">' . $n . '</a>)'; } else { $foo['name'] .= Util::ucFirst(Lang::game('spell')) . ' #' . $effMV; } } else { $foo['name'] .= ' #' . $effMV; } break; case 95: // Skinning switch ($effMV) { case 0: $_ = Lang::game('ct', 1) . ', ' . Lang::game('ct', 2); break; // Beast, Dragonkin // Beast, Dragonkin case 1: case 2: $_ = Lang::game('ct', 4); break; // Elemental (nature based, earth based) // Elemental (nature based, earth based) case 3: $_ = Lang::game('ct', 9); break; // Mechanic // Mechanic default: $_ = ''; } if (User::isInGroup(U_GROUP_EMPLOYEE)) { $_ = sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_); } else { $_ = $effMV; } $foo['name'] .= ' (' . $_ . ')'; break; case 108: // Dispel Mechanic $_ = Lang::game('me', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) { $_ = sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_); } else { if (!$_) { $_ = $effMV; } } $foo['name'] .= ' (' . $_ . ')'; break; case 118: // Require Skill if ($_ = SkillList::getName($effMV)) { $foo['name'] .= '(<a href="?skill=' . $effMV . '">' . $_ . '</a>)'; } else { $foo['name'] .= Util::ucFirst(Lang::game('skill')) . ' #' . $effMV; } break; case 146: // Activate Rune $_ = Lang::spell('powerRunes', $effMV); if ($_ && User::isInGroup(U_GROUP_EMPLOYEE)) { $_ = sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_); } else { if (!$_) { $_ = $effMV; } } $foo['name'] .= ' (' . $_ . ')'; break; case 123: // Send Taxi - effMV is taxiPathId. We only use paths for flightmasters for now, so spell-triggered paths are not in the table // Send Taxi - effMV is taxiPathId. We only use paths for flightmasters for now, so spell-triggered paths are not in the table default: if (($effMV || $effId == 97) && $effId != 155) { $foo['name'] .= ' (' . $effMV . ')'; } // Aura // Aura case 6: // Simple // Simple case 27: // AA Persistent // AA Persistent case 35: // AA Party // AA Party case 65: // AA Raid // AA Raid case 119: // AA Pet // AA Pet case 128: // AA Friend // AA Friend case 129: // AA Enemy // AA Enemy case 143: if ($effAura > 0 && isset(Util::$spellAuraStrings[$effAura])) { $foo['name'] .= User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, 'AuraId: ' . $effAura, Util::$spellAuraStrings[$effAura]) : Util::$spellAuraStrings[$effAura]; $bar = $effMV; switch ($effAura) { case 17: // Mod Stealth Detection 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)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_) : $_; } break; case 24: // Periodic Energize // Periodic Energize case 21: // Obsolete Mod Power // Obsolete Mod Power case 35: // Mod Increase Power // Mod Increase Power case 85: // Mod Power Regeneration // Mod Power Regeneration case 110: // Mod Power Regeneration Pct if ($_ = Lang::spell('powerTypes', $effMV)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_) : $_; } break; case 29: // Mod Stat // Mod Stat case 80: // Mod Stat % // Mod Stat % case 137: // Mod Total Stat % // Mod Total Stat % case 175: // Mod Spell Healing Of Stat Percent // Mod Spell Healing Of Stat Percent case 212: // Mod Ranged Attack Power Of Stat Percent // Mod Ranged Attack Power Of Stat Percent case 219: // Mod Mana Regeneration from Stat // Mod Mana Regeneration from Stat case 268: // Mod Attack Power Of Stat Percent $mask = $effMV == -1 ? 0x1f : 1 << $effMV; $_ = []; for ($j = 0; $j < 5; $j++) { if ($mask & 1 << $j) { $_[] = Lang::game('stats', $j); } } if ($_ = implode(', ', $_)) { } $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_) : $_; break; case 36: // Shapeshift if ($st = $this->subject->getModelInfo($this->typeId, $i)) { $redButtons[BUTTON_VIEW3D] = array('type' => TYPE_NPC, 'displayId' => $st['displayId']); if ($st['creatureType'] > 0) { $infobox[] = Lang::game('type') . Lang::main('colon') . Lang::game('ct', $st['creatureType']); } if ($_ = $st['displayName']) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_) : $_; } } break; case 37: // Effect immunity 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 (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 // Dispel Immunity case 178: // Mod Debuff Resistance // Mod Debuff Resistance case 245: // Mod Aura Duration By Dispel 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)) { $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)) { $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)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_) : $_; } break; case 77: // Mechanic Immunity // Mechanic Immunity case 117: // Mod Mechanic Resistance // Mod Mechanic Resistance case 232: // Mod Mechanic Duration // Mod Mechanic Duration case 234: // Mod Mechanic Duration (no stack) // Mod Mechanic Duration (no stack) case 255: // Mod Mechanic Damage Taken Pct // Mod Mechanic Damage Taken Pct case 276: // Mod Mechanic Damage Done Percent if ($_ = Lang::game('me', $effMV)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . Util::asHex($effMV), $_) : $_; } break; case 147: // Mechanic Immunity Mask $_ = []; foreach (Lang::game('me') as $k => $str) { if ($effMV & 1 << $k - 1) { $_[] = $str; } } if ($_ = implode(', ', $_)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . Util::asHex($effMV), $_) : $_; } break; case 10: // Mod Threat // Mod Threat case 13: // Mod Damage Done // Mod Damage Done case 14: // Mod Damage Taken // Mod Damage Taken case 22: // Mod Resistance // Mod Resistance case 39: // School Immunity // School Immunity case 40: // Damage Immunity // Damage Immunity case 50: // Mod Critical Healing Amount // Mod Critical Healing Amount case 57: // Mod Spell Crit Chance // Mod Spell Crit Chance case 69: // School Absorb // School Absorb case 71: // Mod Spell Crit Chance School // Mod Spell Crit Chance School case 72: // Mod Power Cost School Percent // Mod Power Cost School Percent case 73: // Mod Power Cost School Flat // Mod Power Cost School Flat case 74: // Reflect Spell School // Reflect Spell School case 79: // Mod Damage Done Pct // Mod Damage Done Pct case 81: // Split Damage Pct // Split Damage Pct case 83: // Mod Base Resistance // Mod Base Resistance case 87: // Mod Damage Taken Pct // Mod Damage Taken Pct case 97: // Mana Shield // Mana Shield case 101: // Mod Resistance Pct // Mod Resistance Pct case 115: // Mod Healing Taken // Mod Healing Taken case 118: // Mod Healing Taken Pct // Mod Healing Taken Pct case 123: // Mod Target Resistance // Mod Target Resistance case 135: // Mod Healing Done // Mod Healing Done case 136: // Mod Healing Done Pct // Mod Healing Done Pct case 142: // Mod Base Resistance Pct // Mod Base Resistance Pct case 143: // Mod Resistance Exclusive // Mod Resistance Exclusive case 149: // Reduce Pushback // Reduce Pushback case 163: // Mod Crit Damage Bonus // Mod Crit Damage Bonus case 174: // Mod Spell Damage Of Stat Percent // Mod Spell Damage Of Stat Percent case 182: // Mod Resistance Of Stat Percent // Mod Resistance Of Stat Percent case 186: // Mod Attacker Spell Hit Chance // Mod Attacker Spell Hit Chance case 194: // Mod Target Absorb School // Mod Target Absorb School case 195: // Mod Target Ability Absorb School // Mod Target Ability Absorb School case 199: // Mod Increases Spell Percent to Hit // Mod Increases Spell Percent to Hit case 229: // Mod AoE Damage Avoidance // Mod AoE Damage Avoidance case 271: // Mod Damage Percent Taken Form Caster // Mod Damage Percent Taken Form Caster case 310: // Mod Creature AoE Damage Avoidance if ($_ = Lang::getMagicSchools($effMV)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . Util::asHex($effMV), $_) : $_; } break; case 30: // Mod Skill // Mod Skill case 98: // Mod Skill Value if ($_ = SkillList::getName($effMV)) { $bar = ' (<a href="?skill=' . $effMV . '">' . SkillList::getName($effMV) . '</a>)'; } else { $bar = Lang::main('colon') . Util::ucFirst(Lang::game('skill')) . ' #' . $effMV; } break; case 107: // Flat Modifier // Flat Modifier case 108: // Pct Modifier if ($_ = Lang::spell('spellModOp', $effMV)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $effMV, $_) : $_; } break; case 189: // Mod Rating // Mod Rating case 220: // Combat Rating From Stat $_ = []; foreach (Lang::spell('combatRating') as $k => $str) { if (1 << $k & $effMV) { $_[] = $str; } } if ($_ = implode(', ', $_)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . Util::asHex($effMV), $_) : $_; } break; case 168: // Mod Damage Done Versus // Mod Damage Done Versus case 59: // Mod Damage Done Versus Creature // Mod Damage Done Versus Creature case 102: // Mod Melee Attack Power Versus // Mod Melee Attack Power Versus case 131: // Mod Ranged Attack Power Versus // Mod Ranged Attack Power Versus case 180: // Mod Spell Damage Versus $_ = []; foreach (Lang::game('ct') as $k => $str) { if ($effMV & 1 << $k - 1) { $_[] = $str; } } if ($_ = implode(', ', $_)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . Util::asHex($effMV), $_) : $_; } break; case 249: // Convert Rune $x = $this->subject->getField('effect' . $i . 'MiscValueB'); if ($_ = Lang::spell('powerRunes', $x)) { $bar = User::isInGroup(U_GROUP_EMPLOYEE) ? sprintf(Util::$dfnString, Lang::spell('_value') . Lang::main('colon') . $x, $_) : $_; } break; case 78: // Mounted // Mounted case 56: // Transform if ($transform = $this->subject->getModelInfo($this->typeId, $i)) { $redButtons[BUTTON_VIEW3D] = ['type' => TYPE_NPC, 'displayId' => $transform['displayId']]; $bar = $transform['typeId'] ? ' (<a href="?npc=' . $transform['typeId'] . '">' . $transform['displayName'] . '</a>)' : ' (#0)'; } else { $bar = Lang::main('colon') . Lang::game('npc') . ' #' . $effMV; } break; case 139: // Force Reaction $foo['value'] = sprintf(Util::$dfnString, $foo['value'], Lang::game('rep', $foo['value'])); // DO NOT BREAK // DO NOT BREAK case 190: // Mod Faction Reputation Gain $bar = ' (<a href="?faction=' . $effMV . '">' . FactionList::getName($effMV) . '</a>)'; break; // also breaks for 139 } $foo['name'] .= strstr($bar, 'href') || strstr($bar, '#') ? $bar : ($bar ? ' (' . $bar . ')' : null); if (in_array($effAura, [174, 220, 182])) { $foo['name'] .= ' [' . sprintf(Util::$dfnString, Lang::game('stats', $this->subject->getField('effect' . $i . 'MiscValueB')), $this->subject->getField('effect' . $i . 'MiscValueB')) . ']'; } else { if ($this->subject->getField('effect' . $i . 'MiscValueB') > 0) { $foo['name'] .= ' [' . $this->subject->getField('effect' . $i . 'MiscValueB') . ']'; } } } else { if ($effAura > 0) { $foo['name'] .= Lang::main('colon') . 'Unknown Aura (' . $effAura . ')'; } } break; } // cases where we dont want 'Value' to be displayed if (in_array($effAura, [11, 12, 36, 77]) || in_array($effId, []) || empty($foo['value'])) { unset($foo['value']); } } unset($foo); // clear reference return $effects; }
public function renderTooltip() { $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 = $this->getField('description', true); $name = $this->getField('name', true); $criteria = ''; $i = 0; foreach ($rows as $crt) { $obj = (int) $crt['value1']; $qty = (int) $crt['value2']; // we could show them, but the tooltips are cluttered if ($crt['completionFlags'] & ACHIEVEMENT_CRITERIA_FLAG_HIDDEN && User::$perms <= 0) { continue; } $crtName = Util::localizedString($crt, 'name'); switch ($crt['type']) { // link to title - todo (low): crosslink case ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE: $crtName = Util::ucFirst(Lang::game('title')) . Lang::main('colon') . $crtName; break; // link to quest // link to quest case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: if (!$crtName) { $crtName = QuestList::getName($obj); } break; // link to spell (/w icon) // link to spell (/w icon) 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($obj); } break; // link to item (/w icon) // link to item (/w icon) 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($obj); } break; // link to faction (/w target reputation) // link to faction (/w target reputation) case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: if (!$crtName) { $crtName = FactionList::getName($obj); } break; } if ($crt['completionFlags'] & ACHIEVEMENT_CRITERIA_FLAG_MONEY_COUNTER) { $criteria .= '- ' . Util::jsEscape($crtName) . ' <span class="moneygold">' . number_format($crt['value2'] / 10000) . '</span><br />'; } else { $criteria .= '- ' . Util::jsEscape($crtName) . '<br />'; } if (++$i == round(count($rows) / 2)) { $criteria .= '</small></td><th class="q0" style="white-space: nowrap; text-align: left"><small>'; } } $x = '<table><tr><td><b class="q">'; $x .= Util::jsEscape($name); $x .= '</b></td></tr></table>'; if ($description || $criteria) { $x .= '<table><tr><td>'; } if ($description) { $x .= '<br />' . Util::jsEscape($description) . '<br />'; } if ($criteria) { $x .= '<br /><span class="q">' . Lang::achievement('criteria') . ':</span>'; $x .= '<table width="100%"><tr><td class="q0" style="white-space: nowrap"><small>' . $criteria . '</small></th></tr></table>'; } if ($description || $criteria) { $x .= '</td></tr></table>'; } return $x; }