diff --git a/includes/components/SmartAI/SmartAction.class.php b/includes/components/SmartAI/SmartAction.class.php index ef87fa5d..0f23f409 100644 --- a/includes/components/SmartAI/SmartAction.class.php +++ b/includes/components/SmartAI/SmartAction.class.php @@ -411,7 +411,7 @@ class SmartAction $buff[] = '[emote='.$this->param[$i].']'; $this->jsGlobals[Type::EMOTE][$this->param[$i]] = $this->param[$i]; } - $this->param[10] = Lang::concat($buff, false); + $this->param[10] = Lang::concat($buff, Lang::CONCAT_OR); break; case self::ACTION_SET_FACTION: // 2 -> any target if ($this->param[0]) @@ -592,7 +592,7 @@ class SmartAction foreach ($tal->getTabs() as $guid => $tt) $this->smartAI->addTab($guid, $tt); } - $this->param[10] = Lang::concat($talBuff, false); + $this->param[10] = Lang::concat($talBuff, Lang::CONCAT_OR); break; case self::ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST:// 88 -> self $talBuff = []; @@ -608,7 +608,7 @@ class SmartAction foreach ($tal->getTabs() as $guid => $tt) $this->smartAI->addTab($guid, $tt); } - $this->param[10] = Lang::concat($talBuff, false); + $this->param[10] = Lang::concat($talBuff, Lang::CONCAT_OR); break; case self::ACTION_SET_HOME_POS: // 101 -> self if ($this->smartAI->getTarget()?->type == Smarttarget::TARGET_SELF) @@ -636,7 +636,7 @@ class SmartAction $this->param[10] = Lang::concat($buff); break; case self::ACTION_START_CLOSEST_WAYPOINT: // 113 -> any target - $this->param[10] = Lang::concat(array_filter($this->param), false, fn($x) => '#[b]'.$x.'[/b]'); + $this->param[10] = Lang::concat(array_filter($this->param), Lang::CONCAT_OR, fn($x) => '#[b]'.$x.'[/b]'); break; case self::ACTION_RANDOM_SOUND: // 115 -> self for ($i = 0; $i < 4; $i++) diff --git a/includes/components/SmartAI/SmartEvent.class.php b/includes/components/SmartAI/SmartEvent.class.php index 5346ecaa..722179dc 100644 --- a/includes/components/SmartAI/SmartEvent.class.php +++ b/includes/components/SmartAI/SmartEvent.class.php @@ -282,7 +282,7 @@ class SmartEvent break; case self::EVENT_LINK: // 61 - Used to link together multiple events as a chain of events. if ($links = DB::World()->selectCol('SELECT `id` FROM smart_scripts WHERE `link` = ?d AND `entryorguid` = ?d AND `source_type` = ?d', $this->id, $this->smartAI->entry, $this->smartAI->srcType)) - $this->param[10] = LANG::concat($links, false, fn($x) => "#[b]".$x."[/b]"); + $this->param[10] = Lang::concat($links, Lang::CONCAT_OR, fn($x) => "#[b]".$x."[/b]"); break; case self::EVENT_GOSSIP_SELECT: // 62 - On gossip clicked (gossip_menu_option335). $gmo = DB::World()->selectRow( @@ -323,7 +323,7 @@ class SmartEvent trigger_error('SmartAI::event - entity for event #'.$this->type.' not defined'); break; case self::EVENT_EVENT_PHASE_CHANGE: // 66 - On event phase mask set - $this->param[10] = Lang::concat(Util::mask2bits($this->param[0]), false); + $this->param[10] = Lang::concat(Util::mask2bits($this->param[0]), Lang::CONCAT_OR); break; } diff --git a/localization/lang.class.php b/localization/lang.class.php index 54324fbf..afdf9107 100644 --- a/localization/lang.class.php +++ b/localization/lang.class.php @@ -52,6 +52,10 @@ class Lang public const FMT_HTML = 1; public const FMT_MARKUP = 2; + public const CONCAT_NONE = 0; + public const CONCAT_AND = 1; + public const CONCAT_OR = 2; + public static function load(Locale $loc) : void { if (self::$locale == $loc) @@ -117,27 +121,28 @@ class Lang return $ref; } - public static function concat(array $args, bool $useAnd = true, ?callable $callback = null) : string + public static function concat(array $args, int $concat = self::CONCAT_AND, ?callable $callback = null) : string { - $b = ''; - $i = 0; - $n = count($args); - + $buff = ''; $callback ??= fn($x) => $x; - foreach ($args as $k => $arg) + reset($args); + + do { - $b .= $callback($arg, $k); + $item = $callback(current($args), key($args)); + $arg = next($args); - if ($n > 1 && $i < ($n - 2)) - $b .= ', '; - else if ($n > 1 && $i == $n - 2) - $b .= self::main($useAnd ? 'and' : 'or'); - - $i++; + if ($arg !== false || $concat == self::CONCAT_NONE) + $buff .= ', '.$item; + else if ($concat == self::CONCAT_AND) + $buff .= self::main('and').' '.$item; + else + $buff .= self::main('or').' '.$item; } + while ($arg !== false); - return $b; + return substr($buff, 2); } // truncate string after X chars. If X is inside a word truncate behind it. diff --git a/localization/locale_dede.php b/localization/locale_dede.php index 7acd9059..275d9dab 100644 --- a/localization/locale_dede.php +++ b/localization/locale_dede.php @@ -1210,19 +1210,23 @@ $lang = array( ), 'zone' => array( 'notFound' => "Dieses Gebiet existiert nicht.", - 'attunement' => ["Einstimmung", "Heroische Einstimmung"], - 'key' => ["Schlüssel", "Heroischer Schlüssel"], - 'location' => "Ort", - 'raidFaction' => "Schlachtzugsfraktion", - 'boss' => "Endboss", + 'attunement' => ["Einstimmung: ", "Heroische Einstimmung: "], + 'key' => ["Schlüssel: ", "Heroischer Schlüssel: "], + 'location' => "Ort: ", + 'faction' => "Fraktion: ", + 'factions' => "Fraktionen: ", + 'raidFaction' => "Schlachtzugsfraktion: ", + 'reputationHub' => "Reputation Hub: ", + 'boss' => "Endboss: ", 'reqLevels' => "Mindeststufe: [tooltip=instancereqlevel_tip]%d[/tooltip], [tooltip=lfgreqlevel_tip]%d[/tooltip]", 'zonePartOf' => "Diese Zone ist Teil von [zone=%d].", 'autoRez' => "Automatische Wiederbelebung", 'city' => "Stadt", - 'territory' => "Territorium", - 'instanceType' => "Instanzart", + 'territory' => "Territorium: ", + 'instanceType' => "Instanzart: ", 'hcAvailable' => "Heroischer Modus verfügbar (%d)", - 'numPlayers' => "Anzahl an Spielern", + 'numPlayers' => 'Anzahl an Spielern: %1$s', + 'numPlayersVs' => 'Anzahl an Spielern: %1$dv%1$d', 'noMap' => "Für dieses Gebiet steht keine Karte zur Verfügung.", 'fishingSkill' => "25 – 100% Chance einen gelisteten Fisch zu fangen.", 'instanceTypes' => ["Zone", "Durchgang", "Dungeon", "Schlachtzug", "Battleground", "Dungeon", "Arena", "Schlachtzug", "Schlachtzug"], diff --git a/localization/locale_enus.php b/localization/locale_enus.php index c1c45ad4..18fa94f1 100644 --- a/localization/locale_enus.php +++ b/localization/locale_enus.php @@ -1210,19 +1210,23 @@ $lang = array( ), 'zone' => array( 'notFound' => "This zone doesn't exist.", - 'attunement' => ["Attunement", "Heroic attunement"], - 'key' => ["Key", "Heroic key"], - 'location' => "Location", - 'raidFaction' => "Raid faction", - 'boss' => "Final boss", + 'attunement' => ["Attunement: ", "Heroic attunement: "], + 'key' => ["Key: ", "Heroic key: "], + 'location' => "Location: ", + 'faction' => "Faction: ", + 'factions' => "Factions: ", + 'raidFaction' => "Raid faction: ", + 'reputationHub' => "Reputation Hub: ", + 'boss' => "Final boss: ", 'reqLevels' => "Required levels: [tooltip=instancereqlevel_tip]%d[/tooltip], [tooltip=lfgreqlevel_tip]%d[/tooltip]", 'zonePartOf' => "This zone is part of [zone=%s].", 'autoRez' => "Automatic resurrection", 'city' => "City", - 'territory' => "Territory", - 'instanceType' => "Instance type", + 'territory' => "Territory: ", + 'instanceType' => "Instance type: ", 'hcAvailable' => "Heroic mode available (%d)", - 'numPlayers' => "Number of players", + 'numPlayers' => 'Number of players: %1$s', + 'numPlayersVs' => 'Number of players: %1$dv%1$d', 'noMap' => "There is no map available for this zone.", 'fishingSkill' => "25 – 100% chance to catch a listed fish.", 'instanceTypes' => ["Zone", "Transit", "Dungeon", "Raid", "Battleground", "Dungeon", "Arena", "Raid", "Raid"], diff --git a/localization/locale_eses.php b/localization/locale_eses.php index c8b79cf2..d89b0aa4 100644 --- a/localization/locale_eses.php +++ b/localization/locale_eses.php @@ -1210,19 +1210,23 @@ $lang = array( ), 'zone' => array( 'notFound' => "Esta zona no existe.", - 'attunement' => ["Requisito", "Requisito heroica"], - 'key' => ["Llave", "Llave heroica"], - 'location' => "Ubicación", - 'raidFaction' => "Facción de la banda", - 'boss' => "Jefe Final", + 'attunement' => ["Requisito: ", "Requisito heroica: "], + 'key' => ["Llave: ", "Llave heroica: "], + 'location' => "Ubicación: ", + 'faction' => "Facción: ", + 'factions' => "Facciones: ", + 'raidFaction' => "Facción de la banda: ", + 'reputationHub' => "[Reputation Hub]: ", + 'boss' => "Jefe Final: ", 'reqLevels' => "Niveles requeridos: [tooltip=instancereqlevel_tip]%d[/tooltip], [tooltip=lfgreqlevel_tip]%d[/tooltip]", 'zonePartOf' => "Este campo es parte de la zona [zone=%d].", 'autoRez' => "Resurrección automática", 'city' => "Ciudad", - 'territory' => "Territorio", - 'instanceType' => "Tipo de instancia", + 'territory' => "Territorio: ", + 'instanceType' => "Tipo de instancia: ", 'hcAvailable' => "Modo heroico disponible (%di)", - 'numPlayers' => "Número de jugadores", + 'numPlayers' => 'Número de jugadores: %1$s', + 'numPlayersVs' => 'Número de jugadores: %1$dc%1$d', 'noMap' => "No hay mapa disponible para esta zona.", 'fishingSkill' => "25 – 100% de probabilidad de pescar un pez listado.", 'instanceTypes' => ["Zona", "Tránsito", "Mazmorra", "Banda", "Campo de batalla", "Mazmorra", "Arena", "Banda", "Banda"], diff --git a/localization/locale_frfr.php b/localization/locale_frfr.php index 63597467..f5467461 100644 --- a/localization/locale_frfr.php +++ b/localization/locale_frfr.php @@ -1210,19 +1210,23 @@ $lang = array( ), 'zone' => array( 'notFound' => "Cette zone n'existe pas.", - 'attunement' => ["Accès", "Accès Héroïque"], - 'key' => ["Clef", "Clef Héroïque"], - 'location' => "Localisation", - 'raidFaction' => "Faction de raid", - 'boss' => "Boss final", + 'attunement' => ["Accès : ", "Accès Héroïque : "], + 'key' => ["Clef : ", "Clef Héroïque : "], + 'location' => "Localisation : ", + 'faction' => "Faction : ", + 'factions' => "Factions : ", + 'raidFaction' => "Faction de raid : ", + 'reputationHub' => "[Reputation Hub] : ", + 'boss' => "Boss final : ", 'reqLevels' => "Niveaux requis : [tooltip=instancereqlevel_tip]%d[/tooltip], [tooltip=lfgreqlevel_tip]%d[/tooltip]", 'zonePartOf' => "Cette zone fait partie de la zone [zone=%d].", 'autoRez' => "Résurrection automatique", 'city' => "Ville", - 'territory' => "Territoire", - 'instanceType' => "Type d'instance", + 'territory' => "Territoire : ", + 'instanceType' => "Type d'instance : ", 'hcAvailable' => "Mode héroïque disponible (%d)", - 'numPlayers' => "Nombre de joueurs", + 'numPlayers' => 'Nombre de joueurs: %1$s', + 'numPlayersVs' => 'Nombre de joueurs: %1$dc%1$d', 'noMap' => "Il n'y a aucune carte disponible pour cette zone.", 'fishingSkill' => "[25 – 100% chance to catch a listed fish.]", 'instanceTypes' => ["Zone", "Transit", "Donjon", "Raid", "Champ de bataille", "Donjon", "Arène", "Raid", "Raid"], diff --git a/localization/locale_ruru.php b/localization/locale_ruru.php index c5ee9b80..4da1748b 100644 --- a/localization/locale_ruru.php +++ b/localization/locale_ruru.php @@ -1210,19 +1210,23 @@ $lang = array( ), 'zone' => array( 'notFound' => "Такая местность не существует.", - 'attunement' => ["[Attunement]", "[Heroic attunement]"], - 'key' => ["[Key]", "[Heroic key]"], - 'location' => "Местоположение", - 'raidFaction' => "Фракция рейда", - 'boss' => "Последний босс", + 'attunement' => ["[Attunement]: ", "[Heroic attunement]: "], + 'key' => ["[Key]: ", "[Heroic key]: "], + 'location' => "Местоположение: ", + 'faction' => "Фракция: ", + 'factions' => "Фракции: ", + 'raidFaction' => "Фракция рейда: ", + 'reputationHub' => "Reputation Hub: ", + 'boss' => "Последний босс: ", 'reqLevels' => "Требуемые уровни: [tooltip=instancereqlevel_tip]%d[/tooltip], [tooltip=lfgreqlevel_tip]%d[/tooltip]", 'zonePartOf' => "Эта игровая локация является частью локации [zone=%d].", 'autoRez' => "Автоматическое воскрешение", 'city' => "Город", - 'territory' => "Территория", - 'instanceType' => "Тип подземелья", + 'territory' => "Территория: ", + 'instanceType' => "Тип подземелья: ", 'hcAvailable' => "Доступен героический режим (%d)", - 'numPlayers' => "Количество игроков", + 'numPlayers' => 'Количество игроков: %1$s', + 'numPlayersVs' => 'Количество игроков: %1$dv%1$d', 'noMap' => "Для данной местности нет доступной карты.", 'fishingSkill' => "[25 – 100% chance to catch a listed fish.]", 'instanceTypes' => ["Игровая зона", "Транзит", "Подземелье", "Рейд", "Поле боя", "Подземелье", "Арена", "Рейд", "Рейд"], diff --git a/localization/locale_zhcn.php b/localization/locale_zhcn.php index b197aa9e..87868c6b 100644 --- a/localization/locale_zhcn.php +++ b/localization/locale_zhcn.php @@ -1210,19 +1210,23 @@ $lang = array( ), 'zone' => array( 'notFound' => "这个区域不存在。", - 'attunement' => ["调整", "英雄调整"], - 'key' => ["钥匙", "英雄钥匙"], - 'location' => "位置", - 'raidFaction' => "团队副本阵营", - 'boss' => "最终首领", + 'attunement' => ["调整:", "英雄调整:"], + 'key' => ["钥匙:", "英雄钥匙:"], + 'location' => "位置:", + 'faction' => "阵营:", + 'factions' => "阵营:", + 'raidFaction' => "团队副本阵营:", + 'reputationHub' => "[Reputation Hub]:", + 'boss' => "最终首领:", 'reqLevels' => "要求等级: [tooltip=instancereqlevel_tip]%d[/tooltip], [tooltip=lfgreqlevel_tip]%d[/tooltip]", 'zonePartOf' => "这个区域是[zone=%s]的一部分。", 'autoRez' => "自动复活", 'city' => "城市", - 'territory' => "领地", - 'instanceType' => "副本类型", + 'territory' => "领地:", + 'instanceType' => "副本类型:", 'hcAvailable' => "英雄模式可用 (%d)", - 'numPlayers' => "玩家人数", + 'numPlayers' => '玩家人数:%1$s', + 'numPlayersVs' => '玩家人数:%1$dv%1$d', 'noMap' => "这个区域没有可用地图。", 'fishingSkill' => "[25 – 100% chance to catch a listed fish.]", 'instanceTypes' => ["区域", "运送", "地下城", "团队副本", "战场", "地下城", "竞技场", "团队副本", "团队副本"], diff --git a/pages/genericPage.class.php b/pages/genericPage.class.php index 9a9bf748..6d50e048 100644 --- a/pages/genericPage.class.php +++ b/pages/genericPage.class.php @@ -547,21 +547,19 @@ class GenericPage $article = []; if (isset($this->guideRevision)) - $article = DB::Aowow()->selectRow('SELECT `article`, `quickInfo`, `locale`, `editAccess` FROM ?_articles WHERE `type` = ?d AND `typeId` = ?d AND `rev` = ?d', + $article = DB::Aowow()->selectRow('SELECT `article`, `locale`, `editAccess` FROM ?_articles WHERE `type` = ?d AND `typeId` = ?d AND `rev` = ?d', Type::GUIDE, $this->typeId, $this->guideRevision); else if (!empty($this->articleUrl)) - $article = DB::Aowow()->selectRow('SELECT `article`, `quickInfo`, `locale`, `editAccess` FROM ?_articles WHERE `url` = ? AND `locale` IN (?a) ORDER BY `locale` DESC, `rev` DESC LIMIT 1', + $article = DB::Aowow()->selectRow('SELECT `article`, `locale`, `editAccess` FROM ?_articles WHERE `url` = ? AND `locale` IN (?a) ORDER BY `locale` DESC, `rev` DESC LIMIT 1', $this->articleUrl, [Lang::getLocale()->value, Locale::EN->value]); else if (!empty($this->type) && isset($this->typeId)) - $article = DB::Aowow()->selectRow('SELECT `article`, `quickInfo`, `locale`, `editAccess` FROM ?_articles WHERE `type` = ?d AND `typeId` = ?d AND `locale` IN (?a) ORDER BY `locale` DESC, `rev` DESC LIMIT 1', + $article = DB::Aowow()->selectRow('SELECT `article`, `locale`, `editAccess` FROM ?_articles WHERE `type` = ?d AND `typeId` = ?d AND `locale` IN (?a) ORDER BY `locale` DESC, `rev` DESC LIMIT 1', $this->type, $this->typeId, [Lang::getLocale()->value, Locale::EN->value]); if ($article) { if ($article['article']) Markup::parseTags($article['article'], $this->jsgBuffer); - if ($article['quickInfo']) - Markup::parseTags($article['quickInfo'], $this->jsgBuffer); $this->article = array( 'text' => Util::jsEscape(Util::defStatic($article['article'])), @@ -585,9 +583,6 @@ class GenericPage $this->editAccess = $article['editAccess']; - if (empty($this->infobox) && !empty($article['quickInfo'])) - $this->infobox = $article['quickInfo']; - if ($article['locale'] != Lang::getLocale()->value) $this->article['params']['prepend'] = '
'.Lang::main('langOnly', [Lang::lang($article['locale'])]).'
'; diff --git a/pages/item.php b/pages/item.php index 8a6f92b3..0fef7c86 100644 --- a/pages/item.php +++ b/pages/item.php @@ -298,7 +298,7 @@ class ItemPage extends genericPage if ($_reqRating && $_reqRating[0]) { $text = str_replace('
', ' ', Lang::item('reqRating', $_reqRating[1], [$_reqRating[0]])); - $infobox[] = Lang::breakTextClean($text, 30, LANG::FMT_MARKUP); + $infobox[] = Lang::breakTextClean($text, 30, Lang::FMT_MARKUP); } } diff --git a/pages/zone.php b/pages/zone.php index 30f2a820..0469ac78 100644 --- a/pages/zone.php +++ b/pages/zone.php @@ -45,8 +45,23 @@ class ZonePage extends GenericPage /* Infobox */ /***********/ + $quickFactsRows = DB::Aowow()->selectCol('SELECT `orderIdx` AS ARRAY_KEY, `row` FROM ?_quickfacts WHERE `type` = ?d AND `typeId` = ?d ORDER BY `orderIdx` ASC', $this->type, $this->typeId); + $quickFactsRows = preg_replace_callback('/\|L:(\w+)((:\w+)+)\|/i', function ($m) + { + [, $grp, $args] = $m; + $args = array_filter(explode(':', $args), fn($x) => $x != ''); + + return Lang::$grp(...$args); + }, $quickFactsRows); + + foreach ($quickFactsRows as $er) + $this->extendGlobalData(Markup::parseTags($er)); + $infobox = Lang::getInfoBoxForFlags($this->subject->getField('cuFlags')); + if ($topRows = array_filter($quickFactsRows, fn($x) => $x < 0, ARRAY_FILTER_USE_KEY)) + $infobox = array_merge($infobox, $topRows); + // City if ($this->subject->getField('flags') & 0x8 && !$parentArea) $infobox[] = Lang::zone('city'); @@ -76,27 +91,55 @@ class ZonePage extends GenericPage } // Territory - $_ = $this->subject->getField('faction'); - $__ = '%s'; - if ($_ == 0) - $__ = '[span class=icon-alliance]%s[/span]'; - else if ($_ == 1) - $__ = '[span class=icon-horde]%s[/span]'; - else if ($_ == 4) - $__ = '[span class=icon-ffa]%s[/span]'; + $faction = $this->subject->getField('faction'); + $wrap = match ((int)$faction) + { + 0 => '[span class=icon-alliance]%s[/span]', + 1 => '[span class=icon-horde]%s[/span]', + 4, 5 => '[span class=icon-ffa]%s[/span]', + default => '%s' + }; - $infobox[] = Lang::zone('territory').Lang::main('colon').sprintf($__, Lang::zone('territories', $_)); + $infobox[] = Lang::zone('territory').sprintf($wrap, Lang::zone('territories', $faction)); // Instance Type - $infobox[] = Lang::zone('instanceType').Lang::main('colon').'[span class=icon-instance'.$this->subject->getField('type').']'.Lang::zone('instanceTypes', $this->subject->getField('type')).'[/span]'; + $infobox[] = Lang::zone('instanceType').'[span class=icon-instance'.$this->subject->getField('type').']'.Lang::zone('instanceTypes', $this->subject->getField('type')).'[/span]'; // Heroic mode if ($_ = $this->subject->getField('levelHeroic')) - $infobox[] = '[icon preset=heroic]'.sprintf(Lang::zone('hcAvailable'), $_).'[/icon]'; + $infobox[] = '[icon preset=heroic]'.Lang::zone('hcAvailable', [$_]).'[/icon]'; // number of players if ($_ = $this->subject->getField('maxPlayer')) - $infobox[] = Lang::zone('numPlayers').Lang::main('colon').($_ == -2 ? '10/25' : $_); + { + if (in_array($this->subject->getField('category'), [6, 9])) + $infobox[] = Lang::zone('numPlayersVs', [$_]); + else + $infobox[] = Lang::zone('numPlayers', [$_ == -2 ? '10/25' : $_]); + } + + // Instances + if ($_ = DB::Aowow()->selectCol('SELECT `typeId` FROM ?_spawns WHERE `type`= ?d AND `areaId` = ?d ', Type::ZONE, $this->typeId)) + { + $this->extendGlobalIds(Type::ZONE, ...$_); + $infobox[] = Lang::maps('Instances').Lang::main('colon').Lang::concat($_, Lang::CONCAT_NONE, fn($x) => "\n[zone=".$x."]"); + } + + // start area + if ($_ = DB::Aowow()->selectCol('SELECT `id` FROM ?_races WHERE `startAreaId` = ?d', $this->typeId)) + { + $this->extendGlobalIds(Type::CHR_RACE, ...$_); + $infobox[] = Lang::concat($_, Lang::CONCAT_NONE, fn($x) => '[race='.$x.']').' '.Lang::race('startZone'); + } + + // location (if instance) + if ($pa = DB::Aowow()->selectRow('SELECT `areaId`, `posX`, `posY`, `floor` FROM ?_spawns WHERE `type`= ?d AND `typeId` = ?d ', Type::ZONE, $this->typeId)) + { + $this->addMoveLocationMenu($pa['areaId'], $pa['floor']); + + $pins = str_pad($pa['posX'] * 10, 3, '0', STR_PAD_LEFT) . str_pad($pa['posY'] * 10, 3, '0', STR_PAD_LEFT); + $infobox[] = Lang::zone('location').'[lightbox=map zone='.$pa['areaId'].' '.($pa['floor'] > 1 ? 'floor='.--$pa['floor'] : '').' pins='.$pins.']'.ZoneList::getName($pa['areaId']).'[/lightbox]'; + } // Attunement Quest/Achievements & Keys if ($attmnt = $this->subject->getField('attunes')) @@ -107,37 +150,16 @@ class ZonePage extends GenericPage foreach ($ids as $id) { if ($type == Type::ITEM) - $infobox[] = Lang::zone('key', (int)($id < 0)).Lang::main('colon').'[item='.abs($id).']'; + $infobox[] = Lang::zone('key', (int)($id < 0)).'[item='.abs($id).']'; else - $infobox[] = Lang::zone('attunement', (int)($id < 0)).Lang::main('colon').'['.Type::getFileString($type).'='.abs($id).']'; + $infobox[] = Lang::zone('attunement', (int)($id < 0)).'['.Type::getFileString($type).'='.abs($id).']'; } } } - // Instances - if ($_ = DB::Aowow()->selectCol('SELECT `typeId` FROM ?_spawns WHERE `type`= ?d AND `areaId` = ?d ', Type::ZONE, $this->typeId)) - { - $this->extendGlobalIds(Type::ZONE, ...$_); - $infobox[] = Lang::maps('Instances').Lang::main('colon')."\n[zone=".implode("], \n[zone=", $_).']'; - } + if ($botRows = array_filter($quickFactsRows, fn($x) => $x > 0, ARRAY_FILTER_USE_KEY)) + $infobox = array_merge($infobox, $botRows); - // location (if instance) - if ($pa = DB::Aowow()->selectRow('SELECT `areaId`, `posX`, `posY`, `floor` FROM ?_spawns WHERE `type`= ?d AND `typeId` = ?d ', Type::ZONE, $this->typeId)) - { - $this->addMoveLocationMenu($pa['areaId'], $pa['floor']); - - $pins = str_pad($pa['posX'] * 10, 3, '0', STR_PAD_LEFT) . str_pad($pa['posY'] * 10, 3, '0', STR_PAD_LEFT); - $infobox[] = Lang::zone('location').Lang::main('colon').'[lightbox=map zone='.$pa['areaId'].' '.($pa['floor'] > 1 ? 'floor='.--$pa['floor'] : '').' pins='.$pins.']'.ZoneList::getName($pa['areaId']).'[/lightbox]'; - } - -/* has to be defined in an article, i think - - // faction(s) / Reputation Hub / Raid Faction - // [li]Raid faction: [faction=1156][/li] || [li]Factions: [faction=1156]/[faction=1156][/li] - - // final boss - // [li]Final boss: [icon preset=boss][npc=37226][/icon][/li] -*/ /****************/ /* Main Content */ diff --git a/setup/db_structure.sql b/setup/db_structure.sql index 6186d542..f95a306c 100644 --- a/setup/db_structure.sql +++ b/setup/db_structure.sql @@ -391,7 +391,6 @@ CREATE TABLE `aowow_articles` ( `rev` tinyint unsigned NOT NULL DEFAULT 0, `editAccess` smallint unsigned NOT NULL DEFAULT 2, `article` mediumtext DEFAULT NULL COMMENT 'Markdown formated', - `quickInfo` text DEFAULT NULL COMMENT 'Markdown formated', UNIQUE KEY `type` (`type`,`typeId`,`locale`,`rev`), UNIQUE KEY `url` (`url`,`locale`,`rev`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -2336,6 +2335,22 @@ CREATE TABLE `aowow_quests_startend` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `aowow_quickfacts` +-- + +DROP TABLE IF EXISTS `aowow_quickfacts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `aowow_quickfacts` ( + `type` smallint(5) unsigned NOT NULL, + `typeId` mediumint(9) NOT NULL, + `orderIdx` tinyint(4) NOT NULL COMMENT '<0: prepend to generic list; >0: append to generic list', + `row` varchar(200) NOT NULL COMMENT 'Markdown formated', + UNIQUE KEY `row` (`type`,`typeId`,`orderIdx`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `aowow_races` -- @@ -3341,7 +3356,7 @@ UNLOCK TABLES; LOCK TABLES `aowow_dbversion` WRITE; /*!40000 ALTER TABLE `aowow_dbversion` DISABLE KEYS */; -INSERT INTO `aowow_dbversion` VALUES (1753574970,0,NULL,NULL); +INSERT INTO `aowow_dbversion` VALUES (1753635511,0,NULL,NULL); /*!40000 ALTER TABLE `aowow_dbversion` ENABLE KEYS */; UNLOCK TABLES; @@ -3395,6 +3410,17 @@ INSERT INTO `aowow_profiler_excludes` VALUES (6,459,1,'Gray Wolf'),(6,468,1,'Whi /*!40000 ALTER TABLE `aowow_profiler_excludes` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Dumping data for table `aowow_quickfacts` +-- + +LOCK TABLES `aowow_quickfacts` WRITE; +/*!40000 ALTER TABLE `aowow_quickfacts` DISABLE KEYS */; +INSERT INTO `aowow_quickfacts` VALUES (7,1,1,'|L:zone:city||L:main:colon|[zone=1537]'),(7,12,1,'|L:zone:city||L:main:colon|[zone=1519]'),(7,14,1,'|L:zone:city||L:main:colon|[zone=1637]'),(7,65,1,'|L:zone:reputationHub|[faction=1091]'),(7,67,1,'|L:zone:reputationHub|[faction=1119]'),(7,85,1,'|L:zone:city||L:main:colon|[zone=1497]'),(7,139,1,'|L:zone:reputationHub|[faction=529]'),(7,141,1,'|L:zone:city||L:main:colon|[zone=1657]'),(7,206,1,'|L:zone:boss|[icon preset=boss][npc=23954][/icon]'),(7,209,1,'|L:zone:boss|[icon preset=boss][npc=4275][/icon]'),(7,210,1,'|L:zone:reputationHub|[faction=1106]\n[faction=1098]'),(7,215,1,'|L:zone:city||L:main:colon|[zone=1638]'),(7,361,1,'|L:zone:reputationHub|[faction=576]'),(7,405,1,'|L:zone:reputationHub|[faction=92]\n[faction=93]'),(7,440,1,'|L:zone:reputationHub|[faction=989]'),(7,491,1,'|L:zone:boss|[icon preset=boss][npc=4421][/icon]'),(7,493,1,'|L:game:class||L:main:colon|[class=11]'),(7,618,1,'|L:zone:reputationHub|[faction=589]'),(7,717,1,'|L:zone:boss|[icon preset=boss][npc=1716][/icon]'),(7,718,1,'|L:zone:boss|[icon preset=boss][npc=5775][/icon]'),(7,719,1,'|L:zone:boss|[icon preset=boss][npc=4829][/icon]'),(7,721,1,'|L:zone:boss|[icon preset=boss][npc=7800][/icon]'),(7,722,1,'|L:zone:boss|[icon preset=boss][npc=7358][/icon]'),(7,796,1,'|L:zone:key:0|[item=7146]'),(7,796,2,'|L:zone:boss|[icon preset=boss][npc=3976][/icon]'),(7,1176,1,'|L:zone:boss|[icon preset=boss][npc=7267][/icon]'),(7,1196,1,'|L:zone:boss|[icon preset=boss][npc=26861][/icon]'),(7,1337,1,'|L:zone:boss|[icon preset=boss][npc=2748][/icon]'),(7,1377,1,'|L:zone:reputationHub|[faction=609]'),(7,1477,1,'|L:zone:boss|[icon preset=boss][npc=5709][/icon]'),(7,1497,1,'|L:zone:location|[zone=85]'),(7,1497,2,'|L:zone:reputationHub|[faction=68]'),(7,1519,1,'|L:zone:location|[zone=12]'),(7,1519,2,'|L:zone:reputationHub|[faction=72]'),(7,1537,1,'|L:zone:location|[zone=1]'),(7,1537,2,'|L:zone:reputationHub|[faction=47]\n[faction=54]'),(7,1581,1,'|L:zone:boss|[icon preset=boss][npc=639][/icon]'),(7,1583,1,'|L:zone:boss|[icon preset=boss][npc=10363][/icon]'),(7,1584,1,'|L:zone:boss|[icon preset=boss][npc=9019][/icon]'),(7,1637,1,'|L:zone:location|[zone=14]'),(7,1637,2,'|L:zone:reputationHub|[faction=76]'),(7,1638,1,'|L:zone:location|[zone=215]'),(7,1638,2,'|L:zone:reputationHub|[faction=81]'),(7,1657,1,'|L:zone:location|[zone=141]'),(7,1657,2,'|L:zone:reputationHub|[faction=69]'),(7,1977,1,'|L:zone:raidFaction|[faction=270]'),(7,1977,2,'|L:zone:boss|[icon preset=boss][npc=14834][/icon]'),(7,2017,1,'|L:zone:boss|[icon preset=boss][npc=10440][/icon]'),(7,2057,1,'|L:zone:key:0|[item=13704]'),(7,2057,2,'|L:zone:boss|[icon preset=boss][npc=1853][/icon]'),(7,2100,1,'|L:zone:boss|[icon preset=boss][npc=12201][/icon]'),(7,2366,1,'|L:zone:faction|[faction=989]'),(7,2366,2,'|L:zone:boss|[icon preset=boss][npc=17881][/icon]'),(7,2367,1,'|L:zone:faction|[faction=989]'),(7,2367,2,'|L:zone:boss|[icon preset=boss][npc=18096][/icon]'),(7,2437,1,'|L:zone:boss|[icon preset=boss][npc=11520][/icon]'),(7,2677,1,'|L:zone:attunement:0|[quest=7761]'),(7,2677,2,'|L:zone:boss|[icon preset=boss][npc=11583][/icon]'),(7,2717,1,'|L:zone:attunement:0|[quest=7487]'),(7,2717,2,'|L:zone:raidFaction|[faction=749]'),(7,2717,3,'|L:zone:boss|[icon preset=boss][npc=11502][/icon]'),(7,3428,1,'|L:zone:raidFaction|[faction=910]'),(7,3428,2,'|L:zone:boss|[icon preset=boss][npc=15727][/icon]'),(7,3429,1,'|L:zone:raidFaction|[faction=609]'),(7,3429,2,'|L:zone:boss|[icon preset=boss][npc=15339][/icon]'),(7,3430,1,'|L:zone:city||L:main:colon|[zone=3487]'),(7,3433,1,'|L:zone:reputationHub|[faction=922]'),(7,3457,1,'|L:zone:attunement:0|[quest=9837]'),(7,3457,2,'|L:zone:key:0|[item=24490]'),(7,3457,3,'|L:zone:raidFaction|[faction=967]'),(7,3457,4,'|L:zone:boss|[icon preset=boss][npc=15690][/icon]'),(7,3483,1,'|L:zone:reputationHub|[icon name=side_alliance][faction=946][/icon]\n[icon name=side_horde][faction=947][/icon]'),(7,3487,1,'|L:zone:location|[zone=3430]'),(7,3487,2,'|L:zone:reputationHub|[faction=911]'),(7,3518,1,'|L:zone:reputationHub|[icon name=side_alliance][faction=978][/icon]\n[icon name=side_horde][faction=941][/icon]'),(7,3519,1,'|L:zone:reputationHub|[faction=1031]'),(7,3519,2,'|L:zone:city||L:main:colon|[zone=3703]'),(7,3520,1,'|L:zone:reputationHub|[faction=1015]'),(7,3521,1,'|L:zone:reputationHub|[faction=942]\n[faction=970]'),(7,3522,1,'|L:zone:reputationHub|[faction=1038]'),(7,3523,1,'|L:zone:reputationHub|[faction=933]'),(7,3557,1,'|L:zone:location|[zone=3524]'),(7,3557,2,'|L:zone:reputationHub|[faction=930]'),(7,3562,1,'|L:zone:faction|[icon name=side_alliance][faction=946][/icon] / [icon name=side_horde][faction=947][/icon]'),(7,3562,2,'|L:zone:boss|[icon preset=boss][npc=17536][/icon]'),(7,3606,1,'|L:zone:raidFaction|[faction=990]'),(7,3606,2,'|L:zone:boss|[icon preset=boss][npc=17968][/icon]'),(7,3607,1,'|L:zone:boss|[icon preset=boss][npc=21212][/icon]'),(7,3703,1,'|L:zone:location|[zone=3519]'),(7,3703,2,'|L:zone:reputationHub|[faction=932]\n[faction=934]\n[faction=1011]'),(7,3711,1,'|L:zone:reputationHub|[faction=1105]\n[faction=1104]'),(7,3713,1,'|L:zone:faction|[icon name=side_alliance][faction=946][/icon] / [icon name=side_horde][faction=947][/icon]'),(7,3713,2,'|L:zone:boss|[icon preset=boss][npc=17377][/icon]'),(7,3714,1,'|L:zone:key:0|[item=28395]'),(7,3714,2,'|L:zone:faction|[icon name=side_alliance][faction=946][/icon] / [icon name=side_horde][faction=947][/icon]'),(7,3714,3,'|L:zone:boss|[icon preset=boss][npc=16808][/icon]'),(7,3715,1,'|L:zone:faction|[faction=942]'),(7,3715,2,'|L:zone:boss|[icon preset=boss][npc=17798][/icon]'),(7,3716,1,'|L:zone:faction|[faction=942]'),(7,3716,2,'|L:zone:boss|[icon preset=boss][npc=17882][/icon]'),(7,3717,1,'|L:zone:faction|[faction=942]'),(7,3717,2,'|L:zone:boss|[icon preset=boss][npc=17942][/icon]'),(7,3789,1,'|L:zone:key:0|[item=27991]'),(7,3789,2,'|L:zone:faction|[faction=1011]'),(7,3789,3,'|L:zone:boss|[icon preset=boss][npc=18708][/icon]'),(7,3790,1,'|L:zone:faction|[faction=1011]'),(7,3790,2,'|L:zone:boss|[icon preset=boss][npc=18373][/icon]'),(7,3791,1,'|L:zone:faction|[faction=1011]'),(7,3791,2,'|L:zone:boss|[icon preset=boss][npc=18473][/icon]'),(7,3792,1,'|L:zone:faction|[faction=933]'),(7,3792,2,'|L:zone:boss|[icon preset=boss][npc=18344][/icon]'),(7,3805,1,'|L:zone:boss|[icon preset=boss][npc=23863][/icon]'),(7,3836,1,'|L:zone:boss|[icon preset=boss][npc=17257][/icon]'),(7,3845,1,'|L:zone:boss|[icon preset=boss][npc=19622][/icon]'),(7,3847,1,'|L:zone:faction|[faction=935]'),(7,3847,2,'|L:zone:boss|[icon preset=boss][npc=17977][/icon]'),(7,3848,1,'|L:zone:key:0|[item=31084]'),(7,3848,2,'|L:zone:faction|[faction=935]'),(7,3848,3,'|L:zone:boss|[icon preset=boss][npc=20912][/icon]'),(7,3849,1,'|L:zone:faction|[faction=935]'),(7,3849,2,'|L:zone:boss|[icon preset=boss][npc=19220][/icon]'),(7,3923,1,'|L:zone:boss|[icon preset=boss][npc=19044][/icon]'),(7,3959,1,'|L:zone:raidFaction|[faction=1012]'),(7,3959,2,'|L:zone:boss|[icon preset=boss][npc=22917][/icon]'),(7,4075,1,'|L:zone:boss|[icon preset=boss][npc=25315][/icon]'),(7,4080,1,'|L:zone:reputationHub|[faction=1077]'),(7,4100,1,'|L:zone:boss|[icon preset=boss][npc=26533][/icon]'),(7,4131,1,'|L:zone:faction|[faction=1077]'),(7,4131,2,'|L:zone:boss|[icon preset=boss][npc=24664][/icon]'),(7,4196,1,'|L:zone:boss|[icon preset=boss][npc=26632][/icon]'),(7,4228,1,'|L:zone:boss|[icon preset=boss][npc=27656][/icon]'),(7,4264,1,'|L:zone:boss|[icon preset=boss][npc=27978][/icon]'),(7,4265,1,'|L:zone:boss|[icon preset=boss][npc=26723][/icon]'),(7,4272,1,'|L:zone:boss|[icon preset=boss][npc=28923][/icon]'),(7,4277,1,'|L:zone:boss|[icon preset=boss][npc=29120][/icon]'),(7,4395,1,'|L:zone:location|[zone=2817]'),(7,4395,2,'|L:zone:reputationHub|[faction=1090]'),(7,4415,1,'|L:zone:boss|[icon preset=boss][npc=31134][/icon]'),(7,4416,1,'|L:zone:boss|[icon preset=boss][npc=29306][/icon]'),(7,4494,1,'|L:zone:boss|[icon preset=boss][npc=29311][/icon]'),(7,4723,1,'|L:zone:boss|[icon preset=boss][npc=35451][/icon]'),(7,4809,1,'|L:zone:boss|[icon preset=boss][npc=36502][/icon]'),(7,4813,1,'|L:zone:boss|[icon preset=boss][npc=36658][/icon]'),(7,4820,1,'|L:zone:boss|[icon preset=boss][npc=36954][/icon]'); +/*!40000 ALTER TABLE `aowow_quickfacts` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + -- -- Dumping data for table `aowow_setup_custom_data` -- diff --git a/setup/updates/1753635510_01.sql b/setup/updates/1753635510_01.sql new file mode 100644 index 00000000..77f23fbe --- /dev/null +++ b/setup/updates/1753635510_01.sql @@ -0,0 +1,160 @@ +ALTER TABLE `aowow_articles` + DROP COLUMN `quickInfo`; + +DROP TABLE IF EXISTS `aowow_quickfacts`; +CREATE TABLE `aowow_quickfacts` ( + `type` smallint unsigned NOT NULL, + `typeId` mediumint signed NOT NULL, + `orderIdx` tinyint signed NOT NULL COMMENT '<0: prepend to generic list; >0: append to generic list', + `row` varchar(200) NOT NULL COMMENT 'Markdown formated', + UNIQUE KEY `row` (`type`, `typeId`, `orderIdx`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT; + +INSERT INTO `aowow_quickfacts` VALUES + -- Dungeons + (7, 206, 1, '|L:zone:boss|[icon preset=boss][npc=23954][/icon]'), + (7, 209, 1, '|L:zone:boss|[icon preset=boss][npc=4275][/icon]'), + (7, 491, 1, '|L:zone:boss|[icon preset=boss][npc=4421][/icon]'), + (7, 717, 1, '|L:zone:boss|[icon preset=boss][npc=1716][/icon]'), + (7, 718, 1, '|L:zone:boss|[icon preset=boss][npc=5775][/icon]'), + (7, 719, 1, '|L:zone:boss|[icon preset=boss][npc=4829][/icon]'), + (7, 721, 1, '|L:zone:boss|[icon preset=boss][npc=7800][/icon]'), + (7, 722, 1, '|L:zone:boss|[icon preset=boss][npc=7358][/icon]'), + (7, 796, 1, '|L:zone:key:0|[item=7146]'), + (7, 796, 2, '|L:zone:boss|[icon preset=boss][npc=3976][/icon]'), + (7, 1176, 1, '|L:zone:boss|[icon preset=boss][npc=7267][/icon]'), + (7, 1196, 1, '|L:zone:boss|[icon preset=boss][npc=26861][/icon]'), + (7, 1337, 1, '|L:zone:boss|[icon preset=boss][npc=2748][/icon]'), + (7, 1477, 1, '|L:zone:boss|[icon preset=boss][npc=5709][/icon]'), + (7, 1581, 1, '|L:zone:boss|[icon preset=boss][npc=639][/icon]'), + (7, 1583, 1, '|L:zone:boss|[icon preset=boss][npc=10363][/icon]'), + (7, 1584, 1, '|L:zone:boss|[icon preset=boss][npc=9019][/icon]'), + (7, 2017, 1, '|L:zone:boss|[icon preset=boss][npc=10440][/icon]'), + (7, 2057, 1, '|L:zone:key:0|[item=13704]'), + (7, 2057, 2, '|L:zone:boss|[icon preset=boss][npc=1853][/icon]'), + (7, 2100, 1, '|L:zone:boss|[icon preset=boss][npc=12201][/icon]'), + (7, 2366, 1, '|L:zone:faction|[faction=989]'), + (7, 2366, 2, '|L:zone:boss|[icon preset=boss][npc=17881][/icon]'), + (7, 2367, 1, '|L:zone:faction|[faction=989]'), + (7, 2367, 2, '|L:zone:boss|[icon preset=boss][npc=18096][/icon]'), + (7, 2437, 1, '|L:zone:boss|[icon preset=boss][npc=11520][/icon]'), + (7, 3562, 1, '|L:zone:faction|[icon name=side_alliance][faction=946][/icon] / [icon name=side_horde][faction=947][/icon]'), + (7, 3562, 2, '|L:zone:boss|[icon preset=boss][npc=17536][/icon]'), + (7, 3713, 1, '|L:zone:faction|[icon name=side_alliance][faction=946][/icon] / [icon name=side_horde][faction=947][/icon]'), + (7, 3713, 2, '|L:zone:boss|[icon preset=boss][npc=17377][/icon]'), + (7, 3714, 1, '|L:zone:key:0|[item=28395]'), + (7, 3714, 2, '|L:zone:faction|[icon name=side_alliance][faction=946][/icon] / [icon name=side_horde][faction=947][/icon]'), + (7, 3714, 3, '|L:zone:boss|[icon preset=boss][npc=16808][/icon]'), + (7, 3715, 1, '|L:zone:faction|[faction=942]'), + (7, 3715, 2, '|L:zone:boss|[icon preset=boss][npc=17798][/icon]'), + (7, 3716, 1, '|L:zone:faction|[faction=942]'), + (7, 3716, 2, '|L:zone:boss|[icon preset=boss][npc=17882][/icon]'), + (7, 3717, 1, '|L:zone:faction|[faction=942]'), + (7, 3717, 2, '|L:zone:boss|[icon preset=boss][npc=17942][/icon]'), + (7, 3789, 1, '|L:zone:key:0|[item=27991]'), + (7, 3789, 2, '|L:zone:faction|[faction=1011]'), + (7, 3789, 3, '|L:zone:boss|[icon preset=boss][npc=18708][/icon]'), + (7, 3790, 1, '|L:zone:faction|[faction=1011]'), + (7, 3790, 2, '|L:zone:boss|[icon preset=boss][npc=18373][/icon]'), + (7, 3791, 1, '|L:zone:faction|[faction=1011]'), + (7, 3791, 2, '|L:zone:boss|[icon preset=boss][npc=18473][/icon]'), + (7, 3792, 1, '|L:zone:faction|[faction=933]'), + (7, 3792, 2, '|L:zone:boss|[icon preset=boss][npc=18344][/icon]'), + (7, 3847, 1, '|L:zone:faction|[faction=935]'), + (7, 3847, 2, '|L:zone:boss|[icon preset=boss][npc=17977][/icon]'), + (7, 3848, 1, '|L:zone:key:0|[item=31084]'), + (7, 3848, 2, '|L:zone:faction|[faction=935]'), + (7, 3848, 3, '|L:zone:boss|[icon preset=boss][npc=20912][/icon]'), + (7, 3849, 1, '|L:zone:faction|[faction=935]'), + (7, 3849, 2, '|L:zone:boss|[icon preset=boss][npc=19220][/icon]'), + (7, 4100, 1, '|L:zone:boss|[icon preset=boss][npc=26533][/icon]'), + (7, 4131, 1, '|L:zone:faction|[faction=1077]'), + (7, 4131, 2, '|L:zone:boss|[icon preset=boss][npc=24664][/icon]'), + (7, 4196, 1, '|L:zone:boss|[icon preset=boss][npc=26632][/icon]'), + (7, 4228, 1, '|L:zone:boss|[icon preset=boss][npc=27656][/icon]'), + (7, 4264, 1, '|L:zone:boss|[icon preset=boss][npc=27978][/icon]'), + (7, 4265, 1, '|L:zone:boss|[icon preset=boss][npc=26723][/icon]'), + (7, 4272, 1, '|L:zone:boss|[icon preset=boss][npc=28923][/icon]'), + (7, 4277, 1, '|L:zone:boss|[icon preset=boss][npc=29120][/icon]'), + (7, 4415, 1, '|L:zone:boss|[icon preset=boss][npc=31134][/icon]'), + (7, 4416, 1, '|L:zone:boss|[icon preset=boss][npc=29306][/icon]'), + (7, 4494, 1, '|L:zone:boss|[icon preset=boss][npc=29311][/icon]'), + (7, 4723, 1, '|L:zone:boss|[icon preset=boss][npc=35451][/icon]'), + (7, 4809, 1, '|L:zone:boss|[icon preset=boss][npc=36502][/icon]'), + (7, 4813, 1, '|L:zone:boss|[icon preset=boss][npc=36658][/icon]'), + (7, 4820, 1, '|L:zone:boss|[icon preset=boss][npc=36954][/icon]'), + -- Raids + (7, 1977, 1, '|L:zone:raidFaction|[faction=270]'), + (7, 1977, 2, '|L:zone:boss|[icon preset=boss][npc=14834][/icon]'), + (7, 2677, 1, '|L:zone:attunement:0|[quest=7761]'), + (7, 2677, 2, '|L:zone:boss|[icon preset=boss][npc=11583][/icon]'), + (7, 2717, 1, '|L:zone:attunement:0|[quest=7487]'), + (7, 2717, 2, '|L:zone:raidFaction|[faction=749]'), + (7, 2717, 3, '|L:zone:boss|[icon preset=boss][npc=11502][/icon]'), + (7, 3428, 1, '|L:zone:raidFaction|[faction=910]'), + (7, 3428, 2, '|L:zone:boss|[icon preset=boss][npc=15727][/icon]'), + (7, 3429, 1, '|L:zone:raidFaction|[faction=609]'), + (7, 3429, 2, '|L:zone:boss|[icon preset=boss][npc=15339][/icon]'), + (7, 3457, 1, '|L:zone:attunement:0|[quest=9837]'), + (7, 3457, 2, '|L:zone:key:0|[item=24490]'), + (7, 3457, 3, '|L:zone:raidFaction|[faction=967]'), + (7, 3457, 4, '|L:zone:boss|[icon preset=boss][npc=15690][/icon]'), + (7, 3606, 1, '|L:zone:raidFaction|[faction=990]'), + (7, 3606, 2, '|L:zone:boss|[icon preset=boss][npc=17968][/icon]'), + (7, 3607, 1, '|L:zone:boss|[icon preset=boss][npc=21212][/icon]'), + (7, 3805, 1, '|L:zone:boss|[icon preset=boss][npc=23863][/icon]'), + (7, 3836, 1, '|L:zone:boss|[icon preset=boss][npc=17257][/icon]'), + (7, 3845, 1, '|L:zone:boss|[icon preset=boss][npc=19622][/icon]'), + (7, 3923, 1, '|L:zone:boss|[icon preset=boss][npc=19044][/icon]'), + (7, 3959, 1, '|L:zone:raidFaction|[faction=1012]'), + (7, 3959, 2, '|L:zone:boss|[icon preset=boss][npc=22917][/icon]'), + (7, 4075, 1, '|L:zone:boss|[icon preset=boss][npc=25315][/icon]'), + -- Zones + (7, 1, 1, '|L:zone:city||L:main:colon|[zone=1537]'), + (7, 12, 1, '|L:zone:city||L:main:colon|[zone=1519]'), + (7, 14, 1, '|L:zone:city||L:main:colon|[zone=1637]'), + (7, 65, 1, '|L:zone:reputationHub|[faction=1091]'), + (7, 67, 1, '|L:zone:reputationHub|[faction=1119]'), + (7, 85, 1, '|L:zone:city||L:main:colon|[zone=1497]'), + (7, 139, 1, '|L:zone:reputationHub|[faction=529]'), + (7, 141, 1, '|L:zone:city||L:main:colon|[zone=1657]'), + (7, 210, 1, '|L:zone:reputationHub|[faction=1106]\n[faction=1098]'), + (7, 215, 1, '|L:zone:city||L:main:colon|[zone=1638]'), + (7, 361, 1, '|L:zone:reputationHub|[faction=576]'), + (7, 405, 1, '|L:zone:reputationHub|[faction=92]\n[faction=93]'), + (7, 440, 1, '|L:zone:reputationHub|[faction=989]'), + (7, 493, 1, '|L:game:class||L:main:colon|[class=11]'), + (7, 618, 1, '|L:zone:reputationHub|[faction=589]'), + (7, 1377, 1, '|L:zone:reputationHub|[faction=609]'), + (7, 1497, 1, '|L:zone:location|[zone=85]'), + (7, 1497, 2, '|L:zone:reputationHub|[faction=68]'), + (7, 1519, 1, '|L:zone:location|[zone=12]'), + (7, 1519, 2, '|L:zone:reputationHub|[faction=72]'), + (7, 1537, 1, '|L:zone:location|[zone=1]'), + (7, 1537, 2, '|L:zone:reputationHub|[faction=47]\n[faction=54]'), + (7, 1637, 1, '|L:zone:location|[zone=14]'), + (7, 1637, 2, '|L:zone:reputationHub|[faction=76]'), + (7, 1638, 1, '|L:zone:location|[zone=215]'), + (7, 1638, 2, '|L:zone:reputationHub|[faction=81]'), + (7, 1657, 1, '|L:zone:location|[zone=141]'), + (7, 1657, 2, '|L:zone:reputationHub|[faction=69]'), + (7, 3430, 1, '|L:zone:city||L:main:colon|[zone=3487]'), + (7, 3433, 1, '|L:zone:reputationHub|[faction=922]'), + (7, 3483, 1, '|L:zone:reputationHub|[icon name=side_alliance][faction=946][/icon]\n[icon name=side_horde][faction=947][/icon]'), + (7, 3487, 1, '|L:zone:location|[zone=3430]'), + (7, 3487, 2, '|L:zone:reputationHub|[faction=911]'), + (7, 3518, 1, '|L:zone:reputationHub|[icon name=side_alliance][faction=978][/icon]\n[icon name=side_horde][faction=941][/icon]'), + (7, 3519, 1, '|L:zone:reputationHub|[faction=1031]'), + (7, 3519, 2, '|L:zone:city||L:main:colon|[zone=3703]'), + (7, 3520, 1, '|L:zone:reputationHub|[faction=1015]'), + (7, 3521, 1, '|L:zone:reputationHub|[faction=942]\n[faction=970]'), + (7, 3522, 1, '|L:zone:reputationHub|[faction=1038]'), + (7, 3523, 1, '|L:zone:reputationHub|[faction=933]'), + (7, 3557, 1, '|L:zone:location|[zone=3524]'), + (7, 3557, 2, '|L:zone:reputationHub|[faction=930]'), + (7, 3711, 1, '|L:zone:reputationHub|[faction=1105]\n[faction=1104]'), + (7, 3703, 1, '|L:zone:location|[zone=3519]'), + (7, 3703, 2, '|L:zone:reputationHub|[faction=932]\n[faction=934]\n[faction=1011]'), + (7, 4080, 1, '|L:zone:reputationHub|[faction=1077]'), + (7, 4395, 1, '|L:zone:location|[zone=2817]'), + (7, 4395, 2, '|L:zone:reputationHub|[faction=1090]');