commit cd8866e2a228b0587f93d0f48724fd6d8fb143fd Author: Sattva Date: Sat May 20 18:30:38 2023 +0300 fix minimap button diff --git a/Bindings.xml b/Bindings.xml new file mode 100644 index 0000000..726223c --- /dev/null +++ b/Bindings.xml @@ -0,0 +1,18 @@ + + + + + SlashCmdList["Leatrix_Plus"]() + + + + + SlashCmdList["Leatrix_Plus"]("id") + + + + + SlashCmdList["Leatrix_Plus"]("ra") + + + diff --git a/CHANGELOG.txt b/CHANGELOG.txt new file mode 100644 index 0000000..400a3c9 --- /dev/null +++ b/CHANGELOG.txt @@ -0,0 +1,765 @@ +3.0.131 - 10th May 2023 +- Added flight times. + +3.0.130 - 3rd May 2023 +- For 'Enhance tooltip' ('Interface'), fixed an issue with 'Hide health bar' which caused the health bar to not be hidden. +- For 'Easy item destroy' ('System'), fixed an issue which caused a Lua error when clicking outside of the destroy confirmation. + +3.0.129 - 25th April 2023 +- Added flight times. + +3.0.128 - 22nd April 2023 +- Added flight times. + +3.0.127 - 19th April 2023 +- Added flight times. +- Fixed /run leaplus("quest ") functionality. + +3.0.126 - 15th April 2023 +- Added flight times. + +3.0.125 - 2nd April 2023 +- Added flight times. + +3.0.124 - 31st March 2023 +- Added flight times. + +3.0.123 - 27th March 2023 +- Added flight times. + +3.0.122 - 26th March 2023 +- Added flight times. + +3.0.121 - 23rd March 2023 +- Added flight times. + +3.0.120 - 18th March 2023 +- Added flight times. + +3.0.118 - 13th March 2023 +- Added flight times. + +3.0.117 - 7th March 2023 +- Added flight times. + +3.0.116 - 5th March 2023 +- Added flight times. + +3.0.115 - 4th March 2023 +- Added flight times. + +3.0.114 - 3rd March 2023 +- Added flight times. + +3.0.113 - 2nd March 2023 +- Added flight times. + +3.0.112 - 1st March 2023 +- Added flight times. + +3.0.111 - 28th February 2023 +- Added flight times. + +3.0.110 - 25th February 2023 +- Added flight times. + +3.0.109 - 22nd February 2023 +- For 'Mute game sounds' ('System'), added new sounds to the 'Gyrocopters' setting (including Mimiron's Head). +- Added flight times. + +3.0.108 - 19th February 2023 +- Added flight times. + +3.0.107 - 12th February 2023 +- Added flight times. + +3.0.106 - 10th February 2023 +- Added flight times. + +3.0.105 - 8th February 2023 +- Added flight times. + +3.0.104 - 6th February 2023 +- Updated friend checking code for the options in the social menu to more closely match Dragonflight code. +- For 'Recent chat window' ('Chat'), fixed an issue which caused texture atlases to break dragging and selecting messages. +- For 'Show durability status' ('Interface'), fixed a bug which caused ranged weapons to be excluded. +- Added flight times. + +3.0.103 - 5th February 2023 +- Added flight times. + +3.0.102 - 4th February 2023 +- For 'Mute game sounds' ('System'), you can now mute Rhonin. +- For 'Hide chat buttons' ('Chat'), the text to speech configuration button will now be hidden. +- Added flight times. + +3.0.101 - 2nd February 2023 +- Fixed a minor issue with 'Show auction controls' ('Interface') which caused the 'Find Item' button to only show one page of results. +- Added flight times. There are now 7954 flight times in Leatrix Plus for Wrath of the Lich King Classic. + +3.0.100 - 30th January 2023 +- Updated 'Recent chat window' ('Chat') code and 'Show flight times' ('Interface') code. +- Added flight times. + +3.0.99 - 30th January 2023 +- Updated LibDBIcon. +- Added flight times. + +3.0.98 - 29th January 2023 +- Added flight times. + +3.0.97 - 28th January 2023 +- Added flight times. + +3.0.96 - 27th January 2023 +- Added flight times. + +3.0.95 - 26th January 2023 +- Added flight times. + +3.0.94 - 25th January 2023 +- Added flight times. + +3.0.93 - 24th January 2023 +- Added flight times. + +3.0.92 - 23rd January 2023 +- Added flight times. + +3.0.91 - 22nd January 2023 +- Added flight times. + +3.0.90 - 22nd January 2023 +- Updated the 'Login' setting code ('Mute game sounds') so that it works the same way as Dragonflight and Classic Era. +- Fixed a situational Lua error with 'Automate quests' ('Automation'). +- Added flight times. + +3.0.89 - 21st January 2023 +- Added flight times. + +3.0.88 - 20th January 2023 +- For 'Mute game sounds' ('System'), the 'Login' setting now mutes the login screen music too. +- Added flight times. + +3.0.87 - 19th January 2023 +- Fixed an issue with 'Resize quest text' ('Text') which caused gossip greeting panel scroll lists (such as city guard directions) to be shown outside of the gossip frame. If you use ElvUI, the 'Resize quest text' option will now be disabled if you have ElvUI Skins > Blizzard > Gossip Frame checked. +- Added flight times. + +3.0.86 - 19th January 2023 +- Fixed an issue with 'Enhance trainers' ('Interface') which may have caused the trainers frame to open alongside the gossip frame. +- Added flight times. + +3.0.85 - 19th January 2023 +- For 'Mute game sounds' ('System'), you can now mute login screen sounds. If checked, login screen sounds will be muted when you logout of the game. Note that login screen sounds will not be muted when you initially launch the game. They will only be muted when you logout of the game. This includes manually logging out as well as being forcefully logged out by the game server for reasons such as being away for an extended period of time. No more dragons roaring when you fall asleep while the game is running! +- Added flight times. + +3.0.84 - 18th January 2023 +- Added flight times. + +3.0.83 - 18th January 2023 +- Updated for game version 3.4.1. +- There are a lot of code changes in 3.4.1. +- Due to problems with Blizzard's slash command system in 3.4.1, the /ltp command has been replaced with /run leaplus(). If you wish to pass a parameter, enter it in quotes between the brackets. +- Added flight times. + +3.0.82 - 16th January 2023 +- Added flight times. + +3.0.81 - 14th January 2023 +- Added flight times. + +3.0.80 - 12th January 2023 +- Added flight times. + +3.0.79 - 11th January 2023 +- Added flight times. + +3.0.78 - 8th January 2023 +- Added a new option called 'Mute custom sounds' ('System'). You can enter sound file IDs (separated by comma) along with a brief note describing each ID in the configuration panel editbox. After that, click the Mute button and you will never hear the sounds again. For example, entering 'DevAura 569679, RetAura 568744' will mute both aura sounds. Read the help button tooltip for more details. +- For 'Show train all button' ('Interface'), the train all button now has a global name of LeaPlusGlobalTrainAllButton. +- Added flight times. +- PTR (3.4.1): Fixed the Lua error when logging into the PTR. + +3.0.77 - 4th January 2023 +- Added flight times. + +3.0.76 - 2nd January 2023 +- For 'Filter chat messages' ('Chat'), the 'Block spell links during combat' setting now also applies to the yell channel. +- Added flight times. + +3.0.75 - 31st December 2022 +- Added flight times. + +3.0.74 - 27th December 2022 +- Added flight times. + +3.0.73 - 24th December 2022 +- Added flight times. + +3.0.71 - 23rd December 2022 +- Added flight times. There are now 7393 flight times in Leatrix Plus for Wrath of the Lich King Classic. + +3.0.70 - 21st December 2022 +- Added flight times. + +3.0.69 - 19th December 2022 +- Added flight times. + +3.0.68 - 16th December 2022 +- Added flight times. + +3.0.67 - 13th December 2022 +- Added flight times. + +3.0.66 - 10th December 2022 +- Added flight times. + +3.0.65 - 8th December 2022 +- Added flight times. + +3.0.64 - 5th December 2022 +- Added flight times. + +3.0.63 - 2nd December 2022 +- Added flight times. + +3.0.62 - 30th November 2022 +- For 'Enhance minimap' ('Interface'), the 'Combine addon buttons' setting now supports the Armory addon. +- Added flight times. + +3.0.61 - 27th November 2022 +- 3.4.1: For 'Automate gossip' ('Automation'), replaced the (now removed) NPC types with NPC IDs. +- Added flight times. + +3.0.60 - 23rd November 2022 +- Updated for game version 3.4.1 (currently on the PTR). This is a major update as there are a lot of code changes in 3.4.1. +- These options have been updated for 3.4.1: Automate quests, Automate gossip, Sell junk automatically, Resize quest text, Resize mail text, Resize book text, Hide chat buttons, Restore chat messages and Show flight times. +- In 3.4.1, it's no longer possible to automatically skip gossip based on NPC type (such as banker or battlemaster). +- In 3.4.1, Blizzard's slash command system causes errors (just like retail) so /ltp has been replaced with /run leaplus() (just like retail). When Blizzard fixes their slash command system, the /ltp slash command will return. +- Added flight times. + +3.0.59 - 22nd November 2022 +- Updated 'Sell junk automatically' ('Automation') internal code. +- Fixed a rare and situational Lua error with 'Restore chat messages' ('Chat'). + +3.0.58 - 22nd November 2022 +- Added flight times. + +3.0.57 - 18th November 2022 +- Added flight times. + +3.0.56 - 16th November 2022 +- Fixed the profession frames. +- Added flight times. + +3.0.55 - 16th November 2022 +- Due to problems with Blizzard's code in Wrath of the Lich King Classic, the taller quest log setting (part of 'Enhance quest log') has been removed. +- Updated LibDBIcon, LibChatAnims and LibCandyBar. +- Added flight times. + +3.0.54 - 14th November 2022 +- Added flight times. + +3.0.53 - 10th November 2022 +- Added flight times. + +3.0.52 - 9th November 2022 +- Added flight times. + +3.0.51 - 7th November 2022 +- If you use the Glass addon, some chat settings will now be locked out of Leatrix Plus in order to ensure that the addon loads correctly. +- Added flight times. + +3.0.50 - 6th November 2022 +- For addon authors, the enhanced minimap combined button frame now has a global reference of LeaPlusGlobalMinimapCombinedButtonFrame. +- Added flight times. + +3.0.49 - 5th November 2022 +- Added flight times. + +3.0.48 - 2nd November 2022 +- Added flight times. + +3.0.47 - 31st October 2022 +- Added flight times. + +3.0.46 - 29th October 2022 +- Added flight times. + +3.0.45 - 28th October 2022 +- Added flight times. + +3.0.44 - 27th October 2022 +- Added flight times. + +3.0.43 - 26th October 2022 +- Added flight times. + +3.0.42 - 25th October 2022 +- Added flight times. + +3.0.41 - 24th October 2022 +- Added flight times. + +3.0.40 - 23rd October 2022 +- Added flight times. + +3.0.39 - 22nd October 2022 +- If you use 'Show flight times' ('Interface') with ElvUI, the flight progress bar will now use ElvUI style. +- Added flight times. + +3.0.38 - 21st October 2022 +- Having ElvUI installed will no longer uncheck conflicting option checkboxes. Conflicting option checkboxes will still be locked but they won't be unchecked. So if a conflicting option checkbox was checked before installing ElvUI or before enabling a conflicting ElvUI module, it will still be checked after disabling ElvUI or disabling the conflicting ElvUI module. +- Added flight times. + +3.0.37 - 20th October 2022 +- Added a new option 'Manage vehicle' ('Frames') which will allow you to move and scale the vehicle seat indicator frame. +- For 'Mute game sounds' ('System'), you can now mute broom mount sounds. +- Added flight times. + +3.0.36 - 19th October 2022 +- Added flight times. + +3.0.35 - 18th October 2022 +- Added flight times. + +3.0.34 - 17th October 2022 +- For 'Show flight times' text to speech, the speech volume will now be set to the game master volume slider and the option is now disabled by default. +- For 'Automate quests' ('Automation'), quests from Lillehoff (The Sons of Hodir Quartermaster, The Storm Peaks) will not be selected, accepted or turned-in automatically if you are exalted with Sons of Hodir. +- Added flight times. + +3.0.33 - 16th October 2022 +- For 'Show flight times', you can now have the remaining time spoken to you using text to speech. The time will be announced once a minute and at 30 seconds, 20 seconds and 10 seconds. This setting is enabled by default. +- Fixed a minor issue with LibCandyBar. +- Added flight times. + +3.0.32 - 15th October 2022 +- Fixed 'Use class colors in chat' ('Chat') for game version 3.4.0.46158. +- Added a flight time. + +3.0.31 - 15th October 2022 +- Added flight times. + +3.0.30 - 14th October 2022 +- Update for 'Enhance dressup' ('Interface') and ElvUI WrathArmory plugin. +- Added flight times. + +3.0.29 - 12th October 2022 +- Added flight times. + +3.0.28 - 11th October 2022 +- For 'Mute game sounds' ('System'), you can now make Netherdrakes quieter. +- Added flight times. +- Removed references to instance chat. + +3.0.27 - 10th October 2022 +- Added flight times. + +3.0.26 - 9th October 2022 +- For 'Sell junk automatically' ('Automation'), white items entered in the exclusions editbox will be sold automatically. Junk items entered in the editbox will not be sold automatically (as before). +- Added flight times. + +3.0.25 - 8th October 2022 +- Added flight times. + +3.0.24 - 7th October 2022 +- Fixed 'Mute travelers' so that it applies to Gnimo too. Gnimo sounds are shared with mechstrider wound sounds so now enabling either mute travelers or mute mechstriders will mute the mechstrider wound sounds. +- Added flight times. + +3.0.23 - 6th October 2022 +- For 'Mute game sounds' ('System'), you can now mute travelers, bikes and mechanical guild vaults. +- For 'Show minimap icon', some of the modified clicks have changed. Read the option tooltip for more details. +- The minimap button control-alt-click to toggle maximised windowed mode now runs much faster. +- Added flight times. + +3.0.22 - 5th October 2022 +- Added flight times. + +3.0.21 - 4th October 2022 +- Added flight times. + +3.0.20 - 3rd October 2022 +- Added flight times. + +3.0.19 - 2nd October 2022 +- Added flight times. + +3.0.18 - 2nd October 2022 +- Added flight times. + +3.0.17 - 1st October 2022 +- For 'Show flight times', you can now set the flight progress bar background to fill instead of drain. +- Added flight times. There are more addon releases at the moment to make sure that everyone gets the latest flight times that have been submitted by thousands of Leatrix Plus users since Wrath's release. Thank you everyone for your contributions. + +3.0.16 - 1st October 2022 +- If 'Automate gossip' ('Automation') is enabled, the gossip from the engineer auction house robots in Dalaran will be skipped. +- Added flight times. + +3.0.15 - 30th September 2022 +- Added flight times. + +3.0.14 - 30th September 2022 +- Changes to file structure. +- Added flight times. + +3.0.13 - 29th September 2022 +- Added lots and lots of flight times. There are now 4378 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.12 - 28th September 2022 +- Added lots and lots of flight times. There are now 4275 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.11 - 28th September 2022 +- Added lots and lots of flight times. There are now 4122 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.10 - 28th September 2022 +- For 'Automate gossip' ('Automation'), stable master gossip will now be skipped as long as there are no other gossip options. You can hold shift to prevent this. +- Added Wrath of the Lich King main title music (media > various > main titles). +- Added lots and lots of flight times. There are now 4003 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.09 - 27th September 2022 +- Added a new option 'Restore chat messages' ('Chat'). If enabled, you can reload your UI without losing your recent chat messages. +- Added a new option 'Block shared quests' ('Social'). If enabled, shared quests will be automatically declined unless the player sharing the quest is a friend. +- Added lots and lots of flight times. There are now 3845 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.08 - 21st September 2022 +- For 'Mute game sounds' ('System'), you can now mute the Arcanite Ripper guitar sound. +- For 'Manage buffs' ('Frames'), fixed an issue which caused buff icons to overlap each other at higher scale values. The scale slider will now affect the consolidated buff icon too. +- Added lots of flight times. There are now 3726 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.07 - 14th September 2022 +- For 'Enhance tooltip' ('Interface'), if you use the setting to hide tooltips for world units during combat, you can now specify whether holding shift should override that setting or not. Also some locale updates. +- For 'Show flight times' ('Interface'), the flight progress bar will no longer show if you are in combat when you attempt to take a flight. A few seconds into the flight, there is an additional check to make sure you are actually on the taxi. If you are not, the flight progress bar will be hidden. +- For 'Enhance quest log' ('Interface'), fixed a minor issue which quest list alignment. +- Added lots of flight times. There are now 3657 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.05 - 7th September 2022 +- For 'Enhance questlog', there is a new setting in the configuration panel to show a toggle headers button. It's enabled by default. The toggle headers button allows you to collapse and expand all quest headers in one click. +- Added lots of flight times. There are now 3590 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.04 - 4th September 2022 +- For 'Automate quests', Darkmoon Faire repeatable quests will now be automated for English game clients if you have the required materials in your bag. +- For 'Enhance minimap', fix for the square minimap mail icon overlapping the tracking icon. + +3.0.03 - 4th September 2022 +- For 'Enhance quest log', quest level and difficulty will now be shown in the quest detail pane once again for quests that are in your quest log. Added a new setting to show the quest difficulty in the quest log list. +- For 'Enhance professions', fix for intermittent horizontal bar showing in the professions frame. +- For 'Enhance minimap', fix for the heroic instance difficulty badge to not move with the minimap. +- Added lots of flight times. There are now 3572 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.02 - 31st August 2022 +- For 'Enhance quest log' ('Interface'), there is a new setting that lets you choose whether the quest log should be taller or not. +- Fix for 'Enhance minimap' calendar button #2. +- Added some flight times. There are now 3541 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.01 - 31st August 2022 +- Added a new option 'Manage durability' ('Frames'). If enabled, you can move and scale the armored man durability frame. +- Fixed an issue with 'Enhance minimap' missing calendar button. +- Fixed an issue with 'Enhance quest log' incorrect quest title. +- Added some flight times. There are now 3539 flight times stored in Leatrix Plus for Wrath Classic. + +3.0.00 - 29th August 2022 +- Welcome to Wrath of the Lich King! +- Removed BCC transitional code. +- Added a new option called 'Manage timer' ('Frames'). The 'Manage frames' option no longer includes the timer bar. +- For 'Enhance minimap' ('Interface'), added a new setting that will allow you to adjust the minimap cluster scale without it affecting the minimap scale. +- Removed the 'Hide the clock' setting (part of 'Enhance minimap') and the 'Show free bag slots' setting as they are now both included in the default UI (interface settings display menu). +- Tweaks to the ElvUI locks. +- Added a few flight times. There are now 3521 flight times stored in Leatrix Plus for Wrath Classic. + +2.5.120 - 24th August 2022 +- The 'Hide action button text' option ('Text') is now two options - 'Hide keybind text' and 'Hide macro text'. +- For 'Show flight times' ('Interface'), you can now control whether flight report windows are shown using a new setting in the configuration panel. +- If you use ElvUI, Leatrix Plus options which are not compatible with specific ElvUI modules will now be disabled and locked while those ElvUI modules are enabled. The option tooltip will tell you which ElvUI module is causing the Leatrix Plus option to be disabled. Disabling the relevant ElvUI module will make the Leatrix Plus setting available again. +- Fixed a minor issue with 'Show Wowhead links' ('Interface') and Questie which sometimes caused the quest link to not be updated. +- Wrath: For 'Enhance quest log' ('Interface'), quest levels are now shown in the quest details pane in addition to the quest list. +- Added lots and lots of flight times. There are now 3515 flight times stored in Leatrix Plus for BCC and Wrath Classic. + +2.5.119 - 17th August 2022 +- Wrath: Added a new option 'Hide alerts' ('Frames'). If checked, alert frames will not be shown. When you earn an achievement, a message will be shown in chat instead (just like retail). +- Wrath: Added Northrend zone and dungeon music to the media section. Most of the dungeon tracks are sound kits. +- Wrath: For 'Accept resurrection' ('Automation'), you will not accept a resurrection request automatically if you are in the Thaddius fight (Naxxramas) and someone in your group has a positive or negative charge. +- For 'Show flight times' ('Interface'), the flight progress bar will now always hide when you land. The flight report window will now show if the minimum time difference between the saved flight time and the actual flight time is 15 seconds (up from 5). +- Fixed a minor issue with 'Show cooldowns' ('Interface') which caused buff spell IDs to show in debuff tooltips. +- Added a massive number of flight times. There are now 3476 flight times stored in Leatrix Plus for BCC and Wrath Classic. + +2.5.118 - 10th August 2022 +- Updated for Wrath of the Lich King Beta. +- Wrath: Show Wowhead links (Interface) will now show achievement links as well as quest links. +- Wrath: Show druid power bar is disabled since it's now included in the default UI. +- If you use 'Automate quests' ('Automation') with a Mac, you can now assign the override key to be the command key if you wish. +- Added a massive number of flight times. There are now 2959 flight times stored in Leatrix Plus for BCC and Wrath Classic. +- For Wrath, it's best to use alpha releases during Wrath Beta/prepatch so that you get the latest development updates. To switch to alpha releases, open CurseForge App, right-click Leatrix Plus in your Wrath addon listing and change release type to Alpha. You can change it back to Release once Wrath is live for everyone. + +2.5.117 - 3rd August 2022 +- Added lots of flight times. There are now 2551 flight times stored in Leatrix Plus for BCC. +- Leatrix Plus will be updated for Wrath Classic in August 2022. + +2.5.116 - 27th July 2022 +- For 'Enhance minimap', added a new setting to hide the tracking button while the pointer is not over the minimap. The clock and zone text bar will now be shown on top when using square minimap. Some structural changes to the code. +- Added lots of flight times. There are now 2530 flight times stored in Leatrix Plus for BCC. +- Leatrix Plus will now attempt to run on Wrath Beta but note that it hasn't been tested and there are no Wrath features yet. + +2.5.115 - 20th July 2022 +- Removed the compatibility fix for ClassicCodex addon. +- Added lots of flight times. There are now 2507 flight times stored in Leatrix Plus for BCC. + +2.5.114 - 13th July 2022 +- For 'Enhance tooltip' ('Interface'), there is a new setting to hide the health bar. It's disabled by default. +- Added lots of flight times. There are now 2492 flight times stored in Leatrix Plus for BCC. + +2.5.113 - 6th July 2022 +- Added lots of flight times. There are now 2473 flight times stored in Leatrix Plus for BCC. + +2.5.112 - 29th June 2022 +- In the game key bindings menu, you can now set a keybind to announce rares in chat. Target a creature, press your keybind and detals of your target will be shown in the General chat channel. These details include your target's name, health percentage remaining and coordinates. +- Added lots of flight times. There are now 2455 flight times stored in Leatrix Plus for BCC. + +2.5.111 - 22nd June 2022 +- In the game key bindings menu, you can now set a keybind to show a web link for whatever your pointer is over (as long as it has a tooltip). For example, if you have an item in your bag and you don't know what it's for, hover your pointer over it so the item tooltip shows up then press your defined hotkey. A Wowhead link will show in a copy-friendly window. Press CTRL/C to copy the link then paste it into your browser. +- In the game key bindings menu, you can now set a keybind to toggle Leatrix Plus. The 'Enable hotkey' command has been removed. +- The '/ltp id' command now runs the web link keybind function so if you don't want to set a keybind, you can enter '/ltp id' instead. +- Added lots of flight times. There are now 2431 flight times stored in Leatrix Plus for BCC. + +2.5.110 - 15th June 2022 +- The 'Manage frames', 'Manage buffs', 'Manage widget' and 'Manage focus' settings ('Frames') now show a frame alignment grid when moving the frames (there is a button in each configuration panel to toggle the grid). You can now drag the frames with the left button to position them freely or with the right button to position them using snap-to-grid. +- Added lots of flight times. There are now 2416 flight times stored in Leatrix Plus for BCC. + +2.5.109 - 8th June 2022 +- For 'Show flight times', you can now change the position, scale and width of the flight progress bar using a new configuration panel. You can also remove the progress bar background and destination text if you wish. The flight progress bar is now noninteractive so you can click through it as if it isn't there. If you wish to manually close the flight progress bar, there is a new Close Bar button in the configuration panel. These new settings give you a lot of customisation options. For example, if you set the width to the minimum, hide the background and hide the destination, you can have a neat little flight timer in the corner of the screen. +- Added lots of flight times. There are now 2402 flight times stored in Leatrix Plus for BCC. + +2.5.108 - 1st June 2022 +- For 'Enhance trainers' ('Interface'), you can now disable the train all skills button if you wish using a new setting in the configuration panel. +- For 'Mute game sounds' ('System'), the 'Mechstriders' setting will no longer mute mechanostrider footstep sounds. There is a new setting called 'Mechsteps' that will mute footstep sounds for mechanical mounts. +- Added lots of flight times. There are now 2383 flight times stored in Leatrix Plus for BCC. + +2.5.107 - 25th May 2022 +- Added a new option 'Show ready timer' ('Interface'). If checked, a timer will be shown under the PvP encounter ready frame so that you know how long you have left to click the enter button. +- Added lots of flight times. There are now 2359 flight times stored in Leatrix Plus for BCC. + +2.5.106 - 18th May 2022 +- For 'Enhance quest log' ('Interface'), the quest log is now taller. +- For 'Enhance professions' ('Interface'), the professions frame is now taller. +- For 'Enhance trainers' ('Interface'), the skill trainer frame is now taller. Also fixed a cosmetic bug with the position of the beast training cost column. +- If you are using ElvUI, 'Show Wowhead links' ('Interface') will now place links inside the quest log frame rather than above it. For 'Enhance professions', the search box and 'Have materials' checkbox have been repositioned. +- Added some flight times. There are now 2340 flight times stored in Leatrix Plus for BCC. + +2.5.105 - 12th May 2022 +- Corrected a very popular flight route and added flight times. There are now 2329 flight times stored in Leatrix Plus for BCC. + +2.5.104 - 12th May 2022 +- For 'Sell junk automatically' ('Automation'), you can now exclude specific junk items from being sold. There is an exclusion list in the configuration panel where you can enter your own item IDs (separated by commas). Item IDs will be shown in item tooltips while the configuration panel is showing. +- If you try to use 'Enhance minimap' ('Interface') and ElvUI Minimap together, you will now be asked which one you want to use on startup. Choosing Leatrix Plus will disable ElvUI's minimap module. Choosing ElvUI will disable Leatrix Plus 'Enhance minimap' setting. +- Added flight times. There are now 2326 flight times stored in Leatrix Plus for BCC. + +2.5.103 - 5th May 2022 +- Added lots of flight times. There are now 2314 flight times stored in Leatrix Plus for BCC. + +2.5.102 - 27th April 2022 +- Added lots of flight times. There are now 2295 flight times stored in Leatrix Plus for BCC. + +2.5.101 - 20th April 2022 +- Added lots of flight times. There are now 2265 flight times stored in Leatrix Plus for BCC. + +2.5.100 - 13th April 2022 +- For 'Enhance minimap' ('Interface'), if you use 'Hide addon buttons' or 'Combine addon buttons' but you want some buttons to remain visible around the minimap, you can now do so using a new 'Buttons' editor in the configuration panel. Just follow the directions in the Help button. The 'Exclude BugSack' setting has been removed since you can now add BugSack to the 'Buttons' panel to achieve the same result. +- Added lots of flight times. There are now 2180 flight times stored in Leatrix Plus for BCC. + +2.5.99 - 6th April 2022 +- Fixed an issue with 'Show bag search box' ('Interface') which caused a Lua error after opening a guild bank. +- Added flight times. There are now 2105 flight times stored in Leatrix Plus for BCC. + +2.5.98 - 6th April 2022 +- The 'Enhance dressup' option now shows a toggle stats button in the character frame. You can either click this button or middle-click the character frame to toggle stats. For new Leatrix Plus users, stats are now shown by default. +- Added lots of flight times. There are now 2102 flight times stored in Leatrix Plus for BCC. + +2.5.97 - 30th March 2022 +- If 'Enhance trainers' ('Interface') is enabled, a 'Train All' button will now be shown in the skill trainer frame allowing you to train all available skills in one click. +- Added a compatibility fix for 'Enhance professions' when using the 'Classic Profession Filter' addon so that you can see the search box in the craft frame (used for enchanting). +- Added lots of flight times. There are now 2075 flight times stored in Leatrix Plus for BCC. + +2.5.96 - 25th March 2022 +- Fixed an issue with 'Enhance professions' ('Interface') which caused the new search box to be obscured. +- Added lots of flight times. There are now 2051 flight times stored in Leatrix Plus for BCC. + +2.5.95 - 23rd March 2022 +- Updated for game version 2.5.4. +- Added lots of flight times. There are now 2035 flight times stored in Leatrix Plus for BCC. +- Updated the '/ltp ra' rare announcement message. +- For 'Enhance tooltip', removed the setting to show tooltip backdrops in faction color. + +2.5.94 - 9th March 2022 +- Added lots of flight times. There are now 1994 flight times stored in Leatrix Plus for BCC. + +2.5.93 - 2nd March 2022 +- Added lots of flight times. There are now 1980 flight times stored in Leatrix Plus for BCC. + +2.5.92 - 23rd February 2022 +- Added lots of flight times. There are now 1971 flight times stored in Leatrix Plus for BCC. + +2.5.91 - 16th February 2022 +- For 'Enhance minimap' ('Interface'), added a new setting 'Show who pinged'. It's enabled by default. Note that this does not apply to your own pings. +- For 'Mute game sounds' ('System'), added 'A'dal'. This will mute A'dal in Shattrath City. +- Added lots of flight times. There are now 1952 flight times stored in Leatrix Plus for BCC. + +2.5.90 - 9th February 2022 +- Added lots of flight times. There are now 1932 flight times stored in Leatrix Plus for BCC. +- Added 'Screech' to 'Mute game sounds' ('System'). This is a spell used by some flying pets. +- Added 'Striders' to 'Mute game sounds' ('System'). This will mute mechanostrider mounts. + +2.5.89 - 3rd February 2022 +- Added lots of flight times. There are now 1908 flight times stored in Leatrix Plus for BCC. + +2.5.88 - 26th January 2022 +- If 'Automate quests' ('Automation') is enabled, you can now set the override key to be shift, alt or control. Repeatable battlemaster and cloth quartermaster quests no longer require the alt key to be held. +- For 'Mute game sounds' ('System'), the 'Chimes' setting will now mute the Ironforge hourly horn sound. +- Added lots of flight times. Keep reporting. Every little helps. There are now 1868 flight times stored in Leatrix Plus for BCC. +- If you use ItemRack alongside 'Enhance minimap' with 'Combine addon buttons' enabled, the ItemRack minimap button flyout menu will remain visible as long as the mouse pointer is over it. + +2.5.87 - 19th January 2022 +- Fixed the textures for 'Enhance professions' ('Interface'). + +2.5.86 - 19th January 2022 +- Updated for game version 2.5.3. +- Added lots more flight times. Keep reporting until there's none left to report. Some minor tweaks to flight point tooltips. +- The 'Faster auto loot' option ('System') will now work with TSM Destroy. You no longer need to disable faster auto loot when using TSM Destroy. + +2.5.85 - 13th January 2022 +- Added lots of flight times. Keep reporting. + +2.5.84 - 9th January 2022 +- For 'Show flight times' ('Interface'), added support for odd flight points (such as Altar of Sha'tar). + +2.5.83 - 9th January 2022 +- The 'Show flight times' option ('Interface') now supports multiple flight routes to the same destination. So it will work regardless of how many flight points you have unlocked. Due to the code changes to include multiple routes, some of the submitted flight times could not be added. Please report them again when you see the report window again. + +2.5.82 - 5th January 2022 +- The 'Show flight times' option ('Interface') now works with any locale without the need for translations. Added lots of missing flight times. After landing from a flight, if the saved flight time is missing or incorrect (greater than 5 second difference), you will see a copy-friendly window with the flight details making it very easy for you to report the missing or incorrect flight time. + +2.5.81 - 29th December 2021 +- You need to restart your game client after installing this update. +- Added a new setting 'Show flight times' ('Interface'). If enabled, a flight time progress bar will be shown when you take a flight and travel times will be shown in the flight point tooltips (note: only for flight times that Leatrix Plus is aware of). For the time being, all flight times (whether known or not) will be printed in chat when you land so that you can report inaccurate or missing flight times (there are some of both). If a flight ends before or after the progress bar has reached zero, report the flight time printed in chat and the times will be updated. You can report at github.com/leatrix or you can send a message to leatrix on CurseForge. If you're using the 'Recent chat window' setting ('Chat'), you can use that to copy the text from chat for your report. For non-English locales, the progress bar and flight times will only be shown if the start and end flight point names have been translated. If you want to help with translations to solve that issue, send a message to leatrix on CurseForge. + +2.5.80 - 22nd December 2021 +- If 'Combine addon buttons' ('Enhance minimap)' is enabled, addon button tooltips will no longer show together with game tooltips. Non-standard buttons are now always replaced with LibDBIcon buttons so the 'Replace non-standard buttons' setting has been removed. In addition, non-standard buttons will (for now) be described as such in the button tooltips. You can now set the cluster scale again (note that adjusting the cluster scale has side effects so read the setting tooltip). Method Raid Tools now has a standard LibDBIcon (though it's based on the original, custom icon). If you come across any addons that aren't given a standard icon, please let me know. + +2.5.79 - 18th December 2021 +- If 'Combine addon buttons' ('Enhance minimap)' is enabled, addon button tooltips will now be shown under the minimap so as not to clutter the button frame. This should work with most addon buttons. Fixed a potential issue with addons using non-standard buttons that may have been caused Leatrix Plus not to load correctly. + +2.5.78 - 17th December 2021 +- Fixed a situational issue with 'Replace non-standard buttons' for 'Enhance minimap' ('Interface') creating unintended minimap buttons. + +2.5.75 - 16th December 2021 +- Added a new option 'Filter chat messages' ('Chat'). If enabled, you can block spell links in combat (useful for blocking spell interrupt spam), drunken spam (if it doesn't apply to your character) and duel victory and retreat spam (if you didn't take part in the duel). +- Added a new slider setting to 'Enhance minimap' ('Interface') called 'Square size' which allows you to adjust the square minimap size (up to 400%). While the scale slider makes the minimap and all the elements bigger, the size slider makes the minimap bigger but keeps all the elements the same size. If you are using the square minimap, you can use either the scale slider or the size slider or a combination of the two. The configuration panel reset button will not reset settings that require a UI reload. Added a new setting called 'Replace non-standard buttons'. Most addons use the standard LibDBIcon library for their minimap buttons but a few addons use non-standard buttons instead. The new setting will replace any non-standard buttons with LibDBIcon buttons. This will solve the problems with non-standard buttons such as not hiding automatically, not following the minimap shape and not being placed in the button frame. Added a new setting called 'Exclude BugSack' which will keep the BugSack addon minimap button visible if you have BugSack installed and the minimap button enabled. +- Updated the tooltips for 'Manage frames' and 'Manage focus' ('Frames'). + +2.5.74 - 9th December 2021 +- Fixed a few default UI minimap button locations for 'Enhance minimap' ('Interface') when using the square minimap. + +2.5.73 - 8th December 2021 +- Added some new settings to 'Enhance minimap' ('Interface'). 'Square minimap' changes the minimap shape to a square. 'Hide addon buttons' hides addon buttons automatically while the pointer is not over the minimap. 'Combine addon buttons' combines all addon buttons into a single frame which you can toggle by right-clicking the minimap (cannot be used with 'Hide addon buttons'). You can always drag the minimap now while holding the alt key so the 'Unlock map frame' setting has been removed. The maximum minimap scale is now 400% (was 200%). +- If 'Automate gossip' ('Automation') is enabled, battlemaster gossip will now be automatically selected and the battleground name will be shown at the top of the battlefield instance window. +- Fixed a minor issue with 'Enhance professions' ('Interface') which caused the craft frame filter dropdown menu to not be positioned correctly. Also fixed a minor issue with the default UI which caused beast training points to show in profession frames (this bug is not caused by addons). + +2.5.72 - 2nd December 2021 +- If 'Enhance minimap' is enabled, you can toggle the zone text bar once again using a setting in the configuration panel. Added a new setting to toggle the world map button. + +2.5.71 - 2nd December 2021 +- To address issues with minimap cluster scaling (which have been present for a long time), the 'Scale entire cluster' setting has been removed. Also fixed a minor issue causing the minimap toggle button to be visible. + +2.5.70 - 1st December 2021 +- The 'Enhance minimap' option ('Interface') has two new settings. The first is 'Unlock minimap'. If enabled, you can hold alt and drag the minimap to move it. The second is 'Scale entire cluster'. If checked, the scale slider will apply to the entire minimap cluster. If unchecked, the scale slider will only apply to the minimap. The zone text bar is now always hidden. +- The 'Show Wowhead links' option ('Interface') now has a configuration panel allowing you to choose whether links should go directly to the comments section. +- The 'Recent chat window' option ('Chat') will now use the same font and size as the chat window. Fixed an issue which sometimes caused the recent chat window font size to be smaller than intended. +- Fixed a minor issue with 'Automate quests' ('Automation') which caused Mark of Sargeras and Sunfury Signet reputation turn-ins to not be automated if you only had one of either item in your bags. + +2.5.68 - 17th November 2021 +- Added an animation slider setting to 'Enhance dressup' ('Interface'). +- Added a configuration panel for 'Accept resurrection' ('Automation') so you can choose whether combat resurrection should be excluded. +- Added a 'Guild' setting to the 'Social' page which allows you to choose whether the 'Social' page options should apply to guild members or not (previously, 'Social' page options always applied to guild members). +- Added 'Yawns' to 'Mute game sounds' ('System'). If checked, yawns from hunter pet cats will be muted. + +2.5.67 - 10th November 2021 +- Added a new setting to 'Enhance dressup' ('Interface') which adds item buttons to the dressing room. Added a 'Show me' button and a button to toggle the new item buttons. The 'Remove tabard' button is now part of the new item buttons. +- Added a new option 'Hide action button text' ('Text'). If enabled, macro and keybind text will not be shown on action buttons. + +2.5.66 - 4th November 2021 +- Added a new option 'More font sizes' ('Chat'). If enabled, additional font sizes will be available in the chat frame font size menu. + +2.5.64 - 29th October 2021 +- Replaced packager to fix CurseForge App issue. + +2.5.62 - 28th October 2021 +- The 'Enhance dressup' option ('Interface') now shows a 'Show target model' button in the dressup window. Requires a player target. The nude and tabard buttons will apply whichever model is showing. Transformations such as shapeshift and appearance change will be removed. The 'Reset' button will set the model back to your character. Dressup window buttons are now much smaller and have tooltips. +- The 'Enhance quest log' option now has a setting to toggle showing quest levels. +- The 'Sell junk automatically' option now has a setting to toggle the vendor summary in chat. +- The 'Repair automatically' option now has a setting to toggle the repair summary in chat. +- Fixed a minor issue with 'Recent chat window' ('Chat') which caused the title bar text to overlap the message count for some locales. +- Fixed a few locale issues with invalid translations. + +2.5.61 - 21st October 2021 +- Added 'Chimes' to 'Mute game sounds' ('System'). If enabled, clock hourly chimes will be muted. +- The 'Enhance tooltip' option ('Interface') now scales Total RP 3 tooltips. + +2.5.59 - 13th October 2021 +- Added a new option called 'Show druid power bar' ('Interface'). If enabled, a druid power bar will be shown in the player frame while you are playing as a shapeshifted druid. +- The 'Dismount me' option ('System') will now work with Shaman Ghost Wolf. Added a new setting to show an unshift buton on the flight map when playing as a shapeshifted druid or shaman. The setting to dismount when selecting a flight destination has been removed as that functionality is now built into the game. +- The 'Release in PvP' option ('Automation') now has a configuration panel that lets you exclude Alterac Valley. You can also set a delay timer before you are automatically released. You can hold shift as the timer is ending to cancel automatic release. + +2.5.58 - 29th September 2021 +- Quests from Soridormi and Arazmodu (The Scale of the Sands, Caverns of Time) will no longer be selected, accepted or turned-in automatically. + +2.5.55 - 16th September 2021 +- Updated for World of Warcraft patch 2.5.2. +- Added guild bank support for 'Repair automatically ('Automation'). + +2.5.53 - 19th August 2021 +- Fixed issue caused by malformed translations. + +2.5.48 - 5th August 2021 +- Added 'Gyrocopters' to 'Mute game sounds' ('System'). This includes the engineering flying machine mounts. + +2.5.47 - 22nd July 2021 +- Improved quest automation for Aldor/Scryer repeatable reputation quests in Shattrath. + +2.5.44 - 30th June 2021 +- Updated Classic Profession Filter addon compatibility fixes for 'Enhance professions' ('Interface') to support the latest version. If you use Classic Profession Filter addon, you need to update it. + +2.5.43 - 24th June 2021 +- Fixed a situational issue with 'Faster auto loot' ('System') which caused the loot window to sometimes remain open if you are in a group using free for all loot with multiple group members looting the same corpse at the same time. +- Updated the tooltip for 'Invite from whispers' ('Social') to highlight that an invite will not sent in response a Battle.net message if the invite recipient is showing offline. + +2.5.42 - 16th June 2021 +- Added a new setting to 'Enhance tooltip' ('Interface') which allows you to see guild ranks for players who are not in your guild. It's disabled by default. +- Fixed a compatibility issue with 'Enhance professions' and 'Classic profession filter' addon. +- Removed the 'Class icon portraits' option ('Frames') due to performance issues. There are standalone addons available for this feature if you need it. + +2.5.41 - 9th June 2021 +- Added a note about framerate to the 'Class icon portraits' ('Frames') tooltip. + +2.5.39 - 6th June 2021 +- For 'Automate quests' ('Automation'), quests from Archmage Leryda (The Violet Eye) will no longer be selected, accepted or turned-in automatically. +- Updated translations. + +2.5.38 - 2nd June 2021 +- For 'Automate quests' ('Automation'), quests from BCC escort quest givers will not be accepted automatically. This applies to Ranger Lilatha (Escape from the Catacombs), Anchorite Truuen (Tomb of the Lightbringer), Magwin (A Cry For Help), Fhwoor (Fhwoor Smash!), Kayra Longmane (Escape from Umbrafen), Mag'har Captive (The Totem of Kar'dash, Horde), Kurenai Captive (The Totem of Kar'dash, Alliance), Isla Starmane (Escape from Firewing Point!), Maxx A. Million Mk. V (Mark V is Alive!), Cryo-Engineer Sha'heen (Someone Else's Hard Work Pays Off), Drijya (Sabotage the Warp-Gate!), Bessy (When the Cows Come Home), Image of Commander Ameer (Delivering the Message), Captured Protectorate Vanguard (Escape from the Staging Grounds), Earthmender Wilda (Escape from Coilskar Cistern), Skywing (Skywing), Chief Archaeologist Letoll (Digging Through Bones) and Skyguard Prisoner (Escape from Skettis). Many thanks to drejjmit for supplying the list. +- The 'Manage widget' configuration panel will now show a warning if Titan Panel is preventing the widget frame position from saving correctly.. +- The 'Dismount automatically' option ('System') is now called 'Dismount me'. It now has a configuration panel so you can set which dismount rules you want to use including a new setting that dismounts you when you instruct a flight master to open the flight map. + +2.5.37 - 26th May 2021 +- The 'Dismount automatically' option ('System') will no longer dismount you if you are out of range of your target. + +2.5.33 - 21st May 2021 +- The 'Stand and dismount' option is now called 'Dismount automatically'. Most of what it did before is now included in the game. So now, the option will dismount you when you select a flight location or when you attempt to cast a spell regardless of whether you have enough resource to cast or whether the target is in range. +- Fixed an issue with 'Recent chat window' which caused a Lua error when attempting to show Battle.net messages. +- The 'Remove raid restrictions' option has been removed since it's not needed for Burning Crusade Classic. + +2.5.32 - 17th May 2021 +- Welcome to Burning Crusade Classic. +- Leatrix Plus for Burning Crusade Classic is based on Leatrix Plus for World of Warcraft Classic with the changes listed below. +- Added 'Manage focus' ('Frames'), 'Mute game sounds' ('System') and 'Remove raid restrictions' ('System'). +- Added Burning Crusade zones, dungeons, titles, credits, narration tracks and movies to 'Media'. +- The 'Enhance dressup' option ('Interface') now adds pan (right-button), zoom (mousewheel) and toggle attributes (middle-click) functionality to the character frame, dressup frame and inspect frame. +- The 'Class colored frames' option ('Frames') now colors the focus frame too. +- Thanks to Blizzard for the day one beta access allowing me to bring Leatrix addons to the BCC community. diff --git a/Leatrix_Plus - b4 setvertexcolor.lua b/Leatrix_Plus - b4 setvertexcolor.lua new file mode 100644 index 0000000..dbe7532 --- /dev/null +++ b/Leatrix_Plus - b4 setvertexcolor.lua @@ -0,0 +1,16007 @@ +---------------------------------------------------------------------- +-- Leatrix Plus 3.0.131 (10th May 2023) +---------------------------------------------------------------------- + +-- 01:Functns, 02:Locks, 03:Restart, 20:Live, 30:Isolated, 40:Player +-- 50:RunOnce, 60:Evnts, 62:Profile, 70:Lgot, 80:Commands, 90:Panel + +---------------------------------------------------------------------- +-- Leatrix Plus +---------------------------------------------------------------------- + + LibCompat = LibStub:GetLibrary("LibCompat-1.0") + -- Create global table + _G.LeaPlusDB = _G.LeaPlusDB or {} + + -- Create locals + local LeaPlusLC, LeaPlusCB, LeaDropList, LeaConfigList, LeaLockList = {}, {}, {}, {}, {} + local ClientVersion = GetBuildInfo() + local GameLocale = GetLocale() + local void + + -- Version + LeaPlusLC["AddonVer"] = "3.0.131" + + -- Get locale table + local void, Leatrix_Plus = ... + local L = Leatrix_Plus.L + + -- Check Wow version is valid + do + local gameversion, gamebuild, gamedate, gametocversion = GetBuildInfo() + if gametocversion and gametocversion < 30000 or gametocversion > 39999 then + -- Game client is not Wow Classic + LibCompat.After(2, function() + print(L["LEATRIX PLUS: WRONG VERSION INSTALLED!"]) + end) + return + end + end + + -- Check for addons + if IsAddOnLoaded("ElvUI") then LeaPlusLC.ElvUI = unpack(ElvUI) end + if IsAddOnLoaded("Glass") then LeaPlusLC.Glass = true end + +---------------------------------------------------------------------- +-- L00: Leatrix Plus +---------------------------------------------------------------------- + + -- Initialise variables + LeaPlusLC["ShowErrorsFlag"] = 1 + LeaPlusLC["NumberOfPages"] = 9 + LeaPlusLC["RaidColors"] = RAID_CLASS_COLORS + + -- Create event frame + local LpEvt = CreateFrame("FRAME") + LpEvt:RegisterEvent("ADDON_LOADED") + LpEvt:RegisterEvent("PLAYER_LOGIN") + LpEvt:RegisterEvent("PLAYER_ENTERING_WORLD") + + -- Set bindings translations + _G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_TOGGLE = L["Toggle panel"] + _G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_WEBLINK = L["Show web link"] + _G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_RARE = L["Announce rare"] + + -- Slash command taint + -- Enter combat, enter any addon slash command, open quest log with L, toggle tracking on a quest 4 times, + -- click the tracked quest in the objective tracker, taint and objective tracker no longer functions + +---------------------------------------------------------------------- +-- L01: Functions +---------------------------------------------------------------------- + + -- Print text + function LeaPlusLC:Print(text) + DEFAULT_CHAT_FRAME:AddMessage(L[text], 1.0, 0.85, 0.0) + end + + -- Lock and unlock an item + function LeaPlusLC:LockItem(item, lock) + if lock then + item:Disable() + item:SetAlpha(0.3) + else + item:Enable() + item:SetAlpha(1.0) + end + end + + -- Hide configuration panels + function LeaPlusLC:HideConfigPanels() + for k, v in pairs(LeaConfigList) do + v:Hide() + end + end + + -- Decline a shared quest if needed + function LeaPlusLC:CheckIfQuestIsSharedAndShouldBeDeclined() + if LeaPlusLC["NoSharedQuests"] == "On" then + local npcName = UnitName("questnpc") + if npcName then + if UnitInParty(npcName) or UnitInRaid(npcName) then + if not LeaPlusLC:FriendCheck(npcName) then + DeclineQuest() + return + end + end + end + end + end + + -- Show a single line prefilled editbox with copy functionality + function LeaPlusLC:ShowSystemEditBox(word, focuschat) + if not LeaPlusLC.FactoryEditBox then + -- Create frame for first time + local eFrame = CreateFrame("FRAME", nil, UIParent) + LeaPlusLC.FactoryEditBox = eFrame + eFrame:SetSize(700, 110) + eFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 150) + eFrame:SetFrameStrata("FULLSCREEN_DIALOG") + eFrame:SetFrameLevel(5000) + eFrame:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + eFrame:Hide() + end + end) + -- Add background color + eFrame.t = eFrame:CreateTexture(nil, "BACKGROUND") + eFrame.t:SetAllPoints() + -- eFrame.t:SetColorTexture(0.05, 0.05, 0.05, 0.9) + -- Add copy title + eFrame.f = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.f:SetPoint("TOPLEFT", x, y) + eFrame.f:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 12, -52) + eFrame.f:SetWidth(676) + eFrame.f:SetJustifyH("LEFT") + eFrame.f:SetWordWrap(false) + -- Add copy label + eFrame.c = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.c:SetPoint("TOPLEFT", x, y) + eFrame.c:SetText(L["Press CTRL/C to copy"]) + eFrame.c:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 12, -82) + -- Add feedback label + eFrame.x = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.x:SetPoint("TOPRIGHT", x, y) + eFrame.x:SetText(L["feedback@leatrix.com"]) + eFrame.x:SetPoint("TOPRIGHT", eFrame, "TOPRIGHT", -12, -52) + hooksecurefunc(eFrame.f, "SetText", function() + eFrame.f:SetWidth(676 - eFrame.x:GetStringWidth() - 26) + end) + -- Add cancel label + eFrame.x = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.x:SetPoint("TOPRIGHT", x, y) + eFrame.x:SetText(L["Right-click to close"]) + eFrame.x:SetPoint("TOPRIGHT", eFrame, "TOPRIGHT", -12, -82) + -- Create editbox + eFrame.b = CreateFrame("EditBox", nil, eFrame, "InputBoxTemplate") + eFrame.b:ClearAllPoints() + eFrame.b:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 16, -12) + eFrame.b:SetSize(672, 24) + eFrame.b:SetFontObject("GameFontNormalLarge") + eFrame.b:SetTextColor(1.0, 1.0, 1.0, 1) + eFrame.b:SetBlinkSpeed(0) + eFrame.b:SetHitRectInsets(99, 99, 99, 99) + eFrame.b:SetAutoFocus(true) + eFrame.b:SetAltArrowKeyMode(true) + -- Editbox texture + eFrame.t = CreateFrame("FRAME", nil, eFrame.b) + eFrame.t:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = false, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }}) + eFrame.t:SetPoint("LEFT", -6, 0) + eFrame.t:SetWidth(eFrame.b:GetWidth() + 6) + eFrame.t:SetHeight(eFrame.b:GetHeight()) + eFrame.t:SetBackdropColor(1.0, 1.0, 1.0, 0.3) + -- Handler + eFrame.b:SetScript("OnKeyDown", function(void, key) + if key == "C" and IsControlKeyDown() then + LibCompat.After(0.1, function() + eFrame:Hide() + ActionStatus_DisplayMessage(L["Copied to clipboard."], true) + if LeaPlusLC.FactoryEditBoxFocusChat then + local eBox = ChatEdit_ChooseBoxForSend() + ChatEdit_ActivateChat(eBox) + end + end) + end + end) + -- Prevent changes + eFrame.b:SetScript("OnEscapePressed", function() eFrame:Hide() end) + eFrame.b:SetScript("OnEnterPressed", eFrame.b.HighlightText) + eFrame.b:SetScript("OnMouseDown", eFrame.b.ClearFocus) + eFrame.b:SetScript("OnMouseUp", eFrame.b.HighlightText) + eFrame.b:SetFocus(true) + eFrame.b:HighlightText() + eFrame:Show() + end + if focuschat then LeaPlusLC.FactoryEditBoxFocusChat = true else LeaPlusLC.FactoryEditBoxFocusChat = nil end + LeaPlusLC.FactoryEditBox:Show() + LeaPlusLC.FactoryEditBox.b:SetText(word) + LeaPlusLC.FactoryEditBox.b:HighlightText() + LeaPlusLC.FactoryEditBox.b:SetScript("OnChar", function() LeaPlusLC.FactoryEditBox.b:SetFocus(true) LeaPlusLC.FactoryEditBox.b:SetText(word) LeaPlusLC.FactoryEditBox.b:HighlightText() end) + LeaPlusLC.FactoryEditBox.b:SetScript("OnKeyUp", function() LeaPlusLC.FactoryEditBox.b:SetFocus(true) LeaPlusLC.FactoryEditBox.b:SetText(word) LeaPlusLC.FactoryEditBox.b:HighlightText() end) + end + + -- Load a string variable or set it to default if it's not set to "On" or "Off" + function LeaPlusLC:LoadVarChk(var, def) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" and LeaPlusDB[var] == "On" or LeaPlusDB[var] == "Off" then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Load a numeric variable and set it to default if it's not within a given range + function LeaPlusLC:LoadVarNum(var, def, valmin, valmax) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "number" and LeaPlusDB[var] >= valmin and LeaPlusDB[var] <= valmax then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Load an anchor point variable and set it to default if the anchor point is invalid + function LeaPlusLC:LoadVarAnc(var, def) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" and LeaPlusDB[var] == "CENTER" or LeaPlusDB[var] == "TOP" or LeaPlusDB[var] == "BOTTOM" or LeaPlusDB[var] == "LEFT" or LeaPlusDB[var] == "RIGHT" or LeaPlusDB[var] == "TOPLEFT" or LeaPlusDB[var] == "TOPRIGHT" or LeaPlusDB[var] == "BOTTOMLEFT" or LeaPlusDB[var] == "BOTTOMRIGHT" then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Load a string variable and set it to default if it is not a string (used with minimap exclude list) + function LeaPlusLC:LoadVarStr(var, def) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Show tooltips for checkboxes + function LeaPlusLC:TipSee() + GameTooltip:SetOwner(self, "ANCHOR_NONE") + local parent = self:GetParent() + local pscale = parent:GetEffectiveScale() + local gscale = UIParent:GetEffectiveScale() + local tscale = GameTooltip:GetEffectiveScale() + local gap = ((UIParent:GetRight() * gscale) - (parent:GetRight() * pscale)) + if gap < (250 * tscale) then + GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0) + else + GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0) + end + GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true) + end + + -- Show tooltips for dropdown menu tooltips + function LeaPlusLC:ShowDropTip() + GameTooltip:SetOwner(self, "ANCHOR_NONE") + local parent = self:GetParent():GetParent():GetParent() + local pscale = parent:GetEffectiveScale() + local gscale = UIParent:GetEffectiveScale() + local tscale = GameTooltip:GetEffectiveScale() + local gap = ((UIParent:GetRight() * gscale) - (parent:GetRight() * pscale)) + if gap < (250 * tscale) then + GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0) + else + GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0) + end + GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true) + end + + -- Show tooltips for configuration buttons and dropdown menus + function LeaPlusLC:ShowTooltip() + GameTooltip:SetOwner(self, "ANCHOR_NONE") + local parent = LeaPlusLC["PageF"] + local pscale = parent:GetEffectiveScale() + local gscale = UIParent:GetEffectiveScale() + local tscale = GameTooltip:GetEffectiveScale() + local gap = ((UIParent:GetRight() * gscale) - (LeaPlusLC["PageF"]:GetRight() * pscale)) + if gap < (250 * tscale) then + GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0) + else + GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0) + end + GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true) + end + + -- Create configuration button + function LeaPlusLC:CfgBtn(name, parent) + local CfgBtn = CreateFrame("BUTTON", nil, parent) + LeaPlusCB[name] = CfgBtn + CfgBtn:SetWidth(20) + CfgBtn:SetHeight(20) + CfgBtn:SetPoint("LEFT", parent.f, "RIGHT", 0, 0) + + CfgBtn.t = CfgBtn:CreateTexture(nil, "BORDER") + CfgBtn.t:SetAllPoints() + CfgBtn.t:SetTexture("Interface\\WorldMap\\Gear_64.png") + CfgBtn.t:SetTexCoord(0, 0.50, 0, 0.50); + CfgBtn.t:SetVertexColor(1.0, 0.82, 0, 1.0) + + CfgBtn:SetHighlightTexture("Interface\\WorldMap\\Gear_64.png") + CfgBtn:GetHighlightTexture():SetTexCoord(0, 0.50, 0, 0.50); + + CfgBtn.tiptext = L["Click to configure the settings for this option."] + CfgBtn:SetScript("OnEnter", LeaPlusLC.ShowTooltip) + CfgBtn:SetScript("OnLeave", GameTooltip_Hide) + end + + -- Create a help button to the right of a fontstring + function LeaPlusLC:CreateHelpButton(frame, panel, parent, tip) + LeaPlusLC:CfgBtn(frame, panel) + LeaPlusCB[frame]:ClearAllPoints() + LeaPlusCB[frame]:SetPoint("LEFT", parent, "RIGHT", -parent:GetWidth() + parent:GetStringWidth(), 0) + LeaPlusCB[frame]:SetSize(25, 25) + LeaPlusCB[frame].t:SetTexture("Interface\\COMMON\\help-i.blp") + LeaPlusCB[frame].t:SetTexCoord(0, 1, 0, 1) + LeaPlusCB[frame].t:SetVertexColor(0.9, 0.8, 0.0) + LeaPlusCB[frame]:SetHighlightTexture("Interface\\COMMON\\help-i.blp") + LeaPlusCB[frame]:GetHighlightTexture():SetTexCoord(0, 1, 0, 1) + LeaPlusCB[frame].tiptext = L[tip] + LeaPlusCB[frame]:SetScript("OnEnter", LeaPlusLC.TipSee) + end + + -- Show a footer + function LeaPlusLC:MakeFT(frame, text, left, width) + local footer = LeaPlusLC:MakeTx(frame, text, left, 96) + footer:SetWidth(width); footer:SetJustifyH("LEFT"); footer:SetWordWrap(true); footer:ClearAllPoints() + footer:SetPoint("BOTTOMLEFT", left, 96) + end + + -- Capitalise first character in a string + function LeaPlusLC:CapFirst(str) + return gsub(string.lower(str), "^%l", strupper) + end + + -- Toggle Zygor addon + function LeaPlusLC:ZygorToggle() + if select(2, GetAddOnInfo("ZygorGuidesViewerClassic")) then + if not IsAddOnLoaded("ZygorGuidesViewerClassic") then + if LeaPlusLC:PlayerInCombat() then + return + else + EnableAddOn("ZygorGuidesViewerClassic") + ReloadUI(); + end + else + DisableAddOn("ZygorGuidesViewerClassic") + ReloadUI(); + end + else + -- Zygor cannot be found + LeaPlusLC:Print("Zygor addon not found."); + end + return + end + + -- Show memory usage stat + function LeaPlusLC:ShowMemoryUsage(frame, anchor, x, y) + + -- Create frame + local memframe = CreateFrame("FRAME", nil, frame) + memframe:ClearAllPoints() + memframe:SetPoint(anchor, x, y) + memframe:SetWidth(100) + memframe:SetHeight(20) + + -- Create labels + local pretext = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + pretext:SetPoint("TOPLEFT", 0, 0) + pretext:SetText(L["Memory Usage"]) + + local memtext = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + memtext:SetPoint("TOPLEFT", 0, 0 - 30) + + -- Create stat + local memstat = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + memstat:SetPoint("BOTTOMLEFT", memtext, "BOTTOMRIGHT") + memstat:SetText("(calculating...)") + + -- Create update script + local memtime = -1 + memframe:SetScript("OnUpdate", function(self, elapsed) + if memtime > 2 or memtime == -1 then + UpdateAddOnMemoryUsage(); + memtext = GetAddOnMemoryUsage("Leatrix_Plus") + memtext = math.floor(memtext + .5) .. " KB" + memstat:SetText(memtext); + memtime = 0; + end + memtime = memtime + elapsed; + end) + + -- Release memory + LeaPlusLC.ShowMemoryUsage = nil + + end + + -- Check if player is in LFG queue (battleground) + function LeaPlusLC:IsInLFGQueue() + for i = 1, GetMaxBattlefieldID() do + local status = GetBattlefieldStatus(i) + if status == "queued" or status == "confirmed" then + return true + end + end + end + + -- Check if player is in combat + function LeaPlusLC:PlayerInCombat() + if (UnitAffectingCombat("player")) then + LeaPlusLC:Print("You cannot do that in combat.") + return true + end + end + + -- Hide panel and pages + function LeaPlusLC:HideFrames() + + -- Hide option pages + for i = 0, LeaPlusLC["NumberOfPages"] do + if LeaPlusLC["Page"..i] then + LeaPlusLC["Page"..i]:Hide(); + end; + end + + -- Hide options panel + LeaPlusLC["PageF"]:Hide(); + + end + + -- Find out if Leatrix Plus is showing (main panel or config panel) + function LeaPlusLC:IsPlusShowing() + if LeaPlusLC["PageF"]:IsShown() then return true end + for k, v in pairs(LeaConfigList) do + if v:IsShown() then + return true + end + end + end + + -- Check if a name is in your friends list or guild (does not check realm as realm is unknown for some checks) + function LeaPlusLC:FriendCheck(name, guid) + + -- Do nothing if name is empty (such as whispering from the Battle.net app) + if not name then return end + + -- Update friends list + C_FriendList.ShowFriends() + + -- Remove realm + name = strsplit("-", name, 2) + + -- Check character friends + for i = 1, C_FriendList.GetNumFriends() do + -- Return true is character name matches and GUID matches if there is one (realm is not checked) + local friendInfo = C_FriendList.GetFriendInfoByIndex(i) + local charFriendName = C_FriendList.GetFriendInfoByIndex(i).name + charFriendName = strsplit("-", charFriendName, 2) + if (name == charFriendName) and (guid and (guid == friendInfo.guid) or true) then + return true + end + end + + -- Check Battle.net friends + local numfriends = BNGetNumFriends() + for i = 1, numfriends do + local numtoons = C_BattleNet.GetFriendNumGameAccounts(i) + for j = 1, numtoons do + local gameAccountInfo = C_BattleNet.GetFriendGameAccountInfo(i, j) + local characterName = gameAccountInfo.characterName + local client = gameAccountInfo.clientProgram + if client == "WoW" and characterName == name then + return true + end + end + end + + -- Check guild members if guild is enabled (new members may need to press J to refresh roster) + if LeaPlusLC["FriendlyGuild"] == "On" then + local gCount = GetNumGuildMembers() + for i = 1, gCount do + local gName, void, void, void, void, void, void, void, gOnline, void, void, void, void, gMobile, void, void, gGUID = GetGuildRosterInfo(i) + if gOnline and not gMobile then + gName = strsplit("-", gName, 2) + -- Return true if character name matches including GUID if there is one + if (name == gName) and (guid and (guid == gGUID) or true) then + return true + end + end + end + end + + end + +---------------------------------------------------------------------- +-- L02: Locks +---------------------------------------------------------------------- + + -- Function to set lock state for configuration buttons + function LeaPlusLC:LockOption(option, item, reloadreq) + if reloadreq then + -- Option change requires UI reload + if LeaPlusLC[option] ~= LeaPlusDB[option] or LeaPlusLC[option] == "Off" then + LeaPlusLC:LockItem(LeaPlusCB[item], true) + else + LeaPlusLC:LockItem(LeaPlusCB[item], false) + end + else + -- Option change does not require UI reload + if LeaPlusLC[option] == "Off" then + LeaPlusLC:LockItem(LeaPlusCB[item], true) + else + LeaPlusLC:LockItem(LeaPlusCB[item], false) + end + end + end + +-- Set lock state for configuration buttons + function LeaPlusLC:SetDim() + LeaPlusLC:LockOption("AutomateQuests", "AutomateQuestsBtn", false) -- Automate quests + LeaPlusLC:LockOption("AutoAcceptRes", "AutoAcceptResBtn", false) -- Accept resurrection + LeaPlusLC:LockOption("AutoReleasePvP", "AutoReleasePvPBtn", false) -- Release in PvP + LeaPlusLC:LockOption("AutoSellJunk", "AutoSellJunkBtn", false) -- Sell junk automatically + LeaPlusLC:LockOption("AutoRepairGear", "AutoRepairBtn", false) -- Repair automatically + LeaPlusLC:LockOption("InviteFromWhisper", "InvWhisperBtn", false) -- Invite from whispers + LeaPlusLC:LockOption("FilterChatMessages", "FilterChatMessagesBtn", true) -- Filter chat messages + LeaPlusLC:LockOption("MailFontChange", "MailTextBtn", true) -- Resize mail text + LeaPlusLC:LockOption("QuestFontChange", "QuestTextBtn", true) -- Resize quest text + LeaPlusLC:LockOption("BookFontChange", "BookTextBtn", true) -- Resize book text + LeaPlusLC:LockOption("MinimapModder", "ModMinimapBtn", true) -- Enhance minimap + LeaPlusLC:LockOption("TipModEnable", "MoveTooltipButton", true) -- Enhance tooltip + LeaPlusLC:LockOption("EnhanceDressup", "EnhanceDressupBtn", true) -- Enhance dressup + LeaPlusLC:LockOption("EnhanceQuestLog", "EnhanceQuestLogBtn", true) -- Enhance quest log + LeaPlusLC:LockOption("EnhanceTrainers", "EnhanceTrainersBtn", true) -- Enhance trainers + LeaPlusLC:LockOption("ShowCooldowns", "CooldownsButton", true) -- Show cooldowns + LeaPlusLC:LockOption("ShowPlayerChain", "ModPlayerChain", true) -- Show player chain + LeaPlusLC:LockOption("ShowWowheadLinks", "ShowWowheadLinksBtn", true) -- Show Wowhead links + LeaPlusLC:LockOption("ShowFlightTimes", "ShowFlightTimesBtn", true) -- Show flight times + LeaPlusLC:LockOption("FrmEnabled", "MoveFramesButton", true) -- Manage frames + LeaPlusLC:LockOption("ManageBuffs", "ManageBuffsButton", true) -- Manage buffs + LeaPlusLC:LockOption("ManageWidget", "ManageWidgetButton", true) -- Manage widget + LeaPlusLC:LockOption("ManageFocus", "ManageFocusButton", true) -- Manage focus + LeaPlusLC:LockOption("ManageTimer", "ManageTimerButton", true) -- Manage timer + LeaPlusLC:LockOption("ManageDurability", "ManageDurabilityButton", true) -- Manage durability + LeaPlusLC:LockOption("ManageVehicle", "ManageVehicleButton", true) -- Manage vehicle + LeaPlusLC:LockOption("ClassColFrames", "ClassColFramesBtn", true) -- Class colored frames + LeaPlusLC:LockOption("SetWeatherDensity", "SetWeatherDensityBtn", false) -- Set weather density + LeaPlusLC:LockOption("ViewPortEnable", "ModViewportBtn", true) -- Enable viewport + LeaPlusLC:LockOption("MuteGameSounds", "MuteGameSoundsBtn", false) -- Mute game sounds + LeaPlusLC:LockOption("MuteCustomSounds", "MuteCustomSoundsBtn", false) -- Mute custom sounds + LeaPlusLC:LockOption("StandAndDismount", "DismountBtn", true) -- Dismount me + end + +---------------------------------------------------------------------- +-- L03: Restarts +---------------------------------------------------------------------- + + -- Set the reload button state + function LeaPlusLC:ReloadCheck() + + -- Chat + if (LeaPlusLC["UseEasyChatResizing"] ~= LeaPlusDB["UseEasyChatResizing"]) -- Use easy resizing + or (LeaPlusLC["NoCombatLogTab"] ~= LeaPlusDB["NoCombatLogTab"]) -- Hide the combat log + or (LeaPlusLC["NoChatButtons"] ~= LeaPlusDB["NoChatButtons"]) -- Hide chat buttons + or (LeaPlusLC["UnclampChat"] ~= LeaPlusDB["UnclampChat"]) -- Unclamp chat frame + or (LeaPlusLC["MoveChatEditBoxToTop"] ~= LeaPlusDB["MoveChatEditBoxToTop"]) -- Move editbox to top + or (LeaPlusLC["MoreFontSizes"] ~= LeaPlusDB["MoreFontSizes"]) -- More font sizes + or (LeaPlusLC["NoStickyChat"] ~= LeaPlusDB["NoStickyChat"]) -- Disable sticky chat + or (LeaPlusLC["UseArrowKeysInChat"] ~= LeaPlusDB["UseArrowKeysInChat"]) -- Use arrow keys in chat + or (LeaPlusLC["NoChatFade"] ~= LeaPlusDB["NoChatFade"]) -- Disable chat fade + or (LeaPlusLC["ClassColorsInChat"] ~= LeaPlusDB["ClassColorsInChat"]) -- Use class colors in chat + or (LeaPlusLC["RecentChatWindow"] ~= LeaPlusDB["RecentChatWindow"]) -- Recent chat window + or (LeaPlusLC["MaxChatHstory"] ~= LeaPlusDB["MaxChatHstory"]) -- Increase chat history + or (LeaPlusLC["FilterChatMessages"] ~= LeaPlusDB["FilterChatMessages"]) -- Filter chat messages + or (LeaPlusLC["RestoreChatMessages"] ~= LeaPlusDB["RestoreChatMessages"]) -- Restore chat messages + + -- Text + or (LeaPlusLC["HideErrorMessages"] ~= LeaPlusDB["HideErrorMessages"]) -- Hide error messages + or (LeaPlusLC["NoHitIndicators"] ~= LeaPlusDB["NoHitIndicators"]) -- Hide portrait text + or (LeaPlusLC["HideZoneText"] ~= LeaPlusDB["HideZoneText"]) -- Hide zone text + or (LeaPlusLC["HideKeybindText"] ~= LeaPlusDB["HideKeybindText"]) -- Hide keybind text + or (LeaPlusLC["HideMacroText"] ~= LeaPlusDB["HideMacroText"]) -- Hide macro text + + or (LeaPlusLC["MailFontChange"] ~= LeaPlusDB["MailFontChange"]) -- Resize mail text + or (LeaPlusLC["QuestFontChange"] ~= LeaPlusDB["QuestFontChange"]) -- Resize quest text + or (LeaPlusLC["BookFontChange"] ~= LeaPlusDB["BookFontChange"]) -- Resize book text + + -- Interface + or (LeaPlusLC["MinimapModder"] ~= LeaPlusDB["MinimapModder"]) -- Enhance minimap + or (LeaPlusLC["SquareMinimap"] ~= LeaPlusDB["SquareMinimap"]) -- Square minimap + or (LeaPlusLC["CombineAddonButtons"] ~= LeaPlusDB["CombineAddonButtons"]) -- Combine addon buttons + or (LeaPlusLC["HideMiniTracking"] ~= LeaPlusDB["HideMiniTracking"]) -- Hide tracking button + or (LeaPlusLC["MiniExcludeList"] ~= LeaPlusDB["MiniExcludeList"]) -- Minimap exclude list + or (LeaPlusLC["TipModEnable"] ~= LeaPlusDB["TipModEnable"]) -- Enhance tooltip + or (LeaPlusLC["TipNoHealthBar"] ~= LeaPlusDB["TipNoHealthBar"]) -- Tooltip hide health bar + or (LeaPlusLC["EnhanceDressup"] ~= LeaPlusDB["EnhanceDressup"]) -- Enhance dressup + or (LeaPlusLC["EnhanceQuestLog"] ~= LeaPlusDB["EnhanceQuestLog"]) -- Enhance quest log + or (LeaPlusLC["EnhanceProfessions"] ~= LeaPlusDB["EnhanceProfessions"]) -- Enhance professions + or (LeaPlusLC["EnhanceTrainers"] ~= LeaPlusDB["EnhanceTrainers"]) -- Enhance trainers + or (LeaPlusLC["ShowVolume"] ~= LeaPlusDB["ShowVolume"]) -- Show volume slider + or (LeaPlusLC["AhExtras"] ~= LeaPlusDB["AhExtras"]) -- Show auction controls + or (LeaPlusLC["ShowCooldowns"] ~= LeaPlusDB["ShowCooldowns"]) -- Show cooldowns + or (LeaPlusLC["DurabilityStatus"] ~= LeaPlusDB["DurabilityStatus"]) -- Show durability status + or (LeaPlusLC["ShowVanityControls"] ~= LeaPlusDB["ShowVanityControls"]) -- Show vanity controls + or (LeaPlusLC["ShowBagSearchBox"] ~= LeaPlusDB["ShowBagSearchBox"]) -- Show bag search box + or (LeaPlusLC["ShowRaidToggle"] ~= LeaPlusDB["ShowRaidToggle"]) -- Show raid button + or (LeaPlusLC["ShowPlayerChain"] ~= LeaPlusDB["ShowPlayerChain"]) -- Show player chain + or (LeaPlusLC["ShowReadyTimer"] ~= LeaPlusDB["ShowReadyTimer"]) -- Show ready timer + or (LeaPlusLC["ShowWowheadLinks"] ~= LeaPlusDB["ShowWowheadLinks"]) -- Show Wowhead links + or (LeaPlusLC["ShowFlightTimes"] ~= LeaPlusDB["ShowFlightTimes"]) -- Show flight times + + -- Frames + or (LeaPlusLC["FrmEnabled"] ~= LeaPlusDB["FrmEnabled"]) -- Manage frames + or (LeaPlusLC["ManageBuffs"] ~= LeaPlusDB["ManageBuffs"]) -- Manage buffs + or (LeaPlusLC["ManageWidget"] ~= LeaPlusDB["ManageWidget"]) -- Manage widget + or (LeaPlusLC["ManageFocus"] ~= LeaPlusDB["ManageFocus"]) -- Manage focus + or (LeaPlusLC["ManageTimer"] ~= LeaPlusDB["ManageTimer"]) -- Manage timer + or (LeaPlusLC["ManageDurability"] ~= LeaPlusDB["ManageDurability"]) -- Manage durability + or (LeaPlusLC["ManageVehicle"] ~= LeaPlusDB["ManageVehicle"]) -- Manage vehicle + or (LeaPlusLC["ClassColFrames"] ~= LeaPlusDB["ClassColFrames"]) -- Class colored frames + or (LeaPlusLC["NoAlerts"] ~= LeaPlusDB["NoAlerts"]) -- Hide alerts + or (LeaPlusLC["NoGryphons"] ~= LeaPlusDB["NoGryphons"]) -- Hide gryphons + or (LeaPlusLC["NoClassBar"] ~= LeaPlusDB["NoClassBar"]) -- Hide stance bar + + -- System + or (LeaPlusLC["ViewPortEnable"] ~= LeaPlusDB["ViewPortEnable"]) -- Enable viewport + or (LeaPlusLC["NoRestedEmotes"] ~= LeaPlusDB["NoRestedEmotes"]) -- Silence rested emotes + or (LeaPlusLC["NoBagAutomation"] ~= LeaPlusDB["NoBagAutomation"]) -- Disable bag automation + or (LeaPlusLC["CharAddonList"] ~= LeaPlusDB["CharAddonList"]) -- Show character addons + or (LeaPlusLC["FasterLooting"] ~= LeaPlusDB["FasterLooting"]) -- Faster auto loot + or (LeaPlusLC["FasterMovieSkip"] ~= LeaPlusDB["FasterMovieSkip"]) -- Faster movie skip + or (LeaPlusLC["StandAndDismount"] ~= LeaPlusDB["StandAndDismount"]) -- Dismount me + or (LeaPlusLC["ShowVendorPrice"] ~= LeaPlusDB["ShowVendorPrice"]) -- Show vendor price + or (LeaPlusLC["CombatPlates"] ~= LeaPlusDB["CombatPlates"]) -- Combat plates + or (LeaPlusLC["EasyItemDestroy"] ~= LeaPlusDB["EasyItemDestroy"]) -- Easy item destroy + + then + -- Enable the reload button + LeaPlusLC:LockItem(LeaPlusCB["ReloadUIButton"], false) + LeaPlusCB["ReloadUIButton"].f:Show() + else + -- Disable the reload button + LeaPlusLC:LockItem(LeaPlusCB["ReloadUIButton"], true) + LeaPlusCB["ReloadUIButton"].f:Hide() + end + + end + +---------------------------------------------------------------------- +-- L20: Live +---------------------------------------------------------------------- + + function LeaPlusLC:Live() + + ---------------------------------------------------------------------- + -- Invite from whispers + ---------------------------------------------------------------------- + + if LeaPlusLC["InviteFromWhisper"] == "On" then + LpEvt:RegisterEvent("CHAT_MSG_WHISPER"); + LpEvt:RegisterEvent("CHAT_MSG_BN_WHISPER"); + else + LpEvt:UnregisterEvent("CHAT_MSG_WHISPER"); + LpEvt:UnregisterEvent("CHAT_MSG_BN_WHISPER"); + end + + ---------------------------------------------------------------------- + -- Block duels + ---------------------------------------------------------------------- + + if LeaPlusLC["NoDuelRequests"] == "On" then + LpEvt:RegisterEvent("DUEL_REQUESTED"); + else + LpEvt:UnregisterEvent("DUEL_REQUESTED"); + end + + ---------------------------------------------------------------------- + -- Block party invites and Party from friends + ---------------------------------------------------------------------- + + if LeaPlusLC["NoPartyInvites"] == "On" or LeaPlusLC["AcceptPartyFriends"] == "On" then + LpEvt:RegisterEvent("PARTY_INVITE_REQUEST"); + else + LpEvt:UnregisterEvent("PARTY_INVITE_REQUEST"); + end + + ---------------------------------------------------------------------- + -- Automatic summon + ---------------------------------------------------------------------- + + if LeaPlusLC["AutoAcceptSummon"] == "On" then + LpEvt:RegisterEvent("CONFIRM_SUMMON"); + else + LpEvt:UnregisterEvent("CONFIRM_SUMMON"); + end + + ---------------------------------------------------------------------- + -- Disable loot warnings + ---------------------------------------------------------------------- + + if LeaPlusLC["NoConfirmLoot"] == "On" then + LpEvt:RegisterEvent("CONFIRM_LOOT_ROLL") + LpEvt:RegisterEvent("LOOT_BIND_CONFIRM") + LpEvt:RegisterEvent("MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL") + LpEvt:RegisterEvent("MAIL_LOCK_SEND_ITEMS") + else + LpEvt:UnregisterEvent("CONFIRM_LOOT_ROLL") + LpEvt:UnregisterEvent("LOOT_BIND_CONFIRM") + LpEvt:UnregisterEvent("MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL") + LpEvt:UnregisterEvent("MAIL_LOCK_SEND_ITEMS") + end + + end + +---------------------------------------------------------------------- +-- L30: Isolated +---------------------------------------------------------------------- + + function LeaPlusLC:Isolated() + + ---------------------------------------------------------------------- + -- Easy item destroy + ---------------------------------------------------------------------- + + if LeaPlusLC["EasyItemDestroy"] == "On" then + + -- Get the type "DELETE" into the field to confirm text + local TypeDeleteLine = gsub(DELETE_GOOD_ITEM, "[\r\n]", "@") + local void, TypeDeleteLine = strsplit("@", TypeDeleteLine, 2) + + -- Add hyperlinks to regular item destroy + RunScript('StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter = function(self, link, text, region, boundsLeft, boundsBottom, boundsWidth, boundsHeight) GameTooltip:SetOwner(self, "ANCHOR_PRESERVE") GameTooltip:ClearAllPoints() local cursorClearance = 30 GameTooltip:SetPoint("TOPLEFT", region, "BOTTOMLEFT", boundsLeft, boundsBottom - cursorClearance) GameTooltip:SetHyperlink(link) end') + RunScript('StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave = function(self) GameTooltip:Hide() end') + RunScript('StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter') + RunScript('StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave') + RunScript('StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter') + RunScript('StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave') + RunScript('StaticPopupDialogs["DELETE_GOOD_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter') + RunScript('StaticPopupDialogs["DELETE_GOOD_QUEST_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave') + + -- Hide editbox and set item link + local easyDelFrame = CreateFrame("FRAME") + easyDelFrame:RegisterEvent("DELETE_ITEM_CONFIRM") + easyDelFrame:SetScript("OnEvent", function() + if StaticPopup1EditBox:IsShown() then + -- Item requires player to type delete so hide editbox and show link + StaticPopup1:SetHeight(StaticPopup1:GetHeight() - 10) + StaticPopup1EditBox:Hide() + StaticPopup1Button1:Enable() + local link = select(3, GetCursorInfo()) + if link then + StaticPopup1Text:SetText(gsub(StaticPopup1Text:GetText(), gsub(TypeDeleteLine, "@", ""), "") .. "|n" .. link) + end + else + -- Item does not require player to type delete so just show item link + StaticPopup1:SetHeight(StaticPopup1:GetHeight() + 40) + StaticPopup1EditBox:Hide() + StaticPopup1Button1:Enable() + local link = select(3, GetCursorInfo()) + if link then + StaticPopup1Text:SetText(gsub(StaticPopup1Text:GetText(), gsub(TypeDeleteLine, "@", ""), "") .. "|n|n" .. link) + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Mute game sounds (no reload required) (MuteGameSounds) + ---------------------------------------------------------------------- + + do + + -- Create soundtable + local muteTable = { + + ["MuteFizzle"] = { "sound/spells/fizzle/fizzlefirea.ogg#569773", "sound/spells/fizzle/FizzleFrostA.ogg#569775", "sound/spells/fizzle/FizzleHolyA.ogg#569772", "sound/spells/fizzle/FizzleNatureA.ogg#569774", "sound/spells/fizzle/FizzleShadowA.ogg#569776",}, + ["MuteInterface"] = { "sound/interface/iUiInterfaceButtonA.ogg#567481", "sound/interface/uChatScrollButton.ogg#567407", "sound/interface/uEscapeScreenClose.ogg#567464", "sound/interface/uEscapeScreenOpen.ogg#567490",}, + + -- Trains + ["MuteTrains"] = { + + --[[Blood Elf]] "sound#539219", "sound#539203", + --[[Draenei]] "sound#539516", "sound#539730", + --[[Dwarf]] "sound#539802", "sound#539881", + --[[Gnome]] "sound#540271", "sound#540275", + --[[Human]] "sound#540535", "sound#540734", + --[[Night Elf]] "sound#540870", "sound#540947", + --[[Orc]] "sound#541157", "sound#541239", + --[[Tauren]] "sound#542818", "sound#542896", + --[[Troll]] "sound#543085", "sound#543093", + --[[Undead]] "sound#542526", "sound#542600", + + }, + + -- Chimes (sound/doodad/) + ["MuteChimes"] = { + "belltollalliance.ogg#566564", + "belltollhorde.ogg#565853", + "belltollnightelf.ogg#566558", + "belltolltribal.ogg#566027", + "kharazahnbelltoll.ogg#566254", + "dwarfhorn.ogg#566064", + }, + + -- Vaults + ["MuteVaults"] = { + + -- Mechanical guild vault idle sound (such as those found in Booty Bay and Winterspring) + "sound/doodad/guildvault_goblin_01stand.ogg#566289", + + }, + + -- Ready check (sound/interface/) + ["MuteReady"] = { + "levelup2.ogg#567478", + }, + + -- Login (sound/interface/) + ["MuteLogin"] = { + + -- This is handled with the PLAYER_LOGOUT event + + }, + + -- Bikes + ["MuteBikes"] = { + + -- Mekgineer's Chopper/Mechano Hog/Chauffeured (sound/vehicles/motorcyclevehicle, sound/vehicles) + "motorcyclevehicleattackthrown.ogg#569858", "motorcyclevehiclejumpend1.ogg#569863", "motorcyclevehiclejumpend2.ogg#569857", "motorcyclevehiclejumpend3.ogg#569855", "motorcyclevehiclejumpstart1.ogg#569856", "motorcyclevehiclejumpstart2.ogg#569862", "motorcyclevehiclejumpstart3.ogg#569860", "motorcyclevehicleloadthrown.ogg#569861", "motorcyclevehiclestand.ogg#569859", "motorcyclevehiclewalkrun.ogg#569854", "vehicle_ground_gearshift_1.ogg#598748", "vehicle_ground_gearshift_2.ogg#598736", "vehicle_ground_gearshift_3.ogg#569852", "vehicle_ground_gearshift_4.ogg#598745", "vehicle_ground_gearshift_5.ogg#569845", + + }, + + -- Events + ["MuteEvents"] = { + + -- Headless Horseman (sound/creature/headlesshorseman/) + "horseman_beckon_01.ogg#551670", + "horseman_bodydefeat_01.ogg#551706", + "horseman_bomb_01.ogg#551705", + "horseman_conflag_01.ogg#551686", + "horseman_death_01.ogg#551695", + "horseman_failing_01.ogg#551684", + "horseman_failing_02.ogg#551700", + "horseman_fire_01.ogg#551673", + "horseman_laugh_01.ogg#551703", + "horseman_laugh_02.ogg#551682", + "horseman_out_01.ogg#551680", + "horseman_request_01.ogg#551687", + "horseman_return_01.ogg#551698", + "horseman_slay_01.ogg#551676", + "horseman_special_01.ogg#551696", + + }, + + -- Gyrocopters + ["MuteGyrocopters"] = { + + -- Mimiron's Head (sound/creature/mimironheadmount/) + "mimironheadmount_jumpend.ogg#595097", + "mimironheadmount_jumpstart.ogg#595103", + "mimironheadmount_run.ogg#555364", + "mimironheadmount_walk.ogg#595100", + + -- sound/creature/gyrocopter/ + "gyrocopterfly.ogg#551390", + "gyrocopterflyidle.ogg#551398", + "gyrocopterflyup.ogg#551389", + "gyrocoptergearshift1.ogg#551384", + "gyrocoptergearshift2.ogg#551391", + "gyrocoptergearshift3.ogg#551387", + "gyrocopterjumpend.ogg#551396", + "gyrocopterjumpstart.ogg#551399", + "gyrocopterrun.ogg#551386", + "gyrocoptershuffleleftorright1.ogg#551385", + "gyrocoptershuffleleftorright2.ogg#551382", + "gyrocoptershuffleleftorright3.ogg#551392", + "gyrocopterstallinair.ogg#551395", + "gyrocopterstallinairlong.ogg#551394", + "gyrocopterstallongroundlong.ogg#551393", + "gyrocopterstand.ogg#551383", + "gyrocopterstandvar1_a.ogg#551388", + "gyrocopterstandvar1_b.ogg#551397", + "gyrocopterstandvar1_bnew.ogg#551400", + "gyrocopterwalk.ogg#551401", + + -- Gear shift sounds (sound/vehicles/) + "vehicle_airplane_gearshift_1.ogg#569846", + "vehicle_airplane_gearshift_2.ogg#598739", + "vehicle_airplane_gearshift_3.ogg#569851", + "vehicle_airplane_gearshift_4.ogg#598742", + "vehicle_airplane_gearshift_5.ogg#598733", + "vehicle_airplane_gearshift_6.ogg#569850", + + -- sound/spells/ + "summongyrocopter.ogg#568252", + + }, + + -- Yawns (sound/creature/tiger/) + ["MuteYawns"] = { + + "mtigerstand2a.ogg#562388", + + }, + + -- Screech (sound/spells/) + ["MuteScreech"] = { + + "screech.ogg#569429", + + }, + + -- A'dal + ["MuteAdal"] = { + + -- sound/creature/naaru/ + "naruuloopgood.ogg#601649", + + -- sound/doodad/ + "ancient_d_lights.ogg#567134", + + }, + + -- Ripper (Arcanite ripper guitar sound) + ["MuteRipper"] = { + + -- sound/events/ + "archaniteripper.ogg#567384", + + }, + + -- Rhonin + ["MuteRhonin"] = { + + -- sound/creature/rhonin/ur_rhonin_event + "01.ogg#559130", "02.ogg#559131", "03.ogg#559126", "04.ogg#559128", "05.ogg#559133", "06.ogg#559129", "07.ogg#559132", "08.ogg#559127", + + }, + + -- Travelers (gnimo sounds are handled in SetupMute() as they are shared with striders) + ["MuteTravelers"] = { + + -- Traveler's Tundra Mammoth (sound/creature/npcdraeneimalestandard, sound/creature/goblinmalezanynpc, sound/creature/trollfemalelaidbacknpc, sound/creature/trollfemalelaidbacknpc) + "npcdraeneimalestandardvendor01.ogg#557341", "npcdraeneimalestandardvendor02.ogg#557335", "npcdraeneimalestandardvendor03.ogg#557328", "npcdraeneimalestandardvendor04.ogg#557331", "npcdraeneimalestandardvendor05.ogg#557325", "npcdraeneimalestandardvendor06.ogg#557324", + "npcdraeneimalestandardfarewell01.ogg#557342", "npcdraeneimalestandardfarewell02.ogg#557326", "npcdraeneimalestandardfarewell03.ogg#557322", "npcdraeneimalestandardfarewell05.ogg#557332", "npcdraeneimalestandardfarewell06.ogg#557338", "npcdraeneimalestandardfarewell08.ogg#557334", + "goblinmalezanynpcvendor01.ogg#550818", "goblinmalezanynpcvendor02.ogg#550817", "goblinmalezanynpcgreeting01.ogg#550805", "goblinmalezanynpcgreeting02.ogg#550813", "goblinmalezanynpcgreeting03.ogg#550819", "goblinmalezanynpcgreeting04.ogg#550806", "goblinmalezanynpcgreeting05.ogg#550820", "goblinmalezanynpcgreeting06.ogg#550809", + "goblinmalezanynpcfarewell01.ogg#550807", "goblinmalezanynpcfarewell03.ogg#550808", "goblinmalezanynpcfarewell04.ogg#550812", + "trollfemalelaidbacknpcvendor01.ogg#562812","trollfemalelaidbacknpcvendor02.ogg#562802", "trollfemalelaidbacknpcgreeting01.ogg#562815","trollfemalelaidbacknpcgreeting02.ogg#562814", "trollfemalelaidbacknpcgreeting03.ogg#562816", "trollfemalelaidbacknpcgreeting04.ogg#562807", "trollfemalelaidbacknpcgreeting05.ogg#562804", "trollfemalelaidbacknpcgreeting06.ogg#562803", + "trollfemalelaidbacknpcfarewell01.ogg#562809", "trollfemalelaidbacknpcfarewell02.ogg#562808", "trollfemalelaidbacknpcfarewell03.ogg#562813", "trollfemalelaidbacknpcfarewell04.ogg#562817", "trollfemalelaidbacknpcfarewell05.ogg#562806", + + }, + + -- Striders (footsteps are in another setting) (wound sounds are handled in SetupMute() as they are shared with travelers) + ["MuteStriders"] = { + + -- sound/creature/mechastrider/ + "mechastrideraggro.ogg#555127", + "mechastriderattacka.ogg#555125", + "smechastriderattackb.ogg#555123", + "mechastriderattackc.ogg#555132", + "mechastriderloop.ogg#555124", + "mechastriderwoundcrit.ogg#555131", + + }, + + -- Mechanical mount footsteps + ["MuteMechSteps"] = { + + -- sound/creature/gnomespidertank/ + "gnomespidertankfootstepa.ogg#550507", + "gnomespidertankfootstepb.ogg#550514", + "gnomespidertankfootstepc.ogg#550501", + "gnomespidertankfootstepd.ogg#550500", + "gnomespidertankwoundd.ogg#550511", + "gnomespidertankwounde.ogg#550504", + "gnomespidertankwoundf.ogg#550498", + + }, + + -- Netherdrakes + ["MuteNetherdrakes"] = { + + -- sound/creature/netherdrake/ + "hugewingflap1.ogg#556477", + "hugewingflap2.ogg#556479", + "hugewingflap3.ogg#556476", + "netherdrakea.ogg#556475", + "netherdrakeb.ogg#556478", + + }, + + -- Brooms + ["MuteBrooms"] = { + + -- sound/creature/broomstickmount/ + "broomstickmountland.ogg#545651", + "broomstickmounttakeoff.ogg#545652", + + -- sound/spells/ + "summonbroomstick1.ogg#567986", + "summonbroomstick3.ogg#569547", + "summonbroomstick2.ogg#568335", + + }, + + } + + -- Give table file level scope (its used during logout and for wipe and admin commands) + LeaPlusLC["muteTable"] = muteTable + + -- Load saved settings or set default values + for k, v in pairs(muteTable) do + if LeaPlusDB[k] and type(LeaPlusDB[k]) == "string" and LeaPlusDB[k] == "On" or LeaPlusDB[k] == "Off" then + LeaPlusLC[k] = LeaPlusDB[k] + else + LeaPlusLC[k] = "Off" + LeaPlusDB[k] = "Off" + end + end + + -- Create configuration panel + local SoundPanel = LeaPlusLC:CreatePanel("Mute game sounds", "SoundPanel") + + -- Add checkboxes + LeaPlusLC:MakeTx(SoundPanel, "General", 16, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteChimes", "Chimes", 16, -92, false, "If checked, clock hourly chimes will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteEvents", "Events", 16, -112, false, "If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman.") + LeaPlusLC:MakeCB(SoundPanel, "MuteFizzle", "Fizzle", 16, -132, false, "If checked, the spell fizzle sounds will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteInterface", "Interface", 16, -152, false, "If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteLogin", "Login", 16, -172, false, "If checked, login screen sounds will be muted when you logout of the game.|n|nNote that login screen sounds will not be muted when you initially launch the game.|n|nThey will only be muted when you logout of the game. This includes manually logging out as well as being forcefully logged out by the game server for reasons such as being away for an extended period of time.|n|nNo more dragons roaring when you fall asleep while the game is running!") + LeaPlusLC:MakeCB(SoundPanel, "MuteReady", "Ready", 16, -192, false, "If checked, the ready check sound will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteTrains", "Trains", 16, -212, false, "If checked, train sounds will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteVaults", "Vaults", 16, -232, false, "If checked, the mechanical guild vault idle sound will be muted.") + + LeaPlusLC:MakeTx(SoundPanel, "Mounts", 150, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteBikes", "Bikes", 150, -92, false, "If checked, bike mount sounds will be muted.|n|nThis applies to Mekgineer's Chopper and Mechano-hog.") + LeaPlusLC:MakeCB(SoundPanel, "MuteBrooms", "Brooms", 150, -112, false, "If checked, broom mounts will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteGyrocopters", "Gyrocopters", 150, -132, false, "If checked, gyrocopters will be muted.|n|nThis applies to the engineering flying machine mounts.") + LeaPlusLC:MakeCB(SoundPanel, "MuteMechSteps", "Mechsteps", 150, -152, false, "If checked, footsteps for mechanical mounts will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteStriders", "Mechstriders", 150, -172, false, "If checked, mechanostriders will be quieter.") + LeaPlusLC:MakeCB(SoundPanel, "MuteNetherdrakes", "Netherdrakes", 150, -192, false, "If checked, netherdrakes will be quieter.") + LeaPlusLC:MakeCB(SoundPanel, "MuteTravelers", "Travelers", 150, -212, false, "If checked, traveling merchant greetings and farewells will be muted.|n|nThis applies to Traveler's Tundra Mammoth.") + + LeaPlusLC:MakeTx(SoundPanel, "Pets", 284, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteScreech", "Screech", 284, -92, false, "If checked, Screech will be muted.|n|nThis is a spell used by some flying pets.") + LeaPlusLC:MakeCB(SoundPanel, "MuteYawns", "Yawns", 284, -112, false, "If checked, yawns from hunter pet cats will be muted.") + + LeaPlusLC:MakeTx(SoundPanel, "Misc", 418, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteAdal", "A'dal", 418, -92, false, "If checked, A'dal in Shattrath City will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteRipper", "Ripper", 418, -112, false, "If checked, the Arcanite Ripper guitar sound will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteRhonin", "Rhonin", 418, -132, false, "If checked, Rhonin will be muted.") + + -- Set click width for sounds checkboxes + for k, v in pairs(muteTable) do + LeaPlusCB[k].f:SetWidth(90) + if LeaPlusCB[k].f:GetStringWidth() > 90 then + LeaPlusCB[k]:SetHitRectInsets(0, -80, 0, 0) + else + LeaPlusCB[k]:SetHitRectInsets(0, -LeaPlusCB[k].f:GetStringWidth() + 4, 0, 0) + end + end + + -- Function to mute and unmute sounds + local function SetupMute() + for k, v in pairs(muteTable) do + if LeaPlusLC["MuteGameSounds"] == "On" and LeaPlusLC[k] == "On" then + for i, e in pairs(v) do + local file, soundID = e:match("([^,]+)%#([^,]+)") + MuteSoundFile(soundID) + end + else + for i, e in pairs(v) do + local file, soundID = e:match("([^,]+)%#([^,]+)") + UnmuteSoundFile(soundID) + end + end + end + -- Handle special cases where sounds overlap + if LeaPlusLC["MuteGameSounds"] == "On" and (LeaPlusLC["MuteTravelers"] == "On" or LeaPlusLC["MuteStriders"] == "On") then + -- Mute travelers and mute striders share same sounds + MuteSoundFile(555128) -- mechastriderwounda + MuteSoundFile(555129) -- mechastriderwoundb + MuteSoundFile(555130) -- mechastriderwoundc + else + -- Mute travelers and mute striders share same sounds + UnmuteSoundFile(555128) -- mechastriderwounda + UnmuteSoundFile(555129) -- mechastriderwoundb + UnmuteSoundFile(555130) -- mechastriderwoundc + end + end + + -- Setup mute on startup if option is enabled + if LeaPlusLC["MuteGameSounds"] == "On" then SetupMute() end + + -- Setup mute when options are clicked + for k, v in pairs(muteTable) do + LeaPlusCB[k]:HookScript("OnClick", SetupMute) + end + LeaPlusCB["MuteGameSounds"]:HookScript("OnClick", SetupMute) + + -- Help button hidden + SoundPanel.h:Hide() + + -- Back button handler + SoundPanel.b:SetScript("OnClick", function() + SoundPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button handler + SoundPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + for k, v in pairs(muteTable) do + LeaPlusLC[k] = "Off" + end + SetupMute() + + -- Refresh panel + SoundPanel:Hide(); SoundPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["MuteGameSoundsBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + for k, v in pairs(muteTable) do + LeaPlusLC[k] = "On" + end + LeaPlusLC["MuteReady"] = "Off" + SetupMute() + else + SoundPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + ---------------------------------------------------------------------- + -- Login setting + ---------------------------------------------------------------------- + + -- Create soundtable for PLAYER_LOGOUT (these sounds are only muted or unmuted when logging out + local muteLogoutTable = { + + -- Ambiance (sound/ambience/gluescreen/gluescreenlogin.ogg) + "538968", + + -- Dragon roaring sounds (sound/ambience/gluescreen/wrath_login_) + "538970", "538969", "538971", "538972", + + -- Game music (sound/music/gluescreenmusic/wotlk_main_title.mp3) + "53222", + + } + + -- Handle sounds that get muted or unmuted when logging out + local logoutEvent = CreateFrame("FRAME") + logoutEvent:RegisterEvent("PLAYER_LOGOUT") + + -- Mute or unmute sounds when logging out + logoutEvent:SetScript("OnEvent", function() + if LeaPlusLC["MuteGameSounds"] == "On" and LeaPlusLC["MuteLogin"] == "On" then + -- Mute logout table sounds on logout + for void, soundID in pairs(muteLogoutTable) do + --FIX ME + -- MuteSoundFile(soundID) + end + else + -- Unmute logout table sounds on logout + for void, soundID in pairs(muteLogoutTable) do + --FIX ME + -- UnmuteSoundFile(soundID) + end + end + end) + + -- Unmute sounds when logging in + -- for void, soundID in pairs(muteLogoutTable) do + -- UnmuteSoundFile(soundID) + -- end + + end + + ---------------------------------------------------------------------- + -- Faster movie skip + ---------------------------------------------------------------------- + + if LeaPlusLC["FasterMovieSkip"] == "On" then + + -- Allow space bar, escape key and enter key to cancel cinematic without confirmation + CinematicFrame:HookScript("OnKeyDown", function(self, key) + if key == "ESCAPE" then + if CinematicFrame:IsShown() and CinematicFrame.closeDialog and CinematicFrameCloseDialogConfirmButton then + CinematicFrameCloseDialog:Hide() + end + end + end) + CinematicFrame:HookScript("OnKeyUp", function(self, key) + if key == "SPACE" or key == "ESCAPE" or key == "ENTER" then + if CinematicFrame:IsShown() and CinematicFrame.closeDialog and CinematicFrameCloseDialogConfirmButton then + CinematicFrameCloseDialogConfirmButton:Click() + end + end + end) + MovieFrame:HookScript("OnKeyUp", function(self, key) + if key == "SPACE" or key == "ESCAPE" or key == "ENTER" then + if MovieFrame:IsShown() and MovieFrame.CloseDialog and MovieFrame.CloseDialog.ConfirmButton then + MovieFrame.CloseDialog.ConfirmButton:Click() + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Unclamp chat frame + ---------------------------------------------------------------------- + + if LeaPlusLC["UnclampChat"] == "On" and not LeaLockList["UnclampChat"] then + + -- Process normal and existing chat frames on startup + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i]:SetClampRectInsets(0, 0, 0, 0); + end + end + + -- Process new chat frames and combat log + hooksecurefunc("FloatingChatFrame_UpdateBackgroundAnchors", function(self) + self:SetClampRectInsets(0, 0, 0, 0); + end) + + -- Process temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf]:SetClampRectInsets(0, 0, 0, 0); + end + end) + + end + + ---------------------------------------------------------------------- + -- Wowhead Links + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowWowheadLinks"] == "On" then + + -- Create configuration panel + local WowheadPanel = LeaPlusLC:CreatePanel("Show Wowhead links", "WowheadPanel") + + LeaPlusLC:MakeTx(WowheadPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(WowheadPanel, "WowheadLinkComments", "Links go directly to the comments section", 16, -92, false, "If checked, Wowhead links will go directly to the comments section.") + + -- Help button hidden + WowheadPanel.h:Hide() + + -- Back button handler + WowheadPanel.b:SetScript("OnClick", function() + WowheadPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + WowheadPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["WowheadLinkComments"] = "Off" + + -- Refresh configuration panel + WowheadPanel:Hide(); WowheadPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["ShowWowheadLinksBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["WowheadLinkComments"] = "Off" + else + WowheadPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Get localised Wowhead URL + local wowheadLoc + if GameLocale == "deDE" then wowheadLoc = "wowhead.com/wotlk/de" + elseif GameLocale == "esMX" then wowheadLoc = "wowhead.com/wotlk/es" + elseif GameLocale == "esES" then wowheadLoc = "wowhead.com/wotlk/es" + elseif GameLocale == "frFR" then wowheadLoc = "wowhead.com/wotlk/fr" + elseif GameLocale == "itIT" then wowheadLoc = "wowhead.com/wotlk/it" + elseif GameLocale == "ptBR" then wowheadLoc = "wowhead.com/wotlk/pt" + elseif GameLocale == "ruRU" then wowheadLoc = "wowhead.com/wotlk/ru" + elseif GameLocale == "koKR" then wowheadLoc = "wowhead.com/wotlk/ko" + elseif GameLocale == "zhCN" then wowheadLoc = "wowhead.com/wotlk/cn" + elseif GameLocale == "zhTW" then wowheadLoc = "wowhead.com/wotlk/cn" + else wowheadLoc = "wowhead.com/wotlk" + end + + ---------------------------------------------------------------------- + -- Achievements frame + ---------------------------------------------------------------------- + + -- Achievement link function + local function DoWowheadAchievementFunc() + + -- Create editbox + local aEB = CreateFrame("EditBox", nil, AchievementFrame) + aEB:ClearAllPoints() + aEB:SetPoint("BOTTOMRIGHT", -50, 1) + aEB:SetHeight(16) + aEB:SetFontObject("GameFontNormalSmall") + aEB:SetBlinkSpeed(0) + aEB:SetJustifyH("RIGHT") + aEB:SetAutoFocus(false) + aEB:EnableKeyboard(false) + aEB:SetHitRectInsets(90, 0, 0, 0) + aEB:SetScript("OnKeyDown", function() end) + aEB:SetScript("OnMouseUp", function() + if aEB:IsMouseOver() then + aEB:HighlightText() + else + aEB:HighlightText(0, 0) + end + end) + + -- Create hidden font string (used for setting width of editbox) + aEB.z = aEB:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall') + aEB.z:Hide() + + -- Store last link in case editbox is cleared + local lastAchievementLink + + -- Function to set editbox value + hooksecurefunc("AchievementFrameAchievements_SelectButton", function(self) + local achievementID = self.id or nil + if achievementID then + -- Set editbox text + if LeaPlusLC["WowheadLinkComments"] == "On" then + aEB:SetText("https://" .. wowheadLoc .. "/achievement=" .. achievementID .. "#comments") + else + aEB:SetText("https://" .. wowheadLoc .. "/achievement=" .. achievementID) + end + lastAchievementLink = aEB:GetText() + -- Set hidden fontstring then resize editbox to match + aEB.z:SetText(aEB:GetText()) + aEB:SetWidth(aEB.z:GetStringWidth() + 90) + -- Get achievement title for tooltip + local achievementLink = GetAchievementLink(self.id) + if achievementLink then + aEB.tiptext = achievementLink:match("%[(.-)%]") .. "|n" .. L["Press CTRL/C to copy."] + end + -- Show the editbox + aEB:Show() + end + end) + + -- Create tooltip + aEB:HookScript("OnEnter", function() + aEB:HighlightText() + aEB:SetFocus() + GameTooltip:SetOwner(aEB, "ANCHOR_TOP", 0, 10) + GameTooltip:SetText(aEB.tiptext, nil, nil, nil, nil, true) + GameTooltip:Show() + end) + + aEB:HookScript("OnLeave", function() + -- Set link text again if it's changed since it was set + if aEB:GetText() ~= lastAchievementLink then aEB:SetText(lastAchievementLink) end + aEB:HighlightText(0, 0) + aEB:ClearFocus() + GameTooltip:Hide() + end) + + -- Hide editbox when achievement is deselected + hooksecurefunc("AchievementFrameAchievements_ClearSelection", function(self) aEB:Hide() end) + hooksecurefunc("AchievementCategoryButton_OnClick", function(self) aEB:Hide() end) + + end + + -- Run function when achievement UI is loaded + if IsAddOnLoaded("Blizzard_AchievementUI") then + DoWowheadAchievementFunc() + else + local waitAchievementsFrame = CreateFrame("FRAME") + waitAchievementsFrame:RegisterEvent("ADDON_LOADED") + waitAchievementsFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_AchievementUI" then + DoWowheadAchievementFunc() + waitAchievementsFrame:UnregisterAllEvents() + end + end) + end + + ---------------------------------------------------------------------- + -- World map frame + ---------------------------------------------------------------------- + + -- Create editbox + local mEB = CreateFrame("EditBox", nil, QuestLogFrame) + mEB:ClearAllPoints() + mEB:SetPoint("TOPLEFT", 70, 4) + mEB:SetHeight(16) + mEB:SetFontObject("GameFontNormal") + mEB:SetBlinkSpeed(0) + mEB:SetAutoFocus(false) + mEB:EnableKeyboard(false) + mEB:SetHitRectInsets(0, 90, 0, 0) + mEB:SetScript("OnKeyDown", function() end) + mEB:SetScript("OnMouseUp", function() + if mEB:IsMouseOver() then + mEB:HighlightText() + else + mEB:HighlightText(0, 0) + end + end) + + -- Set the background color + mEB.t = mEB:CreateTexture(nil, "BACKGROUND") + mEB.t:SetPoint(mEB:GetPoint()) + mEB.t:SetSize(mEB:GetSize()) + -- mEB.t:SetColorTexture(0.05, 0.05, 0.05, 1.0) + + -- Create hidden font string (used for setting width of editbox) + mEB.z = mEB:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mEB.z:Hide() + + -- Function to set editbox value + local function SetQuestInBox(questListID) + + local questTitle, void, void, isHeader, void, void, void, questID = GetQuestLogTitle(questListID) + if questID and not isHeader then + + -- Hide editbox if quest ID is invalid + if questID == 0 then mEB:Hide() else mEB:Show() end + + -- Set editbox text + if LeaPlusLC["WowheadLinkComments"] == "On" then + mEB:SetText("https://" .. wowheadLoc .. "/quest=" .. questID .. "#comments") + else + mEB:SetText("https://" .. wowheadLoc .. "/quest=" .. questID) + end + + -- Set hidden fontstring then resize editbox to match + mEB.z:SetText(mEB:GetText()) + mEB:SetWidth(mEB.z:GetStringWidth() + 90) + mEB.t:SetWidth(mEB.z:GetStringWidth()) + + -- Get quest title for tooltip + if questTitle then + mEB.tiptext = questTitle .. "|n" .. L["Press CTRL/C to copy."] + else + mEB.tiptext = "" + if mEB:IsMouseOver() and GameTooltip:IsShown() then GameTooltip:Hide() end + end + + end + end + + -- Set URL when quest is selected (this works with Questie, old method used QuestLog_SetSelection) + hooksecurefunc("SelectQuestLogEntry", function(questListID) + SetQuestInBox(questListID) + end) + + -- Create tooltip + mEB:HookScript("OnEnter", function() + mEB:HighlightText() + mEB:SetFocus() + GameTooltip:SetOwner(mEB, "ANCHOR_BOTTOM", 0, -10) + GameTooltip:SetText(mEB.tiptext, nil, nil, nil, nil, true) + GameTooltip:Show() + end) + + mEB:HookScript("OnLeave", function() + mEB:HighlightText(0, 0) + mEB:ClearFocus() + GameTooltip:Hide() + end) + + -- ElvUI fix to move Wowhead link inside the quest log frame + if LeaPlusLC.ElvUI then + LibCompat.After(0.1, function() + QuestLogTitleText:ClearAllPoints() + QuestLogTitleText:SetPoint("TOPLEFT", QuestLogFrame, "TOPLEFT", 32, -18) + if QuestLogTitleText:GetStringWidth() > 200 then + QuestLogTitleText:SetWidth(200) + else + QuestLogTitleText:SetWidth(QuestLogTitleText:GetStringWidth()) + end + mEB:ClearAllPoints() + mEB:SetPoint("LEFT", QuestLogTitleText, "RIGHT", 10, 0) + mEB.t:Hide() + end) + end + + end + + ---------------------------------------------------------------------- + -- Automate gossip (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to skip gossip + local function SkipGossip(skipAltKeyRequirement) + if not skipAltKeyRequirement and not IsAltKeyDown() then return end + local gossipInfoTable = C_GossipInfo.GetOptions() + if gossipInfoTable and #gossipInfoTable == 1 and C_GossipInfo.GetNumAvailableQuests() == 0 and C_GossipInfo.GetNumActiveQuests() == 0 and gossipInfoTable[1] and gossipInfoTable[1].gossipOptionID then + C_GossipInfo.SelectOption(gossipInfoTable[1].gossipOptionID) + end + end + + -- Create gossip event frame + local gossipFrame = CreateFrame("FRAME") + + -- Function to setup events + local function SetupEvents() + if LeaPlusLC["AutomateGossip"] == "On" then + gossipFrame:RegisterEvent("GOSSIP_SHOW") + else + gossipFrame:UnregisterEvent("GOSSIP_SHOW") + end + end + + -- Setup events when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutomateGossip"]:HookScript("OnClick", SetupEvents) + if LeaPlusLC["AutomateGossip"] == "On" then SetupEvents() end + + -- Create tables for specific NPC IDs (these are automatically selected with no alt key requirement) + local npcTable = { + + -- Stable masters (https://www.wowhead.com/wotlk/npcs?filter=27;1;0) + 9988, 21518, 15131, 10055, 21517, 11069, 9985, 22469, 19476, 21336, 10060, 16586, 16094, 18250, 16824, 23392, 15722, 9977, 19018, 9987, 19368, 6749, 10058, 22468, 11104, 9986, 13617, 10046, 10048, 10051, 10053, 10054, 17485, 18244, 10045, 24974, 16665, 25037, 16656, 10057, 18984, 9984, 11105, 10056, 16185, 10059, 16764, 11119, 14741, 10085, 10061, 19019, 10052, 10047, 10063, 9979, 17666, 11117, 10049, 17896, 9983, 24905, 9989, 9982, 10050, 9980, 9981, 10062, 9976, 9978, 13616, + + -- Dalaran: Brassbolt Mechawrench (Alliance) and Reginald Arcfire (Horde) (engineer auctioneers) + 35594, 35607, + + -- Banker + 2625, 2455, 2458, 31420, 19318, 3309, 21733, 21732, 29282, 30606, 28676, 30607, 38919, 2461, 18350, 30608, 5060, 2460, 19246, 29530, 17631, 8356, 16617, 17632, 36284, 3496, 4209, 17633, 2457, 16710, 3318, 31421, 4208, 28343, 19034, 2459, 16615, 4550, 17773, 29283, 16616, 8124, 8123, 5099, 31422, 3320, 28680, 28679, 30605, 28678, 28677, 28675, 2996, 36352, 4549, 8119, 38920, 38921, 8357, 7799, 4155, 13917, 19338, 2456, 36351, 30604, 21734, + + -- Flightmaster + 23859, 32571, 28574, 28674, 24795, 28615, 3310, 931, 29480, 1387, 25288, 26851, 18789, 10583, 26878, 11901, 12578, 11900, 20234, 26852, 26881, 27046, 2859, 26602, 10897, 6726, 4312, 26880, 18930, 6706, 16587, 16227, 6026, 4267, 2432, 8610, 28624, 18940, 26847, 1571, 27344, 7823, 28618, 1573, 18938, 8020, 22455, 22935, 4407, 1572, 13177, 8609, 18931, 4321, 2299, 16822, 20762, 12577, 26845, 12617, 17554, 26560, 23736, 4319, 21766, 18937, 19558, 12596, 18939, 7824, 3841, 2835, 28196, 15177, 19317, 18791, 2409, 22216, 8019, 22931, 19583, 2858, 3305, 28623, 18808, 22485, 20515, 18942, 18807, 18785, 2941, 19581, 11138, 4551, 26566, 4317, 10378, 21107, 11899, 26879, 18953, 2851, 3615, 352, 23612, 12740, 12636, 2861, 8018, 2226, 24851, 18788, 24366, 15178, 16189, 16192, 17555, 2995, 3838, 12616, 11139, 2389, 18809, 4314, 28197, 523, + 37888, -- Added manually + + -- Trainer + 31238, 28701, 31247, 28697, 28699, 29631, 28746, 28705, 18988, 26989, 28703, 26953, 8126, 19186, 18987, 35093, 35135, 35133, 26992, 18911, 5482, 28693, 29156, 25277, 25099, 26986, 33676, 26905, 35100, 29233, 26972, 29513, 3494, 18773, 16583, 18753, 19778, 24868, 4752, 26990, 26991, 4732, 26982, 28742, 26975, 28698, 18774, 28694, 33682, 28706, 26956, 27001, 3399, 18993, 26976, 18990, 28700, 33680, 18751, 26964, 19775, 26974, 26997, 3026, 26955, 5159, 4552, 23734, 26999, 26969, 26994, 26980, 4586, 16253, 16588, 26912, 31084, 26907, 18991, 16280, 26960, 26915, 26987, 1430, 26962, 26954, 26910, 19252, 26914, 3028, 7406, 32474, 26963, 18802, 19052, 20914, 18775, 12042, 26988, 30721, 28702, 27000, 7954, 3690, 26998, 26981, 33614, 18779, 26993, 17637, 17634, 26906, 28958, 4772, 5493, 20500, 33613, 4773, 26951, 5518, 16823, 26958, 20511, 5938, 4210, 11869, 11868, 18749, 11865, 18777, 26903, 5174, 8736, 11557, 33638, 18747, 3067, 33610, 29505, 26977, 18772, 28696, 33617, 30722, 6251, 18752, 29194, 30713, 17110, 11867, 5491, 18771, 20791, 26952, 4218, 4753, 17246, 6297, 7944, 1651, 7953, 11870, 15501, 6707, 3332, 17204, 29514, 19185, 23128, 33679, 11017, 27703, 30706, 26995, 18755, 5885, 33611, 7866, 16676, 6286, 4568, 19540, 3064, 29195, 19187, 18776, 18748, 3355, 7867, 3032, 5161, 3412, 3352, 4217, 18018, 4606, 23127, 33615, 5513, 19180, 5511, 8306, 908, 11866, 4573, 925, 5127, 3324, 28472, 18754, 837, 2704, 19184, 28474, 3373, 26959, 28704, 30717, 928, 8146, 10993, 28956, 16681, 20407, 19063, 1218, 3036, 543, 375, 16646, 4156, 3136, 16773, 11074, 16621, 9584, 19539, 3347, 223, 11097, 3345, 6288, 987, 3401, 912, 5958, 7311, 8738, 26564, 1681, 7869, 7870, 461, 915, 985, 8128, 916, 3033, 16771, 16663, 957, 1346, 19341, 3365, 16499, 911, 13283, 29509, 2327, 3030, 5566, 17222, 3001, 5172, 33683, 33621, 3327, 895, 15400, 4258, 17215, 4211, 2367, 4165, 13417, 7871, 5564, 22477, 914, 2836, 16266, 2399, 7312, 1231, 14740, 1382, 11025, 11401, 5502, 2818, 5392, 3326, 3606, 5173, 13084, 17101, 30715, 4219, 4254, 11098, 17513, 11406, 376, 16653, 17509, 11072, 29196, 19340, 16633, 5880, 3967, 33608, 16662, 4215, 3047, 6291, 7946, 5515, 3181, 17520, 7231, 5113, 20124, 8144, 16755, 5506, 2798, 16277, 17481, 4212, 11073, 4588, 16669, 5144, 5149, 1701, 19251, 11031, 17482, 5165, 4576, 1473, 1317, 3137, 2329, 16721, 17219, 1458, 16684, 3607, 5957, 5690, 1355, 3963, 16667, 1229, 986, 3039, 5497, 27034, 3344, 3013, 3063, 28471, 2492, 27705, 913, 3357, 16719, 5166, 16679, 3034, 3354, 3706, 3041, 3007, 19576, 16728, 16658, 3009, 5114, 7232, 4598, 927, 20406, 5115, 5164, 6306, 16680, 2837, 3555, 3175, 8153, 30709, 5943, 514, 16647, 5505, 3171, 2857, 11052, 11029, 17483, 5495, 17844, 3406, 16651, 1632, 2390, 5148, 10090, 16367, 4593, 2129, 4609, 17488, 5498, 16774, 4214, 1470, 11037, 5492, 1404, 5499, 1292, 4591, 4583, 2834, 11397, 11096, 5137, 1386, 5496, 33618, 3173, 4163, 5171, 7088, 17212, 3040, 6295, 20125, 4160, 16660, 17484, 19369, 4611, 1676, 3353, 1234, 27704, 1411, 4138, 3170, 3038, 16640, 12961, 5941, 12032, 3045, 1226, 2489, 7089, 17442, 16752, 16726, 11177, 29506, 918, 5882, 15513, 10276, 5504, 4089, 5177, 3169, 6018, 5479, 4090, 23534, 1385, 5484, 2128, 4582, 23103, 4205, 16749, 17487, 5167, 16269, 5157, 17441, 16655, 11146, 11028, 3154, 3602, 2998, 17121, 3707, 3964, 3600, 16659, 16688, 3363, 1228, 12030, 12025, 16725, 16686, 16275, 16731, 1700, 377, 6287, 16366, 15283, 5939, 7949, 3065, 4900, 812, 16161, 4087, 1232, 17514, 11068, 17245, 16644, 16756, 8141, 16736, 3545, 2119, 7315, 3290, 16738, 3172, 16780, 3174, 16685, 5883, 17089, 5612, 9465, 4584, 4193, 3179, 10086, 5480, 4596, 3404, 5153, 4578, 5145, 4563, 4566, 16272, 17504, 16503, 7948, 3061, 331, 16160, 3604, 29507, 3597, 15284, 3044, 3605, 16654, 3066, 5150, 5146, 3328, 15285, 4567, 16729, 3155, 5567, 2391, 3407, 1383, 11026, 3004, 5516, 16500, 1246, 10088, 328, 16502, 30710, 5994, 1215, 8308, 17214, 2856, 16501, 2131, 4595, 17120, 3698, 11178, 1702, 5489, 4320, 16642, 3069, 3603, 10930, 11044, 6387, 459, 17005, 11081, 17511, 2114, 3046, 4204, 3594, 3153, 16712, 3060, 2627, 1699, 1466, 3622, 10277, 3557, 16675, 3059, 17983, 17519, 2124, 17510, 11066, 15279, 5501, 1901, 3043, 198, 17505, 7087, 33681, 11047, 3598, 11070, 4092, 2485, 4616, 1300, 16723, 5884, 3008, 11067, 2130, 4614, 2126, 3062, 3184, 11041, 3325, 17434, 11071, 3156, 5759, 5116, 2878, 18804, 16652, 3688, 16763, 17480, 2127, 7868, 3042, 16278, 3549, 3157, 10089, 2855, 4213, 16279, 11084, 5500, 5141, 10278, 3049, 5143, 16692, 10266, 1703, 5147, 11051, 11048, 1683, 11046, 16674, 3624, 3593, 17424, 4594, 3596, 16761, 4605, 3523, 4898, 6094, 2132, 3087, 3965, 11083, 2123, 2122, 3601, 6292, 1103, 4607, 4608, 3620, 4091, 15280, 4146, 5811, 2879, 988, 3306, 3484, 3703, 4564, 3704, 16273, 1680, 4159, 16724, 3185, 16276, 6289, 5117, 11049, 4565, 3595, 7230, 3403, 11042, 16672, 3011, 16271, 2326, 11065, 5517, 3031, 1241, 3478, 11050, 3048, 5695, 17122, 5784, 6014, 6290, 16648, 3408, 5142, 926, 8140, 6299, 19478, 21087, 16270, 3599, 8142, 917, 944, 16673, 460, 906, + + -- Vendor + 30431, 32538, 32287, 32540, 32533, 31238, 29529, 28997, 32172, 31580, 27730, 28995, 28701, 32763, 32565, 28992, 29636, 8137, 31579, 29523, 32514, 31582, 18960, 32216, 28721, 35507, 32564, 28718, 7947, 18484, 29537, 12781, 20096, 18988, 32515, 340, 19186, 18987, 31863, 19296, 29535, 31581, 31031, 18911, 4561, 2664, 8139, 28722, 16585, 35508, 20097, 25206, 8145, 19663, 35498, 31910, 32773, 19373, 32380, 20028, 12022, 2810, 18011, 28715, 12793, 2821, 29547, 21655, 4229, 18015, 31032, 32385, 18773, 2803, 2806, 16583, 18753, 19004, 31916, 5494, 8125, 32509, 29493, 19213, 28742, 66, 29744, 32774, 18756, 18774, 16786, 12919, 15174, 33026, 18993, 29532, 20916, 1448, 18990, 30472, 16826, 29527, 3556, 19383, 18751, 34252, 28951, 28714, 29587, 25977, 5940, 19038, 31911, 1465, 29478, 18382, 3027, 14846, 2685, 31865, 31864, 21113, 28776, 12944, 16253, 19662, 3482, 16588, 16657, 3323, 14753, 5594, 19837, 24539, 30885, 12783, 18005, 18991, 4877, 19074, 12246, 10618, 7564, 12245, 26484, 12788, 28040, 1275, 18957, 32834, 12778, 19575, 14754, 20980, 21432, 17904, 18525, 13219, 35496, 23489, 32594, 19042, 12796, 18802, 8678, 16782, 29528, 16624, 3489, 4574, 5162, 32832, 18775, 5817, 6548, 11189, 29628, 26941, 17512, 28687, 2393, 1286, 20080, 14847, 32383, 35497, 9499, 19227, 20240, 3954, 8666, 12043, 1148, 19661, 11185, 28692, 27037, 25046, 19617, 29715, 29491, 11187, 16823, 28589, 3348, 13217, 3313, 30006, 18749, 6367, 3497, 21643, 22212, 5483, 16860, 28038, 30825, 7775, 15419, 4305, 11557, 33638, 29049, 3546, 22208, 4879, 3333, 32631, 27012, 4897, 1257, 19331, 15127, 26977, 25314, 18772, 2663, 6779, 13218, 23732, 28990, 14860, 26110, 14624, 1285, 1263, 14322, 33027, 15126, 18897, 35099, 3335, 2381, 23007, 14921, 18752, 16262, 5519, 1684, 3029, 21019, 32356, 35500, 29495, 18771, 29497, 32337, 17657, 12033, 27011, 32381, 3881, 26938, 27668, 2480, 734, 13216, 5188, 17585, 23381, 17246, 233, 4307, 32382, 20377, 21474, 20241, 8665, 19772, 4453, 3346, 35132, 13476, 9179, 20242, 27722, 22213, 8401, 28685, 19196, 24780, 1301, 5193, 33679, 12795, 6746, 27039, 16635, 277, 4731, 5942, 24291, 29716, 19694, 15179, 26995, 3960, 19521, 20981, 16602, 19232, 3550, 23802, 25032, 1303, 35101, 30723, 29548, 19540, 27721, 3362, 989, 24341, 1460, 28991, 12943, 28993, 1347, 31781, 2848, 23367, 29496, 13433, 1318, 8679, 4200, 4217, 18672, 18018, 23604, 11056, 21485, 16631, 26352, 5101, 5151, 2832, 16528, 4553, 19182, 5611, 483, 29688, 18427, 7854, 21906, 5049, 24357, 167, 3614, 12794, 25976, 12384, 29499, 2805, 32641, 32334, 16015, 1307, 10667, 19538, 35131, 3495, 32639, 8161, 12942, 27142, 8681, 3413, 30730, 27063, 29203, 11057, 19197, 3133, 32413, 4226, 20278, 3400, 14637, 15351, 18754, 5514, 152, 29702, 15006, 5160, 31776, 5175, 15350, 789, 5815, 28723, 11278, 3334, 3366, 1261, 3081, 2670, 1302, 12957, 26600, 19053, 843, 1325, 5565, 25195, 21183, 27267, 28691, 8361, 3342, 27134, 829, 19539, 384, 1299, 222, 945, 29703, 12096, 3562, 4981, 836, 981, 3490, 22491, 9636, 2383, 227, 5753, 19857, 226, 2626, 12785, 3023, 6777, 26596, 2118, 20510, 17553, 16376, 16638, 24396, 29291, 980, 3685, 15165, 1311, 19015, 10118, 13420, 19321, 16264, 23521, 844, 8158, 2838, 1304, 28726, 956, 25178, 8176, 11555, 6740, 258, 793, 1237, 74, 23748, 4730, 791, 3351, 4577, 28725, 24188, 5178, 984, 982, 31557, 16442, 28994, 15293, 17222, 11038, 2672, 15197, 958, 20092, 28727, 1328, 16268, 19678, 3358, 4575, 29538, 9501, 372, 19342, 32354, 15471, 12784, 1313, 7955, 959, 27144, 4265, 4225, 19773, 4221, 17584, 26898, 896, 8404, 15400, 25196, 2481, 3364, 4165, 2687, 1213, 29905, 18907, 5111, 6929, 15291, 29510, 3135, 28716, 29908, 16224, 30438, 21905, 18266, 2482, 26945, 1321, 27138, 32355, 27030, 19536, 1298, 14437, 23437, 14740, 30735, 12792, 5848, 32412, 2380, 31804, 12799, 27195, 3488, 1146, 12956, 5173, 9087, 4602, 5128, 21112, 32477, 1669, 17101, 1250, 1314, 27935, 14337, 10216, 29962, 6741, 8150, 1305, 4590, 1287, 33019, 4878, 17930, 13018, 23159, 1308, 3955, 23208, 27711, 14522, 27146, 15011, 26599, 27031, 3481, 1291, 20986, 16708, 28728, 11188, 3369, 3493, 960, 1289, 23484, 19879, 11116, 1471, 12941, 4083, 1454, 3536, 3015, 4173, 8157, 16829, 12024, 32642, 27052, 18954, 16191, 20808, 16649, 1149, 4228, 25278, 16611, 3537, 28989, 29512, 1294, 24054, 27071, 5163, 27148, 16709, 16722, 3168, 4184, 3018, 23731, 17630, 6807, 8403, 23428, 6574, 3359, 8178, 4085, 24468, 7852, 11536, 23145, 7945, 10367, 27019, 2622, 1690, 5158, 29907, 7952, 2135, 4604, 7683, 4610, 14480, 19932, 1312, 25274, 11183, 24033, 23263, 26936, 2697, 3578, 20494, 12019, 29288, 26934, 18898, 4585, 3367, 12097, 3085, 29014, 4885, 16444, 2265, 16766, 3410, 19574, 16641, 19011, 26868, 1645, 27489, 22225, 20807, 1407, 3935, 2819, 16636, 3409, 23896, 1316, 16705, 3350, 20616, 228, 21488, 5110, 21084, 27817, 16553, 18906, 4894, 6374, 12021, 3577, 2668, 3180, 29277, 30434, 6300, 4170, 5100, 4556, 8508, 3962, 6731, 1247, 33018, 4892, 12023, 28046, 3134, 3958, 4558, 5758, 27140, 3658, 12959, 27186, 3551, 19718, 16678, 29122, 18017, 27055, 32478, 32416, 3178, 18019, 15864, 16612, 6568, 18542, 26569, 28707, 27667, 28796, 24333, 18267, 20081, 16367, 1351, 16739, 29922, 54, 29205, 4220, 19371, 2397, 26968, 15292, 23862, 21110, 2682, 32638, 3316, 28760, 3956, 2264, 7733, 6747, 19495, 2388, 7736, 6730, 5512, 3322, 19474, 3937, 1691, 27185, 27053, 28812, 27478, 19330, 19047, 26707, 1694, 11874, 19836, 2134, 8878, 12026, 4241, 12029, 2364, 1323, 3539, 19450, 16677, 19473, 8177, 14581, 14371, 30439, 1326, 5189, 4259, 27938, 19013, 19245, 3534, 2679, 8117, 16443, 18664, 26474, 27137, 27149, 8131, 6576, 31024, 12777, 12782, 20378, 20249, 7940, 24148, 19533, 19534, 27950, 24510, 4891, 23064, 4555, 19518, 4223, 6567, 12958, 4256, 23511, 24408, 5112, 16748, 26908, 18564, 2352, 5688, 6790, 6791, 3610, 19195, 13435, 30241, 17489, 19560, 13434, 24975, 32421, 19020, 30724, 3533, 3076, 4183, 2814, 16767, 8160, 30572, 19479, 16632, 18810, 16263, 16718, 18009, 3528, 3532, 27181, 491, 31115, 7879, 2699, 2684, 2688, 27057, 28871, 15199, 14737, 5520, 23606, 7976, 4562, 24342, 5169, 4899, 15176, 2842, 22099, 20082, 26568, 16664, 25248, 3952, 23244, 8359, 18581, 28807, 2816, 20463, 18255, 2113, 10856, 23522, 16713, 4893, 5620, 3097, 7978, 5570, 3096, 28827, 4182, 4266, 16683, 26398, 2137, 4587, 16670, 2845, 3091, 3298, 4600, 2698, 5820, 4232, 1692, 16716, 19561, 2839, 2844, 30731, 18905, 1464, 6930, 28682, 3491, 25245, 2483, 15012, 2401, 1697, 3589, 3588, 4231, 5748, 8305, 5411, 5870, 8362, 29511, 19520, 27147, 27143, 1297, 5129, 19239, 18010, 2394, 4888, 28791, 16620, 2357, + + -- Battlemaster and Arenamaster + 12197, 29318, 15006, 26007, 857, 907, 35007, 19859, 3890, 7029, 35023, 15008, 34999, 15972, 34955, 7885, 34991, 19905, 14981, 14982, 19907, 347, 7427, 7410, 20271, 19855, 29568, 19858, 2302, 14942, 17506, 15007, 34983, 5238, 29234, 32332, 1037, 10360, 2804, 30578, 20388, 30171, 5118, 18439, 32333, 20120, 19908, 30581, 20118, 14879, 16711, 20381, 35024, 22516, 25991, 20200, 7314, 20269, 34895, 35027, 30583, 18895, 20272, 30584, 35017, 19811, 20386, 34971, 20273, 34972, 19915, 20274, 30587, 20390, 19923, 20497, 34976, 12198, 19925, 16695, 20362, 35022, 20499, 14623, 16696, 20374, 21235, 19909, 40413, 20382, 32330, 20119, 30579, 35000, 34985, 30580, 35001, 35025, 35002, 17507, 20383, 34437, 35026, 20384, 19910, 35008, 20385, 19912, 29533, 30586, 35019, 34993, 35020, 16694, 30231, 19906, 34986, 34987, 19911, 34989, 30590, 35021, 30610, 30582, 34988, 20276, 34978, 34973, 34997, 34998 + + } + + -- Event handler + gossipFrame:SetScript("OnEvent", function() + -- Special treatment for specific NPCs + local npcGuid = UnitGUID("target") or nil + if npcGuid and not IsShiftKeyDown() then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + -- Open rogue doors in Dalaran (Broken Isles) automatically + if npcID == "96782" -- Lucian Trias + or npcID == "93188" -- Mongar + or npcID == "97004" -- "Red" Jack Findle + then + SkipGossip() + return + end + -- Skip gossip with no alt key requirement + if npcID == "132969" -- Katy Stampwhistle (toy) + or npcID == "104201" -- Katy Stampwhistle (npc) + or tContains(npcTable, tonumber(npcID)) + then + SkipGossip(true) -- true means skip alt key requirement + return + end + end + end + -- Process gossip + SkipGossip() + end) + + end + + ---------------------------------------------------------------------- + -- Faster looting + ---------------------------------------------------------------------- + + if LeaPlusLC["FasterLooting"] == "On" then + + -- Time delay + local tDelay = 0 + + -- Fast loot function + local function FastLoot() + if GetTime() - tDelay >= 0.3 then + tDelay = GetTime() + if GetCVarBool("autoLootDefault") ~= IsModifiedClick("AUTOLOOTTOGGLE") then + if TSMDestroyBtn and TSMDestroyBtn:IsShown() and TSMDestroyBtn:GetButtonState() == "DISABLED" then tDelay = GetTime() return end + local lootMethod = GetLootMethod() + if lootMethod == "master" then + -- Master loot is enabled so fast loot if item should be auto looted + local lootThreshold = GetLootThreshold() + for i = GetNumLootItems(), 1, -1 do + local lootIcon, lootName, lootQuantity, currencyID, lootQuality = GetLootSlotInfo(i) + if lootQuality and lootThreshold and lootQuality < lootThreshold then + LootSlot(i) + end + end + else + -- Master loot is disabled so fast loot regardless + local grouped = IsInGroup() + for i = GetNumLootItems(), 1, -1 do + local lootIcon, lootName, lootQuantity, currencyID, lootQuality, locked = GetLootSlotInfo(i) + local slotType = GetLootSlotType(i) + if lootName and not locked then + if not grouped then + LootSlot(i) + else + if lootMethod == "freeforall" then + if slotType == LOOT_SLOT_ITEM then + LootSlot(i) + end + else + LootSlot(i) + end + end + end + end + end + tDelay = GetTime() + end + end + end + + -- Event frame + local faster = CreateFrame("Frame") + faster:RegisterEvent("LOOT_READY") + faster:SetScript("OnEvent", FastLoot) + + end + + ---------------------------------------------------------------------- + -- Disable bag automation + ---------------------------------------------------------------------- + + if LeaPlusLC["NoBagAutomation"] == "On" and not LeaLockList["NoBagAutomation"] then + RunScript("hooksecurefunc('OpenAllBags', CloseAllBags)") + end + + ---------------------------------------------------------------------- + -- Automate quests (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local QuestPanel = LeaPlusLC:CreatePanel("Automate quests", "QuestPanel") + + LeaPlusLC:MakeTx(QuestPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(QuestPanel, "AutoQuestAvailable", "Accept available quests automatically", 16, -92, false, "If checked, available quests will be accepted automatically.") + LeaPlusLC:MakeCB(QuestPanel, "AutoQuestCompleted", "Turn-in completed quests automatically", 16, -112, false, "If checked, completed quests will be turned-in automatically.") + LeaPlusLC:MakeCB(QuestPanel, "AutoQuestShift", "Require override key for quest automation", 16, -132, false, "If checked, you will need to hold the override key down for quests to be automated.|n|nIf unchecked, holding the override key will prevent quests from being automated.") + + LeaPlusLC:CreateDropDown("AutoQuestKeyMenu", "Override key", QuestPanel, 146, "TOPLEFT", 356, -115, {L["SHIFT"], L["ALT"], L["CONTROL"], L["CMD (MAC)"]}, "") + + -- Help button hidden + QuestPanel.h:Hide() + + -- Back button handler + QuestPanel.b:SetScript("OnClick", function() + QuestPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + QuestPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoQuestShift"] = "Off" + LeaPlusLC["AutoQuestAvailable"] = "On" + LeaPlusLC["AutoQuestCompleted"] = "On" + LeaPlusLC["AutoQuestKeyMenu"] = 1 + + -- Refresh panel + QuestPanel:Hide(); QuestPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutomateQuestsBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoQuestShift"] = "Off" + LeaPlusLC["AutoQuestAvailable"] = "On" + LeaPlusLC["AutoQuestCompleted"] = "On" + LeaPlusLC["AutoQuestKeyMenu"] = 1 + else + QuestPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to determine if override key is being held + local function IsOverrideKeyDown() + if LeaPlusLC["AutoQuestKeyMenu"] == 1 and IsShiftKeyDown() + or LeaPlusLC["AutoQuestKeyMenu"] == 2 and IsAltKeyDown() + or LeaPlusLC["AutoQuestKeyMenu"] == 3 and IsControlKeyDown() + or LeaPlusLC["AutoQuestKeyMenu"] == 4 and IsMetaKeyDown() + then + return true + end + end + + -- Funcion to ignore specific NPCs + local function isNpcBlocked(actionType) + local npcGuid = UnitGUID("target") or nil + if npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + -- Ignore specific NPCs for selecting, accepting and turning-in quests (required if automation has consequences) + if npcID == "15192" -- Anachronos (Caverns of Time) + or npcID == "19935" -- Soridormi (The Scale of Sands, Caverns of Time) + or npcID == "19936" -- Arazmodu (The Scale of Sands, Caverns of Time) + or npcID == "3430" -- Mangletooth (Blood Shard quests, Barrens) + or npcID == "14828" -- Gelvas Grimegate (Darkmoon Faire Ticket Redemption, Elwynn Forest and Mulgore) + or npcID == "14921" -- Rin'wosho the Trader (Zul'Gurub Isle, Stranglethorn Vale) + or npcID == "18166" -- Khadgar (Allegiance to Aldor/Scryer, Shattrath) + or npcID == "18253" -- Archmage Leryda (Violet Signet, Karazhan) + then + return true + end + -- Same but for specific NPCs with special requirements + if npcID == "32540" then -- Lillehoff (The Sons of Hodir Quartermaster, The Storm Peaks) + local name, description, standingID = GetFactionInfoByID(1119) + if standingID and standingID >= 8 then -- Dont automate quests if exalted + return true + end + end + -- Ignore specific NPCs for accepting quests only + if actionType == "Accept" then + -- Classic escort quests + if npcID == "467" -- The Defias Traitor (The Defias Brotherhood) + or npcID == "349" -- Corporal Keeshan (Missing In Action) + or npcID == "1379" -- Miran (Protecting the Shipment) + or npcID == "7766" -- Tyrion (The Attack!) + or npcID == "1978" -- Deathstalker Erland (Escorting Erland) + or npcID == "7784" -- Homing Robot OOX-17/TN (Rescue OOX-17/TN!) + or npcID == "2713" -- Kinelory (Hints of a New Plague?) + or npcID == "2768" -- Professor Phizzlethorpe (Sunken Treasure) + or npcID == "2610" -- Shakes O'Breen (Death From Below) + or npcID == "2917" -- Prospector Remtravel (The Absent Minded Prospector) + or npcID == "7806" -- Homing Robot OOX-09/HL (Rescue OOX-09/HL!) + or npcID == "3439" -- Wizzlecrank's Shredder (The Escape) + or npcID == "3465" -- Gilthares Firebough (Free From the Hold) + or npcID == "3568" -- Mist (Mist) + or npcID == "3584" -- Therylune (Therylune's Escape) + or npcID == "4484" -- Feero Ironhand (Supplies to Auberdine) + or npcID == "3692" -- Volcor (Escape Through Force) + or npcID == "4508" -- Willix the Importer (Willix the Importer) + or npcID == "4880" -- "Stinky" Ignatz (Stinky's Escape) + or npcID == "4983" -- Ogron (Questioning Reethe) + or npcID == "5391" -- Galen Goodward (Galen's Escape) + or npcID == "5644" -- Dalinda Malem (Return to Vahlarriel) + or npcID == "5955" -- Tooga (Tooga's Quest) + or npcID == "7780" -- Rin'ji (Rin'ji is Trapped!) + or npcID == "7807" -- Homing Robot OOX-22/FE (Rescue OOX-22/FE!) + or npcID == "7774" -- Shay Leafrunner (Wandering Shay) + or npcID == "7850" -- Kernobee (A Fine Mess) + or npcID == "8284" -- Dorius Stonetender (Suntara Stones) + or npcID == "8380" -- Captain Vanessa Beltis (A Crew Under Fire) + or npcID == "8516" -- Belnistrasz (Extinguishing the Idol) + or npcID == "9020" -- Commander Gor'shak (What Is Going On?) + or npcID == "9520" -- Grark Lorkrub (Precarious Predicament) + or npcID == "9623" -- A-Me 01 (Chasing A-Me 01) + or npcID == "9598" -- Arei (Ancient Spirit) + or npcID == "9023" -- Marshal Windsor (Jail Break!) + or npcID == "9999" -- Ringo (A Little Help From My Friends) + or npcID == "10427" -- Pao'ka Swiftmountain (Homeward Bound) + or npcID == "10300" -- Ranshalla (Guardians of the Altar) + or npcID == "10646" -- Lakota Windsong (Free at Last) + or npcID == "10638" -- Kanati Greycloud (Protect Kanati Greycloud) + or npcID == "11016" -- Captured Arko'narin (Rescue From Jaedenar) + or npcID == "11218" -- Kerlonian Evershade (The Sleeper Has Awakened) + or npcID == "11711" -- Sentinel Aynasha (One Shot. One Kill.) + or npcID == "11625" -- Cork Gizelton (Bodyguard for Hire) + or npcID == "11626" -- Rigger Gizelton (Gizelton Caravan) + or npcID == "1842" -- Highlord Taelan Fordring (In Dreams) + or npcID == "12277" -- Melizza Brimbuzzle (Get Me Out of Here!) + or npcID == "12580" -- Reginald Windsor (The Great Masquerade) + or npcID == "12818" -- Ruul Snowhoof (Freedom to Ruul) + or npcID == "11856" -- Kaya Flathoof (Protect Kaya) + or npcID == "12858" -- Torek (Torek's Assault) + or npcID == "12717" -- Muglash (Vorsha the Lasher) + or npcID == "13716" -- Celebras the Redeemed (The Scepter of Celebras) + or npcID == "19401" -- Wing Commander Brack (Return to the Abyssal Shelf) (Horde) + or npcID == "20235" -- Gryphoneer Windbellow (Return to the Abyssal Shelf) (Alliance) + -- BCC escort quests + or npcID == "16295" -- Ranger Lilatha (Escape from the Catacombs) + or npcID == "17238" -- Anchorite Truuen (Tomb of the Lightbringer) + or npcID == "17312" -- Magwin (A Cry For Help) + or npcID == "17877" -- Fhwoor (Fhwoor Smash!) + or npcID == "17969" -- Kayra Longmane (Escape from Umbrafen) + or npcID == "18210" -- Mag'har Captive (The Totem of Kar'dash, Horde) + or npcID == "18209" -- Kurenai Captive (The Totem of Kar'dash, Alliance) + or npcID == "18760" -- Isla Starmane (Escape from Firewing Point!) + or npcID == "19589" -- Maxx A. Million Mk. V (Mark V is Alive!) + or npcID == "19671" -- Cryo-Engineer Sha'heen (Someone Else's Hard Work Pays Off) + or npcID == "20281" -- Drijya (Sabotage the Warp-Gate!) + or npcID == "20415" -- Bessy (When the Cows Come Home) + or npcID == "20482" -- Image of Commander Ameer (Delivering the Message) + or npcID == "20763" -- Captured Protectorate Vanguard (Escape from the Staging Grounds) + or npcID == "21027" -- Earthmender Wilda (Escape from Coilskar Cistern) + or npcID == "22424" -- Skywing (Skywing) + or npcID == "22458" -- Chief Archaeologist Letoll (Digging Through Bones) + or npcID == "23383" -- Skyguard Prisoner (Escape from Skettis) + then + return true + end + end + -- Ignore specific NPCs for selecting quests only (only used for items that have no other purpose) + if actionType == "Select" then + if npcID == "12944" -- Lokhtos Darkbargainer (Thorium Brotherhood, Blackrock Depths) + or npcID == "19401" -- Wing Commander Brack (Return to the Abyssal Shelf) (Horde) + or npcID == "20235" -- Gryphoneer Windbellow (Return to the Abyssal Shelf) (Alliance) + or npcID == "10307" -- Witch Doctor Mau'ari (E'Ko quests, Winterspring) + -- Ahn'Qiraj War Effort (Alliance, Ironforge) + or npcID == "15446" -- Bonnie Stoneflayer (Light Leather Collector) + or npcID == "15458" -- Commander Stronghammer (Alliance Ambassador) + or npcID == "15431" -- Corporal Carnes (Iron Bar Collector) + or npcID == "15432" -- Dame Twinbraid (Thorium Bar Collector) + or npcID == "15453" -- Keeper Moonshade (Runecloth Bandage Collector) + or npcID == "15457" -- Huntress Swiftriver (Spotted Yellowtail Collector) + or npcID == "15450" -- Marta Finespindle (Thick Leather Collector) + or npcID == "15437" -- Master Nightsong (Purple Lotus Collector) + or npcID == "15452" -- Nurse Stonefield (Silk Bandage Collector) + or npcID == "15434" -- Private Draxlegauge (Stranglekelp Collector) + or npcID == "15448" -- Private Porter (Medium Leather Collector) + or npcID == "15456" -- Sarah Sadwhistle (Roast Raptor Collector) + or npcID == "15451" -- Sentinel Silversky (Linen Bandage Collector) + or npcID == "15445" -- Sergeant Major Germaine (Arthas' Tears Collector) + or npcID == "15383" -- Sergeant Stonebrow (Copper Bar Collector) + or npcID == "15455" -- Slicky Gastronome (Rainbow Fin Albacore Collector) + -- Ahn'Qiraj War Effort (Horde, Orgrimmar) + or npcID == "15512" -- Apothecary Jezel (Purple Lotus Collector) + or npcID == "15508" -- Batrider Pele'keiki (Firebloom Collector) + or npcID == "15533" -- Bloodguard Rawtar (Lean Wolf Steak Collector) + or npcID == "15535" -- Chief Sharpclaw (Baked Salmon Collector) + or npcID == "15525" -- Doctor Serratus (Rugged Leather Collector) + or npcID == "15534" -- Fisherman Lin'do (Spotted Yellowtail Collector) + or npcID == "15539" -- General Zog (Horde Ambassador) + or npcID == "15460" -- Grunt Maug (Tin Bar Collector) + or npcID == "15528" -- Healer Longrunner (Wool Bandage Collector) + or npcID == "15477" -- Herbalist Proudfeather (Peacebloom Collector) + or npcID == "15529" -- Lady Callow (Mageweave Bandage Collector) + or npcID == "15459" -- Miner Cromwell (Copper Bar Collector) + or npcID == "15469" -- Senior Sergeant T'kelah (Mithril Bar Collector) + or npcID == "15522" -- Sergeant Umala (Thick Leather Collector) + or npcID == "15515" -- Skinner Jamani (Heavy Leather Collector) + or npcID == "15532" -- Stoneguard Clayhoof (Runecloth Bandage Collector) + -- Alliance Commendations + or npcID == "15764" -- Officer Ironbeard (Ironforge Commendations) + or npcID == "15762" -- Officer Lunalight (Darnassus Commendations) + or npcID == "15766" -- Officer Maloof (Stormwind Commendations) + or npcID == "15763" -- Officer Porterhouse (Gnomeregan Commendations) + -- Horde Commendations + or npcID == "15768" -- Officer Gothena (Undercity Commendations) + or npcID == "15765" -- Officer Redblade (Orgrimmar Commendations) + or npcID == "15767" -- Officer Thunderstrider (Thunder Bluff Commendations) + or npcID == "15761" -- Officer Vu'Shalay (Darkspear Commendations) + -- Battlegrounds (Alliance) + or npcID == "13442" -- Arch Druid Renferal (Storm Crystal, Alterac Valley) + -- Battlegrounds (Horde) + or npcID == "13236" -- Primalist Thurloga (Stormpike Soldier's Blood, Alterac Valley) + -- Scourgestones + or npcID == "11039" -- Duke Nicholas Zverenhoff (Eastern Plaguelands) + -- Un'Goro crystals + or npcID == "9117" -- J. D. Collie (Un'Goro Crater) + then + return true + end + end + end + end + end + + -- Function to check if quest requires a blocked item + local function QuestRequiresBlockedItem() + for i = 1, 6 do + local progItem = _G["QuestProgressItem" ..i] or nil + if progItem and progItem:IsShown() and progItem.type == "required" then + if progItem.objectType == "item" then + local name, texture, numItems = GetQuestItemInfo("required", i) + if name then + local itemID = GetItemInfoInstant(name) + if itemID then + if itemID == 9999999999 then -- Reserved for future use + return true + end + end + end + end + end + end + end + + -- Function to check if quest requires gold + local function QuestRequiresGold() + local goldRequiredAmount = GetQuestMoneyToGet() + if goldRequiredAmount and goldRequiredAmount > 0 then + return true + end + end + + -- Function to check if quest title has requirements met + local function DoesQuestHaveRequirementsMet(title) + if title and title ~= "" then + + if not title then + + -- Battlemasters + elseif title == L["Concerted Efforts"] or title == L["For Great Honor"] then + -- Requires 3 Alterac Valley Mark of Honor, 3 Arathi Basin Mark of Honor, 3 Warsong Gulch Mark of Honor (must be before other Mark of Honor quests) + if GetItemCount(20560) >= 3 and GetItemCount(20559) >= 3 and GetItemCount(20558) >= 3 then return true end + elseif title == L["Remember Alterac Valley!"] or title == L["Invaders of Alterac Valley"] then + -- Requires 3 Alterac Valley Mark of Honor + if GetItemCount(20560) >= 3 then return true end + elseif title == L["Claiming Arathi Basin"] or title == L["Conquering Arathi Basin"] then + -- Requires 3 Arathi Basin Mark of Honor + if GetItemCount(20559) >= 3 then return true end + elseif title == L["Fight for Warsong Gulch"] or title == L["Battle of Warsong Gulch"] then + -- Requires 3 Warsong Gulch Mark of Honor + if GetItemCount(20558) >= 3 then return true end + + -- Cloth quartermasters + elseif title == L["A Donation of Wool"] then + -- Requires 60 Wool Cloth + if GetItemCount(2592) >= 60 then return true end + elseif title == L["A Donation of Silk"] then + -- Requires 60 Silk Cloth + if GetItemCount(4306) >= 60 then return true end + elseif title == L["A Donation of Mageweave"] then + -- Requires 60 Mageweave + if GetItemCount(4338) >= 60 then return true end + elseif title == L["A Donation of Runecloth"] then + -- Requires 60 Runecloth + if GetItemCount(14047) >= 60 then return true end + elseif title == L["Additional Runecloth"] then + -- Requires 20 Runecloth + if GetItemCount(14047) >= 20 then return true end + elseif title == L["Gurubashi, Vilebranch, and Witherbark Coins"] then + -- Requires 1 Gurubashi Coin, 1 Vilebranch Coin, 1 Witherbark Coin + if GetItemCount(19701) >= 1 and GetItemCount(19702) >= 1 and GetItemCount(19703) >= 1 then return true end + elseif title == L["Sandfury, Skullsplitter, and Bloodscalp Coins"] then + -- Requires 1 Sandfury Coin, 1 Skullsplitter Coin, 1 Bloodscalp Coin + if GetItemCount(19704) >= 1 and GetItemCount(19705) >= 1 and GetItemCount(19706) >= 1 then return true end + elseif title == L["Zulian, Razzashi, and Hakkari Coins"] then + -- Requires 1 Zulian Coin, 1 Razzashi Coin, 1 Hakkari Coin + if GetItemCount(19698) >= 1 and GetItemCount(19699) >= 1 and GetItemCount(19700) >= 1 then return true end + elseif title == L["Frostsaber E'ko"] then + -- Requires 3 Frostsaber E'ko + if GetItemCount(12430) >= 3 then return true end + elseif title == L["Winterfall E'ko"] then + -- Requires 3 Winterfall E'ko + if GetItemCount(12431) >= 3 then return true end + elseif title == L["Shardtooth E'ko"] then + -- Requires 3 Shardtooth E'ko + if GetItemCount(12432) >= 3 then return true end + elseif title == L["Wildkin E'ko"] then + -- Requires 3 Wildkin E'ko + if GetItemCount(12433) >= 3 then return true end + elseif title == L["Chillwind E'ko"] then + -- Requires 3 Chillwind E'ko + if GetItemCount(12434) >= 3 then return true end + elseif title == L["Ice Thistle E'ko"] then + -- Requires 3 Ice Thistle E'ko + if GetItemCount(12435) >= 3 then return true end + elseif title == L["Frostmaul E'ko"] then + -- Requires 3 Ice Thistle E'ko + if GetItemCount(12436) >= 3 then return true end + elseif title == L["Marks of Kil'jaeden"] or title == L["More Marks of Kil'jaeden"] then + -- Requires 10 More Marks of Kil'jaeden + if GetItemCount(29425) >= 10 then return true end + elseif title == L["Single Mark of Sargeras"] then + -- Requires 1 Marks of Sargeras (if more than 10, leave for More Marks of Sargeras) + if GetItemCount(30809) >= 1 and GetItemCount(30809) < 10 then return true end + elseif title == L["More Marks of Sargeras"] then + -- Requires 10 Marks of Sargeras + if GetItemCount(30809) >= 10 then return true end + elseif title == L["Firewing Signets"] or title == L["More Firewing Signets"] then + -- Requires 10 Firewing Signets + if GetItemCount(29426) >= 10 then return true end + elseif title == L["Single Sunfury Signet"] then + -- Requires 1 Sunfury Signet (if more than 10, leave for More Sunfury Signets) + if GetItemCount(30810) >= 1 and GetItemCount(30810) < 10 then return true end + elseif title == L["More Sunfury Signets"] then + -- Requires 10 Sunfury Signets + if GetItemCount(30810) >= 10 then return true end + + -- Darkmoon Faire (Rinling) + elseif title == L["Copper Modulator"] then + if GetItemCount(4363) >= 5 then return true end + elseif title == L["Whirring Bronze Gizmo"] then + if GetItemCount(4375) >= 7 then return true end + elseif title == L["Green Fireworks"] then + if GetItemCount(9313) >= 36 then return true end + elseif title == L["Mechanical Repair Kits"] then + if GetItemCount(11590) >= 6 then return true end + elseif title == L["Thorium Widget"] then + if GetItemCount(15994) >= 6 then return true end + elseif title == L["More Thorium Widgets"] then + if GetItemCount(15994) >= 6 then return true end + + -- Darkmoon Faire (Yebb Neblegear) + elseif title == L["Small Furry Paws"] then + if GetItemCount(5134) >= 5 then return true end + elseif title == L["Evil Bat Eyes"] then + if GetItemCount(11404) >= 10 then return true end + elseif title == L["Glowing Scorpid Blood"] then + if GetItemCount(19933) >= 10 then return true end + elseif title == L["More Bat Eyes"] then + if GetItemCount(11404) >= 10 then return true end + elseif title == L["More Glowing Scorpid Blood"] then + if GetItemCount(19933) >= 10 then return true end + elseif title == L["Soft Bushy Tails"] then + if GetItemCount(4582) >= 5 then return true end + elseif title == L["Torn Bear Pelts"] then + if GetItemCount(11407) >= 5 then return true end + elseif title == L["Vibrant Plumes"] then + if GetItemCount(5117) >= 5 then return true end + + -- Darkmoon Faire (Chronos) + elseif title == L["Armor Kits"] then + if GetItemCount(15564) >= 8 then return true end + elseif title == L["Carnival Boots"] then + if GetItemCount(2309) >= 3 then return true end + elseif title == L["Carnival Jerkins"] then + if GetItemCount(2314) >= 3 then return true end + elseif title == L["Crocolisk Boy and the Bearded Murloc"] then + if GetItemCount(8185) >= 1 then return true end + elseif title == L["More Armor Kits"] then + if GetItemCount(15564) >= 8 then return true end + elseif title == L["The World's Largest Gnome!"] then + if GetItemCount(5739) >= 3 then return true end + + -- Darkmoon Faire (Kerri Hicks) + elseif title == L["Big Black Mace"] then + if GetItemCount(7945) >= 1 then return true end + elseif title == L["Coarse Weightstone"] then + if GetItemCount(3240) >= 10 then return true end + elseif title == L["Green Iron Bracers"] then + if GetItemCount(3835) >= 3 then return true end + elseif title == L["Heavy Grinding Stone"] then + if GetItemCount(3486) >= 7 then return true end + elseif title == L["More Dense Grinding Stones"] then + if GetItemCount(12644) >= 8 then return true end + elseif title == L["Rituals of Strength"] then + if GetItemCount(12644) >= 8 then return true end + + else return true + end + end + end + + -- Create event frame + local qFrame = CreateFrame("FRAME") + + -- Function to setup events + local function SetupEvents() + if LeaPlusLC["AutomateQuests"] == "On" then + qFrame:RegisterEvent("QUEST_DETAIL") + qFrame:RegisterEvent("QUEST_ACCEPT_CONFIRM") + qFrame:RegisterEvent("QUEST_PROGRESS") + qFrame:RegisterEvent("QUEST_COMPLETE") + qFrame:RegisterEvent("QUEST_GREETING") + qFrame:RegisterEvent("QUEST_AUTOCOMPLETE") + qFrame:RegisterEvent("GOSSIP_SHOW") + qFrame:RegisterEvent("QUEST_FINISHED") + else + qFrame:UnregisterAllEvents() + end + end + + -- Setup events when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutomateQuests"]:HookScript("OnClick", SetupEvents) + if LeaPlusLC["AutomateQuests"] == "On" then SetupEvents() end + + -- Event handler + qFrame:SetScript("OnEvent", function(self, event, arg1) + + -- Block shared quests if option is enabled + if event == "QUEST_DETAIL" then + LeaPlusLC:CheckIfQuestIsSharedAndShouldBeDeclined() + end + + -- Clear progress items when quest interaction has ceased + if event == "QUEST_FINISHED" then + for i = 1, 6 do + local progItem = _G["QuestProgressItem" ..i] or nil + if progItem and progItem:IsShown() then + progItem:Hide() + end + end + return + end + + -- Check for SHIFT key modifier + if LeaPlusLC["AutoQuestShift"] == "On" and not IsOverrideKeyDown() then return + elseif LeaPlusLC["AutoQuestShift"] == "Off" and IsOverrideKeyDown() then return + end + + ---------------------------------------------------------------------- + -- Accept quests automatically + ---------------------------------------------------------------------- + + -- Accept quests with a quest detail window + if event == "QUEST_DETAIL" then + if LeaPlusLC["AutoQuestAvailable"] == "On" then + -- Don't accept blocked quests + if isNpcBlocked("Accept") then return end + -- Accept quest + AcceptQuest() + HideUIPanel(QuestFrame) + end + end + + -- Accept quests which require confirmation (such as sharing escort quests) + if event == "QUEST_ACCEPT_CONFIRM" then + if LeaPlusLC["AutoQuestAvailable"] == "On" then + ConfirmAcceptQuest() + StaticPopup_Hide("QUEST_ACCEPT") + end + end + + ---------------------------------------------------------------------- + -- Turn-in quests automatically + ---------------------------------------------------------------------- + + -- Turn-in progression quests + if event == "QUEST_PROGRESS" and IsQuestCompletable() then + if LeaPlusLC["AutoQuestCompleted"] == "On" then + -- Don't continue quests for blocked NPCs + if isNpcBlocked("Complete") then return end + -- Don't continue if quest requires blocked item + if QuestRequiresBlockedItem() then return end + -- Don't continue if quest requires gold + if QuestRequiresGold() then return end + -- Continue quest + CompleteQuest() + end + end + + -- Turn in completed quests if only one reward item is being offered + if event == "QUEST_COMPLETE" then + if LeaPlusLC["AutoQuestCompleted"] == "On" then + -- Don't complete quests for blocked NPCs + if isNpcBlocked("Complete") then return end + -- Don't complete if quest requires blocked item + if QuestRequiresBlockedItem() then return end + -- Don't complete if quest requires gold + if QuestRequiresGold() then return end + -- Complete quest + if GetNumQuestChoices() <= 1 then + GetQuestReward(GetNumQuestChoices()) + end + end + end + + -- Show quest dialog for quests that use the objective tracker (it will be completed automatically) + if event == "QUEST_AUTOCOMPLETE" then + if LeaPlusLC["AutoQuestCompleted"] == "On" then + local index = GetQuestLogIndexByID(arg1) + if GetQuestLogIsAutoComplete(index) then + ShowQuestComplete(index) + end + end + end + + ---------------------------------------------------------------------- + -- Select quests automatically + ---------------------------------------------------------------------- + + if event == "GOSSIP_SHOW" or event == "QUEST_GREETING" then + + -- Select quests + if UnitExists("npc") or QuestFrameGreetingPanel:IsShown() or GossipFrame.GreetingPanel:IsShown() then + + -- Don't select quests for blocked NPCs + if isNpcBlocked("Select") then return end + + if event == "QUEST_GREETING" then + -- Select quest greeting completed quests + if LeaPlusLC["AutoQuestCompleted"] == "On" then + for i = 1, GetNumActiveQuests() do + local title, isComplete = GetActiveTitle(i) + if title and isComplete then + return SelectActiveQuest(i) + end + end + end + -- Select quest greeting available quests + if LeaPlusLC["AutoQuestAvailable"] == "On" then + for i = 1, GetNumAvailableQuests() do + local title, isComplete = GetAvailableTitle(i) + if title and not isComplete then + return SelectAvailableQuest(i) + end + end + end + else + -- Select gossip completed quests + if LeaPlusLC["AutoQuestCompleted"] == "On" then + local gossipQuests = C_GossipInfo.GetActiveQuests() + for titleIndex, questInfo in ipairs(gossipQuests) do + if questInfo.title and questInfo.isComplete then + if questInfo.questID then + return C_GossipInfo.SelectActiveQuest(questInfo.questID) + end + end + end + end + -- Select gossip available quests + if LeaPlusLC["AutoQuestAvailable"] == "On" then + local GossipQuests = C_GossipInfo.GetAvailableQuests() + for titleIndex, questInfo in ipairs(GossipQuests) do + if questInfo.questID and DoesQuestHaveRequirementsMet(questInfo.questID) then + return C_GossipInfo.SelectAvailableQuest(questInfo.questID) + end + end + end + end + end + end + + end) + + end + + ---------------------------------------------------------------------- + -- Sort game options addon list + ---------------------------------------------------------------------- + + if LeaPlusLC["CharAddonList"] == "On" then + -- Set the addon list to character by default + if AddonCharacterDropDown and AddonCharacterDropDown.selectedValue then + AddonCharacterDropDown.selectedValue = UnitName("player"); + AddonCharacterDropDownText:SetText(UnitName("player")) + end + end + + ---------------------------------------------------------------------- + -- Sell junk automatically (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create sell junk banner + local StartMsg = CreateFrame("FRAME", nil, MerchantFrame) + StartMsg:ClearAllPoints() + StartMsg:SetPoint("BOTTOMLEFT", 4, 4) + StartMsg:SetSize(160, 22) + StartMsg:SetToplevel(true) + StartMsg:Hide() + + StartMsg.s = StartMsg:CreateTexture(nil, "BACKGROUND") + StartMsg.s:SetAllPoints() + -- StartMsg.s:SetColorTexture(0.1, 0.1, 0.1, 1.0) + + StartMsg.f = StartMsg:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + StartMsg.f:SetAllPoints(); + StartMsg.f:SetText(L["SELLING JUNK"]) + + -- Declarations + local IterationCount, totalPrice = 500, 0 + local SellJunkTicker + + -- Create custom NewTicker function (from Wrath) + local function LeaPlusNewTicker(duration, callback, iterations) + local ticker = setmetatable({}, TickerMetatable) + ticker._remainingIterations = iterations + ticker._callback = function() + if (not ticker._cancelled) then + callback(ticker) + --Make sure we weren't cancelled during the callback + if (not ticker._cancelled) then + if (ticker._remainingIterations) then + ticker._remainingIterations = ticker._remainingIterations - 1 + end + if (not ticker._remainingIterations or ticker._remainingIterations > 0) then + LibCompat.After(duration, ticker._callback) + end + end + end + end + LibCompat.After(duration, ticker._callback) + return ticker + end + + + + -- Create configuration panel + local SellJunkFrame = LeaPlusLC:CreatePanel("Sell junk automatically", "SellJunkFrame") + LeaPlusLC:MakeTx(SellJunkFrame, "Settings", 16, -72) + LeaPlusLC:MakeCB(SellJunkFrame, "AutoSellShowSummary", "Show vendor summary in chat", 16, -92, false, "If checked, a vendor summary will be shown in chat when junk is automatically sold.") + + -- Help button hidden + SellJunkFrame.h:Hide() + + -- Back button handler + SellJunkFrame.b:SetScript("OnClick", function() + SellJunkFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + SellJunkFrame.r.tiptext = SellJunkFrame.r.tiptext .. "|n|n" .. L["Note that this will not reset your exclusions list."] + SellJunkFrame.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoSellShowSummary"] = "On" + + -- Refresh panel + SellJunkFrame:Hide(); SellJunkFrame:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoSellJunkBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoSellShowSummary"] = "On" + else + SellJunkFrame:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to stop selling + local function StopSelling() + if SellJunkTicker then SellJunkTicker._cancelled = true; end + StartMsg:Hide() + SellJunkFrame:UnregisterEvent("ITEM_LOCKED") + SellJunkFrame:UnregisterEvent("UI_ERROR_MESSAGE") + end + + -- Create excluded box + local titleTX = LeaPlusLC:MakeTx(SellJunkFrame, "Exclusions", 356, -72) + titleTX:SetWidth(200) + titleTX:SetWordWrap(false) + titleTX:SetJustifyH("LEFT") + + -- Show help button for exclusions + LeaPlusLC:CreateHelpButton("SellJunkExcludeHelpButton", SellJunkFrame, titleTX, "Enter item IDs separated by commas. Item IDs can be found in item tooltips while this panel is showing.|n|nJunk items entered here will not be sold automatically.|n|nWhite items entered here will be sold automatically.|n|nThe editbox tooltip will show you more information about the items you have entered.") + + local eb = CreateFrame("Frame", nil, SellJunkFrame) + eb:SetSize(200, 180) + eb:SetPoint("TOPLEFT", 350, -92) + eb:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight", + edgeSize = 16, + insets = {left = 8, right = 6, top = 8, bottom = 8}, + }) + eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5) + + eb.scroll = CreateFrame("ScrollFrame", nil, eb) + eb.scroll:SetPoint("TOPLEFT", eb, 12, -10) + eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10) + + eb.Text = CreateFrame("EditBox", nil, eb) + eb.Text:SetMultiLine(true) + eb.Text:SetWidth(150) + eb.Text:SetPoint("TOPLEFT", eb.scroll) + eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll) + eb.Text:SetMaxLetters(600) + eb.Text:SetFontObject(GameFontNormalLarge) + eb.Text:SetAutoFocus(false) + eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) + eb.scroll:SetScrollChild(eb.Text) + + -- Set focus on the editbox text when clicking the editbox + eb:SetScript("OnMouseDown", function() + eb.Text:SetFocus() + eb.Text:SetCursorPosition(eb.Text:GetMaxLetters()) + end) + + -- Function to create whitelist + local whiteList = {} + local function UpdateWhiteList() + wipe(whiteList) + + local whiteString = eb.Text:GetText() + if whiteString and whiteString ~= "" then + whiteString = whiteString:gsub("[^,%d]", "") + local tList = {strsplit(",", whiteString)} + for i = 1, #tList do + if tList[i] then + tList[i] = tonumber(tList[i]) + if tList[i] then + whiteList[tList[i]] = true + end + end + end + end + + LeaPlusLC["AutoSellExcludeList"] = whiteString + eb.Text:SetText(LeaPlusLC["AutoSellExcludeList"]) + + end + + -- Save the excluded list when it changes and at startup + eb.Text:SetScript("OnTextChanged", UpdateWhiteList) + eb.Text:SetText(LeaPlusLC["AutoSellExcludeList"]) + UpdateWhiteList() + + -- Create whitelist on startup and option or preset is clicked + UpdateWhiteList() + LeaPlusCB["AutoSellJunkBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + UpdateWhiteList() + end + end) + + -- Function to make tooltip string + local function MakeTooltipString() + + local keepMsg = "" + local sellMsg = "" + local dupMsg = "" + local novalueMsg = "" + local incompatMsg = "" + + local tipString = eb.Text:GetText() + if tipString and tipString ~= "" then + tipString = tipString:gsub("[^,%d]", "") + local tipList = {strsplit(",", tipString)} + for i = 1, #tipList do + if tipList[i] then + tipList[i] = tonumber(tipList[i]) + if tipList[i] and tipList[i] > 0 and tipList[i] < 999999999 then + local void, tLink, Rarity, void, void, void, void, void, void, void, ItemPrice = GetItemInfo(tipList[i]) + if tLink and tLink ~= "" then + local linkCol = string.sub(tLink, 1, 10) + if linkCol then + local linkName = tLink:match("%[(.-)%]") + if linkName and ItemPrice then + if ItemPrice > 0 then + if Rarity == 0 then + -- Junk item + if string.find(keepMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add junk item to keep list + keepMsg = keepMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + elseif Rarity == 1 then + -- White item + if string.find(sellMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add non-junk item to sell list + sellMsg = sellMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + else + -- Incompatible item (not junk or white) + if string.find(incompatMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add item to incompatible list + incompatMsg = incompatMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + end + else + -- Item has no sell price so cannot be sold + if string.find(novalueMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add item to cannot be sold list + novalueMsg = novalueMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + end + end + end + end + end + end + end + end + + if keepMsg ~= "" then keepMsg = "|n" .. L["Keep"] .. "|n" .. keepMsg end + if sellMsg ~= "" then sellMsg = "|n" .. L["Sell"] .. "|n" .. sellMsg end + if dupMsg ~= "" then dupMsg = "|n" .. L["Duplicates"] .. "|n" .. dupMsg end + if novalueMsg ~= "" then novalueMsg = "|n" .. L["Cannot be sold"] .. "|n" .. novalueMsg end + if incompatMsg ~= "" then incompatMsg = "|n" .. L["Incompatible"] .. "|n" .. incompatMsg end + + eb.tiptext = L["Exclusions"] .. "|n" .. keepMsg .. sellMsg .. dupMsg .. novalueMsg .. incompatMsg + eb.Text.tiptext = L["Exclusions"] .. "|n" .. keepMsg .. sellMsg .. dupMsg .. novalueMsg .. incompatMsg + if eb.tiptext == L["Exclusions"] .. "|n" then eb.tiptext = eb.tiptext .. "|n" .. L["Nothing to see here."] end + if eb.Text.tiptext == L["Exclusions"] .. "|n" then eb.Text.tiptext = "-" end + + if GameTooltip:IsShown() then + if MouseIsOver(eb) or MouseIsOver(eb.Text) then + GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) + end + end + + end + + eb.Text:HookScript("OnTextChanged", MakeTooltipString) + eb.Text:HookScript("OnTextChanged", function() + LibCompat.After(0.1, function() + MakeTooltipString() + end) + end) + + -- Show the button tooltip for the editbox + eb:SetScript("OnEnter", MakeTooltipString) + eb:HookScript("OnEnter", LeaPlusLC.TipSee) + eb:HookScript("OnEnter", function() GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) end) + eb:SetScript("OnLeave", GameTooltip_Hide) + eb.Text:SetScript("OnEnter", MakeTooltipString) + eb.Text:HookScript("OnEnter", LeaPlusLC.ShowDropTip) + eb.Text:HookScript("OnEnter", function() GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) end) + eb.Text:SetScript("OnLeave", GameTooltip_Hide) + + -- Show item ID in item tooltips while configuration panel is showing + GameTooltip:HookScript("OnTooltipSetItem", function(self) + if SellJunkFrame:IsShown() then + local void, itemLink = self:GetItem() + if itemLink then + local itemID = GetItemInfoFromHyperlink(itemLink) + if itemID then self:AddLine(L["Item ID"] .. ": " .. itemID) end + end + end + end) + + -- Vendor function + local function SellJunkFunc() + + -- Variables + local SoldCount, Rarity, ItemPrice = 0, 0, 0 + local CurrentItemLink, void + + -- Traverse bags and sell grey items + for BagID = 0, 4 do + for BagSlot = 1, C_Container.GetContainerNumSlots(BagID) do + CurrentItemLink = C_Container.GetContainerItemLink(BagID, BagSlot) + if CurrentItemLink then + void, void, Rarity, void, void, void, void, void, void, void, ItemPrice = GetItemInfo(CurrentItemLink) + -- Don't sell whitelisted items + local itemID = GetItemInfoFromHyperlink(CurrentItemLink) + if itemID and whiteList[itemID] then + if Rarity == 0 then + -- Junk item to keep + Rarity = 3 + ItemPrice = 0 + elseif Rarity == 1 then + -- White item to sell + Rarity = 0 + end + end + -- Continue + local cInfo = C_Container.GetContainerItemInfo(BagID, BagSlot) + local itemCount = cInfo.stackCount + if Rarity == 0 and ItemPrice ~= 0 then + SoldCount = SoldCount + 1 + if MerchantFrame:IsShown() then + -- If merchant frame is open, vendor the item + C_Container.UseContainerItem(BagID, BagSlot) + -- Perform actions on first iteration + if SellJunkTicker._remainingIterations == IterationCount then + -- Calculate total price + totalPrice = totalPrice + (ItemPrice * itemCount) + end + else + -- If merchant frame is not open, stop selling + StopSelling() + return + end + end + end + end + + end + + -- Stop selling if no items were sold for this iteration or iteration limit was reached + if SoldCount == 0 or SellJunkTicker and SellJunkTicker._remainingIterations == 1 then + StopSelling() + if totalPrice > 0 and LeaPlusLC["AutoSellShowSummary"] == "On" then + LeaPlusLC:Print(L["Sold junk for"] .. " " .. GetCoinText(totalPrice) .. ".") + end + end + + end + + -- Function to setup events + local function SetupEvents() + if LeaPlusLC["AutoSellJunk"] == "On" then + SellJunkFrame:RegisterEvent("MERCHANT_SHOW"); + SellJunkFrame:RegisterEvent("MERCHANT_CLOSED"); + else + SellJunkFrame:UnregisterEvent("MERCHANT_SHOW") + SellJunkFrame:UnregisterEvent("MERCHANT_CLOSED") + end + end + + -- Setup events when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutoSellJunk"]:HookScript("OnClick", SetupEvents) + if LeaPlusLC["AutoSellJunk"] == "On" then SetupEvents() end + + -- Event handler + SellJunkFrame:SetScript("OnEvent", function(self, event) + if event == "MERCHANT_SHOW" then + -- Check for vendors that refuse to buy items + SellJunkFrame:RegisterEvent("UI_ERROR_MESSAGE") + -- Reset variable + totalPrice = 0 + -- Do nothing if shift key is held down + if IsShiftKeyDown() then return end + -- Cancel existing ticker if present + if SellJunkTicker then SellJunkTicker._cancelled = true; end + -- Sell grey items using ticker (ends when all grey items are sold or iteration count reached) + SellJunkTicker = LeaPlusNewTicker(0.2, SellJunkFunc, IterationCount) + SellJunkFrame:RegisterEvent("ITEM_LOCKED") + elseif event == "ITEM_LOCKED" then + StartMsg:Show() + SellJunkFrame:UnregisterEvent("ITEM_LOCKED") + elseif event == "MERCHANT_CLOSED" then + -- If merchant frame is closed, stop selling + StopSelling() + elseif event == "UI_ERROR_MESSAGE" then + if arg1 == 46 then + StopSelling() -- Vendor refuses to buy items + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Repair automatically (no reload required) + ---------------------------------------------------------------------- + + do + + -- Repair when suitable merchant frame is shown + local function RepairFunc() + if IsShiftKeyDown() then return end + if CanMerchantRepair() then -- If merchant is capable of repair + -- Process repair + local RepairCost, CanRepair = GetRepairAllCost() + if CanRepair then -- If merchant is offering repair + if LeaPlusLC["AutoRepairGuildFunds"] == "On" and IsInGuild() then + -- Guilded character and guild repair option is enabled + if CanGuildBankRepair() then + -- Character has permission to repair so try guild funds but fallback on character funds (if daily gold limit is reached) + RepairAllItems(1) + RepairAllItems() + else + -- Character does not have permission to repair so use character funds + RepairAllItems() + end + else + -- Unguilded character or guild repair option is disabled + RepairAllItems() + end + -- Show cost summary + if LeaPlusLC["AutoRepairShowSummary"] == "On" then + LeaPlusLC:Print(L["Repaired for"] .. " " .. GetCoinText(RepairCost) .. ".") + end + end + end + end + + -- Create event frame + local RepairFrame = CreateFrame("FRAME") + + -- Function to setup event + local function SetupEvent() + if LeaPlusLC["AutoRepairGear"] == "On" then + RepairFrame:RegisterEvent("MERCHANT_SHOW") + else + RepairFrame:UnregisterEvent("MERCHANT_SHOW") + end + end + + -- Setup event when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutoRepairGear"]:HookScript("OnClick", SetupEvent) + if LeaPlusLC["AutoRepairGear"] == "On" then SetupEvent() end + + -- Event handler + RepairFrame:SetScript("OnEvent", RepairFunc) + + -- Create configuration panel + local RepairPanel = LeaPlusLC:CreatePanel("Repair automatically", "RepairPanel") + + LeaPlusLC:MakeTx(RepairPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(RepairPanel, "AutoRepairGuildFunds", "Repair using guild funds if available", 16, -92, false, "If checked, repair costs will be taken from guild funds for characters that are guilded and have permission to repair.") + LeaPlusLC:MakeCB(RepairPanel, "AutoRepairShowSummary", "Show repair summary in chat", 16, -112, false, "If checked, a repair summary will be shown in chat when your gear is automatically repaired.") + + -- Help button hidden + RepairPanel.h:Hide() + + -- Back button handler + RepairPanel.b:SetScript("OnClick", function() + RepairPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + RepairPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoRepairGuildFunds"] = "On" + LeaPlusLC["AutoRepairShowSummary"] = "On" + + -- Refresh panel + RepairPanel:Hide(); RepairPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoRepairBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoRepairGuildFunds"] = "On" + LeaPlusLC["AutoRepairShowSummary"] = "On" + else + RepairPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Hide the combat log + ---------------------------------------------------------------------- + + if LeaPlusLC["NoCombatLogTab"] == "On" and not LeaLockList["NoCombatLogTab"] then + + -- Ensure combat log is docked + if ChatFrame2.isDocked then + -- Set combat log attributes when chat windows are updated + LpEvt:RegisterEvent("UPDATE_CHAT_WINDOWS") + -- Set combat log tab placement when tabs are assigned by the client + hooksecurefunc("FCF_SetTabPosition", function() + ChatFrame2Tab:SetPoint("BOTTOMLEFT", ChatFrame1Tab, "BOTTOMRIGHT", 0, 0) + end) + else + -- If combat log is undocked, do nothing but show warning + LibCompat.After(1, function() + LeaPlusLC:Print("Combat log cannot be hidden while undocked.") + end) + end + + end + + ---------------------------------------------------------------------- + -- Show player chain + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowPlayerChain"] == "On" and not LeaLockList["ShowPlayerChain"] then + + -- Ensure chain doesnt clip through pet portrait + PetPortrait:GetParent():SetFrameLevel(4) + + -- Create configuration panel + local ChainPanel = LeaPlusLC:CreatePanel("Show player chain", "ChainPanel") + + -- Add dropdown menu + LeaPlusLC:CreateDropDown("PlayerChainMenu", "Chain style", ChainPanel, 146, "TOPLEFT", 16, -112, {L["RARE"], L["ELITE"], L["RARE ELITE"]}, "") + + -- Set chain style + local function SetChainStyle() + -- Get dropdown menu value + local chain = LeaPlusLC["PlayerChainMenu"] -- Numeric value + -- Set chain style according to value + if chain == 1 then -- Rare + PlayerFrameTexture:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Rare.blp") + PlayerFrameTexture:SetTexCoord(1, .09375, 0, .78125) + elseif chain == 2 then -- Elite + PlayerFrameTexture:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Elite.blp") + PlayerFrameTexture:SetTexCoord(1, .09375, 0, .78125) + elseif chain == 3 then -- Rare Elite + PlayerFrameTexture:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp") + PlayerFrameTexture:SetTexCoord(0.25, 0.0234375, 0, 0.1953125) + end + end + + -- Set style on startup + SetChainStyle() + + -- Set style when a drop menu is selected (procs when the list is hidden) + LeaPlusCB["ListFramePlayerChainMenu"]:HookScript("OnHide", SetChainStyle) + + -- Help button hidden + ChainPanel.h:Hide() + + -- Back button handler + ChainPanel.b:SetScript("OnClick", function() + LeaPlusCB["ListFramePlayerChainMenu"]:Hide(); -- Hide the dropdown list + ChainPanel:Hide(); + LeaPlusLC["PageF"]:Show(); + LeaPlusLC["Page5"]:Show(); + return + end) + + -- Reset button handler + ChainPanel.r:SetScript("OnClick", function() + LeaPlusCB["ListFramePlayerChainMenu"]:Hide(); -- Hide the dropdown list + LeaPlusLC["PlayerChainMenu"] = 2 + ChainPanel:Hide(); ChainPanel:Show(); + SetChainStyle() + end) + + -- Show the panel when the configuration button is clicked + LeaPlusCB["ModPlayerChain"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + LeaPlusLC["PlayerChainMenu"] = 3; + SetChainStyle(); + else + LeaPlusLC:HideFrames(); + ChainPanel:Show(); + end + end) + + end + + ---------------------------------------------------------------------- + -- Show raid frame toggle button + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowRaidToggle"] == "On" and not LeaLockList["ShowRaidToggle"] then + + -- Check to make sure raid toggle button exists + if CompactRaidFrameManagerDisplayFrameHiddenModeToggle then + + -- Create a border for the button + local cBackdrop = CreateFrame("Frame", nil, CompactRaidFrameManagerDisplayFrameHiddenModeToggle) + cBackdrop:SetAllPoints() + cBackdrop.backdropInfo = {edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}} + cBackdrop:ApplyBackdrop() + + -- Move the button (function runs after PLAYER_ENTERING_WORLD and PARTY_LEADER_CHANGED) + hooksecurefunc("CompactRaidFrameManager_UpdateOptionsFlowContainer", function() + if CompactRaidFrameManager and CompactRaidFrameManagerDisplayFrameHiddenModeToggle then + local void, void, void, void, y = CompactRaidFrameManager:GetPoint() + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetWidth(40) + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:ClearAllPoints() + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, y + 22) + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetParent(UIParent) + end + end) + + end + + end + + ---------------------------------------------------------------------- + -- Hide hit indicators (portrait text) + ---------------------------------------------------------------------- + + if LeaPlusLC["NoHitIndicators"] == "On" and not LeaLockList["NoHitIndicators"] then + hooksecurefunc(PlayerHitIndicator, "Show", PlayerHitIndicator.Hide) + hooksecurefunc(PetHitIndicator, "Show", PetHitIndicator.Hide) + end + + ---------------------------------------------------------------------- + -- Class colored frames + ---------------------------------------------------------------------- + + if LeaPlusLC["ClassColFrames"] == "On" and not LeaLockList["ClassColFrames"] then + + -- Create background frame for player frame + local PlayFN = CreateFrame("FRAME", nil, PlayerFrame) + PlayFN:Hide() + + PlayFN:SetWidth(TargetFrameNameBackground:GetWidth()) + PlayFN:SetHeight(TargetFrameNameBackground:GetHeight()) + + local void, void, void, x, y = TargetFrameNameBackground:GetPoint() + PlayFN:SetPoint("TOPLEFT", PlayerFrame, "TOPLEFT", -x, y) + + PlayFN.t = PlayFN:CreateTexture(nil, "BORDER") + PlayFN.t:SetAllPoints() + PlayFN.t:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-LevelBackground") + + local c = LeaPlusLC["RaidColors"][select(2, UnitClass("player"))] + if c then PlayFN.t:SetVertexColor(c.r, c.g, c.b) end + + -- Create color function for target and focus frames + local function TargetFrameCol() + if UnitIsPlayer("target") then + local c = LeaPlusLC["RaidColors"][select(2, UnitClass("target"))] + if c then TargetFrameNameBackground:SetVertexColor(c.r, c.g, c.b) end + end + if UnitIsPlayer("focus") then + local c = LeaPlusLC["RaidColors"][select(2, UnitClass("focus"))] + if c then FocusFrameNameBackground:SetVertexColor(c.r, c.g, c.b) end + end + end + + local ColTar = CreateFrame("FRAME") + ColTar:SetScript("OnEvent", TargetFrameCol) -- Events are registered if target option is enabled + + -- Refresh color if focus frame size changes + hooksecurefunc(FocusFrame, "SetSmallSize", function() + if LeaPlusLC["ClassColTarget"] == "On" then + TargetFrameCol() + end + end) + + -- Create configuration panel + local ClassFrame = LeaPlusLC:CreatePanel("Class colored frames", "ClassFrame") + + LeaPlusLC:MakeTx(ClassFrame, "Settings", 16, -72) + LeaPlusLC:MakeCB(ClassFrame, "ClassColPlayer", "Show player frame in class color", 16, -92, false, "If checked, the player frame background will be shown in class color.") + LeaPlusLC:MakeCB(ClassFrame, "ClassColTarget", "Show target frame and focus frame in class color", 16, -112, false, "If checked, the target frame background and focus frame background will be shown in class color.") + + -- Help button hidden + ClassFrame.h:Hide() + + -- Back button handler + ClassFrame.b:SetScript("OnClick", function() + ClassFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Function to set class colored frames + local function SetClassColFrames() + -- Player frame + if LeaPlusLC["ClassColPlayer"] == "On" then + PlayFN:Show() + else + PlayFN:Hide() + end + -- Target and focus frames + if LeaPlusLC["ClassColTarget"] == "On" then + ColTar:RegisterEvent("GROUP_ROSTER_UPDATE") + ColTar:RegisterEvent("PLAYER_TARGET_CHANGED") + ColTar:RegisterEvent("PLAYER_FOCUS_CHANGED") + ColTar:RegisterEvent("UNIT_FACTION") + TargetFrameCol() + else + ColTar:UnregisterAllEvents() + TargetFrame_CheckFaction(TargetFrame) -- Reset target frame colors + TargetFrame_CheckFaction(FocusFrame) -- Reset focus frame colors + end + end + + -- Run function when options are clicked and on startup + LeaPlusCB["ClassColPlayer"]:HookScript("OnClick", SetClassColFrames) + LeaPlusCB["ClassColTarget"]:HookScript("OnClick", SetClassColFrames) + SetClassColFrames() + + -- Reset button handler + ClassFrame.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["ClassColPlayer"] = "On" + LeaPlusLC["ClassColTarget"] = "On" + + -- Update colors and refresh configuration panel + SetClassColFrames() + ClassFrame:Hide(); ClassFrame:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["ClassColFramesBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ClassColPlayer"] = "On" + LeaPlusLC["ClassColTarget"] = "On" + SetClassColFrames() + else + ClassFrame:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Quest text size + ---------------------------------------------------------------------- + + if LeaPlusLC["QuestFontChange"] == "On" and not LeaLockList["QuestFontChange"] then + + -- Set gossip frame scroll box layout (fix for game patch 3.4.1) + GossipFrame.GreetingPanel.ScrollBox:SetHeight(320) + GossipFrame.GreetingPanel.ScrollBar:ClearAllPoints() + GossipFrame.GreetingPanel.ScrollBar:SetPoint("TOPLEFT", GossipFrame.GreetingPanel.ScrollBox, "TOPRIGHT", 4, 9) + GossipFrame.GreetingPanel.ScrollBar:SetPoint("BOTTOMLEFT", GossipFrame.GreetingPanel.ScrollBox, "BOTTOMRIGHT", 4, -14) + + -- Create configuration panel + local QuestTextPanel = LeaPlusLC:CreatePanel("Resize quest text", "QuestTextPanel") + + LeaPlusLC:MakeTx(QuestTextPanel, "Text size", 16, -72) + LeaPlusLC:MakeSL(QuestTextPanel, "LeaPlusQuestFontSize", "Drag to set the font size of quest text.", 10, 36, 1, 16, -92, "%.0f") + + -- Function to update the font size + local function QuestSizeUpdate() + local a, b, c = QuestFont:GetFont() + QuestTitleFont:SetFont(a, LeaPlusLC["LeaPlusQuestFontSize"] + 3, c) + QuestFont:SetFont(a, LeaPlusLC["LeaPlusQuestFontSize"] + 1, c) + local d, e, f = QuestFontNormalSmall:GetFont() + QuestFontNormalSmall:SetFont(d, LeaPlusLC["LeaPlusQuestFontSize"], f) + end + + -- Set text size when slider changes and on startup + LeaPlusCB["LeaPlusQuestFontSize"]:HookScript("OnValueChanged", QuestSizeUpdate) + QuestSizeUpdate() + + -- Help button hidden + QuestTextPanel.h:Hide() + + -- Back button handler + QuestTextPanel.b:SetScript("OnClick", function() + QuestTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show() + return + end) + + -- Reset button handler + QuestTextPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["LeaPlusQuestFontSize"] = 12 + QuestSizeUpdate() + + -- Refresh side panel + QuestTextPanel:Hide(); QuestTextPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["QuestTextBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["LeaPlusQuestFontSize"] = 18 + QuestSizeUpdate() + else + QuestTextPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Resize mail text + ---------------------------------------------------------------------- + + if LeaPlusLC["MailFontChange"] == "On" then + + -- Create configuration panel + local MailTextPanel = LeaPlusLC:CreatePanel("Resize mail text", "MailTextPanel") + + LeaPlusLC:MakeTx(MailTextPanel, "Text size", 16, -72) + LeaPlusLC:MakeSL(MailTextPanel, "LeaPlusMailFontSize", "Drag to set the font size of mail text.", 10, 36, 1, 16, -92, "%.0f") + + -- Function to set the text size + local function MailSizeUpdate() + local MailFont, void, flags = QuestFont:GetFont() + OpenMailBodyText:SetFont("h1", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + OpenMailBodyText:SetFont("h2", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + OpenMailBodyText:SetFont("h3", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + OpenMailBodyText:SetFont("p", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + MailEditBox:GetEditBox():SetFont(MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) -- in DF, this is replaced with SendMailBodyEditBox + end + + -- Set text size after changing slider and on startup + LeaPlusCB["LeaPlusMailFontSize"]:HookScript("OnValueChanged", MailSizeUpdate) + MailSizeUpdate() + + -- Help button hidden + MailTextPanel.h:Hide() + + -- Back button handler + MailTextPanel.b:SetScript("OnClick", function() + MailTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show() + return + end) + + -- Reset button handler + MailTextPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["LeaPlusMailFontSize"] = 15 + + -- Refresh side panel + MailTextPanel:Hide(); MailTextPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["MailTextBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["LeaPlusMailFontSize"] = 22 + MailSizeUpdate() + else + MailTextPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Resize book text + ---------------------------------------------------------------------- + + if LeaPlusLC["BookFontChange"] == "On" then + + -- Create configuration panel + local BookTextPanel = LeaPlusLC:CreatePanel("Resize book text", "BookTextPanel") + + LeaPlusLC:MakeTx(BookTextPanel, "Text size", 16, -72) + LeaPlusLC:MakeSL(BookTextPanel, "LeaPlusBookFontSize", "Drag to set the font size of book text.", 10, 36, 1, 16, -92, "%.0f") + + -- Function to set the text size + local function BookSizeUpdate() + local BookFont, void, flags = QuestFont:GetFont() + ItemTextFontNormal:SetFont(BookFont, LeaPlusLC["LeaPlusBookFontSize"], flags) + end + + -- Set text size after changing slider and on startup + LeaPlusCB["LeaPlusBookFontSize"]:HookScript("OnValueChanged", BookSizeUpdate) + BookSizeUpdate() + + -- Help button hidden + BookTextPanel.h:Hide() + + -- Back button handler + BookTextPanel.b:SetScript("OnClick", function() + BookTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show() + return + end) + + -- Reset button handler + BookTextPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["LeaPlusBookFontSize"] = 15 + + -- Refresh side panel + BookTextPanel:Hide(); BookTextPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["BookTextBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["LeaPlusBookFontSize"] = 22 + BookSizeUpdate() + else + BookTextPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Show durability status + ---------------------------------------------------------------------- + + if LeaPlusLC["DurabilityStatus"] == "On" then + + -- Create durability button + local cButton = CreateFrame("BUTTON", nil, PaperDollFrame) + cButton:ClearAllPoints() + cButton:SetPoint("BOTTOMRIGHT", CharacterFrame, "BOTTOMRIGHT", -40, 80) + cButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up") + cButton:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight") + cButton:SetSize(32, 32) + + -- Create durability tables + local Slots = {"HeadSlot", "ShoulderSlot", "ChestSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "MainHandSlot", "SecondaryHandSlot", "RangedSlot"} + local SlotsFriendly = {INVTYPE_HEAD, INVTYPE_SHOULDER, INVTYPE_CHEST, INVTYPE_WRIST, INVTYPE_HAND, INVTYPE_WAIST, INVTYPE_LEGS, INVTYPE_FEET, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, INVTYPE_RANGED} + + -- Show durability status in tooltip or status line (tip or status) + local function ShowDuraStats(where) + + local duravaltotal, duramaxtotal, durapercent = 0, 0, 0 + local valcol, id, duraval, duramax + + if where == "tip" then + -- Creare layout + GameTooltip:AddLine("|cffffffff") + GameTooltip:AddLine("|cffffffff") + GameTooltip:AddLine("|cffffffff") + _G["GameTooltipTextLeft1"]:SetText("|cffffffff"); _G["GameTooltipTextRight1"]:SetText("|cffffffff") + _G["GameTooltipTextLeft2"]:SetText("|cffffffff"); _G["GameTooltipTextRight2"]:SetText("|cffffffff") + _G["GameTooltipTextLeft3"]:SetText("|cffffffff"); _G["GameTooltipTextRight3"]:SetText("|cffffffff") + end + + local validItems = false + + -- Traverse equipment slots + for k, slotName in ipairs(Slots) do + if GetInventorySlotInfo(slotName) then + id = GetInventorySlotInfo(slotName) + duraval, duramax = GetInventoryItemDurability(id) + if duraval ~= nil then + + -- At least one item has durability stat + validItems = true + + -- Add to tooltip + if where == "tip" then + durapercent = tonumber(format("%.0f", duraval / duramax * 100)) + valcol = (durapercent >= 80 and "|cff00FF00") or (durapercent >= 60 and "|cff99FF00") or (durapercent >= 40 and "|cffFFFF00") or (durapercent >= 20 and "|cffFF9900") or (durapercent >= 0 and "|cffFF2000") or ("|cffFFFFFF") + _G["GameTooltipTextLeft1"]:SetText(L["Durability"]) + _G["GameTooltipTextLeft2"]:SetText(_G["GameTooltipTextLeft2"]:GetText() .. SlotsFriendly[k] .. "|n") + _G["GameTooltipTextRight2"]:SetText(_G["GameTooltipTextRight2"]:GetText() .. valcol .. durapercent .. "%" .. "|n") + end + + duravaltotal = duravaltotal + duraval + duramaxtotal = duramaxtotal + duramax + end + end + end + if duravaltotal > 0 and duramaxtotal > 0 then + durapercent = duravaltotal / duramaxtotal * 100 + else + durapercent = 0 + end + + if where == "tip" then + + if validItems == true then + -- Show overall durability in the tooltip + if durapercent >= 80 then valcol = "|cff00FF00" elseif durapercent >= 60 then valcol = "|cff99FF00" elseif durapercent >= 40 then valcol = "|cffFFFF00" elseif durapercent >= 20 then valcol = "|cffFF9900" elseif durapercent >= 0 then valcol = "|cffFF2000" else return end + _G["GameTooltipTextLeft3"]:SetText(L["Overall"] .. " " .. valcol) + _G["GameTooltipTextRight3"]:SetText(valcol .. string.format("%.0f", durapercent) .. "%") + + -- Show lines of the tooltip + GameTooltipTextLeft1:Show(); GameTooltipTextRight1:Show() + GameTooltipTextLeft2:Show(); GameTooltipTextRight2:Show() + GameTooltipTextLeft3:Show(); GameTooltipTextRight3:Show() + GameTooltipTextRight2:SetJustifyH"RIGHT"; + GameTooltipTextRight3:SetJustifyH"RIGHT"; + GameTooltip:Show() + else + -- No items have durability stat + GameTooltip:ClearLines() + GameTooltip:AddLine("" .. L["Durability"],1.0, 0.85, 0.0) + GameTooltip:AddLine("" .. L["No items with durability equipped."], 1, 1, 1) + GameTooltip:Show() + end + + elseif where == "status" then + if validItems == true then + -- Show simple status line instead + if tonumber(durapercent) >= 0 then -- Ensure character has some durability items equipped + LeaPlusLC:Print(L["You have"] .. " " .. string.format("%.0f", durapercent) .. "%" .. " " .. L["durability"] .. ".") + end + end + + end + end + + -- Hover over the durability button to show the durability tooltip + cButton:SetScript("OnEnter", function() + GameTooltip:SetOwner(cButton, "ANCHOR_RIGHT"); + ShowDuraStats("tip"); + end) + cButton:SetScript("OnLeave", GameTooltip_Hide) + + -- Create frame to watch events + local DeathDura = CreateFrame("FRAME") + DeathDura:RegisterEvent("PLAYER_DEAD") + DeathDura:SetScript("OnEvent", function(self, event) + ShowDuraStats("status") + DeathDura:UnregisterEvent("PLAYER_DEAD") + LibCompat.After(2, function() + DeathDura:RegisterEvent("PLAYER_DEAD") + end) + end) + + hooksecurefunc("AcceptResurrect", function() + -- Player has ressed without releasing + ShowDuraStats("status") + end) + + end + + ---------------------------------------------------------------------- + -- Hide zone text + ---------------------------------------------------------------------- + + if LeaPlusLC["HideZoneText"] == "On" then + ZoneTextFrame:SetScript("OnShow", ZoneTextFrame.Hide); + SubZoneTextFrame:SetScript("OnShow", SubZoneTextFrame.Hide); + end + + ---------------------------------------------------------------------- + -- Disable sticky chat + ---------------------------------------------------------------------- + + if LeaPlusLC["NoStickyChat"] == "On" and not LeaLockList["NoStickyChat"] then + -- These taint if set to anything other than nil + ChatTypeInfo.WHISPER.sticky = nil + ChatTypeInfo.BN_WHISPER.sticky = nil + ChatTypeInfo.CHANNEL.sticky = nil + end + + ---------------------------------------------------------------------- + -- Hide stance bar + ---------------------------------------------------------------------- + + if LeaPlusLC["NoClassBar"] == "On" and not LeaLockList["NoClassBar"] then + local stancebar = CreateFrame("FRAME", nil, UIParent) + stancebar:Hide() + StanceBarFrame:UnregisterAllEvents() + StanceBarFrame:SetParent(stancebar) + end + + ---------------------------------------------------------------------- + -- Hide gryphons + ---------------------------------------------------------------------- + + if LeaPlusLC["NoGryphons"] == "On" and not LeaLockList["NoGryphons"] then + MainMenuBarLeftEndCap:Hide(); + MainMenuBarRightEndCap:Hide(); + end + + ---------------------------------------------------------------------- + -- Disable chat fade + ---------------------------------------------------------------------- + + if LeaPlusLC["NoChatFade"] == "On" and not LeaLockList["NoChatFade"] then + -- Process normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i]:SetFading(false) + end + end + -- Process temporary frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf]:SetFading(false) + end + end) + end + + ---------------------------------------------------------------------- + -- Use easy chat frame resizing + ---------------------------------------------------------------------- + + if LeaPlusLC["UseEasyChatResizing"] == "On" and not LeaLockList["UseEasyChatResizing"] then + ChatFrame1Tab:HookScript("OnMouseDown", function(self,arg1) + if arg1 == "LeftButton" then + if select(8, GetChatWindowInfo(1)) then + ChatFrame1:StartSizing("TOP") + end + end + end) + ChatFrame1Tab:SetScript("OnMouseUp", function(self,arg1) + if arg1 == "LeftButton" then + ChatFrame1:StopMovingOrSizing() + FCF_SavePositionAndDimensions(ChatFrame1) + end + end) + end + + ---------------------------------------------------------------------- + -- Increase chat history + ---------------------------------------------------------------------- + + if LeaPlusLC["MaxChatHstory"] == "On" and not LeaLockList["MaxChatHstory"] then + -- Process normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] and _G["ChatFrame" .. i]:GetMaxLines() ~= 4096 then + _G["ChatFrame" .. i]:SetMaxLines(4096); + end + end + -- Process temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + if (_G[cf]:GetMaxLines() ~= 4096) then + _G[cf]:SetMaxLines(4096); + end + end + end) + end + + ---------------------------------------------------------------------- + -- Hide error messages + ---------------------------------------------------------------------- + + if LeaPlusLC["HideErrorMessages"] == "On" then + + -- Error message events + local OrigErrHandler = UIErrorsFrame:GetScript('OnEvent') + UIErrorsFrame:SetScript('OnEvent', function (self, event, id, err, ...) + if event == "UI_ERROR_MESSAGE" then + -- Hide error messages + if LeaPlusLC["ShowErrorsFlag"] == 1 then + if err == ERR_INV_FULL or + err == ERR_QUEST_LOG_FULL or + err == ERR_RAID_GROUP_ONLY or + err == ERR_PET_SPELL_DEAD or + err == ERR_PLAYER_DEAD or + err == ERR_FEIGN_DEATH_RESISTED or + err == SPELL_FAILED_TARGET_NO_POCKETS or + err == ERR_ALREADY_PICKPOCKETED then + return OrigErrHandler(self, event, id, err, ...) + end + else + return OrigErrHandler(self, event, id, err, ...) + end + elseif event == 'UI_INFO_MESSAGE' then + -- Show information messages + return OrigErrHandler(self, event, id, err, ...) + end + end) + + end + + -- Release memory + LeaPlusLC.Isolated = nil + + end + +---------------------------------------------------------------------- +-- L40: Player +---------------------------------------------------------------------- + + function LeaPlusLC:Player() + + ---------------------------------------------------------------------- + -- Mute custom sounds (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local MuteCustomPanel = LeaPlusLC:CreatePanel("Mute custom sounds", "MuteCustomPanel") + + local titleTX = LeaPlusLC:MakeTx(MuteCustomPanel, "Editor", 16, -72) + titleTX:SetWidth(534) + titleTX:SetWordWrap(false) + titleTX:SetJustifyH("LEFT") + + -- Show help button for title + LeaPlusLC:CreateHelpButton("MuteGameSoundsCustomHelpButton", MuteCustomPanel, titleTX, "Enter sound file IDs separated by comma then click the Mute button.|n|nIf you wish, you can enter a brief note for each file ID but do not include numbers in your notes.|n|nFor example, you can enter 'DevAura 569679, RetAura 568744' to mute the Devotion Aura and Retribution Aura spells.|n|nUse Leatrix Sounds to find, test and play sound file IDs.") + + -- Add large editbox + local eb = CreateFrame("Frame", nil, MuteCustomPanel) + eb:SetSize(548, 180) + eb:SetPoint("TOPLEFT", 10, -92) + eb:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight", + edgeSize = 16, + insets = { left = 8, right = 6, top = 8, bottom = 8 }, + }) + eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5) + + eb.scroll = CreateFrame("ScrollFrame", nil, eb) + eb.scroll:SetPoint("TOPLEFT", eb, 12, -10) + eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10) + + eb.Text = CreateFrame("EditBox", nil, eb) + eb.Text:SetMultiLine(true) + eb.Text:SetWidth(494) + eb.Text:SetHeight(230) + eb.Text:SetPoint("TOPLEFT", eb.scroll) + eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll) + eb.Text:SetMaxLetters(2000) + eb.Text:SetFontObject(GameFontNormalLarge) + eb.Text:SetAutoFocus(false) + eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) + eb.scroll:SetScrollChild(eb.Text) + + -- Set focus on the editbox text when clicking the editbox + eb:SetScript("OnMouseDown", function() + eb.Text:SetFocus() + eb.Text:SetCursorPosition(eb.Text:GetMaxLetters()) + end) + + -- Function to save the custom sound list + local function SaveString(self, userInput) + local keytext = eb.Text:GetText() + if keytext and keytext ~= "" then + LeaPlusLC["MuteCustomList"] = strtrim(eb.Text:GetText()) + else + LeaPlusLC["MuteCustomList"] = "" + end + end + + -- Save the custom sound list when it changes and at startup + eb.Text:SetScript("OnTextChanged", SaveString) + eb.Text:SetText(LeaPlusLC["MuteCustomList"]) + SaveString() + + -- Help button hidden + MuteCustomPanel.h:Hide() + + -- Back button handler + MuteCustomPanel.b:SetScript("OnClick", function() + MuteCustomPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button hidden + MuteCustomPanel.r:Hide() + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["MuteCustomSoundsBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["MuteCustomList"] = "Devotion Aura 569679, Retribution Aura 568744" + eb.Text:SetText(LeaPlusLC["MuteCustomList"]) + else + MuteCustomPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to mute custom sound list + local function MuteCustomListFunc(unmute, userInput) + -- local mutedebug = true -- Debug + local counter = 0 + local muteString = LeaPlusLC["MuteCustomList"] + if muteString and muteString ~= "" then + muteString = muteString:gsub("%s", ",") + muteString = muteString:gsub("[\n]", ",") + muteString = muteString:gsub("[^,%d]", "") + if mutedebug then print(muteString) end + local tList = {strsplit(",", muteString)} + if mutedebug then ChatFrame1:Clear() end + for i = 1, #tList do + if tList[i] then + tList[i] = tonumber(tList[i]) + if tList[i] and tList[i] < 20000000 then + if mutedebug then print(tList[i]) end + if unmute then + UnmuteSoundFile(tList[i]) + else + MuteSoundFile(tList[i]) + end + counter = counter + 1 + end + end + end + if userInput then + if unmute then + if counter == 1 then + LeaPlusLC:Print(L["Unmuted"] .. " " .. counter .. " " .. L["sound"] .. ".") + else + LeaPlusLC:Print(L["Unmuted"] .. " " .. counter .. " " .. L["sounds"] .. ".") + end + else + if counter == 1 then + LeaPlusLC:Print(L["Muted"] .. " " .. counter .. " " .. L["sound"] .. ".") + else + LeaPlusLC:Print(L["Muted"] .. " " .. counter .. " " .. L["sounds"] .. ".") + end + end + end + end + end + + -- Mute custom list on startup if option is enabled + if LeaPlusLC["MuteCustomSounds"] == "On" then + MuteCustomListFunc() + end + + -- Mute or unmute when option is clicked + LeaPlusCB["MuteCustomSounds"]:HookScript("OnClick", function() + if LeaPlusLC["MuteCustomSounds"] == "On" then + MuteCustomListFunc(false, false) + else + MuteCustomListFunc(true, false) + end + end) + + -- Add mute button + local MuteCustomNowButton = LeaPlusLC:CreateButton("MuteCustomNowButton", MuteCustomPanel, "Mute", "TOPLEFT", 16, -292, 0, 25, true, "Click to mute sounds in the list.") + LeaPlusCB["MuteCustomNowButton"]:SetScript("OnClick", function() MuteCustomListFunc(false, true) end) + + -- Add unmute button + local UnmuteCustomNowButton = LeaPlusLC:CreateButton("UnmuteCustomNowButton", MuteCustomPanel, "Unmute", "TOPLEFT", 16, -72, 0, 25, true, "Click to unmute sounds in the list.") + LeaPlusCB["UnmuteCustomNowButton"]:ClearAllPoints() + LeaPlusCB["UnmuteCustomNowButton"]:SetPoint("LEFT", MuteCustomNowButton, "RIGHT", 10, 0) + LeaPlusCB["UnmuteCustomNowButton"]:SetScript("OnClick", function() MuteCustomListFunc(true, true) end) + + -- Add play sound file editbox + local willPlay, musicHandle + local MuteCustomSoundsStopButton = LeaPlusLC:CreateButton("MuteCustomSoundsStopButton", MuteCustomPanel, "Stop", "TOPRIGHT", -18, -66, 0, 25, true, "") + MuteCustomSoundsStopButton:SetScript("OnClick", function() + if musicHandle then StopSound(musicHandle) end + end) + + local MuteCustomSoundsPlayButton = LeaPlusLC:CreateButton("MuteCustomSoundsPlayButton", MuteCustomPanel, "Play", "TOPRIGHT", -18, -66, 0, 25, true, "") + MuteCustomSoundsPlayButton:ClearAllPoints() + MuteCustomSoundsPlayButton:SetPoint("RIGHT", MuteCustomSoundsStopButton, "LEFT", -10, 0) + + local MuteCustomSoundsSoundBox = LeaPlusLC:CreateEditBox("MuteCustomSoundsSoundBox", eb, 80, 8, "TOPRIGHT", -10, 20, "PlaySoundBox", "PlaySoundBox") + MuteCustomSoundsSoundBox:SetNumeric(true) + MuteCustomSoundsSoundBox:ClearAllPoints() + MuteCustomSoundsSoundBox:SetPoint("RIGHT", MuteCustomSoundsPlayButton, "LEFT", -10, 0) + MuteCustomSoundsPlayButton:SetScript("OnClick", function() + MuteCustomSoundsSoundBox:GetText() + if musicHandle then StopSound(musicHandle) end + willPlay, musicHandle = PlaySoundFile(MuteCustomSoundsSoundBox:GetText(), "Master") + end) + + -- Add mousewheel support to the editbox + MuteCustomSoundsSoundBox:SetScript("OnMouseWheel", function(self, delta) + local endSound = tonumber(MuteCustomSoundsSoundBox:GetText()) + if endSound then + if delta == 1 then endSound = endSound + 1 else endSound = endSound - 1 end + if endSound < 1 then endSound = 1 elseif endSound >= 10000000 then endSound = 10000000 end + MuteCustomSoundsSoundBox:SetText(endSound) + MuteCustomSoundsPlayButton:Click() + end + end) + + local titlePlayer = LeaPlusLC:MakeTx(MuteCustomPanel, "Player", 16, -72) + titlePlayer:ClearAllPoints() + titlePlayer:SetPoint("TOPLEFT", MuteCustomSoundsSoundBox, "TOPLEFT", -4, 16) + LeaPlusLC:CreateHelpButton("MuteGameSoundsCustomPlayHelpButton", MuteCustomPanel, titlePlayer, "If you want to listen to a sound file, enter the sound file ID into the editbox and click the play button.|n|nYou can scroll the mousewheel over the editbox to play neighbouring sound files.") + end + + ---------------------------------------------------------------------- + -- Manage vehicle + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageVehicle"] == "On" and not LeaLockList["ManageVehicle"] then + + -- Create and manage container for VehicleSeatIndicator + local vehicleHolder = CreateFrame("Frame", nil, UIParent) + vehicleHolder:SetPoint("TOP", UIParent, "TOP", 0, -15) + vehicleHolder:SetSize(128, 128) + + local vehicleContainer = _G.VehicleSeatIndicator + vehicleContainer:ClearAllPoints() + vehicleContainer:SetPoint('CENTER', vehicleHolder) + vehicleContainer:SetIgnoreParentScale(true) -- Needed to keep drag frame position when scaled + + hooksecurefunc(vehicleContainer, 'SetPoint', function(self, void, b) + if b and (b ~= vehicleHolder) then + -- Reset parent if it changes from vehicleHolder + self:ClearAllPoints() + self:SetPoint('TOPRIGHT', vehicleHolder) -- Has to be TOPRIGHT (drag frame while moving between subzones) + self:SetParent(vehicleHolder) + end + end) + + -- Allow vehicle frame to be moved + vehicleHolder:SetMovable(true) + vehicleHolder:SetUserPlaced(true) + vehicleHolder:SetDontSavePosition(true) + vehicleHolder:SetClampedToScreen(false) + + -- Set vehicle frame position at startup + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + vehicleHolder:SetScale(LeaPlusLC["VehicleScale"]) + VehicleSeatIndicator:SetScale(LeaPlusLC["VehicleScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("CENTER", vehicleHolder, "CENTER", 0, 1) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["VehicleScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + -- dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Vehicle"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + vehicleHolder:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame position + vehicleHolder:StopMovingOrSizing() + LeaPlusLC["VehicleA"], void, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"] = vehicleHolder:GetPoint() + vehicleHolder:SetMovable(true) + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 120, 128 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local VehiclePanel = LeaPlusLC:CreatePanel("Manage vehicle", "VehiclePanel") + + LeaPlusLC:MakeTx(VehiclePanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(VehiclePanel, "VehicleScale", "Drag to set the vehicle seat indicator frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["VehicleScale"]:HookScript("OnValueChanged", function() + vehicleHolder:SetScale(LeaPlusLC["VehicleScale"]) + VehicleSeatIndicator:SetScale(LeaPlusLC["VehicleScale"]) + dragframe:SetScale(LeaPlusLC["VehicleScale"]) + -- Show formatted slider value + LeaPlusCB["VehicleScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["VehicleScale"] * 100) + end) + + -- Hide frame alignment grid with panel + VehiclePanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local VehicleToggleGridButton = LeaPlusLC:CreateButton("VehicleToggleGridButton", VehiclePanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["VehicleToggleGridButton"]:ClearAllPoints() + LeaPlusCB["VehicleToggleGridButton"]:SetPoint("LEFT", VehiclePanel.h, "RIGHT", 10, 0) + LeaPlusCB["VehicleToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + VehiclePanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + VehiclePanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + VehiclePanel.b:SetScript("OnClick", function() + VehiclePanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + VehiclePanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["VehicleA"] = "TOPRIGHT" + LeaPlusLC["VehicleR"] = "TOPRIGHT" + LeaPlusLC["VehicleX"] = -100 + LeaPlusLC["VehicleY"] = -192 + LeaPlusLC["VehicleScale"] = 1 + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + + -- Refresh configuration panel + VehiclePanel:Hide(); VehiclePanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageVehicleButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["VehicleA"] = "TOPRIGHT" + LeaPlusLC["VehicleR"] = "TOPRIGHT" + LeaPlusLC["VehicleX"] = -100 + LeaPlusLC["VehicleY"] = -192 + LeaPlusLC["VehicleScale"] = 1 + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + vehicleHolder:SetScale(LeaPlusLC["VehicleScale"]) + VehicleSeatIndicator:SetScale(LeaPlusLC["VehicleScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(128 * LeaPlusLC["gscale"]) + dragframe:SetHeight(128 * LeaPlusLC["gscale"]) + + -- Show configuration panel + VehiclePanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + VehiclePanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Block shared quests (no reload needed) + ---------------------------------------------------------------------- + + do + + local eFrame = CreateFrame("FRAME") + eFrame:SetScript("OnEvent", LeaPlusLC.CheckIfQuestIsSharedAndShouldBeDeclined) + + -- Function to set event + local function SetSharedQuestsFunc() + if LeaPlusLC["NoSharedQuests"] == "On" then + eFrame:RegisterEvent("QUEST_DETAIL") + else + eFrame:UnregisterEvent("QUEST_DETAIL") + end + end + + -- Set event when option is clicked and on startup + LeaPlusCB["NoSharedQuests"]:HookScript("OnClick", SetSharedQuestsFunc) + SetSharedQuestsFunc() + + end + + ---------------------------------------------------------------------- + -- Restore chat messages + ---------------------------------------------------------------------- + + if LeaPlusLC["RestoreChatMessages"] == "On" and not LeaLockList["RestoreChatMessages"] then + + local historyFrame = CreateFrame("FRAME") + historyFrame:RegisterEvent("PLAYER_LOGIN") + historyFrame:RegisterEvent("PLAYER_LOGOUT") + + local FCF_IsChatWindowIndexActive = FCF_IsChatWindowIndexActive + local GetMessageInfo = GetMessageInfo + local GetNumMessages = GetNumMessages + + -- Use function from Dragonflight + local function FCF_IsChatWindowIndexActive(chatWindowIndex) + local shown = select(7, FCF_GetChatWindowInfo(chatWindowIndex)) + if shown then + return true + end + local chatFrame = _G["ChatFrame" .. chatWindowIndex] + return (chatFrame and chatFrame.isDocked) + end + + -- Save chat messages on logout + historyFrame:SetScript("OnEvent", function(self, event) + if event == "PLAYER_LOGOUT" then + local name, realm = UnitFullName("player") + if not realm then realm = GetNormalizedRealmName() end + if name and realm then + LeaPlusDB["ChatHistoryName"] = name .. "-" .. realm + LeaPlusDB["ChatHistoryTime"] = GetServerTime() + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] then + if FCF_IsChatWindowIndexActive(i) then + LeaPlusDB["ChatHistory" .. i] = {} + local chtfrm = _G["ChatFrame" .. i] + local NumMsg = chtfrm:GetNumMessages() + local StartMsg = 1 + if NumMsg > 128 then StartMsg = NumMsg - 127 end + for iMsg = StartMsg, NumMsg do + local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg) + if chatMessage then + if r and g and b then + local colorCode = RGBToColorCode(r, g, b) + chatMessage = colorCode .. chatMessage + end + tinsert(LeaPlusDB["ChatHistory" .. i], chatMessage) + end + end + end + end + end + end + end + end) + + -- Restore chat messages on login + local name, realm = UnitFullName("player") + if not realm then realm = GetNormalizedRealmName() end + if name and realm then + if LeaPlusDB["ChatHistoryName"] and LeaPlusDB["ChatHistoryTime"] then + local timeDiff = GetServerTime() - LeaPlusDB["ChatHistoryTime"] + if LeaPlusDB["ChatHistoryName"] == name .. "-" .. realm and timeDiff and timeDiff < 10 then -- reload must be done within 15 seconds + + -- Store chat messages from current session and clear chat + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] and FCF_IsChatWindowIndexActive(i) then + LeaPlusDB["ChatTemp" .. i] = {} + local chtfrm = _G["ChatFrame" .. i] + local NumMsg = chtfrm:GetNumMessages() + for iMsg = 1, NumMsg do + local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg) + if chatMessage then + if r and g and b then + local colorCode = RGBToColorCode(r, g, b) + chatMessage = colorCode .. chatMessage + end + tinsert(LeaPlusDB["ChatTemp" .. i], chatMessage) + end + end + chtfrm:Clear() + end + end + + -- Restore chat messages from previous session + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatHistory" .. i] and FCF_IsChatWindowIndexActive(i) then + LeaPlusDB["ChatHistory" .. i .. "Count"] = 0 + -- Add previous session messages to chat + for k = 1, #LeaPlusDB["ChatHistory" .. i] do + if LeaPlusDB["ChatHistory" .. i][k] ~= string.match(LeaPlusDB["ChatHistory" .. i][k], "|cffffd800" .. L["Restored"] .. " " .. ".*" .. " " .. L["message"] .. ".*.|r") then + _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatHistory" .. i][k]) + LeaPlusDB["ChatHistory" .. i .. "Count"] = LeaPlusDB["ChatHistory" .. i .. "Count"] + 1 + end + end + -- Show how many messages were restored + if LeaPlusDB["ChatHistory" .. i .. "Count"] == 1 then + _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["message from previous session"] .. ".|r") + else + _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["messages from previous session"] .. ".|r") + end + else + -- No messages to restore + LeaPlusDB["ChatHistory" .. i] = nil + end + end + + -- Restore chat messages from this session + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatTemp" .. i] and FCF_IsChatWindowIndexActive(i) then + for k = 1, #LeaPlusDB["ChatTemp" .. i] do + _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatTemp" .. i][k]) + end + end + end + + end + end + end + + else + + -- Option is disabled so clear any messages from saved variables + LeaPlusDB["ChatHistoryName"] = nil + LeaPlusDB["ChatHistoryTime"] = nil + for i = 1, 50 do + LeaPlusDB["ChatHistory" .. i] = nil + LeaPlusDB["ChatTemp" .. i] = nil + LeaPlusDB["ChatHistory" .. i .. "Count"] = nil + end + + end + + ---------------------------------------------------------------------- + -- Enhance minimap + ---------------------------------------------------------------------- + + if LeaPlusLC["MinimapModder"] == "On" and not LeaLockList["MinimapModder"] then + + local miniFrame = CreateFrame("FRAME") + local LibDBIconStub = LibStub("LibDBIcon-1.0") + + -- Function to set button radius + local function SetButtonRad() + if LeaPlusLC["SquareMinimap"] == "On" then + LibDBIconStub:SetButtonRadius(26 + ((LeaPlusLC["MinimapSize"] - 140) * 0.165)) + else + LibDBIconStub:SetButtonRadius(1) + end + end + + ---------------------------------------------------------------------- + -- Configuration panel + ---------------------------------------------------------------------- + + -- Create configuration panel + local SideMinimap = LeaPlusLC:CreatePanel("Enhance minimap", "SideMinimap") + + -- Hide panel during combat + SideMinimap:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + SideMinimap:Hide() + end + end) + + -- Add checkboxes + LeaPlusLC:MakeTx(SideMinimap, "Settings", 16, -72) + LeaPlusLC:MakeCB(SideMinimap, "HideMiniZoomBtns", "Hide the zoom buttons", 16, -92, false, "If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniZoneText", "Hide the zone text bar", 16, -112, false, "If checked, the zone text bar will be hidden.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniMapButton", "Hide the world map button", 16, -132, false, "If checked, the world map button will be hidden.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniTracking", "Hide the tracking button", 16, -152, true, "If checked, the tracking button will be hidden while the pointer is not over the minimap.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniAddonButtons", "Hide addon buttons", 16, -172, false, "If checked, addon buttons will be hidden while the pointer is not over the minimap.") + LeaPlusLC:MakeCB(SideMinimap, "CombineAddonButtons", "Combine addon buttons", 16, -192, true, "If checked, addon buttons will be combined into a single button frame which you can toggle by right-clicking the minimap.|n|nNote that enabling this option will lock out the 'Hide addon buttons' setting.") + LeaPlusLC:MakeCB(SideMinimap, "SquareMinimap", "Square minimap", 16, -212, true, "If checked, the minimap shape will be square.") + LeaPlusLC:MakeCB(SideMinimap, "ShowWhoPinged", "Show who pinged", 16, -232, false, "If checked, when someone pings the minimap, their name will be shown. This does not apply to your pings.") + + -- Add excluded button + local MiniExcludedButton = LeaPlusLC:CreateButton("MiniExcludedButton", SideMinimap, "Buttons", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the addon buttons editor.") + LeaPlusCB["MiniExcludedButton"]:ClearAllPoints() + LeaPlusCB["MiniExcludedButton"]:SetPoint("LEFT", SideMinimap.h, "RIGHT", 10, 0) + + -- Set exclude button visibility + local function SetExcludeButtonsFunc() + if LeaPlusLC["HideMiniAddonButtons"] == "On" or LeaPlusLC["CombineAddonButtons"] == "On" then + LeaPlusLC:LockItem(LeaPlusCB["MiniExcludedButton"], false) + else + LeaPlusLC:LockItem(LeaPlusCB["MiniExcludedButton"], true) + end + end + LeaPlusCB["HideMiniAddonButtons"]:HookScript("OnClick", SetExcludeButtonsFunc) + SetExcludeButtonsFunc() + + -- Add slider controls + LeaPlusLC:MakeTx(SideMinimap, "Scale", 356, -72) + LeaPlusLC:MakeSL(SideMinimap, "MinimapScale", "Drag to set the minimap scale.|n|nAdjusting this slider makes the minimap and all the elements bigger.", 1, 4, 0.1, 356, -92, "%.2f") + + LeaPlusLC:MakeTx(SideMinimap, "Square size", 356, -132) + LeaPlusLC:MakeSL(SideMinimap, "MinimapSize", "Drag to set the square minimap size.|n|nAdjusting this slider makes the minimap bigger but keeps the elements the same size.", 140, 560, 1, 356, -152, "%.0f") + + LeaPlusLC:MakeTx(SideMinimap, "Cluster scale", 356, -192) + LeaPlusLC:MakeSL(SideMinimap, "MiniClusterScale", "Drag to set the cluster scale.|n|nNote: Adjusting the cluster scale affects the entire cluster including frames attached to it such as the quest watch frame.|n|nIt will also cause the default UI right-side action bars to scale when you login. If you use the default UI right-side action bars, you may want to leave this at 100%.", 1, 2, 0.1, 356, -212, "%.2f") + + LeaPlusLC:MakeCB(SideMinimap, "MinimapNoScale", "Not minimap", 356, -242, false, "If checked, adjusting the cluster scale will not affect the minimap scale.") + + ---------------------------------------------------------------------- + -- Addon buttons editor + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local ExcludedButtonsPanel = LeaPlusLC:CreatePanel("Enhance minimap", "ExcludedButtonsPanel") + + local titleTX = LeaPlusLC:MakeTx(ExcludedButtonsPanel, "Buttons for the addons listed below will remain visible.", 16, -72) + titleTX:SetWidth(534) + titleTX:SetWordWrap(false) + titleTX:SetJustifyH("LEFT") + + -- Add second excluded button + local MiniExcludedButton2 = LeaPlusLC:CreateButton("MiniExcludedButton2", ExcludedButtonsPanel, "Buttons", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the addon buttons editor.") + LeaPlusCB["MiniExcludedButton2"]:ClearAllPoints() + LeaPlusCB["MiniExcludedButton2"]:SetPoint("LEFT", ExcludedButtonsPanel.h, "RIGHT", 10, 0) + LeaPlusCB["MiniExcludedButton2"]:SetScript("OnClick", function() + ExcludedButtonsPanel:Hide(); SideMinimap:Show() + return + end) + + -- Add large editbox + local eb = CreateFrame("Frame", nil, ExcludedButtonsPanel) + eb:SetSize(548, 180) + eb:SetPoint("TOPLEFT", 10, -92) + eb:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight", + edgeSize = 16, + insets = { left = 8, right = 6, top = 8, bottom = 8 }, + }) + eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5) + + eb.scroll = CreateFrame("ScrollFrame", nil, eb) + eb.scroll:SetPoint("TOPLEFT", eb, 12, -10) + eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10) + + eb.Text = CreateFrame("EditBox", nil, eb) + eb.Text:SetMultiLine(true) + eb.Text:SetWidth(494) + eb.Text:SetHeight(230) + eb.Text:SetPoint("TOPLEFT", eb.scroll) + eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll) + eb.Text:SetMaxLetters(1200) + eb.Text:SetFontObject(GameFontNormalLarge) + eb.Text:SetAutoFocus(false) + eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) + eb.scroll:SetScrollChild(eb.Text) + + -- Set focus on the editbox text when clicking the editbox + eb:SetScript("OnMouseDown", function() + eb.Text:SetFocus() + eb.Text:SetCursorPosition(eb.Text:GetMaxLetters()) + end) + + -- Debug + -- eb.Text:SetText("Leatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack") + + -- Function to save the excluded list + local function SaveString(self, userInput) + local keytext = eb.Text:GetText() + if keytext and keytext ~= "" then + LeaPlusLC["MiniExcludeList"] = strtrim(eb.Text:GetText()) + else + LeaPlusLC["MiniExcludeList"] = "" + end + if userInput then + LeaPlusLC:ReloadCheck() + end + end + + -- Save the excluded list when it changes and at startup + eb.Text:SetScript("OnTextChanged", SaveString) + eb.Text:SetText(LeaPlusLC["MiniExcludeList"]) + SaveString() + + -- Help button tooltip + ExcludedButtonsPanel.h.tiptext = L["If you use the 'Hide addon buttons' or 'Combine addon buttons' settings but you want some addon buttons to remain visible around the minimap, enter the addon names into the editbox separated by a comma.|n|nThe editbox tooltip shows the addon names that you can enter. The names must match exactly with the names shown in the editbox tooltip though case does not matter.|n|nChanges to the list will require a UI reload to take effect."] + + -- Back button handler + ExcludedButtonsPanel.b:SetScript("OnClick", function() + ExcludedButtonsPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + ExcludedButtonsPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["MiniExcludeList"] = "" + eb.Text:SetText(LeaPlusLC["MiniExcludeList"]) + + -- Refresh configuration panel + ExcludedButtonsPanel:Hide(); ExcludedButtonsPanel:Show() + LeaPlusLC:ReloadCheck() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["MiniExcludedButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["MiniExcludeList"] = "BugSack, Leatrix_Plus" + LeaPlusLC:ReloadCheck() + else + ExcludedButtonsPanel:Show() + LeaPlusGlobalPanel_SideMinimap:Hide() + end + end) + + -- Function to make tooltip string with list of addons + local function MakeAddonString() + local msg = "" + local numAddons = GetNumAddOns() + for i = 1, numAddons do + if IsAddOnLoaded(i) then + local name = GetAddOnInfo(i) + if name and _G["LibDBIcon10_" .. name] then -- Only list LibDBIcon buttons + msg = msg .. name .. ", " + end + end + end + if msg ~= "" then + msg = L["Supported Addons"] .. "|n|n" .. msg:sub(1, (strlen(msg) - 2)) .. "." + else + msg = L["No supported addons."] + end + eb.tiptext = msg + eb.Text.tiptext = msg + end + + -- Show the help button tooltip for the editbox too + eb:SetScript("OnEnter", MakeAddonString) + eb:HookScript("OnEnter", LeaPlusLC.TipSee) + eb:SetScript("OnLeave", GameTooltip_Hide) + eb.Text:SetScript("OnEnter", MakeAddonString) + eb.Text:HookScript("OnEnter", LeaPlusLC.ShowDropTip) + eb.Text:SetScript("OnLeave", GameTooltip_Hide) + + end + + ---------------------------------------------------------------------- + -- Show who pinged + ---------------------------------------------------------------------- + + do + + -- Create frame + local pFrame = CreateFrame("FRAME", nil, Minimap) + pFrame:SetSize(100, 20) + + -- Set position + if LeaPlusLC["SquareMinimap"] == "On" then + pFrame:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMRIGHT", 0, -3) + else + pFrame:SetPoint("BOTTOM", Minimap, "BOTTOM", 0, 2) + end + + -- Set backdrop + pFrame.bg = { + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + insets = {left = 4, top = 4, right = 4, bottom = 4}, + edgeSize = 16, + tile = true, + } + + pFrame:SetBackdrop(pFrame.bg) + pFrame:SetBackdropColor(0, 0, 0, 0.7) + pFrame:SetBackdropBorderColor(0, 0, 0, 0) + + -- Create fontstring + pFrame.f = pFrame:CreateFontString(nil, nil, "GameFontNormalSmall") + pFrame.f:SetAllPoints() + pFrame:Hide() + + -- Set variables + local pingTime + local lastUnit, lastX, lastY = "player", 0, 0 + + -- Show who pinged + pFrame:SetScript("OnEvent", function(void, void, unit, x, y) + + -- Do nothing if unit has not changed + if UnitIsUnit(unit, "player") or UnitIsUnit(unit, lastUnit) and x == lastX and y == lastY then return end + lastUnit, lastX, lastY = unit, x, y + + -- Show name in class color + local void, class = UnitClass(unit) + if class then + local color = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class] + if color then + + -- Set frame details + pFrame.f:SetFormattedText("|cff%02x%02x%02x%s|r", color.r * 255, color.g * 255, color.b * 255, UnitName(unit)) + pFrame:SetSize(pFrame.f:GetUnboundedStringWidth() + 12, 20) + + -- Hide frame after 5 seconds + pFrame:Show() + pingTime = GetTime() + LibCompat.After(5, function() + if GetTime() - pingTime >= 5 then + pFrame:Hide() + end + end) + + end + end + + end) + + -- Set event when option is clicked and on startup + local function SetPingFunc() + if LeaPlusLC["ShowWhoPinged"] == "On" then + pFrame:RegisterEvent("MINIMAP_PING") + else + pFrame:UnregisterEvent("MINIMAP_PING") + if pFrame:IsShown() then pFrame:Hide() end + end + end + + LeaPlusCB["ShowWhoPinged"]:HookScript("OnClick", SetPingFunc) + SetPingFunc() + + end + + ---------------------------------------------------------------------- + -- Minimap scale + ---------------------------------------------------------------------- + + -- Function to set the minimap cluster scale + local function SetClusterScale() + MinimapCluster:SetScale(LeaPlusLC["MiniClusterScale"]) + -- Set slider formatted text + LeaPlusCB["MiniClusterScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["MiniClusterScale"] * 100) + end + + -- Set minimap scale when slider is changed and on startup + LeaPlusCB["MiniClusterScale"]:HookScript("OnValueChanged", SetClusterScale) + SetClusterScale() + + ---------------------------------------------------------------------- + -- Minimap size + ---------------------------------------------------------------------- + + if LeaPlusLC["SquareMinimap"] == "On" then + + -- Function to set minimap size + local function SetMinimapSize() + -- Set minimap size + Minimap:SetSize(LeaPlusLC["MinimapSize"], LeaPlusLC["MinimapSize"]) + -- Refresh minimap + if Minimap:GetZoom() ~= 5 then + Minimap:SetZoom(Minimap:GetZoom() + 1) + Minimap:SetZoom(Minimap:GetZoom() - 1) + else + Minimap:SetZoom(Minimap:GetZoom() - 1) + Minimap:SetZoom(Minimap:GetZoom() + 1) + end + -- Refresh addon button radius + SetButtonRad() + -- Update slider text + LeaPlusCB["MinimapSize"].f:SetFormattedText("%.0f%%", (LeaPlusLC["MinimapSize"] / 140) * 100) + end + + -- Set minimap size when slider is changed and on startup + LeaPlusCB["MinimapSize"]:HookScript("OnValueChanged", SetMinimapSize) + SetMinimapSize() + + -- Assign file level scope (for reset and preset) + LeaPlusLC.SetMinimapSize = SetMinimapSize + + else + + -- Square minimap is disabled so lock the size slider + LeaPlusLC:LockItem(LeaPlusCB["MinimapSize"], true) + LeaPlusCB["MinimapSize"].tiptext = LeaPlusCB["MinimapSize"].tiptext .. "|cff00AAFF|n|n" .. L["This slider requires 'Square minimap' to be enabled."] .. "|r" + + end + + ---------------------------------------------------------------------- + -- Combine addon buttons + ---------------------------------------------------------------------- + + if LeaPlusLC["CombineAddonButtons"] == "On" then + + -- Lock out hide minimap buttons + LeaPlusLC:LockItem(LeaPlusCB["HideMiniAddonButtons"], true) + LeaPlusCB["HideMiniAddonButtons"].tiptext = LeaPlusCB["HideMiniAddonButtons"].tiptext .. "|n|n|cff00AAFF" .. L["Cannot be used with Combine addon buttons."] + + -- Create button frame (parenting to cluster ensures bFrame scales correctly) + local bFrame = CreateFrame("FRAME", nil, MinimapCluster) + bFrame:ClearAllPoints() + bFrame:SetPoint("TOPLEFT", Minimap, "TOPRIGHT", 4, 4) + bFrame:Hide() + bFrame:SetFrameLevel(8) + + LeaPlusLC.bFrame = bFrame -- Used in LibDBIcon callback + _G["LeaPlusGlobalMinimapCombinedButtonFrame"] = bFrame -- For third party addons + + -- Hide button frame automatically + local ButtonFrameTicker + bFrame:HookScript("OnShow", function() + if ButtonFrameTicker then ButtonFrameTicker:Cancel() end + ButtonFrameTicker = LibCompat.NewTicker(2, function() + if ItemRackMenuFrame and ItemRackMenuFrame:IsShown() and ItemRackMenuFrame:IsMouseOver() then return end + if not bFrame:IsMouseOver() and not Minimap:IsMouseOver() then + bFrame:Hide() + if ButtonFrameTicker then ButtonFrameTicker:Cancel() end + end + end, 15) + end) + + -- Match scale with minimap + if LeaPlusLC["SquareMinimap"] == "On" then + bFrame:SetScale(LeaPlusLC["MinimapScale"] * 0.75) + else + bFrame:SetScale(LeaPlusLC["MinimapScale"]) + end + LeaPlusCB["MinimapScale"]:HookScript("OnValueChanged", function() + if LeaPlusLC["SquareMinimap"] == "On" then + bFrame:SetScale(LeaPlusLC["MinimapScale"] * 0.75) + else + bFrame:SetScale(LeaPlusLC["MinimapScale"]) + end + end) + + -- Position LibDBIcon tooltips when shown + LibDBIconTooltip:HookScript("OnShow", function() + GameTooltip:Hide() + LibDBIconTooltip:ClearAllPoints() + if bFrame:GetPoint() == "BOTTOMLEFT" then + LibDBIconTooltip:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", 0, -6) + else + LibDBIconTooltip:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 0, -6) + end + end) + + -- Function to position GameTooltip below the minimap + local function SetButtonTooltip() + GameTooltip:ClearAllPoints() + if bFrame:GetPoint() == "BOTTOMLEFT" then + GameTooltip:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", 0, -6) + else + GameTooltip:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 0, -6) + end + end + + LeaPlusLC.SetButtonTooltip = SetButtonTooltip -- Used in LibDBIcon callback + + -- Hide existing LibDBIcon icons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + button:Hide() + button:SetScript("OnShow", function() if not bFrame:IsShown() then button:Hide() end end) + -- Create background texture + local bFrameBg = button:CreateTexture(nil, "BACKGROUND") + bFrameBg:SetTexture("Interface\\ChatFrame\\ChatFrameBackground") + bFrameBg:SetPoint("CENTER") + bFrameBg:SetSize(30, 30) + bFrameBg:SetVertexColor(0, 0, 0, 0.5) + elseif strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) and LeaPlusLC["SquareMinimap"] == "On" then + button:SetScale(0.75) + end + -- Move GameTooltip to below the minimap in case the button uses it + button:HookScript("OnEnter", SetButtonTooltip) + end + + -- Hide new LibDBIcon icons + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + + -- Toggle button frame + Minimap:SetScript("OnMouseUp", function(frame, button) + if button == "RightButton" then + if bFrame:IsShown() then + bFrame:Hide() + else bFrame:Show() + -- Position button frame + local side + local m = Minimap:GetCenter() + local b = Minimap:GetEffectiveScale() + local w = GetScreenWidth() + local s = UIParent:GetEffectiveScale() + bFrame:ClearAllPoints() + if m * b > (w * s / 2) then + side = "Right" + bFrame:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMLEFT", -10, -0) + else + side = "Left" + bFrame:SetPoint("BOTTOMLEFT", Minimap, "BOTTOMRIGHT", 10, 0) + end + -- Show button frame + local x, y, row, col = 0, 0, 0, 0 + local buttons = LibDBIconStub:GetButtonList() + -- Calculate buttons per row + local buttonsPerRow + local totalButtons = #buttons + if totalButtons > 36 then buttonsPerRow = 10 + elseif totalButtons > 32 then buttonsPerRow = 9 + elseif totalButtons > 28 then buttonsPerRow = 8 + elseif totalButtons > 24 then buttonsPerRow = 7 + elseif totalButtons > 20 then buttonsPerRow = 6 + elseif totalButtons > 16 then buttonsPerRow = 5 + elseif totalButtons > 12 then buttonsPerRow = 4 + elseif totalButtons > 8 then buttonsPerRow = 3 + elseif totalButtons > 4 then buttonsPerRow = 2 + else + buttonsPerRow = 1 + end + -- Build button grid + for i = 1, totalButtons do + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + if button.db then + if buttonName == "armory" then button.db.hide = false end -- Armory addon sets hidden to true + if not button.db.hide then + button:SetParent(bFrame) + button:ClearAllPoints() + if side == "Left" then + -- Minimap is on left side of screen + button:SetPoint("TOPLEFT", bFrame, "TOPLEFT", x, y) + col = col + 1; if col >= buttonsPerRow then col = 0; row = row + 1; x = 0; y = y - 30 else x = x + 30 end + else + -- Minimap is on right side of screen + button:SetPoint("TOPRIGHT", bFrame, "TOPRIGHT", x, y) + col = col + 1; if col >= buttonsPerRow then col = 0; row = row + 1; x = 0; y = y - 30 else x = x - 30 end + end + if totalButtons <= buttonsPerRow then + bFrame:SetWidth(totalButtons * 30) + else + bFrame:SetWidth(buttonsPerRow * 30) + end + local void, void, void, void, e = button:GetPoint() + bFrame:SetHeight(0 - e + 30) + LibDBIconStub:Show(buttons[i]) + end + end + end + end + end + else + Minimap_OnClick(frame, button) + end + end) + + end + + ---------------------------------------------------------------------- + -- Square minimap + ---------------------------------------------------------------------- + + if LeaPlusLC["SquareMinimap"] == "On" then + + -- Set minimap shape + _G.GetMinimapShape = function() return "SQUARE" end + + -- Create black border around map + local miniBorder = CreateFrame("Frame", nil, Minimap) + miniBorder:SetPoint("TOPLEFT", -3, 3) + miniBorder:SetPoint("BOTTOMRIGHT", 3, -3) + miniBorder:SetAlpha(0.8) + miniBorder:SetBackdrop({ + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Background-Dark", + edgeSize = 3, + }) + + -- Hide the default border + MinimapBorder:Hide() + + -- Mask texture + Minimap:SetMaskTexture('Interface\\ChatFrame\\ChatFrameBackground') + + -- Hide the North tag + hooksecurefunc(MinimapNorthTag, "Show", function() + MinimapNorthTag:Hide() + end) + + -- Tracking button + MiniMapTracking:SetScale(0.75) + miniFrame.ClearAllPoints(MiniMapTracking) + MiniMapTracking:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -20, -40) + + -- Mail button + MiniMapMailFrame:SetScale(0.75) + miniFrame.ClearAllPoints(MiniMapMailFrame) + MiniMapMailFrame:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -19, -75) + + -- Battleground queue button + MiniMapBattlefieldFrame:SetScale(0.75) + miniFrame.ClearAllPoints(MiniMapBattlefieldFrame) + MiniMapBattlefieldFrame:SetPoint("TOP", MiniMapMailFrame, "BOTTOM", 0, 0) + + -- Looking For Group button + MiniMapLFGFrame:SetScale(0.75) + MiniMapLFGFrame:ClearAllPoints() + MiniMapLFGFrame:SetPoint("TOP", MiniMapBattlefieldFrame, "BOTTOM", 0, 0) + + -- World map button + MiniMapWorldMapButton:SetScale(0.75) + MiniMapWorldMapButton:ClearAllPoints() + MiniMapWorldMapButton:SetPoint("BOTTOM", MinimapZoomIn, "TOP", 0, 0) + + -- Zoom in button + MinimapZoomIn:SetScale(0.75) + miniFrame.ClearAllPoints(MinimapZoomIn) + MinimapZoomIn:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT", 19, -120) + + -- Zoom out button + MinimapZoomOut:SetScale(0.75) + miniFrame.ClearAllPoints(MinimapZoomOut) + MinimapZoomOut:SetPoint("TOP", MinimapZoomIn, "BOTTOM", 0, 0) + + -- Calendar button + miniFrame.ClearAllPoints(GameTimeFrame) + GameTimeFrame:SetPoint("BOTTOM", MiniMapWorldMapButton, "TOP", 0, 2) + GameTimeFrame:SetParent(MinimapBackdrop) + GameTimeFrame:SetScale(0.75) + GameTimeFrame:SetSize(32, 32) + + -- Debug buttons + local LeaPlusMiniMapDebug = nil + if LeaPlusMiniMapDebug then + LibCompat.After(2, function() + MiniMapMailFrame:Show() + MiniMapBattlefieldFrame:Show() + MiniMapWorldMapButton:Show() + -- GameTimeFrame:Show() + MiniMapLFGFrame:Show() + end) + end + + -- Rescale addon buttons if combine addon buttons is disabled + if LeaPlusLC["CombineAddonButtons"] == "Off" then + -- Scale existing buttons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + button:SetScale(0.75) + end + -- Scale new buttons + -- LibDBIcon_IconCreated: Done in LiBDBIcon callback function + end + + -- Refresh buttons + LibCompat.After(0.1, SetButtonRad) + + else + + -- Square minimap is disabled so use round shape + _G.GetMinimapShape = function() return "ROUND" end + Minimap:SetMaskTexture([[Interface\CharacterFrame\TempPortraitAlphaMask]]) + + -- Calendar button + miniFrame.ClearAllPoints(GameTimeFrame) + GameTimeFrame:SetPoint("TOPRIGHT", MinimapBackdrop, "TOPRIGHT", -11, 4) + GameTimeFrame:SetParent(MinimapBackdrop) + + -- World map button + miniFrame.ClearAllPoints(MiniMapWorldMapButton) + LibDBIconStub:SetButtonToPosition(MiniMapWorldMapButton, 20) + + end + + ---------------------------------------------------------------------- + -- Replace non-standard buttons + ---------------------------------------------------------------------- + + -- Replace non-standard buttons for addons that don't use the standard LibDBIcon library + do + + -- Make custom LibDBIcon buttons for addons that don't use LibDBIcon + local CustomAddonTable = {} + LeaPlusDB["CustomAddonButtons"] = LeaPlusDB["CustomAddonButtons"] or {} + + -- Function to create a LibDBIcon button + local function CreateBadButton(name) + + -- Get non-standard button texture + local finalTex = "Interface\\HELPFRAME\\HelpIcon-KnowledgeBase" + + if _G[name .. "Icon"] then + if _G[name .. "Icon"]:GetObjectType() == "Texture" then + local gTex = _G[name .. "Icon"]:GetTexture() + if gTex then + finalTex = gTex + end + end + else + for i = 1, select('#', _G[name]:GetRegions()) do + local region = select(i, _G[name]:GetRegions()) + if region.GetTexture then + local x, y = region:GetSize() + if x and x < 30 then + finalTex = region:GetTexture() + end + end + end + end + + if not finalTex then finalTex = "Interface\\HELPFRAME\\HelpIcon-KnowledgeBase" end + + local zeroButton = LibStub("LibDataBroker-1.1"):NewDataObject("LeaPlusCustomIcon_" .. name, { + type = "data source", + text = name, + icon = finalTex, + OnClick = function(self, btn) + if _G[name] then + if string.find(name, "LibDBIcon") then + -- It's a fake LibDBIcon + local mouseUp = _G[name]:GetScript("OnMouseUp") + if mouseUp then + mouseUp(self, btn) + end + else + -- It's a genuine LibDBIcon + local clickUp = _G[name]:GetScript("OnClick") + if clickUp then + _G[name]:Click(btn) + end + end + end + end, + OnTooltipShow = function(tooltip) + if not tooltip or not tooltip.AddLine then return end + tooltip:AddLine(name) + tooltip:AddLine(L["This is a custom button."], 1, 1, 1) + tooltip:AddLine(L["Please ask the addon author to use LibDBIcon."], 1, 1, 1) + tooltip:AddLine(L["There is a helpful guide on leatrix.com."], 1, 1, 1) + end, + }) + LeaPlusDB["CustomAddonButtons"][name] = LeaPlusDB["CustomAddonButtons"][name] or {} + LeaPlusDB["CustomAddonButtons"][name].hide = false + CustomAddonTable[name] = name + local icon = LibStub("LibDBIcon-1.0", true) + icon:Register("LeaPlusCustomIcon_" .. name, zeroButton, LeaPlusDB["CustomAddonButtons"][name]) + + end + + -- Function to loop through minimap children to find custom addon buttons + local function MakeButtons() + local temp = {Minimap:GetChildren()} + for i = 1, #temp do + if temp[i] then + local btn = temp[i] + local name = btn:GetName() + local btype = btn:GetObjectType() + if name and btype == "Button" and not CustomAddonTable[name] and btn:GetNumRegions() >= 3 and not issecurevariable(name) and btn:IsShown() then + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), strlower("##" .. name)) then + if not string.find(name, "LibDBIcon") or name == "LibDBIcon10_MethodRaidTools" then + CreateBadButton(name) + btn:Hide() + btn:SetScript("OnShow", function() btn:Hide() end) + end + end + end + end + end + end + + -- Run the function a few times on startup + LibCompat.NewTicker(2, MakeButtons, 3) + LibCompat.After(0.1, MakeButtons) + + end + + ---------------------------------------------------------------------- + -- Hide addon buttons + ---------------------------------------------------------------------- + + if LeaPlusLC["CombineAddonButtons"] == "Off" then + + -- Function to set button state + local function SetHideButtons() + if LeaPlusLC["HideMiniAddonButtons"] == "On" then + -- Hide existing buttons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(buttons[i], true) + end + end + -- Hide new buttons + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + else + -- Show existing buttons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(buttons[i], false) + end + end + -- Show new buttons + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + end + end + + -- Assign file level scope (it's used in reset and preset) + LeaPlusLC.SetHideButtons = SetHideButtons + + -- Set buttons when option is clicked and on startup + LeaPlusCB["HideMiniAddonButtons"]:HookScript("OnClick", SetHideButtons) + SetHideButtons() + + end + + ---------------------------------------------------------------------- + -- Hide the world map button + ---------------------------------------------------------------------- + + -- Function to set world map button + local function SetWorldMapButton() + if LeaPlusLC["HideMiniMapButton"] == "On" then + MiniMapWorldMapButton:Hide() + else + MiniMapWorldMapButton:Show() + end + end + + -- Set map button when option is clicked and on startup + LeaPlusCB["HideMiniMapButton"]:HookScript("OnClick", SetWorldMapButton) + SetWorldMapButton() + + -- Hide world map button when it's shown + hooksecurefunc(MiniMapWorldMapButton, "Show", function() + if LeaPlusLC["HideMiniMapButton"] == "On" then + MiniMapWorldMapButton:Hide() + end + end) + + ---------------------------------------------------------------------- + -- Unlock the minimap + ---------------------------------------------------------------------- + + -- Raise the frame in case it's hidden + Minimap:Raise() + + -- Enable minimap movement + Minimap:SetMovable(true) + Minimap:SetUserPlaced(true) + Minimap:SetDontSavePosition(true) + Minimap:SetClampedToScreen(true) + if LeaPlusLC["SquareMinimap"] == "On" then + Minimap:SetClampRectInsets(-3, 3, 3, -3) + else + Minimap:SetClampRectInsets(-2, 0, 2, -2) + end + MinimapBackdrop:ClearAllPoints() + MinimapBackdrop:SetPoint("TOP", Minimap, "TOP", -9, 2) + Minimap:RegisterForDrag("LeftButton") + + -- Set minimap position on startup + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + + -- Drag functions + Minimap:SetScript("OnDragStart", function(self, btn) + -- Start dragging if left clicked + if IsAltKeyDown() and btn == "LeftButton" then + Minimap:StartMoving() + end + end) + + Minimap:SetScript("OnDragStop", function(self, btn) + -- Save minimap position + Minimap:StopMovingOrSizing() + LeaPlusLC["MinimapA"], void, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"] = Minimap:GetPoint() + Minimap:SetMovable(true) + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + end) + + ---------------------------------------------------------------------- + -- Hide the zone text bar, time of day button and toggle button + ---------------------------------------------------------------------- + + -- Reparent MinimapCluster elements + MinimapBorderTop:SetParent(Minimap) + MinimapZoneTextButton:SetParent(MinimapBackdrop) + + -- Instance difficulty + miniFrame.SetParent(MiniMapInstanceDifficulty, Minimap) + miniFrame.ClearAllPoints(MiniMapInstanceDifficulty) + if LeaPlusLC["SquareMinimap"] == "On" then + MiniMapInstanceDifficulty:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -21, 10) + MiniMapInstanceDifficulty:SetScale(0.75) + else + MiniMapInstanceDifficulty:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -13, 5) + end + MiniMapInstanceDifficulty:SetFrameLevel(4) + + -- Anchor border top to MinimapBackdrop + MinimapBorderTop:ClearAllPoints() + MinimapBorderTop:SetPoint("TOP", MinimapBackdrop, "TOP", 0, 20) + + -- Refresh buttons + LibCompat.After(0.1, SetButtonRad) + + -- Function to set zone text bar + local function SetZoneTextBar() + if LeaPlusLC["HideMiniZoneText"] == "On" then + MinimapBorderTop:Hide() + MinimapZoneTextButton:Hide() + else + MinimapZoneTextButton:ClearAllPoints() + MinimapZoneTextButton:SetPoint("CENTER", MinimapBorderTop, "CENTER", -1, 3) + MinimapBorderTop:Show() + MinimapZoneTextButton:Show() + if LeaPlusDB["SquareMinimap"] == "On" then + MinimapBorderTop:Hide() + MinimapZoneTextButton:ClearAllPoints() + MinimapZoneTextButton:SetPoint("TOP", Minimap, "TOP", 0, 0) + MinimapZoneTextButton:SetFrameLevel(100) + end + end + end + + -- Set the zone text bar when option is clicked and on startup + LeaPlusCB["HideMiniZoneText"]:HookScript("OnClick", SetZoneTextBar) + SetZoneTextBar() + + ---------------------------------------------------------------------- + -- Hide the zoom buttons + ---------------------------------------------------------------------- + + -- Function to toggle the zoom buttons + local function ToggleZoomButtons() + if LeaPlusLC["HideMiniZoomBtns"] == "On" then + MinimapZoomIn:Hide() + MinimapZoomOut:Hide() + else + MinimapZoomIn:Show() + MinimapZoomOut:Show() + end + end + + -- Set the zoom buttons when the option is clicked and on startup + LeaPlusCB["HideMiniZoomBtns"]:HookScript("OnClick", ToggleZoomButtons) + ToggleZoomButtons() + + ---------------------------------------------------------------------- + -- Style and position the clock + ---------------------------------------------------------------------- + + -- Function to style and position the clock + local function SetMiniClock(firstRun) + if IsAddOnLoaded("Blizzard_TimeManager") then + if LeaPlusLC["SquareMinimap"] == "On" and firstRun == true then + local regions = {TimeManagerClockButton:GetRegions()} + regions[1]:Hide() + TimeManagerClockButton:ClearAllPoints() + TimeManagerClockButton:SetPoint("BOTTOMLEFT", Minimap, "BOTTOMLEFT", -15, -8) + TimeManagerClockButton:SetHitRectInsets(15, 10, 5, 8) + TimeManagerClockButton:SetFrameLevel(100) + local timeBG = TimeManagerClockButton:CreateTexture(nil, "BACKGROUND") + timeBG:SetTexture("Interface\\ChatFrame\\ChatFrameBackground") + timeBG:SetPoint("TOPLEFT", 15, -5) + timeBG:SetPoint("BOTTOMRIGHT", -10, 8) + timeBG:SetVertexColor(0, 0, 0, 0.6) + end + end + end + + -- Run function when Blizzard addon is loaded + if IsAddOnLoaded("Blizzard_TimeManager") then + SetMiniClock(true) + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_TimeManager" then + SetMiniClock(true) + waitFrame:UnregisterAllEvents() + end + end) + end + + ---------------------------------------------------------------------- + -- Enable mousewheel zoom + ---------------------------------------------------------------------- + + -- Function to control mousewheel zoom + local function MiniZoom(self, arg1) + if arg1 > 0 and self:GetZoom() < 5 then + -- Zoom in + MinimapZoomOut:Enable() + self:SetZoom(self:GetZoom() + 1) + if(Minimap:GetZoom() == (Minimap:GetZoomLevels() - 1)) then + MinimapZoomIn:Disable() + end + elseif arg1 < 0 and self:GetZoom() > 0 then + -- Zoom out + MinimapZoomIn:Enable() + self:SetZoom(self:GetZoom() - 1) + if(Minimap:GetZoom() == 0) then + MinimapZoomOut:Disable() + end + end + end + + -- Enable mousewheel zoom + Minimap:EnableMouseWheel(true) + Minimap:SetScript("OnMouseWheel", MiniZoom) + + ---------------------------------------------------------------------- + -- Minimap scale + ---------------------------------------------------------------------- + + -- Function to set the minimap scale and not minimap checkbox + local function SetMiniScale() + Minimap:SetScale(LeaPlusLC["MinimapScale"]) + -- Set slider formatted text + LeaPlusCB["MinimapScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["MinimapScale"] * 100) + -- Set Not minimap + if LeaPlusLC["MinimapNoScale"] == "On" then + Minimap:SetIgnoreParentScale(true) + else + Minimap:SetIgnoreParentScale(false) + end + end + + -- Set minimap scale when slider is changed and on startup + LeaPlusCB["MinimapScale"]:HookScript("OnValueChanged", SetMiniScale) + LeaPlusCB["MinimapNoScale"]:HookScript("OnClick", SetMiniScale) + SetMiniScale() + + ---------------------------------------------------------------------- + -- Buttons + ---------------------------------------------------------------------- + + -- Help button tooltip + SideMinimap.h.tiptext = L["To move the minimap, hold down the alt key and drag it.|n|nIf you toggle an addon minimap button, you may need to reload your UI for the change to take effect. This only affects a few addons that use custom buttons.|n|nThis panel will close automatically if you enter combat."] + + -- Back button handler + SideMinimap.b:SetScript("OnClick", function() + SideMinimap:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + SideMinimap.r.tiptext = SideMinimap.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."] + SideMinimap.r:HookScript("OnClick", function() + LeaPlusLC["HideMiniZoomBtns"] = "Off"; ToggleZoomButtons() + LeaPlusLC["HideMiniZoneText"] = "Off"; SetZoneTextBar() + LeaPlusLC["HideMiniAddonButtons"] = "On"; if LeaPlusLC.SetHideButtons then LeaPlusLC.SetHideButtons() end + LeaPlusLC["MinimapScale"] = 1 + LeaPlusLC["MinimapSize"] = 140; if LeaPlusLC.SetMinimapSize then LeaPlusLC:SetMinimapSize() end + LeaPlusLC["MiniClusterScale"] = 1; LeaPlusLC["MinimapNoScale"] = "Off"; SetClusterScale() + Minimap:SetScale(1) + SetMiniScale() + -- Reset map position + LeaPlusLC["MinimapA"], LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"] = "TOPRIGHT", "TOPRIGHT", -17, -22 + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + -- Hide world map button + LeaPlusLC["HideMiniMapButton"] = "On"; SetWorldMapButton() + -- Refresh panel + SideMinimap:Hide(); SideMinimap:Show() + end) + + -- Configuration button handler + LeaPlusCB["ModMinimapBtn"]:HookScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["HideMiniZoomBtns"] = "Off"; ToggleZoomButtons() + LeaPlusLC["HideMiniZoneText"] = "On"; SetZoneTextBar() + LeaPlusLC["HideMiniAddonButtons"] = "On"; if LeaPlusLC.SetHideButtons then LeaPlusLC.SetHideButtons() end + LeaPlusLC["MinimapScale"] = 1.40 + LeaPlusLC["MinimapSize"] = 180; if LeaPlusLC.SetMinimapSize then LeaPlusLC:SetMinimapSize() end + LeaPlusLC["MiniClusterScale"] = 1; LeaPlusLC["MinimapNoScale"] = "Off"; SetClusterScale() + Minimap:SetScale(1) + SetMiniScale() + -- Hide world map button + LeaPlusLC["HideMiniMapButton"] = "On"; SetWorldMapButton() + -- Map position + LeaPlusLC["MinimapA"], LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"] = "TOPRIGHT", "TOPRIGHT", 0, 0 + Minimap:SetMovable(true) + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + LeaPlusLC:ReloadCheck() -- Special reload check + else + -- Show configuration panel + SideMinimap:Show() + LeaPlusLC:HideFrames() + end + end + end) + + -- Hide tracking button + if LeaPlusLC["HideMiniTracking"] == "On" then + + -- Hide tracking button initially + MiniMapTracking:SetAlpha(0) + MiniMapTracking:Hide() + + -- Create tracking button fade out animation + MiniMapTracking.fadeOut = MiniMapTracking:CreateAnimationGroup() + local animOut = MiniMapTracking.fadeOut:CreateAnimation("Alpha") + animOut:SetOrder(1) + animOut:SetDuration(0.2) + animOut:SetFromAlpha(1) + animOut:SetToAlpha(0) + animOut:SetStartDelay(1) + MiniMapTracking.fadeOut:SetToFinalAlpha(true) + + -- Show tracking button when entering minimap + Minimap:HookScript("OnEnter", function() + MiniMapTracking.fadeOut:Stop() + MiniMapTracking:SetAlpha(1) + end) + + -- Hide tracking button when leaving minimap if pointer is not over tracking button + Minimap:HookScript("OnLeave", function() + if not MouseIsOver(MiniMapTracking) then + MiniMapTracking.fadeOut:Play() + end + end) + + -- Hide tracking button when leaving tracking button + MiniMapTracking:HookScript("OnLeave", function() + MiniMapTracking.fadeOut:Play() + end) + + -- Hook existing LibDBIcon buttons to include tracking button + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + if button then + button:HookScript("OnEnter", function() + MiniMapTracking.fadeOut:Stop() + MiniMapTracking:SetAlpha(1) + end) + button:HookScript("OnLeave", function() + MiniMapTracking.fadeOut:Play() + end) + end + end + + -- Hook new LibDBIcon buttons to include tracking button + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + + -- Show tracking button when button alpha is set to 1 + hooksecurefunc(MiniMapTracking, "SetAlpha", function(self, alphavalue) + if alphavalue and alphavalue == 1 then + MiniMapTracking:Show() + end + end) + + -- Hide tracking button when fadeout animation has finished + MiniMapTracking.fadeOut:HookScript("OnFinished", function() + MiniMapTracking:Hide() + end) + + end + + -- LibDBIcon callback (search LibDBIcon_IconCreated to find calls to this) + LibDBIconStub.RegisterCallback(miniFrame, "LibDBIcon_IconCreated", function(self, button, name) + + -- Combine addon buttons: Hide new LibDBIcon icons + if LeaPlusLC["CombineAddonButtons"] == "On" then + --LibCompat.After(0.1, function() -- Removed for now + local buttonName = strlower(name) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + if button.db and not button.db.hide then + button:Hide() + button:SetScript("OnShow", function() if not LeaPlusLC.bFrame:IsShown() then button:Hide() end end) + end + -- Create background texture + local bFrameBg = button:CreateTexture(nil, "BACKGROUND") + bFrameBg:SetTexture("Interface\\ChatFrame\\ChatFrameBackground") + bFrameBg:SetPoint("CENTER") + bFrameBg:SetSize(30, 30) + bFrameBg:SetVertexColor(0, 0, 0, 0.5) + elseif strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) and LeaPlusLC["SquareMinimap"] == "On" then + button:SetScale(0.75) + end + -- Move GameTooltip to below the minimap in case the button uses it + button:HookScript("OnEnter", LeaPlusLC.SetButtonTooltip) + --end) + end + + -- Square minimap: Set scale of new LibDBIcon icons + if LeaPlusLC["SquareMinimap"] == "On" and LeaPlusLC["CombineAddonButtons"] == "Off" then + button:SetScale(0.75) + end + + -- Hide addon buttons: Hide new LibDBIcon icons + if LeaPlusLC["CombineAddonButtons"] == "Off" then + local buttonName = strlower(name) + if LeaPlusLC["HideMiniAddonButtons"] == "On" then + -- Hide addon buttons is enabled + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(name, true) + end + else + -- Hide addon buttons is disabled + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(name, false) + end + end + end + + -- Hide tracking button + if LeaPlusLC["HideMiniTracking"] == "On" then + button:HookScript("OnEnter", function() + -- Show tracking button when entering LibDBIcon button + MiniMapTracking.fadeOut:Stop() + MiniMapTracking:SetAlpha(1) + end) + button:HookScript("OnLeave", function() + -- Hide tracking button when leaving LibDBIcon button + MiniMapTracking.fadeOut:Play() + end) + end + + end) + + end + + ---------------------------------------------------------------------- + -- Manage durability + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageDurability"] == "On" and not LeaLockList["ManageDurability"] then + + -- Create and manage container for DurabilityFrame + local durabilityHolder = CreateFrame("Frame", nil, UIParent) + durabilityHolder:SetPoint("TOP", UIParent, "TOP", 0, -15) + durabilityHolder:SetSize(92, 75) + + local durabilityContainer = _G.DurabilityFrame + durabilityContainer:ClearAllPoints() + durabilityContainer:SetPoint('CENTER', durabilityHolder) + durabilityContainer:SetIgnoreParentScale(true) -- Needed to keep drag frame position when scaled + + hooksecurefunc(durabilityContainer, 'SetPoint', function(self, void, b) + if b and (b ~= durabilityHolder) then + -- Reset parent if it changes from durabilityHolder + self:ClearAllPoints() + self:SetPoint('TOPRIGHT', durabilityHolder) -- Has to be TOPRIGHT (drag frame while moving between subzones) + self:SetParent(durabilityHolder) + end + end) + + -- Allow durability frame to be moved + durabilityHolder:SetMovable(true) + durabilityHolder:SetUserPlaced(true) + durabilityHolder:SetDontSavePosition(true) + durabilityHolder:SetClampedToScreen(false) + + -- Set durability frame position at startup + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + durabilityHolder:SetScale(LeaPlusLC["DurabilityScale"]) + DurabilityFrame:SetScale(LeaPlusLC["DurabilityScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("CENTER", durabilityHolder, "CENTER", 0, 1) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["DurabilityScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + -- dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Durability"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + durabilityHolder:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame position + durabilityHolder:StopMovingOrSizing() + LeaPlusLC["DurabilityA"], void, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"] = durabilityHolder:GetPoint() + durabilityHolder:SetMovable(true) + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 65, 75 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local DurabilityPanel = LeaPlusLC:CreatePanel("Manage durability", "DurabilityPanel") + + LeaPlusLC:MakeTx(DurabilityPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(DurabilityPanel, "DurabilityScale", "Drag to set the durability frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["DurabilityScale"]:HookScript("OnValueChanged", function() + durabilityHolder:SetScale(LeaPlusLC["DurabilityScale"]) + DurabilityFrame:SetScale(LeaPlusLC["DurabilityScale"]) + dragframe:SetScale(LeaPlusLC["DurabilityScale"]) + -- Show formatted slider value + LeaPlusCB["DurabilityScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["DurabilityScale"] * 100) + end) + + -- Hide frame alignment grid with panel + DurabilityPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local DurabilityToggleGridButton = LeaPlusLC:CreateButton("DurabilityToggleGridButton", DurabilityPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["DurabilityToggleGridButton"]:ClearAllPoints() + LeaPlusCB["DurabilityToggleGridButton"]:SetPoint("LEFT", DurabilityPanel.h, "RIGHT", 10, 0) + LeaPlusCB["DurabilityToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + DurabilityPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + DurabilityPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + DurabilityPanel.b:SetScript("OnClick", function() + DurabilityPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + DurabilityPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["DurabilityA"] = "TOPRIGHT" + LeaPlusLC["DurabilityR"] = "TOPRIGHT" + LeaPlusLC["DurabilityX"] = 0 + LeaPlusLC["DurabilityY"] = -192 + LeaPlusLC["DurabilityScale"] = 1 + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + + -- Refresh configuration panel + DurabilityPanel:Hide(); DurabilityPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageDurabilityButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["DurabilityA"] = "TOPRIGHT" + LeaPlusLC["DurabilityR"] = "TOPRIGHT" + LeaPlusLC["DurabilityX"] = 0 + LeaPlusLC["DurabilityY"] = -192 + LeaPlusLC["DurabilityScale"] = 1 + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + durabilityHolder:SetScale(LeaPlusLC["DurabilityScale"]) + DurabilityFrame:SetScale(LeaPlusLC["DurabilityScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(92 * LeaPlusLC["gscale"]) + dragframe:SetHeight(75 * LeaPlusLC["gscale"]) + + -- Show configuration panel + DurabilityPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + DurabilityPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Manage timer + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageTimer"] == "On" and not LeaLockList["ManageTimer"] then + + -- Allow timer frame to be moved + MirrorTimer1:SetMovable(true) + MirrorTimer1:SetUserPlaced(true) + MirrorTimer1:SetDontSavePosition(true) + MirrorTimer1:SetClampedToScreen(true) + + -- Set timer frame position at startup + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + MirrorTimer1:SetScale(LeaPlusLC["TimerScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("TOPRIGHT", MirrorTimer1, "TOPRIGHT", 0, 2.5) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0 }}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["TimerScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + -- dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Timer"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + MirrorTimer1:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + MirrorTimer1:StopMovingOrSizing() + LeaPlusLC["TimerA"], void, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"] = MirrorTimer1:GetPoint() + MirrorTimer1:SetMovable(true) + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 180, 20 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local TimerPanel = LeaPlusLC:CreatePanel("Manage timer", "TimerPanel") + + LeaPlusLC:MakeTx(TimerPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(TimerPanel, "TimerScale", "Drag to set the timer bar scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["TimerScale"]:HookScript("OnValueChanged", function() + MirrorTimer1:SetScale(LeaPlusLC["TimerScale"]) + dragframe:SetScale(LeaPlusLC["TimerScale"]) + -- Show formatted slider value + LeaPlusCB["TimerScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["TimerScale"] * 100) + end) + + -- Hide frame alignment grid with panel + TimerPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local TimerToggleGridButton = LeaPlusLC:CreateButton("TimerToggleGridButton", TimerPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["TimerToggleGridButton"]:ClearAllPoints() + LeaPlusCB["TimerToggleGridButton"]:SetPoint("LEFT", TimerPanel.h, "RIGHT", 10, 0) + LeaPlusCB["TimerToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + TimerPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + TimerPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + TimerPanel.b:SetScript("OnClick", function() + TimerPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + TimerPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["TimerA"] = "TOP" + LeaPlusLC["TimerR"] = "TOP" + LeaPlusLC["TimerX"] = -5 + LeaPlusLC["TimerY"] = -96 + LeaPlusLC["TimerScale"] = 1 + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + + -- Refresh configuration panel + TimerPanel:Hide(); TimerPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageTimerButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["TimerA"] = "TOP" + LeaPlusLC["TimerR"] = "TOP" + LeaPlusLC["TimerX"] = 0 + LeaPlusLC["TimerY"] = -120 + LeaPlusLC["TimerScale"] = 1 + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + MirrorTimer1:SetScale(LeaPlusLC["TimerScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(206 * LeaPlusLC["gscale"]) + dragframe:SetHeight(20 * LeaPlusLC["gscale"]) + dragframe:SetFrameStrata("HIGH") -- MirrorTimer is medium + + -- Show configuration panel + TimerPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + TimerPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Hide alerts + ---------------------------------------------------------------------- + + if LeaPlusLC["NoAlerts"] == "On" then + + -- Unregister alert events + hooksecurefunc(AlertFrame, "RegisterEvent", function(self, event) + AlertFrame:UnregisterEvent(event) + end) + AlertFrame:UnregisterAllEvents() + + -- Show chat message and play sound for achievement alerts + local frame = CreateFrame("FRAME") + frame:RegisterEvent("ACHIEVEMENT_EARNED") + frame:SetScript("OnEvent", function(self, event, arg1) + if arg1 then + local alink = GetAchievementLink(arg1) + if alink then + LeaPlusLC:Print(string.format(NEW_ACHIEVEMENT_EARNED:gsub("'", ""), alink)) + PlaySoundFile(569143) + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Show ready timer + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowReadyTimer"] == "On" then + + -- Player vs Player + do + + -- Declare variables + local t, barTime = -1, -1 + + -- Create status bar below dungeon ready popup + local bar = CreateFrame("StatusBar", nil, PVPReadyDialog) + bar:SetPoint("TOPLEFT", PVPReadyDialog, "BOTTOMLEFT", 0, -5) + bar:SetPoint("TOPRIGHT", PVPReadyDialog, "BOTTOMRIGHT", 0, -5) + bar:SetHeight(5) + bar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar") + bar:SetStatusBarColor(1.0, 0.85, 0.0) + + -- Create status bar text + local text = bar:CreateFontString(nil, "ARTWORK") + text:SetFontObject("GameFontNormalLarge") + text:SetTextColor(1.0, 0.85, 0.0) + text:SetPoint("TOP", 0, -10) + + -- Update bar as timer counts down + bar:SetScript("OnUpdate", function(self, elapsed) + t = t - elapsed + if barTime >= 1 or barTime == -1 then + self:SetValue(t) + text:SetText(SecondsToTime(floor(t + 0.5))) + barTime = 0 + end + barTime = barTime + elapsed + end) + + -- Show frame when PvP ready frame shows + hooksecurefunc("PVPReadyDialog_Display", function(self, id) + t = GetBattlefieldPortExpiration(id) + 1 + -- t = 89; -- debug + if t and t > 1 then + bar:SetMinMaxValues(0, t) + barTime = -1 + bar:Show() + else + bar:Hide() + end + end) + + PVPReadyDialog:HookScript("OnHide", function() + bar:Hide() + end) + + -- Debug + -- LibCompat.After(2, function() PVPReadyDialog_Display(self, 1, "Warsong Gulch", 0, "BATTLEGROUND", "", "DAMAGER"); bar:Show() end) + + end + + end + + ---------------------------------------------------------------------- + -- Show flight times + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowFlightTimes"] == "On" then + + -- Load flight data + Leatrix_Plus["FlightData"] = {} + Leatrix_Plus:LoadFlightDataAlliance() + Leatrix_Plus:LoadFlightDataHorde() + + -- Minimum time difference (in seconds) to flight data entry before flight report window is shown + local timeBuffer = 15 + + -- Create editbox + local editFrame = CreateFrame("ScrollFrame", nil, UIParent, "InputScrollFrameTemplate") + + -- Set frame parameters + editFrame:ClearAllPoints() + editFrame:SetPoint("BOTTOM", 0, 130) + editFrame:SetSize(600, 200) + editFrame:SetFrameStrata("MEDIUM") + editFrame:SetToplevel(true) + editFrame:Hide() + editFrame.CharCount:Hide() + + -- Add background color + editFrame.t = editFrame:CreateTexture(nil, "BACKGROUND") + editFrame.t:SetAllPoints() + -- editFrame.t:SetColorTexture(0.00, 0.00, 0.0, 0.6) + + -- Set textures + editFrame.LeftTex:SetTexture(editFrame.RightTex:GetTexture()); editFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + editFrame.BottomTex:SetTexture(editFrame.TopTex:GetTexture()); editFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomRightTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + editFrame.TopLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Create title bar + local titleFrame = CreateFrame("ScrollFrame", nil, editFrame, "InputScrollFrameTemplate") + titleFrame:ClearAllPoints() + titleFrame:SetPoint("TOP", 0, 32) + titleFrame:SetSize(600, 24) + titleFrame:SetFrameStrata("MEDIUM") + titleFrame:SetToplevel(true) + titleFrame:SetHitRectInsets(-6, -6, -6, -6) + titleFrame.CharCount:Hide() + titleFrame.t = titleFrame:CreateTexture(nil, "BACKGROUND") + titleFrame.t:SetAllPoints() + -- titleFrame.t:SetColorTexture(0.00, 0.00, 0.0, 0.6) + titleFrame.LeftTex:SetTexture(titleFrame.RightTex:GetTexture()); titleFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + titleFrame.BottomTex:SetTexture(titleFrame.TopTex:GetTexture()); titleFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomRightTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + titleFrame.TopLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Add title + titleFrame.m = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.m:SetPoint("LEFT", 4, 0) + titleFrame.m:SetText(L["Leatrix Plus"]) + titleFrame.m:SetFont(titleFrame.m:GetFont(), 16, nil) + + -- Add right-click to close message + titleFrame.x = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.x:SetPoint("RIGHT", -4, 0) + titleFrame.x:SetText(L["Right-click to close"]) + titleFrame.x:SetFont(titleFrame.x:GetFont(), 16, nil) + titleFrame.x:SetWidth(600 - titleFrame.m:GetStringWidth() - 30) + titleFrame.x:SetWordWrap(false) + titleFrame.x:SetJustifyH("RIGHT") + + local titleBox = titleFrame.EditBox + titleBox:Hide() + titleBox:SetEnabled(false) + titleBox:SetMaxLetters(0) + + -- Create editbox + local editBox = editFrame.EditBox + editBox:SetAltArrowKeyMode(false) + editBox:SetTextInsets(4, 4, 4, 4) + editBox:SetWidth(editFrame:GetWidth() - 30) + editBox:SetSecurityDisablePaste() + editBox:SetFont(_G["ChatFrame1"]:GetFont()) + editBox:SetMaxLetters(0) + + local introMsg = L["Leatrix Plus needs to be updated with the flight details. Press CTRL/C to copy the flight details below then paste them into an email to flight@leatrix.com. When your report is received, Leatrix Plus will be updated and you will never see this window again for this flight."] .. "|n|n" + local startHighlight = string.len(introMsg) + + local function DoHighlight() + editBox:HighlightText(startHighlight) + end + + editBox:SetScript("OnEscapePressed", DoHighlight) + editBox:SetScript("OnEnterPressed", DoHighlight) + editBox:SetScript("OnMouseUp", DoHighlight) + editBox:HookScript("OnShow", function() + editBox:SetFocus(); DoHighlight() + end) + + -- Close frame with right-click of editframe or editbox + local function CloseRecentChatWindow(self, btn) + if btn and btn == "RightButton" then + editBox:SetText("") + editBox:ClearFocus() + editFrame:Hide() + end + end + + editFrame:SetScript("OnMouseDown", CloseRecentChatWindow) + editBox:SetScript("OnMouseDown", CloseRecentChatWindow) + titleFrame:HookScript("OnMouseDown", CloseRecentChatWindow) + + -- Disable text changes while still allowing editing controls to work + editBox:EnableKeyboard(false) + editBox:SetScript("OnKeyDown", function() end) + + -- Load LibCandyBar + Leatrix_Plus:LeaPlusCandyBar() + + -- Variables + local data = Leatrix_Plus["FlightData"] + local faction = UnitFactionGroup("player") + local candy = LibStub("LibCandyBar-3.0") + local texture = "Interface\\TargetingFrame\\UI-StatusBar" + local flightFrame = CreateFrame("FRAME") + LeaPlusLC.flightFrame = flightFrame + + -- Function to get continent + local function getContinent() + local mapID = C_Map.GetBestMapForUnit("player") + if(mapID) then + local info = C_Map.GetMapInfo(mapID) + if(info) then + while(info['mapType'] and info['mapType'] > 2) do + info = C_Map.GetMapInfo(info['parentMapID']) + end + if(info['mapType'] == 2) then + return info['mapID'] + end + end + end + end + + -- Function to get node name + local function GetNodeName(i) + return strmatch(TaxiNodeName(i), "[^,]+") + end + + -- Show progress bar when flight is taken + hooksecurefunc("TakeTaxiNode", function(node) + if UnitAffectingCombat("player") then return end + if editFrame:IsShown() then editFrame:Hide() end + for i = 1, NumTaxiNodes() do + local nodeType = TaxiNodeGetType(i) + local nodeName = GetNodeName(i) + if nodeType == "CURRENT" then + + -- Get current node + local continent = getContinent() + local startX, startY = TaxiNodePosition(i) + local currentNode = string.format("%0.2f", startX) .. ":" .. string.format("%0.2f", startY) + + -- Get flight duration and start the progress timer + local endX, endY = TaxiNodePosition(node) + local destination = string.format("%0.2f", endX) .. ":" .. string.format("%0.2f", endY) + local barName = GetNodeName(node) + + -- Assign file level scope to destination (it's used for removing bar name) + LeaPlusLC.FlightDestination = barName + + -- Build route string and debug string + local numHops = GetNumRoutes(node) + local debugString = '["' .. currentNode + local routeString = currentNode + for i = 2, numHops + 1 do + local hopPosX, hopPosY = TaxiNodePosition(TaxiGetNodeSlot(node, i, true)) + local hopPos = string.format("%0.2f", hopPosX) .. ":" .. string.format("%0.2f", hopPosY) + local fpName = string.split(", ", TaxiNodeName(TaxiGetNodeSlot(node, i, true))) + debugString = debugString .. ":" .. hopPos + routeString = routeString .. ":" .. hopPos + end + + -- If route string does not contain destination, add it to the end (such as Altar of Sha'tar) + if not string.find(routeString, destination) then + debugString = debugString .. ":" .. destination + routeString = routeString .. ":" .. destination + end + + debugString = debugString .. '"] = TimeTakenPlaceHolder,' + debugString = debugString .. " -- " .. nodeName + for i = 2, numHops + 1 do + local fpName = string.split(",", TaxiNodeName(TaxiGetNodeSlot(node, i, true))) + debugString = debugString .. ", " .. fpName + end + + -- If debug string does not contain destination, add it to the end + if not string.find(debugString, barName) then + debugString = debugString .. ", " .. barName + end + + -- Handle flight time not correct or flight does not exist in database + local timeStart = GetTime() + LibCompat.After(1, function() + if UnitOnTaxi("player") then + -- Player is on a taxi so register when taxi lands + flightFrame:RegisterEvent("PLAYER_CONTROL_GAINED") + else + -- Player is not on a taxi so delete the flight progress bar + flightFrame:UnregisterEvent("PLAYER_CONTROL_GAINED") + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end + end) + flightFrame:SetScript("OnEvent", function() + local timeEnd = GetTime() + local timeTaken = timeEnd - timeStart + debugString = gsub(debugString, "TimeTakenPlaceHolder", string.format("%0.0f", timeTaken)) + local flightMsg = L["Flight details"] .. " (" .. L["WRATH"].. "): " .. nodeName .. " (" .. currentNode .. ") " .. L["to"] .. " " .. barName .. " (" .. destination .. ") (" .. faction .. ") " .. L["took"] .. " " .. string.format("%0.0f", timeTaken) .. " " .. L["seconds"] .. " (" .. numHops .. " " .. L["hop"] ..").|n|n" .. debugString .. "|n|n" + if destination and data[faction] and data[faction][continent] and data[faction][continent][routeString] then + local savedDuration = data[faction][continent][routeString] + if savedDuration then + if timeTaken > (savedDuration + timeBuffer) or timeTaken < (savedDuration - timeBuffer) then + local editMsg = introMsg .. flightMsg .. L["This flight's actual time of"] .. " " .. string.format("%0.0f", timeTaken) .. " " .. L["seconds does not match the saved flight time of"] .. " " .. savedDuration .. " " .. L["seconds"] .. "." + editBox:SetText(editMsg); if LeaPlusLC["FlightBarContribute"] == "On" then editFrame:Show() end + end + else + local editMsg = introMsg .. flightMsg .. L["This flight does not have a saved duration in the database."] + editBox:SetText(editMsg); if LeaPlusLC["FlightBarContribute"] == "On" then editFrame:Show() end + end + else + local editMsg = introMsg .. flightMsg .. L["This flight does not exist in the database."] + editBox:SetText(editMsg); if LeaPlusLC["FlightBarContribute"] == "On" then editFrame:Show() end + end + flightFrame:UnregisterEvent("PLAYER_CONTROL_GAINED") + + -- Delete the progress bar since we have landed + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end) + + -- Show flight progress bar if flight exists in database + if data[faction] and data[faction][continent] and data[faction][continent][routeString] then + + local duration = data[faction][continent][routeString] + if duration then + + -- Delete an existing progress bar if one exists + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + + -- Create progress bar + local mybar = candy:New(texture, 230, 16) + mybar:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + mybar:SetScale(LeaPlusLC["FlightBarScale"]) + mybar:SetWidth(LeaPlusLC["FlightBarWidth"]) + + -- Setup sound files + local mt + local Seconds600, Seconds540, Seconds480, Seconds420, Seconds360 + local Seconds300, Seconds240, Seconds180, Seconds120, Seconds060 + local Seconds030, Seconds020, Seconds010 + + local destination = Enum.VoiceTtsDestination.LocalPlayback + local speed = -2 + + if LeaPlusLC["FlightBarSpeech"] == "On" then + LibCompat.After(1, function() + C_VoiceChat.SpeakText(0, L["Flight commenced."], destination, speed, GetCVar("Sound_MasterVolume") * 100) + end) + mybar:AddUpdateFunction(function(bar) + mt = bar.remaining + if mt > 600 and mt < 601 and not Seconds600 then Seconds600 = true; C_VoiceChat.SpeakText(0, L["Ten minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 540 and mt < 541 and not Seconds540 then Seconds540 = true; C_VoiceChat.SpeakText(0, L["Nine minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 480 and mt < 481 and not Seconds480 then Seconds480 = true; C_VoiceChat.SpeakText(0, L["Eight minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 420 and mt < 421 and not Seconds420 then Seconds420 = true; C_VoiceChat.SpeakText(0, L["Seven minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 360 and mt < 361 and not Seconds360 then Seconds360 = true; C_VoiceChat.SpeakText(0, L["Six minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 300 and mt < 301 and not Seconds300 then Seconds300 = true; C_VoiceChat.SpeakText(0, L["Five minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 240 and mt < 241 and not Seconds240 then Seconds240 = true; C_VoiceChat.SpeakText(0, L["Four minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 180 and mt < 181 and not Seconds180 then Seconds180 = true; C_VoiceChat.SpeakText(0, L["Three minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 120 and mt < 121 and not Seconds120 then Seconds120 = true; C_VoiceChat.SpeakText(0, L["Two minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 060 and mt < 061 and not Seconds060 then Seconds060 = true; C_VoiceChat.SpeakText(0, L["One minute"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 030 and mt < 031 and not Seconds030 then Seconds030 = true; C_VoiceChat.SpeakText(0, L["Thirty seconds"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 020 and mt < 021 and not Seconds020 then Seconds020 = true; C_VoiceChat.SpeakText(0, L["Twenty seconds"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 010 and mt < 011 and not Seconds010 then Seconds010 = true; C_VoiceChat.SpeakText(0, L["Ten seconds"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + end + end) + end + + if faction == "Alliance" then + mybar:SetColor(0, 0.5, 1, 0.5) + else + mybar:SetColor(1, 0.0, 0, 0.5) + end + mybar:SetShadowColor(0, 0, 0, 0.5) + + mybar:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + mybar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end) + + -- Set bar label width + -- barName = "SupercalifragilisticexpialidociousDociousaliexpisticfragicalirupus" -- Debug + mybar.candyBarLabel:ClearAllPoints() + mybar.candyBarLabel:SetPoint("TOPLEFT", mybar.candyBarBackground, "TOPLEFT", 2, 0) + mybar.candyBarLabel:SetPoint("BOTTOMRIGHT", mybar.candyBarBackground, "BOTTOMRIGHT", -40, 0) + + -- Set flight bar background + if LeaPlusLC["FlightBarBackground"] == "On" then + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalFlightBar = mybar.candyBarBar + if faction == "Alliance" then + LeaPlusLC.ElvUI:GetModule("Skins"):HandleStatusBar(_G.LeaPlusGlobalFlightBar, {0, 0.5, 1, 0.5}) + else + LeaPlusLC.ElvUI:GetModule("Skins"):HandleStatusBar(_G.LeaPlusGlobalFlightBar, {1, 0.0, 0, 0.5}) + end + else + mybar:SetTexture(texture) + end + else + mybar:SetTexture("") + end + + -- Set flight bar destination + if LeaPlusLC["FlightBarDestination"] == "On" then + mybar:SetLabel(barName) + end + + -- Set flight bar fill mode + if LeaPlusLC["FlightBarFillBar"] == "On" then + mybar:SetFill(true) + else + mybar:SetFill(false) + end + + mybar:EnableMouse(false) + mybar:SetDuration(duration) + mybar:Start() + + -- Unlock close bar button + if LeaPlusCB["CloseFlightBarButton"] then + LeaPlusLC:LockItem(LeaPlusCB["CloseFlightBarButton"], false) + end + + -- Assign file level scope to the bar so it can be cancelled later + LeaPlusLC.FlightProgressBar = mybar + + end + + end + + end + end + end) + + -- Function to stop the progress bar + local function CeaseProgress() + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end + + -- Stop the progress bar under various circumstances + hooksecurefunc("TaxiRequestEarlyLanding", CeaseProgress) + hooksecurefunc("AcceptBattlefieldPort", CeaseProgress) + hooksecurefunc(C_SummonInfo, "ConfirmSummon", CeaseProgress) + + -- Show flight time in node tooltips + hooksecurefunc("TaxiNodeOnButtonEnter", function(button) + local index = button:GetID() + for i = 1, NumTaxiNodes() do + local nodeType = TaxiNodeGetType(i) + local nodeName = GetNodeName(i) + if nodeType == "CURRENT" then + + -- Get current node + local continent = getContinent() + local startX, startY = TaxiNodePosition(i) + local currentNode = string.format("%0.2f", startX) .. ":" .. string.format("%0.2f", startY) + + -- Get destination + local endX, endY = TaxiNodePosition(index) + local destination = string.format("%0.2f", endX) .. ":" .. string.format("%0.2f", endY) + local barName = GetNodeName(index) + + -- Build route string and debug string + local numEnterHops = GetNumRoutes(index) + local debugString = '["' .. currentNode + local routeString = currentNode + for i = 2, numEnterHops + 1 do + local hopPosX, hopPosY = TaxiNodePosition(TaxiGetNodeSlot(index, i, true)) -- TaxiNodeName + local hopPos = string.format("%0.2f", hopPosX) .. ":" .. string.format("%0.2f", hopPosY) + local fpName = string.split(", ", TaxiNodeName(TaxiGetNodeSlot(index, i, true))) + debugString = debugString .. ":" .. hopPos + routeString = routeString .. ":" .. hopPos + end + + -- If route string does not contain destination, add it to the end (such as Altar of Sha'tar) + if not string.find(routeString, destination) then + debugString = debugString .. ":" .. destination + routeString = routeString .. ":" .. destination + end + debugString = debugString .. '"] = ' + + -- Show flight time in tooltip if it exists + if data[faction] and data[faction][continent] and data[faction][continent][routeString] then + local duration = data[faction][continent][routeString] + if duration and type(duration) == "number" then + duration = date("%M:%S", duration):gsub("^0","") + GameTooltip:AddLine(L["Duration"] .. ": " .. duration, 0.9, 0.9, 0.9, true) + GameTooltip:Show() + end + elseif currentNode ~= destination then + GameTooltip:AddLine(L["Duration"] .. ": -:--", 0.9, 0.9, 0.9, true) + GameTooltip:Show() + end + + -- Add node names to debug string + debugString = debugString .. " -- " .. nodeName + for i = 2, numEnterHops + 1 do + local fpName = string.split(",", TaxiNodeName(TaxiGetNodeSlot(index, i, true))) + debugString = debugString .. ", " .. fpName + end + + -- If debug string does not contain destination, add it to the end + if not string.find(debugString, barName) then + debugString = debugString .. ", " .. barName + end + + -- Print debug string (used for showing full routes for nodes) + -- print(debugString) + + end + end + end) + + -- Unregister landing event for various reasons that stop taxi early + local function StopLandingEvent() + LeaPlusLC.flightFrame:UnregisterEvent("PLAYER_CONTROL_GAINED") + end + + hooksecurefunc("TaxiNodeOnButtonEnter", StopLandingEvent) + hooksecurefunc("TaxiRequestEarlyLanding", StopLandingEvent) + hooksecurefunc("AcceptBattlefieldPort", StopLandingEvent) + hooksecurefunc(C_SummonInfo, "ConfirmSummon", StopLandingEvent) + + ---------------------------------------------------------------------- + -- Drag frame + ---------------------------------------------------------------------- + + -- Create drag frame + local tempFrame = CreateFrame("FRAME", nil, UIParent) + tempFrame:SetWidth(230) + tempFrame:SetHeight(16) + tempFrame:SetScale(2) + tempFrame:ClearAllPoints() + tempFrame:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + tempFrame:Hide() + tempFrame:SetFrameStrata("FULLSCREEN_DIALOG") + tempFrame:SetFrameLevel(5000) + tempFrame:SetClampedToScreen(false) + + -- Create texture + tempFrame.t = tempFrame:CreateTexture(nil, "BORDER") + tempFrame.t:SetAllPoints() + tempFrame.t:SetTexture("Interface\\TargetingFrame\\UI-StatusBar") + tempFrame.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + + -- Enable movement + tempFrame:EnableMouse(true) + tempFrame:SetMovable(true) + tempFrame:SetScript("OnMouseDown", function() + tempFrame:StartMoving() + end) + tempFrame:SetScript("OnMouseUp", function() + tempFrame:StopMovingOrSizing() + LeaPlusLC["FlightBarA"], void, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"] = tempFrame:GetPoint() + -- Position actual flight progress bar if one exists + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:ClearAllPoints() + LeaPlusLC.FlightProgressBar:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + end + end) + + ---------------------------------------------------------------------- + -- Configuration panel + ---------------------------------------------------------------------- + + -- Create configuration panel + local FlightPanel = LeaPlusLC:CreatePanel("Show flight times", "FlightPanel") + + LeaPlusLC:MakeTx(FlightPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(FlightPanel, "FlightBarBackground", "Show background", 16, -92, false, "If checked, the flight progress bar background texture will be shown.") + LeaPlusLC:MakeCB(FlightPanel, "FlightBarDestination", "Show destination", 16, -112, false, "If checked, the flight progress bar destination will be shown.") + LeaPlusLC:MakeCB(FlightPanel, "FlightBarFillBar", "Fill instead of drain", 16, -132, false, "If checked, the flight progress bar background will fill instead of drain.") + LeaPlusLC:MakeCB(FlightPanel, "FlightBarSpeech", "Speak the remaining time", 16, -152, false, "If checked, the remaining flight time will be spoken using text to speech.|n|nChanges to this setting will take effect on the next flight you take.") + + LeaPlusLC:MakeTx(FlightPanel, "Contribute", 16, -192) + LeaPlusLC:MakeCB(FlightPanel, "FlightBarContribute", "Help contribute flight times", 16, -212, false, "If checked, you will be prompted to submit missing flight times.") + + LeaPlusLC:MakeTx(FlightPanel, "Scale", 356, -72) + LeaPlusLC:MakeSL(FlightPanel, "FlightBarScale", "Drag to set the flight progress bar scale.", 1, 5, 0.1, 356, -92, "%.2f") + + LeaPlusLC:MakeTx(FlightPanel, "Width", 356, -132) + LeaPlusLC:MakeSL(FlightPanel, "FlightBarWidth", "Drag to set the flight progress bar width.", 40, 460, 10, 356, -152, "%.0f") + + -- Add close bar button + local CloseFlightBarButton = LeaPlusLC:CreateButton("CloseFlightBarButton", FlightPanel, "Close Bar", "TOPLEFT", 16, -72, 0, 25, true, "Click to close the currently active flight progress bar.") + LeaPlusCB["CloseFlightBarButton"]:ClearAllPoints() + LeaPlusCB["CloseFlightBarButton"]:SetPoint("LEFT", FlightPanel.h, "RIGHT", 10, 0) + LeaPlusCB["CloseFlightBarButton"]:SetScript("OnClick", function() + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end) + + -- Lock close bar button at startup and when flight progress bar stops + LeaPlusLC:LockItem(LeaPlusCB["CloseFlightBarButton"], true) + candy.RegisterCallback(LeaPlusLC, "LibCandyBar_Stop", function() + if LeaPlusCB["CloseFlightBarButton"] then + LeaPlusLC:LockItem(LeaPlusCB["CloseFlightBarButton"], true) + end + end) + + -- Set progress bar background + if LeaPlusLC.ElvUI then + + -- Progress bar background is always enabled and cannot be disabled with ElvUI + LeaPlusLC:LockItem(LeaPlusCB["FlightBarBackground"], true) + LeaPlusLC["FlightBarBackground"] = "On" + LeaPlusCB["FlightBarBackground"].tiptext = LeaPlusCB["FlightBarBackground"].tiptext .. "|n|n|cff00AAFF" .. L["The background is always shown with ElvUI."] + + else + + -- Set progress bar background + local function SetProgressBarBackground() + if LeaPlusLC.FlightProgressBar then + if LeaPlusLC["FlightBarBackground"] == "On" then + LeaPlusLC.FlightProgressBar:SetTexture(texture) + else + LeaPlusLC.FlightProgressBar:SetTexture("") + end + end + end + + -- Set progress bar background when option is clicked and on startup + LeaPlusCB["FlightBarBackground"]:HookScript("OnClick", SetProgressBarBackground) + SetProgressBarBackground() + + end + + -- Set progress bar fill mode + local function SetProgressBarFillMode() + if LeaPlusLC.FlightProgressBar then + if LeaPlusLC["FlightBarFillBar"] == "On" then + LeaPlusLC.FlightProgressBar:SetFill(true) + else + LeaPlusLC.FlightProgressBar:SetFill(false) + end + end + end + + -- Set progress bar fill mode when option is clicked and on startup + LeaPlusCB["FlightBarFillBar"]:HookScript("OnClick", SetProgressBarFillMode) + SetProgressBarFillMode() + + -- Set progress bar destination + local function SetProgressBarDestination() + if LeaPlusLC.FlightProgressBar then + if LeaPlusLC["FlightBarDestination"] == "On" then + if LeaPlusLC.FlightDestination then + LeaPlusLC.FlightProgressBar:SetLabel(LeaPlusLC.FlightDestination) + end + else + LeaPlusLC.FlightProgressBar:SetLabel("") + end + end + end + + -- Set flight bar destination when option is clicked and on startup + LeaPlusCB["FlightBarDestination"]:HookScript("OnClick", SetProgressBarDestination) + SetProgressBarDestination() + + -- Flight progress bar scale + local function SetFlightBarScale() + tempFrame:SetScale(LeaPlusLC["FlightBarScale"]) + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:SetScale(LeaPlusLC["FlightBarScale"]) + end + -- Set slider formatted text + LeaPlusCB["FlightBarScale"].f:SetFormattedText("%.0f%%", (LeaPlusLC["FlightBarScale"] / 2) * 100) + end + + -- Set flight bar scale when slider is changed and on startup + LeaPlusCB["FlightBarScale"]:HookScript("OnValueChanged", SetFlightBarScale) + SetFlightBarScale() + + -- Flight progress bar width + local function SetFlightBarWidth() + tempFrame:SetWidth(LeaPlusLC["FlightBarWidth"]) + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:SetWidth(LeaPlusLC["FlightBarWidth"]) + end + -- Set slider formatted text + LeaPlusCB["FlightBarWidth"].f:SetFormattedText("%.0f%%", (LeaPlusLC["FlightBarWidth"] / 230) * 100) + end + + -- Set flight bar width when slider is changed and on startup + LeaPlusCB["FlightBarWidth"]:HookScript("OnValueChanged", SetFlightBarWidth) + SetFlightBarWidth() + + -- Help button tooltip + FlightPanel.h.tiptext = L["Drag the frame overlay to position the frame."] + + -- Back button handler + FlightPanel.b:SetScript("OnClick", function() + FlightPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + FlightPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["FlightBarA"], LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"] = "TOP", "TOP", 0, -66 + tempFrame:ClearAllPoints() + tempFrame:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + -- Reset scale + LeaPlusLC["FlightBarScale"] = 2 + tempFrame:SetScale(LeaPlusLC["FlightBarScale"]) + -- Reset width + LeaPlusLC["FlightBarWidth"] = 230 + tempFrame:SetWidth(LeaPlusLC["FlightBarWidth"]) + -- Reset checkboxes + LeaPlusLC["FlightBarBackground"] = "On" + LeaPlusLC["FlightBarDestination"] = "On" + LeaPlusLC["FlightBarFillBar"] = "Off"; SetProgressBarFillMode() + LeaPlusLC["FlightBarSpeech"] = "Off" + LeaPlusLC["FlightBarContribute"] = "On" + -- Reset live progress bar + if LeaPlusLC.FlightProgressBar then + -- Reset position + LeaPlusLC.FlightProgressBar:ClearAllPoints() + LeaPlusLC.FlightProgressBar:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + LeaPlusLC.FlightProgressBar:SetScale(LeaPlusLC["FlightBarScale"]) + -- Reset width + LeaPlusLC.FlightProgressBar:SetWidth(LeaPlusLC["FlightBarWidth"]) + -- Reset background + LeaPlusLC.FlightProgressBar:SetTexture(texture) + -- Reset destination + if LeaPlusLC.FlightDestination then + LeaPlusLC.FlightProgressBar:SetLabel(LeaPlusLC.FlightDestination) + end + end + + -- Refresh configuration panel + FlightPanel:Hide(); FlightPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["ShowFlightTimesBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["FlightBarContribute"] = "On" + else + FlightPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Toggle drag frame with configuration panel + FlightPanel:HookScript("OnShow", function() + tempFrame:Show() + end) + + FlightPanel:HookScript("OnHide", function() + tempFrame:Hide() + end) + + end + + ---------------------------------------------------------------------- + -- Filter chat messages + ---------------------------------------------------------------------- + + if LeaPlusLC["FilterChatMessages"] == "On" then + + -- Load LibChatAnims + Leatrix_Plus:LeaPlusLCA() + + -- Create configuration panel + local ChatFilterPanel = LeaPlusLC:CreatePanel("Filter chat messages", "ChatFilterPanel") + + LeaPlusLC:MakeTx(ChatFilterPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(ChatFilterPanel, "BlockSpellLinks", "Block spell links during combat", 16, -92, false, "If checked, messages containing spell links will be blocked while you are in combat.|n|nThis is useful for blocking spell interrupt spam.|n|nThis applies to the say, party, raid, emote and yell channels.") + LeaPlusLC:MakeCB(ChatFilterPanel, "BlockDrunkenSpam", "Block drunken spam", 16, -112, false, "If checked, drunken messages will be blocked unless they apply to your character.|n|nThis applies to the system channel.") + LeaPlusLC:MakeCB(ChatFilterPanel, "BlockDuelSpam", "Block duel spam", 16, -132, false, "If checked, duel victory and retreat messages will be blocked unless your character took part in the duel.|n|nThis applies to the system channel.") + + -- Lock block drunken spam option for zhTW + if GameLocale == "zhTW" then + LeaPlusLC:LockItem(LeaPlusCB["BlockDrunkenSpam"], true) + LeaPlusLC["BlockDrunkenSpam"] = "Off" + LeaPlusDB["BlockDrunkenSpam"] = "Off" + LeaPlusCB["BlockDrunkenSpam"].tiptext = LeaPlusCB["BlockDrunkenSpam"].tiptext .. "|n|n|cff00AAFF" .. L["Cannot use this with your locale."] + end + + -- Help button hidden + ChatFilterPanel.h:Hide() + + -- Back button handler + ChatFilterPanel.b:SetScript("OnClick", function() + ChatFilterPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page3"]:Show() + return + end) + + local charName = GetUnitName("player") + local charRealm = GetNormalizedRealmName() + local nameRealm = charName .. "%%-" .. charRealm + + -- Chat filter + local function ChatFilterFunc(self, event, msg) + -- Block duel spam + if LeaPlusLC["BlockDuelSpam"] == "On" then + -- Block duel messages unless you are part of the duel + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", "%.+")) or msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", "%.+")) then + -- Player has defeated player in a duel. + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", charName):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", nameRealm):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", charName)) then return false end + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", nameRealm)) then return false end + -- Player has fled from player in a duel. + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", charName):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", nameRealm):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", charName)) then return false end + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", nameRealm)) then return false end + -- Block all duel messages not involving player + return true + end + end + -- Block spell links + if LeaPlusLC["BlockSpellLinks"] == "On" and UnitAffectingCombat("player") then + if msg:find("|Hspell") then return true end + end + -- Block drunken spam + if LeaPlusLC["BlockDrunkenSpam"] == "On" then + for i = 1, 4 do + local drunk1 = _G["DRUNK_MESSAGE_ITEM_OTHER"..i]:gsub("%%s", "%s-") + local drunk2 = _G["DRUNK_MESSAGE_OTHER"..i]:gsub("%%s", "%s-") + if msg:match(drunk1) or msg:match(drunk2) then + return true + end + end + end + end + + -- Enable or disable chat filter settings + local function SetChatFilter() + if LeaPlusLC["BlockSpellLinks"] == "On" then + ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY_LEADER", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID_LEADER", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_EMOTE", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL", ChatFilterFunc) + else + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SAY", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_PARTY", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_PARTY_LEADER", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_RAID", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_RAID_LEADER", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_EMOTE", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_YELL", ChatFilterFunc) + end + if LeaPlusLC["BlockDrunkenSpam"] == "On" or LeaPlusLC["BlockDuelSpam"] == "On" then + ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", ChatFilterFunc) + else + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", ChatFilterFunc) + end + end + + -- Set chat filter when settings are clicked and on startup + LeaPlusCB["BlockSpellLinks"]:HookScript("OnClick", SetChatFilter) + LeaPlusCB["BlockDrunkenSpam"]:HookScript("OnClick", SetChatFilter) + LeaPlusCB["BlockDuelSpam"]:HookScript("OnClick", SetChatFilter) + SetChatFilter() + + -- Reset button handler + ChatFilterPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["BlockSpellLinks"] = "Off" + LeaPlusLC["BlockDrunkenSpam"] = "Off" + LeaPlusLC["BlockDuelSpam"] = "Off" + SetChatFilter() + + -- Refresh configuration panel + ChatFilterPanel:Hide(); ChatFilterPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["FilterChatMessagesBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["BlockSpellLinks"] = "On" + LeaPlusLC["BlockDrunkenSpam"] = "On" + LeaPlusLC["BlockDuelSpam"] = "On" + SetChatFilter() + else + ChatFilterPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Automatically accept resurrection requests (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local AcceptResPanel = LeaPlusLC:CreatePanel("Accept resurrection", "AcceptResPanel") + + LeaPlusLC:MakeTx(AcceptResPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(AcceptResPanel, "AutoResNoCombat", "Exclude combat resurrection", 16, -92, false, "If checked, resurrection requests will not be automatically accepted if the player resurrecting you is in combat.") + + -- Help button hidden + AcceptResPanel.h:Hide() + + -- Back button handler + AcceptResPanel.b:SetScript("OnClick", function() + AcceptResPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + AcceptResPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoResNoCombat"] = "On" + + -- Refresh panel + AcceptResPanel:Hide(); AcceptResPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoAcceptResBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoResNoCombat"] = "On" + else + AcceptResPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to set resurrect event + local function SetResEvent() + if LeaPlusLC["AutoAcceptRes"] == "On" then + AcceptResPanel:RegisterEvent("RESURRECT_REQUEST") + else + AcceptResPanel:UnregisterEvent("RESURRECT_REQUEST") + end + end + + -- Run function when option is clicked and on startup if option is enabled + LeaPlusCB["AutoAcceptRes"]:HookScript("OnClick", SetResEvent) + if LeaPlusLC["AutoAcceptRes"] == "On" then SetResEvent() end + + -- Function to not accept resurrection based on certain conditions + local function DoNotAcceptResurrect() + local mapID = C_Map.GetBestMapForUnit("player") or nil + if mapID and mapID == 162 then -- Naxxramas Construct Quarter + -- Check party or raid for debuffs + local group = IsInRaid() and "raid" or "party" + for i = 1, GetNumGroupMembers() do + local unit = group .. i + if unit and UnitExists(unit) then + for j = 1, 40 do + local void, void, void, void, void, void, void, void, void, spellID = UnitDebuff(unit, j) + if spellID then + if spellID == 28059 or spellID == 28084 then + -- Thaddius positive and negative charge debuffs + LeaPlusLC:Print("Resurrection not accepted. Someone in your group has a charge debuff.") + return true + end + end + end + end + end + end + end + + -- Handle event + AcceptResPanel:SetScript("OnEvent", function(self, event, arg1) + if event == "RESURRECT_REQUEST" then + + -- Exclude Chained Spirit (Zul'Gurub) + local chainLoc + + -- Exclude Chained Spirit (Zul'Gurub) + chainLoc = "Chained Spirit" + if GameLocale == "zhCN" then chainLoc = "被禁锢的灵魂" + elseif GameLocale == "zhTW" then chainLoc = "禁錮之魂" + elseif GameLocale == "ruRU" then chainLoc = "Скованный дух" + elseif GameLocale == "koKR" then chainLoc = "구속된 영혼" + elseif GameLocale == "esMX" then chainLoc = "Espíritu encadenado" + elseif GameLocale == "ptBR" then chainLoc = "Espírito Acorrentado" + elseif GameLocale == "deDE" then chainLoc = "Angeketteter Geist" + elseif GameLocale == "esES" then chainLoc = "Espíritu encadenado" + elseif GameLocale == "frFR" then chainLoc = "Esprit enchaîné" + elseif GameLocale == "itIT" then chainLoc = "Spirito Incatenato" + end + if arg1 == chainLoc then return end + + -- Resurrect + local resTimer = GetCorpseRecoveryDelay() + if resTimer and resTimer > 0 then + -- Resurrect has a delay so wait before resurrecting + LibCompat.After(resTimer + 1, function() + if not UnitAffectingCombat(arg1) or LeaPlusLC["AutoResNoCombat"] == "Off" then + if LeaPlusLC["AutoAcceptRes"] == "On" then + if not DoNotAcceptResurrect() then + AcceptResurrect() + StaticPopup_Hide("RESURRECT_NO_TIMER") + end + end + end + end) + else + -- Resurrect has no delay so resurrect now + if not UnitAffectingCombat(arg1) or LeaPlusLC["AutoResNoCombat"] == "Off" then + if not DoNotAcceptResurrect() then + AcceptResurrect() + StaticPopup_Hide("RESURRECT_NO_TIMER") + end + end + end + + return + + end + end) + + end + + ---------------------------------------------------------------------- + -- Hide keybind text + ---------------------------------------------------------------------- + + if LeaPlusLC["HideKeybindText"] == "On" and not LeaLockList["HideKeybindText"] then + + -- Hide keybind text + for i = 1, 12 do + _G["ActionButton"..i.."HotKey"]:SetAlpha(0) -- Main bar + _G["MultiBarBottomRightButton"..i.."HotKey"]:SetAlpha(0) -- Bottom right bar + _G["MultiBarBottomLeftButton"..i.."HotKey"]:SetAlpha(0) -- Bottom left bar + _G["MultiBarRightButton"..i.."HotKey"]:SetAlpha(0) -- Right bar + _G["MultiBarLeftButton"..i.."HotKey"]:SetAlpha(0) -- Left bar + end + + end + + ---------------------------------------------------------------------- + -- Hide macro text + ---------------------------------------------------------------------- + + if LeaPlusLC["HideMacroText"] == "On" and not LeaLockList["HideMacroText"] then + + -- Hide marco text + for i = 1, 12 do + _G["ActionButton"..i.."Name"]:SetAlpha(0) -- Main bar + _G["MultiBarBottomRightButton"..i.."Name"]:SetAlpha(0) -- Bottom right bar + _G["MultiBarBottomLeftButton"..i.."Name"]:SetAlpha(0) -- Bottom left bar + _G["MultiBarRightButton"..i.."Name"]:SetAlpha(0) -- Right bar + _G["MultiBarLeftButton"..i.."Name"]:SetAlpha(0) -- Left bar + end + + end + + ---------------------------------------------------------------------- + -- More font sizes + ---------------------------------------------------------------------- + + if LeaPlusLC["MoreFontSizes"] == "On" and not LeaLockList["MoreFontSizes"] then + RunScript('CHAT_FONT_HEIGHTS = {[1] = 10, [2] = 12, [3] = 14, [4] = 16, [5] = 18, [6] = 20, [7] = 22, [8] = 24, [9] = 26, [10] = 28}') + end + + ---------------------------------------------------------------------- + -- Show vanity controls (must be before Enhance dressup) + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowVanityControls"] == "On" then + + -- Create checkboxes + LeaPlusLC:MakeCB(PaperDollFrame, "ShowHelm", L["Helm"], 2, -192, false, "") + LeaPlusLC:MakeCB(PaperDollFrame, "ShowCloak", L["Cloak"], 281, -192, false, "") + LeaPlusCB["ShowHelm"]:SetFrameStrata("HIGH") + LeaPlusCB["ShowCloak"]:SetFrameStrata("HIGH") + + -- Function to set vanity controls layout + local function SetVanityControlsLayout() + + -- ElvUI_WrathArmory: Position helm and cloak checkboxes + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI:GetModule("ElvUI_WrathArmory", true) + if E then + LeaPlusCB["ShowHelm"].f:SetText(L["H"]) + LeaPlusCB["ShowHelm"].f:ClearAllPoints() + LeaPlusCB["ShowHelm"].f:SetPoint("RIGHT", LeaPlusCB["ShowHelm"], "LEFT", 4, 0) + LeaPlusCB["ShowHelm"]:ClearAllPoints() + LeaPlusCB["ShowHelm"]:SetPoint("BOTTOMLEFT", CharacterFrame, "BOTTOMLEFT", 80, 110) + LeaPlusCB["ShowHelm"]:SetHitRectInsets(-LeaPlusCB["ShowHelm"].f:GetStringWidth() + 4, 3, 0, 0) + LeaPlusCB["ShowCloak"].f:SetText(L["C"]) + LeaPlusCB["ShowCloak"].f:ClearAllPoints() + LeaPlusCB["ShowCloak"].f:SetPoint("RIGHT", LeaPlusCB["ShowCloak"], "LEFT", 4, 0) + LeaPlusCB["ShowCloak"]:ClearAllPoints() + LeaPlusCB["ShowCloak"]:SetPoint("LEFT", LeaPlusCB["ShowHelm"], "RIGHT", 4, 0) + LeaPlusCB["ShowCloak"]:SetHitRectInsets(-LeaPlusCB["ShowCloak"].f:GetStringWidth() + 4, 3, 0, 0) + return + end + end + + -- Position helm and cloak checkboxes + if LeaPlusLC["VanityAltLayout"] == "On" then + -- Alternative layout + LeaPlusCB["ShowHelm"].f:SetText(L["H"]) + LeaPlusCB["ShowHelm"]:ClearAllPoints() + LeaPlusCB["ShowHelm"]:SetPoint("TOPLEFT", 275, -224) + LeaPlusCB["ShowHelm"]:SetHitRectInsets(-LeaPlusCB["ShowHelm"].f:GetStringWidth() + 4, 3, 0, 0) + LeaPlusCB["ShowHelm"].f:ClearAllPoints() + LeaPlusCB["ShowHelm"].f:SetPoint("RIGHT", LeaPlusCB["ShowHelm"], "LEFT", 4, 0) + + LeaPlusCB["ShowCloak"].f:SetText(L["C"]) + LeaPlusCB["ShowCloak"]:ClearAllPoints() + LeaPlusCB["ShowCloak"]:SetPoint("TOP", LeaPlusCB["ShowHelm"], "BOTTOM", 0, 6) + LeaPlusCB["ShowCloak"].f:ClearAllPoints() + LeaPlusCB["ShowCloak"].f:SetPoint("RIGHT", LeaPlusCB["ShowCloak"], "LEFT", 4, 0) + LeaPlusCB["ShowCloak"]:SetHitRectInsets(-LeaPlusCB["ShowCloak"].f:GetStringWidth() + 4, 3, 0, 0) + else + -- Default layout + LeaPlusCB["ShowHelm"].f:SetText(L["Helm"]) + LeaPlusCB["ShowHelm"]:ClearAllPoints() + LeaPlusCB["ShowHelm"]:SetPoint("TOPLEFT", 65, -246) + LeaPlusCB["ShowHelm"]:SetHitRectInsets(3, -LeaPlusCB["ShowHelm"].f:GetStringWidth(), 0, 0) + LeaPlusCB["ShowHelm"].f:ClearAllPoints() + LeaPlusCB["ShowHelm"].f:SetPoint("LEFT", LeaPlusCB["ShowHelm"], "RIGHT", 0, 0) + + LeaPlusCB["ShowCloak"].f:SetText(L["Cloak"]) + LeaPlusCB["ShowCloak"]:ClearAllPoints() + LeaPlusCB["ShowCloak"]:SetPoint("TOPLEFT", 275, -246) + LeaPlusCB["ShowCloak"]:SetHitRectInsets(-LeaPlusCB["ShowCloak"].f:GetStringWidth(), 3, 0, 0) + LeaPlusCB["ShowCloak"].f:ClearAllPoints() + LeaPlusCB["ShowCloak"].f:SetPoint("RIGHT", LeaPlusCB["ShowCloak"], "LEFT", 0, 0) + end + end + + -- Set position when controls are shift/right-clicked + LeaPlusCB["ShowHelm"]:SetScript('OnMouseDown', function(self, btn) + if btn == "RightButton" and IsShiftKeyDown() then + if LeaPlusLC["VanityAltLayout"] == "On" then LeaPlusLC["VanityAltLayout"] = "Off" else LeaPlusLC["VanityAltLayout"] = "On" end + SetVanityControlsLayout() + end + end) + + LeaPlusCB["ShowCloak"]:SetScript('OnMouseDown', function(self, btn) + if btn == "RightButton" and IsShiftKeyDown() then + if LeaPlusLC["VanityAltLayout"] == "On" then LeaPlusLC["VanityAltLayout"] = "Off" else LeaPlusLC["VanityAltLayout"] = "On" end + SetVanityControlsLayout() + end + end) + + -- Set controls on startup + SetVanityControlsLayout() + + -- Manage alpha + LeaPlusCB["ShowHelm"]:SetAlpha(0.3) + LeaPlusCB["ShowCloak"]:SetAlpha(0.3) + LeaPlusCB["ShowHelm"]:HookScript("OnEnter", function() LeaPlusCB["ShowHelm"]:SetAlpha(1.0) end) + LeaPlusCB["ShowHelm"]:HookScript("OnLeave", function() LeaPlusCB["ShowHelm"]:SetAlpha(0.3) end) + LeaPlusCB["ShowCloak"]:HookScript("OnEnter", function() LeaPlusCB["ShowCloak"]:SetAlpha(1.0) end) + LeaPlusCB["ShowCloak"]:HookScript("OnLeave", function() LeaPlusCB["ShowCloak"]:SetAlpha(0.3) end) + + -- Toggle helm with click + LeaPlusCB["ShowHelm"]:HookScript("OnClick", function() + LeaPlusCB["ShowHelm"]:Disable() + LeaPlusCB["ShowHelm"]:SetAlpha(1.0) + LibCompat.After(0.5, function() + if ShowingHelm() then + ShowHelm(false) + else + ShowHelm(true) + end + LeaPlusCB["ShowHelm"]:Enable() + if not LeaPlusCB["ShowHelm"]:IsMouseOver() then + LeaPlusCB["ShowHelm"]:SetAlpha(0.3) + end + end) + end) + + -- Toggle cloak with click + LeaPlusCB["ShowCloak"]:HookScript("OnClick", function() + LeaPlusCB["ShowCloak"]:Disable() + LeaPlusCB["ShowCloak"]:SetAlpha(1.0) + LibCompat.After(0.5, function() + if ShowingCloak() then + ShowCloak(false) + else + ShowCloak(true) + end + LeaPlusCB["ShowCloak"]:Enable() + if not LeaPlusCB["ShowCloak"]:IsMouseOver() then + LeaPlusCB["ShowCloak"]:SetAlpha(0.3) + end + end) + end) + + -- Set checkbox state when checkboxes are shown + LeaPlusCB["ShowCloak"]:HookScript("OnShow", function() + if ShowingHelm() then + LeaPlusCB["ShowHelm"]:SetChecked(true) + else + LeaPlusCB["ShowHelm"]:SetChecked(false) + end + if ShowingCloak() then + LeaPlusCB["ShowCloak"]:SetChecked(true) + else + LeaPlusCB["ShowCloak"]:SetChecked(false) + end + end) + + end + + ---------------------------------------------------------------------- + -- Enhance dressup + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceDressup"] == "On" then + + -- Create configuration panel + local DressupPanel = LeaPlusLC:CreatePanel("Enhance dressup", "DressupPanel") + + LeaPlusLC:MakeTx(DressupPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(DressupPanel, "DressupItemButtons", "Show item buttons", 16, -92, false, "If checked, item buttons will be shown in the dressing room. You can click the item buttons to remove individual items from the model.") + LeaPlusLC:MakeCB(DressupPanel, "DressupAnimControl", "Show animation slider", 16, -112, false, "If checked, an animation slider will be shown in the dressing room.") + + -- Help button hidden + DressupPanel.h:Hide() + + -- Back button handler + DressupPanel.b:SetScript("OnClick", function() + DressupPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + DressupPanel.r:SetScript("OnClick", function() + + -- Refresh configuration panel + DressupPanel:Hide(); DressupPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["EnhanceDressupBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + else + DressupPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + ---------------------------------------------------------------------- + -- Item buttons + ---------------------------------------------------------------------- + + do + + local buttons = {} + local slotTable = {"HeadSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot", "TabardSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "MainHandSlot", "SecondaryHandSlot"} + local texTable = {"INV_Misc_Desecrated_ClothHelm", "INV_Misc_Desecrated_ClothShoulder", "INV_Misc_Cape_01", "INV_Misc_Desecrated_ClothChest", "INV_Shirt_01", "INV_Shirt_GuildTabard_01", "INV_Misc_Desecrated_ClothBracer", "INV_Misc_Desecrated_ClothGlove", "INV_Misc_Desecrated_ClothBelt", "INV_Misc_Desecrated_ClothPants", "INV_Misc_Desecrated_ClothBoots", "INV_Sword_01", "INV_Shield_01"} + + local function MakeSlotButton(number, slot, anchor, x, y) + + -- Create slot button + local slotBtn = CreateFrame("Button", nil, DressUpFrame) + slotBtn:SetFrameStrata("HIGH") + slotBtn:SetSize(30, 30) + slotBtn.slot = slot + slotBtn:ClearAllPoints() + slotBtn:SetPoint(anchor, x, y) + slotBtn:RegisterForClicks("LeftButtonUp") + slotBtn:SetMotionScriptsWhileDisabled(true) + + -- Slot button click + slotBtn:SetScript("OnClick", function(self, btn) + if btn == "LeftButton" then + local slotID = GetInventorySlotInfo(self.slot) + DressUpFrame.DressUpModel:UndressSlot(slotID) + end + end) + + -- Slot button tooltip + slotBtn:SetScript("OnEnter", function(self) + GameTooltip:SetOwner(self, "ANCHOR_RIGHT") + if self.item then + GameTooltip:SetHyperlink(self.item) + else + if self.slot then + GameTooltip:SetText(_G[string.upper(self.slot)]) + end + end + end) + slotBtn:SetScript("OnLeave", GameTooltip_Hide) + + -- Slot button textures + slotBtn.t = slotBtn:CreateTexture(nil, "BACKGROUND") + slotBtn.t:SetSize(30, 30) + slotBtn.t:SetPoint("CENTER") + slotBtn.t:SetDesaturated(true) + slotBtn.t:SetTexture("interface\\icons\\" .. texTable[number]) + + slotBtn.h = slotBtn:CreateTexture() + slotBtn.h:SetSize(30, 30) + slotBtn.h:SetPoint("CENTER") + slotBtn.h:SetAtlas("bags-glow-white") + slotBtn.h:SetBlendMode("ADD") + slotBtn:SetHighlightTexture(slotBtn.h) + + -- Add slot button to table + tinsert(buttons, slotBtn) + + end + + -- Show left column slot buttons + for i = 1, 7 do + MakeSlotButton(i, slotTable[i], "TOPLEFT", 22, -80 + -35 * (i - 1)) + end + + -- Show right column slot buttons + for i = 8, 13 do + MakeSlotButton(i, slotTable[i], "TOPRIGHT", -46, -80 + -35 * (i - 8)) + end + + -- Function to set item buttons + local function ToggleItemButtons() + if LeaPlusLC["DressupItemButtons"] == "On" then + for i = 1, #buttons do buttons[i]:Show() end + else + for i = 1, #buttons do buttons[i]:Hide() end + end + end + LeaPlusLC.ToggleItemButtons = ToggleItemButtons + + -- Set item buttons for option click, startup, reset click and preset click + LeaPlusCB["DressupItemButtons"]:HookScript("OnClick", ToggleItemButtons) + ToggleItemButtons() + DressupPanel.r:HookScript("OnClick", function() + LeaPlusLC["DressupItemButtons"] = "On" + ToggleItemButtons() + DressupPanel:Hide(); DressupPanel:Show() + end) + LeaPlusCB["EnhanceDressupBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + LeaPlusLC["DressupItemButtons"] = "On" + ToggleItemButtons() + end + end) + + end + + ---------------------------------------------------------------------- + -- Animation slider (must be before bottom row buttons) + ---------------------------------------------------------------------- + + local animTable = {0, 4, 5, 143, 119, 26, 25, 27, 28, 108, 120, 51, 124, 52, 125, 126, 62, 63, 41, 42, 43, 44, 132, 38, 14, 115, 193, 48, 110, 109, 134, 197, 0} + local lastSetting + + LeaPlusLC["DressupAnim"] = 0 -- Defined here since the setting is not saved + LeaPlusLC:MakeSL(DressUpFrame, "DressupAnim", "", 1, #animTable - 1, 1, 356, -92, "%.0f") + LeaPlusCB["DressupAnim"]:ClearAllPoints() + LeaPlusCB["DressupAnim"]:SetPoint("BOTTOM", -12, 112) + LeaPlusCB["DressupAnim"]:SetWidth(226) + LeaPlusCB["DressupAnim"]:SetFrameLevel(5) + LeaPlusCB["DressupAnim"]:HookScript("OnValueChanged", function(self, setting) + local playerActor = DressUpFrame.DressUpModel + setting = math.floor(setting + 0.5) + if playerActor and setting ~= lastSetting then + lastSetting = setting + DressUpFrame.DressUpModel:SetAnimation(animTable[setting], 0, 1, 1) + -- print(animTable[setting]) -- Debug + end + end) + + -- Function to show animation control + local function SetAnimationSlider() + if LeaPlusLC["DressupAnimControl"] == "On" then + LeaPlusCB["DressupAnim"]:Show() + else + LeaPlusCB["DressupAnim"]:Hide() + end + LeaPlusCB["DressupAnim"]:SetValue(1) + end + + -- Set animation control with option, startup, preset and reset + LeaPlusCB["DressupAnimControl"]:HookScript("OnClick", SetAnimationSlider) + SetAnimationSlider() + LeaPlusCB["EnhanceDressupBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + LeaPlusLC["DressupAnimControl"] = "On" + SetAnimationSlider() + end + end) + DressupPanel.r:HookScript("OnClick", function() + LeaPlusLC["DressupAnimControl"] = "On" + SetAnimationSlider() + DressupPanel:Hide(); DressupPanel:Show() + end) + + -- Reset animation when dressup frame is shown and model is reset + hooksecurefunc(DressUpFrame, "Show", SetAnimationSlider) + DressUpFrameResetButton:HookScript("OnClick", SetAnimationSlider) + + -- Skin slider for ElvUI + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalDressupAnim = LeaPlusCB["DressupAnim"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleSliderFrame(_G.LeaPlusGlobalDressupAnim, false) + end + + ---------------------------------------------------------------------- + -- Buttons + ---------------------------------------------------------------------- + + -- Function to modify a button + local function SetButton(where, text, tip) + if text ~= "" then + where:SetText(L[text]) + where:SetWidth(where:GetFontString():GetStringWidth() + 20) + end + where:HookScript("OnEnter", function() + GameTooltip:SetOwner(where, "ANCHOR_NONE") + GameTooltip:SetPoint("BOTTOM", where, "TOP", 0, 10) + GameTooltip:SetText(L[tip], nil, nil, nil, nil, true) + end) + where:HookScript("OnLeave", GameTooltip_Hide) + end + + -- Close + SetButton(DressUpFrameCancelButton, "", "Close") + DressUpFrameCancelButton:ClearAllPoints() + DressUpFrameCancelButton:SetPoint("BOTTOMRIGHT", DressUpFrame, "BOTTOMRIGHT", -40, 80) + + -- Reset + SetButton(DressUpFrameResetButton, "R", "Reset") + + -- Nude + LeaPlusLC:CreateButton("DressUpNudeBtn", DressUpFrameResetButton, "N", "BOTTOMLEFT", 106, 79, 80, 22, false, "") + LeaPlusCB["DressUpNudeBtn"]:SetFrameLevel(3) + LeaPlusCB["DressUpNudeBtn"]:ClearAllPoints() + LeaPlusCB["DressUpNudeBtn"]:SetPoint("RIGHT", DressUpFrameResetButton, "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpNudeBtn"], "N", "Remove all items") + LeaPlusCB["DressUpNudeBtn"]:SetScript("OnClick", function() + DressUpFrame.DressUpModel:Undress() + end) + + -- Show me + LeaPlusLC:CreateButton("DressUpShowMeBtn", DressUpFrameResetButton, "M", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpShowMeBtn"]:ClearAllPoints() + LeaPlusCB["DressUpShowMeBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpNudeBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpShowMeBtn"], "M", "Show me") + LeaPlusCB["DressUpShowMeBtn"]:SetScript("OnClick", function() + local playerActor = DressUpFrame.DressUpModel + playerActor:SetUnit("player") + -- Set animation + playerActor:SetAnimation(0) + LibCompat.After(0.1,function() + playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1) + end) + end) + + -- Show my outfit on target + --[[LeaPlusLC:CreateButton("DressUpOutfitOnTargetBtn", DressUpFrameResetButton, "O", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpOutfitOnTargetBtn"]:ClearAllPoints() + LeaPlusCB["DressUpOutfitOnTargetBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpNudeBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpOutfitOnTargetBtn"], "O", "Show my outfit on target") + LeaPlusCB["DressUpOutfitOnTargetBtn"]:SetScript("OnClick", function() + if UnitIsPlayer("target") then + DressUpFrame.DressUpModel:SetUnit("target") + DressUpFrame.DressUpModel:Undress() + LibCompat.After(0.01, function() + for i = 1, 19 do + local itemName = GetInventoryItemID("player", i) + if itemName then + DressUpFrame.DressUpModel:TryOn("item:" .. itemName) + end + end + end) + end + end)]] + + -- Target + LeaPlusLC:CreateButton("DressUpTargetBtn", DressUpFrameResetButton, "T", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpTargetBtn"]:ClearAllPoints() + LeaPlusCB["DressUpTargetBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpShowMeBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpTargetBtn"], "T", "Show target model") + LeaPlusCB["DressUpTargetBtn"]:SetScript("OnClick", function() + if UnitIsPlayer("target") then + local playerActor = DressUpFrame.DressUpModel + if playerActor then + playerActor:SetUnit("target") + -- Set animation + playerActor:SetAnimation(0) + LibCompat.After(0.1,function() + playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1) + end) + end + end + end) + + -- Toggle buttons + LeaPlusLC:CreateButton("DressUpButonsBtn", DressUpFrameResetButton, "B", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpButonsBtn"]:ClearAllPoints() + LeaPlusCB["DressUpButonsBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpTargetBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpButonsBtn"], "B", "Toggle buttons") + LeaPlusCB["DressUpButonsBtn"]:SetScript("OnClick", function() + if LeaPlusLC["DressupItemButtons"] == "On" then LeaPlusLC["DressupItemButtons"] = "Off" else LeaPlusLC["DressupItemButtons"] = "On" end + LeaPlusLC:ToggleItemButtons() + if DressupPanel:IsShown() then DressupPanel:Hide(); DressupPanel:Show() end + end) + + -- Show nearby target outfit on me button + --[[LeaPlusLC:CreateButton("DressUpTargetSelfBtn", DressUpFrameResetButton, "S", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpTargetSelfBtn"]:ClearAllPoints() + LeaPlusCB["DressUpTargetSelfBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpTargetBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpTargetSelfBtn"], "S", "Show nearby target outfit on me") + LeaPlusCB["DressUpTargetSelfBtn"]:SetScript("OnClick", function() + if UnitIsPlayer("target") then + if not CanInspect("target") then + ActionStatus_DisplayMessage(L["Target out of range."], true) + return + end + NotifyInspect("target") + LeaPlusCB["DressUpTargetSelfBtn"]:RegisterEvent("INSPECT_READY") + LeaPlusCB["DressUpTargetSelfBtn"]:SetScript("OnEvent", function() + DressUpFrame.DressUpModel:SetUnit("player") + DressUpFrame.DressUpModel:Undress() + LibCompat.After(0.01, function() + for i = 1, 19 do + local itemName = GetInventoryItemID("target", i) + LibCompat.After(0.01, function() + if itemName then + DressUpFrame.DressUpModel:TryOn("item:" .. itemName) + end + end) + end + end) + LeaPlusCB["DressUpTargetSelfBtn"]:UnregisterEvent("INSPECT_READY") + end) + end + end)]] + + -- Change player actor to player when reset button is clicked (needed because target button changes it) + DressUpFrameResetButton:HookScript("OnClick", function() + DressUpFrame.DressUpModel:SetUnit("player") + end) + + -- Auction house + local BtnStrata, BtnLevel = SideDressUpModelResetButton:GetFrameStrata(), SideDressUpModelResetButton:GetFrameLevel() + + -- Add buttons to auction house dressup frame + LeaPlusLC:CreateButton("DressUpSideBtn", SideDressUpModelResetButton, "Tabard", "BOTTOMLEFT", -36, -31, 60, 22, false, "") + LeaPlusCB["DressUpSideBtn"]:SetFrameStrata(BtnStrata) + LeaPlusCB["DressUpSideBtn"]:SetFrameLevel(BtnLevel) + LeaPlusCB["DressUpSideBtn"]:SetScript("OnClick", function() + SideDressUpModel:UndressSlot(19) + end) + + LeaPlusLC:CreateButton("DressUpSideNudeBtn", SideDressUpModelResetButton, "Nude", "BOTTOMRIGHT", 39, -31, 60, 22, false, "") + LeaPlusCB["DressUpSideNudeBtn"]:SetFrameStrata(BtnStrata) + LeaPlusCB["DressUpSideNudeBtn"]:SetFrameLevel(BtnLevel) + LeaPlusCB["DressUpSideNudeBtn"]:SetScript("OnClick", function() + SideDressUpModel:Undress() + end) + + -- Skin buttons for ElvUI + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalDressUpButtonsButton = LeaPlusCB["DressUpButonsBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpButtonsButton) + + _G.LeaPlusGlobalDressUpShowMeButton = LeaPlusCB["DressUpShowMeBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpShowMeButton) + + _G.LeaPlusGlobalDressUpTargetButton = LeaPlusCB["DressUpTargetBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpTargetButton) + + _G.LeaPlusGlobalDressUpNudeButton = LeaPlusCB["DressUpNudeBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpNudeButton) + end + + ---------------------------------------------------------------------- + -- Controls + ---------------------------------------------------------------------- + + -- Hide model rotation controls + CharacterModelFrameRotateLeftButton:HookScript("OnShow", CharacterModelFrameRotateLeftButton.Hide) + CharacterModelFrameRotateRightButton:HookScript("OnShow", CharacterModelFrameRotateRightButton.Hide) + DressUpModelFrameRotateLeftButton:HookScript("OnShow", DressUpModelFrameRotateLeftButton.Hide) + DressUpModelFrameRotateRightButton:HookScript("OnShow", DressUpModelFrameRotateRightButton.Hide) + SideDressUpModelControlFrame:HookScript("OnShow", SideDressUpModelControlFrame.Hide) + + ---------------------------------------------------------------------- + -- Hide dressup stats button + ---------------------------------------------------------------------- + + local function ToggleStats(startup) + + -- ElvUI_WrathArmory: Make character model full size + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI:GetModule("ElvUI_WrathArmory", true) + if E then + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 134) + return + end + end + + -- Toggle dressup stats + if LeaPlusLC["HideDressupStats"] == "On" then + CharacterResistanceFrame:Hide() + if CSC_HideStatsPanel then + -- CharacterStatsTBC is installed + RunScript('CSC_HideStatsPanel()') + if startup then + LibCompat.After(0.1, function() + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 134) + end) + end + else + -- CharacterStatsTBC is not installed + CharacterAttributesFrame:Hide() + end + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 134) + if LeaPlusLC["ShowVanityControls"] == "On" then + LeaPlusCB["ShowHelm"]:Hide() + LeaPlusCB["ShowCloak"]:Hide() + end + + else + + CharacterResistanceFrame:Show() + if CSC_ShowStatsPanel then + -- CharacterStatsTBC is installed + RunScript('CSC_ShowStatsPanel()') + if startup then + LibCompat.After(0.1, function() + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 243) + end) + end + else + -- CharacterStatsTBC is not installed + CharacterAttributesFrame:Show() + end + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 243) + if LeaPlusLC["ShowVanityControls"] == "On" then + LeaPlusCB["ShowHelm"]:Show() + LeaPlusCB["ShowCloak"]:Show() + end + end + + end + + -- Toggle stats with middle mouse button + CharacterModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "MiddleButton" then + if LeaPlusLC["HideDressupStats"] == "On" then LeaPlusLC["HideDressupStats"] = "Off" else LeaPlusLC["HideDressupStats"] = "On" end + ToggleStats() + end + end) + ToggleStats(true) + + -- Create toggle stats button + local toggleButton = CreateFrame("Button", nil, PaperDollFrame) + toggleButton:SetSize(36, 36) + toggleButton:SetPoint("TOPLEFT", PaperDollFrame, "TOPLEFT", 64, -45) + toggleButton:SetNormalTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-RotationRight-Big-Up") + toggleButton:SetHighlightTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-RotationRight-Big-Up") + toggleButton:SetPushedTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-RotationRight-Big-Up") + toggleButton:SetScript("OnEnter", function() + GameTooltip:SetOwner(toggleButton, "ANCHOR_NONE") + GameTooltip:SetPoint("BOTTOMLEFT", toggleButton, "BOTTOMRIGHT", 0, 0) + GameTooltip:SetText(L["Toggle character stats"], nil, nil, nil, nil, true) + GameTooltip:Show() + end) + toggleButton:SetScript("OnLeave", GameTooltip_Hide) + toggleButton:SetScript("OnClick", function() + if LeaPlusLC["HideDressupStats"] == "On" then LeaPlusLC["HideDressupStats"] = "Off" else LeaPlusLC["HideDressupStats"] = "On" end + ToggleStats() + end) + + -- Delay setting stats if CharacterStatsTBC is installed but hasn't loaded yet + if not CSC_HideStatsPanel and select(2, GetAddOnInfo("CharacterStatsTBC")) then + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "CharacterStatsTBC" then + ToggleStats(true) + waitFrame:UnregisterAllEvents() + end + end) + end + + ---------------------------------------------------------------------- + -- Enable zooming and panning + ---------------------------------------------------------------------- + + -- Enable zooming for character frame and dressup frame + CharacterModelFrame:HookScript("OnMouseWheel", Model_OnMouseWheel) + DressUpModelFrame:HookScript("OnMouseWheel", Model_OnMouseWheel) + + -- Slightly shorter character model frame for CharacterStatsTBC + if IsAddOnLoaded("CharacterStatsTBC") then + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 220) + end + + -- Enable panning for character frame + CharacterModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + Model_StartPanning(self) + end + end) + + CharacterModelFrame:HookScript("OnMouseUp", function(self, btn) + Model_StopPanning(self) + end) + + -- Enable panning for dressup frame + DressUpModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + Model_StartPanning(self) + end + end) + + DressUpModelFrame:HookScript("OnMouseUp", function(self, btn) + Model_StopPanning(self) + end) + + DressUpModelFrame:ClearAllPoints() + DressUpModelFrame:SetPoint("TOPLEFT", DressUpFrame, 22, -76) + DressUpModelFrame:SetPoint("BOTTOMRIGHT", DressUpFrame, -46, 106) + + -- Reset dressup frame when reset button clicked + DressUpFrameResetButton:HookScript("OnClick", function() + DressUpModelFrame.rotation = 0 + DressUpModelFrame:SetRotation(0) + DressUpModelFrame:SetPosition(0, 0, 0) + DressUpModelFrame.zoomLevel = 0 + DressUpModelFrame:SetPortraitZoom(0) + DressUpModelFrame:RefreshCamera() + end) + + -- Reset side dressup when reset button clicked + SideDressUpModelResetButton:HookScript("OnClick", function() + SideDressUpModel.rotation = 0 + SideDressUpModel:SetRotation(0) + SideDressUpModel:SetPosition(0, 0, -0.1) + SideDressUpModel.zoomLevel = 0 + SideDressUpModel:SetPortraitZoom(0) + SideDressUpModel:RefreshCamera() + end) + + ---------------------------------------------------------------------- + -- Inspect system + ---------------------------------------------------------------------- + + -- Inspect System + local function DoInspectSystemFunc() + + -- Hide model rotation controls + InspectModelFrameRotateLeftButton:Hide() + InspectModelFrameRotateRightButton:Hide() + + -- Enable zooming + InspectModelFrame:HookScript("OnMouseWheel", Model_OnMouseWheel) + + -- Enable panning + InspectModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + Model_StartPanning(self) + end + end) + + InspectModelFrame:HookScript("OnMouseUp", function(self, btn) + Model_StopPanning(self) + end) + + end + + if IsAddOnLoaded("Blizzard_InspectUI") then + DoInspectSystemFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_InspectUI" then + DoInspectSystemFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Automatically release in battlegrounds + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local ReleasePanel = LeaPlusLC:CreatePanel("Release in PvP", "ReleasePanel") + + LeaPlusLC:MakeTx(ReleasePanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(ReleasePanel, "AutoReleaseNoAlterac", "Exclude Alterac Valley", 16, -92, false, "If checked, you will not release automatically in Alterac Valley.") + + LeaPlusLC:MakeTx(ReleasePanel, "Delay", 356, -72) + LeaPlusLC:MakeSL(ReleasePanel, "AutoReleaseDelay", "Drag to set the number of milliseconds before you are automatically released.|n|nYou can hold down shift as the timer is ending to cancel the automatic release.", 200, 3000, 100, 356, -92, "%.0f") + + -- Help button hidden + ReleasePanel.h:Hide() + + -- Back button handler + ReleasePanel.b:SetScript("OnClick", function() + ReleasePanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + ReleasePanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoReleaseNoAlterac"] = "Off" + LeaPlusLC["AutoReleaseDelay"] = 200 + + -- Refresh panel + ReleasePanel:Hide(); ReleasePanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoReleasePvPBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoReleaseNoAlterac"] = "Off" + LeaPlusLC["AutoReleaseDelay"] = 200 + else + ReleasePanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Release in battlegrounds + hooksecurefunc("StaticPopup_Show", function(sType) + if sType and sType == "DEATH" and LeaPlusLC["AutoReleasePvP"] == "On" then + if C_DeathInfo.GetSelfResurrectOptions() and #C_DeathInfo.GetSelfResurrectOptions() > 0 then return end + local InstStat, InstType = IsInInstance() + if InstStat and InstType == "pvp" then + -- Exclude specific maps + local mapID = C_Map.GetBestMapForUnit("player") or nil + if mapID then + if mapID == 1459 and LeaPlusLC["AutoReleaseNoAlterac"] == "On" then return end -- Alterac Valley + end + -- Release automatically + local delay = LeaPlusLC["AutoReleaseDelay"] / 1000 + LibCompat.After(delay, function() + local dialog = StaticPopup_Visible("DEATH") + if dialog then + if IsShiftKeyDown() then + ActionStatus_DisplayMessage(L["Automatic Release Cancelled"], true) + else + StaticPopup_OnClick(_G[dialog], 1) + end + end + end) + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Enhance trainers + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceTrainers"] == "On" then + + -- Create configuration panel + local TrainerPanel = LeaPlusLC:CreatePanel("Enhance trainers", "TrainerPanel") + + LeaPlusLC:MakeTx(TrainerPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(TrainerPanel, "ShowTrainAllBtn", "Show train all skills button", 16, -92, false, "If checked, a train all skills button will be shown in the skill trainer frame allowing you to train all available skills instantly.") + + -- Help button hidden + TrainerPanel.h:Hide() + + -- Back button handler + TrainerPanel.b:SetScript("OnClick", function() + TrainerPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + TrainerPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["ShowTrainAllBtn"] = "On" + + -- Refresh configuration panel + TrainerPanel:Hide(); TrainerPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["EnhanceTrainersBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ShowTrainAllBtn"] = "On" + else + TrainerPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Set increased height of skill trainer frame and maximum number of skills listed + local tall, numTallTrainers = 73, 17 + + ---------------------------------------------------------------------- + -- Trainers Frame + ---------------------------------------------------------------------- + + local function TrainerFunc(frame) + + -- Make the frame double-wide + UIPanelWindows["ClassTrainerFrame"] = {area = "override", pushable = 0, xoffset = -16, yoffset = 12, bottomClampOverride = 140 + 12, width = 714, height = 487, whileDead = 1} + + -- Size the frame + _G["ClassTrainerFrame"]:SetSize(714, 487 + tall) + + -- Lower title text slightly + _G["ClassTrainerNameText"]:ClearAllPoints() + _G["ClassTrainerNameText"]:SetPoint("TOP", _G["ClassTrainerFrame"], "TOP", 0, -18) + + -- Expand the skill list to full height + _G["ClassTrainerListScrollFrame"]:ClearAllPoints() + _G["ClassTrainerListScrollFrame"]:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 25, -75) + _G["ClassTrainerListScrollFrame"]:SetSize(295, 336 + tall) + + -- Create additional list rows + do + + local oldSkillsDisplayed = CLASS_TRAINER_SKILLS_DISPLAYED + + -- Position existing buttons + for i = 1 + 1, CLASS_TRAINER_SKILLS_DISPLAYED do + _G["ClassTrainerSkill" .. i]:ClearAllPoints() + _G["ClassTrainerSkill" .. i]:SetPoint("TOPLEFT", _G["ClassTrainerSkill" .. (i - 1)], "BOTTOMLEFT", 0, 1) + end + + -- Create and position new buttons + _G.CLASS_TRAINER_SKILLS_DISPLAYED = _G.CLASS_TRAINER_SKILLS_DISPLAYED + numTallTrainers + for i = oldSkillsDisplayed + 1, CLASS_TRAINER_SKILLS_DISPLAYED do + local button = CreateFrame("Button", "ClassTrainerSkill" .. i, ClassTrainerFrame, "ClassTrainerSkillButtonTemplate") + button:SetID(i) + button:Hide() + button:ClearAllPoints() + button:SetPoint("TOPLEFT", _G["ClassTrainerSkill" .. (i - 1)], "BOTTOMLEFT", 0, 1) + end + + hooksecurefunc("ClassTrainer_SetToTradeSkillTrainer", function() + _G.CLASS_TRAINER_SKILLS_DISPLAYED = _G.CLASS_TRAINER_SKILLS_DISPLAYED + numTallTrainers + ClassTrainerListScrollFrame:SetHeight(336 + tall) + ClassTrainerDetailScrollFrame:SetHeight(336 + tall) + end) + + hooksecurefunc("ClassTrainer_SetToClassTrainer", function() + _G.CLASS_TRAINER_SKILLS_DISPLAYED = _G.CLASS_TRAINER_SKILLS_DISPLAYED + numTallTrainers - 1 + ClassTrainerListScrollFrame:SetHeight(336 + tall) + ClassTrainerDetailScrollFrame:SetHeight(336 + tall) + end) + + end + + -- Set highlight bar width when shown + hooksecurefunc(_G["ClassTrainerSkillHighlightFrame"], "Show", function() + ClassTrainerSkillHighlightFrame:SetWidth(290) + end) + + -- Move the detail frame to the right and stretch it to full height + _G["ClassTrainerDetailScrollFrame"]:ClearAllPoints() + _G["ClassTrainerDetailScrollFrame"]:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 352, -74) + _G["ClassTrainerDetailScrollFrame"]:SetSize(296, 336 + tall) + -- _G["ClassTrainerSkillIcon"]:SetHeight(500) -- Debug + + -- Hide detail scroll frame textures + _G["ClassTrainerDetailScrollFrameTop"]:SetAlpha(0) + _G["ClassTrainerDetailScrollFrameBottom"]:SetAlpha(0) + + -- Hide expand tab (left of All button) + _G["ClassTrainerExpandTabLeft"]:Hide() + + -- Get frame textures + local regions = {_G["ClassTrainerFrame"]:GetRegions()} + + -- Set top left texture + regions[2]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[2]:SetTexCoord(0.25, 0.75, 0, 1) + regions[2]:SetSize(512, 512) + + -- Set top right texture + regions[3]:ClearAllPoints() + regions[3]:SetPoint("TOPLEFT", regions[2], "TOPRIGHT", 0, 0) + regions[3]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[3]:SetTexCoord(0.75, 1, 0, 1) + regions[3]:SetSize(256, 512) + + -- Hide bottom left and bottom right textures + regions[4]:Hide() + regions[5]:Hide() + + -- Hide skills list dividing bar + regions[9]:Hide() + ClassTrainerHorizontalBarLeft:Hide() + + -- Set skills list backdrop + local RecipeInset = _G["ClassTrainerFrame"]:CreateTexture(nil, "ARTWORK") + RecipeInset:SetSize(304, 361 + tall) + RecipeInset:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 16, -72) + RecipeInset:SetTexture("Interface\\RAIDFRAME\\UI-RaidFrame-GroupBg") + + -- Set detail frame backdrop + local DetailsInset = _G["ClassTrainerFrame"]:CreateTexture(nil, "ARTWORK") + DetailsInset:SetSize(302, 339 + tall) + DetailsInset:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 348, -72) + DetailsInset:SetTexture("Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated") + + -- Move bottom button row + _G["ClassTrainerTrainButton"]:ClearAllPoints() + _G["ClassTrainerTrainButton"]:SetPoint("RIGHT", _G["ClassTrainerCancelButton"], "LEFT", -1, 0) + + -- Position and size close button + _G["ClassTrainerCancelButton"]:SetSize(80, 22) + _G["ClassTrainerCancelButton"]:SetText(CLOSE) + _G["ClassTrainerCancelButton"]:ClearAllPoints() + _G["ClassTrainerCancelButton"]:SetPoint("BOTTOMRIGHT", _G["ClassTrainerFrame"], "BOTTOMRIGHT", -42, 54) + + -- Position close box + _G["ClassTrainerFrameCloseButton"]:ClearAllPoints() + _G["ClassTrainerFrameCloseButton"]:SetPoint("TOPRIGHT", _G["ClassTrainerFrame"], "TOPRIGHT", -30, -8) + + -- Position dropdown menus + ClassTrainerFrameFilterDropDown:ClearAllPoints() + ClassTrainerFrameFilterDropDown:SetPoint("TOPLEFT", ClassTrainerFrame, "TOPLEFT", 501, -40) + + -- Position money frame + ClassTrainerMoneyFrame:ClearAllPoints() + ClassTrainerMoneyFrame:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 143, -49) + ClassTrainerGreetingText:Hide() + + ---------------------------------------------------------------------- + -- Train All button + ---------------------------------------------------------------------- + + -- Create train all button + LeaPlusLC:CreateButton("TrainAllButton", ClassTrainerFrame, "Train All", "BOTTOMLEFT", 344, 54, 0, 22, false, "") + + -- Give button global scope (useful for compatibility with other addons and essential for ElvUI) + _G.LeaPlusGlobalTrainAllButton = LeaPlusCB["TrainAllButton"] + + -- Button tooltip + LeaPlusCB["TrainAllButton"]:SetScript("OnEnter", function(self) + -- Get number of available skills and total cost + local count, cost = 0, 0 + for i = 1, GetNumTrainerServices() do + local void, void, isAvail = GetTrainerServiceInfo(i) + if isAvail and isAvail == "available" then + count = count + 1 + cost = cost + GetTrainerServiceCost(i) + end + end + -- Show tooltip + if count > 0 then + GameTooltip:SetOwner(self, "ANCHOR_TOP", 0, 4) + GameTooltip:ClearLines() + if count > 1 then + GameTooltip:AddLine(L["Train"] .. " " .. count .. " " .. L["skills for"] .. " " .. GetCoinTextureString(cost)) + else + GameTooltip:AddLine(L["Train"] .. " " .. count .. " " .. L["skill for"] .. " " .. GetCoinTextureString(cost)) + end + GameTooltip:Show() + end + end) + + -- Button click handler + LeaPlusCB["TrainAllButton"]:SetScript("OnClick",function(self) + for i = 1, GetNumTrainerServices() do + local void, void, isAvail = GetTrainerServiceInfo(i) + if isAvail and isAvail == "available" then + BuyTrainerService(i) + end + end + end) + + -- Enable button only when skills are available + local skillsAvailable + hooksecurefunc("ClassTrainerFrame_Update", function() + skillsAvailable = false + for i = 1, GetNumTrainerServices() do + local void, void, isAvail = GetTrainerServiceInfo(i) + if isAvail and isAvail == "available" then + skillsAvailable = true + end + end + LeaPlusCB["TrainAllButton"]:SetEnabled(skillsAvailable) + -- Refresh tooltip + if LeaPlusCB["TrainAllButton"]:IsMouseOver() and skillsAvailable then + LeaPlusCB["TrainAllButton"]:GetScript("OnEnter")(LeaPlusCB["TrainAllButton"]) + end + end) + + -- Function to set train all button + local function SetTrainAllFunc() + if LeaPlusLC["ShowTrainAllBtn"] == "On" then + LeaPlusCB["TrainAllButton"]:Show() + else + LeaPlusCB["TrainAllButton"]:Hide() + end + end + + -- Run function when option is clicked, reset or preset button is clicked and on startup + LeaPlusCB["ShowTrainAllBtn"]:HookScript("OnClick", SetTrainAllFunc) + TrainerPanel.r:HookScript("OnClick", SetTrainAllFunc) + LeaPlusCB["EnhanceTrainersBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ShowTrainAllBtn"] = "On" + SetTrainAllFunc() + end + end) + SetTrainAllFunc() + + ---------------------------------------------------------------------- + -- ElvUI fixes + ---------------------------------------------------------------------- + + -- ElvUI fixes + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI + if E.private.skins.blizzard.enable and E.private.skins.blizzard.trainer then + regions[2]:Hide() + regions[3]:Hide() + RecipeInset:Hide() + DetailsInset:Hide() + _G["ClassTrainerFrame"]:SetHeight(512 + tall) + _G["ClassTrainerTrainButton"]:ClearAllPoints() + _G["ClassTrainerTrainButton"]:SetPoint("BOTTOMRIGHT", _G["ClassTrainerFrame"], "BOTTOMRIGHT", -42, 78) + LeaPlusCB["TrainAllButton"]:ClearAllPoints() + LeaPlusCB["TrainAllButton"]:SetPoint("BOTTOMLEFT", _G["ClassTrainerFrame"], "BOTTOMLEFT", 344, 78) + E:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalTrainAllButton) + end + end + + end + + -- Run function when Trainer UI has loaded + if IsAddOnLoaded("Blizzard_TrainerUI") then + TrainerFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_TrainerUI" then + TrainerFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Set weather density (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local weatherPanel = LeaPlusLC:CreatePanel("Set weather density", "weatherPanel") + LeaPlusLC:MakeTx(weatherPanel, "Settings", 16, -72) + LeaPlusLC:MakeSL(weatherPanel, "WeatherLevel", "Drag to set the density of weather effects.", 0, 3, 1, 16, -92, "%.0f") + + local weatherSliderTable = {L["Very Low"], L["Low"], L["Medium"], L["High"]} + + -- Function to set the weather density + local function SetWeatherFunc() + LeaPlusCB["WeatherLevel"].f:SetText(LeaPlusLC["WeatherLevel"] .. " (" .. weatherSliderTable[LeaPlusLC["WeatherLevel"] + 1] .. ")") + if LeaPlusLC["SetWeatherDensity"] == "On" then + SetCVar("WeatherDensity", LeaPlusLC["WeatherLevel"]) + SetCVar("RAIDweatherDensity", LeaPlusLC["WeatherLevel"]) + else + SetCVar("WeatherDensity", "3") + SetCVar("RAIDweatherDensity", "3") + end + end + + -- Set weather density when options are clicked and on startup if option is enabled + LeaPlusCB["SetWeatherDensity"]:HookScript("OnClick", SetWeatherFunc) + LeaPlusCB["WeatherLevel"]:HookScript("OnValueChanged", SetWeatherFunc) + if LeaPlusLC["SetWeatherDensity"] == "On" then SetWeatherFunc() end + + -- Prevent weather density from being changed when particle density is changed + hooksecurefunc("SetCVar", function(setting, value) + if setting and LeaPlusLC["SetWeatherDensity"] == "On" then + if setting == "graphicsParticleDensity" then + if GetCVar("WeatherDensity") ~= LeaPlusLC["WeatherLevel"] then + LibCompat.After(0.1, function() + SetCVar("WeatherDensity", LeaPlusLC["WeatherLevel"]) + end) + end + elseif setting == "raidGraphicsParticleDensity" then + if GetCVar("RAIDweatherDensity") ~= LeaPlusLC["WeatherLevel"] then + LibCompat.After(0.1, function() + SetCVar("RAIDweatherDensity", LeaPlusLC["WeatherLevel"]) + end) + end + end + end + end) + + -- Help button hidden + weatherPanel.h:Hide() + + -- Back button handler + weatherPanel.b:SetScript("OnClick", function() + weatherPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button handler + weatherPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["WeatherLevel"] = 3 + + -- Refresh side panel + weatherPanel:Hide(); weatherPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["SetWeatherDensityBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["WeatherLevel"] = 0 + SetWeatherFunc() + else + weatherPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Enhance professions + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceProfessions"] == "On" then + + -- Set increased height of professions frame and maximum number of recipes listed + local tall, numTallProfs = 73, 19 + + ---------------------------------------------------------------------- + -- TradeSkill Frame + ---------------------------------------------------------------------- + + local function TradeSkillFunc(frame) + + -- Make the tradeskill frame double-wide + UIPanelWindows["TradeSkillFrame"] = {area = "override", pushable = 3, xoffset = -16, yoffset = 12, bottomClampOverride = 140 + 12, width = 714, height = 487, whileDead = 1} + + -- Size the tradeskill frame + _G["TradeSkillFrame"]:SetWidth(714) + _G["TradeSkillFrame"]:SetHeight(487 + tall) + + -- Adjust title text + _G["TradeSkillFrameTitleText"]:ClearAllPoints() + _G["TradeSkillFrameTitleText"]:SetPoint("TOP", _G["TradeSkillFrame"], "TOP", 0, -18) + + -- Expand the tradeskill list to full height + _G["TradeSkillListScrollFrame"]:ClearAllPoints() + _G["TradeSkillListScrollFrame"]:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 25, -75) + _G["TradeSkillListScrollFrame"]:SetSize(295, 336 + tall) + + -- Create additional list rows + local oldTradeSkillsDisplayed = TRADE_SKILLS_DISPLAYED + + -- Position existing buttons + for i = 1 + 1, TRADE_SKILLS_DISPLAYED do + _G["TradeSkillSkill" .. i]:ClearAllPoints() + _G["TradeSkillSkill" .. i]:SetPoint("TOPLEFT", _G["TradeSkillSkill" .. (i-1)], "BOTTOMLEFT", 0, 1) + end + + -- Create and position new buttons + _G.TRADE_SKILLS_DISPLAYED = _G.TRADE_SKILLS_DISPLAYED + numTallProfs + for i = oldTradeSkillsDisplayed + 1, TRADE_SKILLS_DISPLAYED do + local button = CreateFrame("Button", "TradeSkillSkill" .. i, TradeSkillFrame, "TradeSkillSkillButtonTemplate") + button:SetID(i) + button:Hide() + button:ClearAllPoints() + button:SetPoint("TOPLEFT", _G["TradeSkillSkill" .. (i-1)], "BOTTOMLEFT", 0, 1) + end + + -- Set highlight bar width when shown + hooksecurefunc(_G["TradeSkillHighlightFrame"], "Show", function() + _G["TradeSkillHighlightFrame"]:SetWidth(290) + end) + + -- Move the tradeskill detail frame to the right and stretch it to full height + _G["TradeSkillDetailScrollFrame"]:ClearAllPoints() + _G["TradeSkillDetailScrollFrame"]:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 352, -74) + _G["TradeSkillDetailScrollFrame"]:SetSize(298, 336 + tall) + -- _G["TradeSkillReagent1"]:SetHeight(500) -- Debug + + -- Hide detail scroll frame textures + _G["TradeSkillDetailScrollFrameTop"]:SetAlpha(0) + _G["TradeSkillDetailScrollFrameBottom"]:SetAlpha(0) + + -- Create texture for skills list + local RecipeInset = _G["TradeSkillFrame"]:CreateTexture(nil, "ARTWORK") + RecipeInset:SetSize(304, 361+ tall) + RecipeInset:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 16, -72) + RecipeInset:SetTexture("Interface\\RAIDFRAME\\UI-RaidFrame-GroupBg") + + -- Set detail frame backdrop + local DetailsInset = _G["TradeSkillFrame"]:CreateTexture(nil, "ARTWORK") + DetailsInset:SetSize(302, 339+ tall) + DetailsInset:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 348, -72) + DetailsInset:SetTexture("Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated") + + -- Hide expand tab (left of All button) + _G["TradeSkillExpandTabLeft"]:Hide() + + -- Hide skills list horizontal dividing bar (this hides it behind RecipeInset) + TradeSkillHorizontalBarLeft:SetSize(1, 1) + TradeSkillHorizontalBarLeft:Hide() + + -- Get tradeskill frame textures + local regions = {_G["TradeSkillFrame"]:GetRegions()} + + -- Set top left texture + regions[3]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[3]:SetTexCoord(0.25, 0.75, 0, 1) + regions[3]:SetSize(512, 512) + + -- Set top right texture + regions[4]:ClearAllPoints() + regions[4]:SetPoint("TOPLEFT", regions[3], "TOPRIGHT", 0, 0) + regions[4]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[4]:SetTexCoord(0.75, 1, 0, 1) + regions[4]:SetSize(256, 512) + + -- Hide bottom left and bottom right textures + TradeSkillFrameBottomLeftTexture:Hide() + TradeSkillFrameBottomRightTexture:Hide() + + -- Hide horizonal bar in recipe list + regions[8]:Hide() + regions[9]:Hide() -- The shorter pesky horizontal bar that only shows sometimes (texture is 130968) + + -- Move skill rank text + TradeSkillRankFrameSkillRank:ClearAllPoints() + TradeSkillRankFrameSkillRank:SetPoint("TOP", TradeSkillRankFrame, "TOP", 0, -1) + + -- Move create button row + _G["TradeSkillCreateButton"]:ClearAllPoints() + _G["TradeSkillCreateButton"]:SetPoint("RIGHT", _G["TradeSkillCancelButton"], "LEFT", -1, 0) + + -- Position and size close button + _G["TradeSkillCancelButton"]:SetSize(80, 22) + _G["TradeSkillCancelButton"]:SetText(CLOSE) + _G["TradeSkillCancelButton"]:ClearAllPoints() + _G["TradeSkillCancelButton"]:SetPoint("BOTTOMRIGHT", _G["TradeSkillFrame"], "BOTTOMRIGHT", -42, 54) + + -- Position close box + _G["TradeSkillFrameCloseButton"]:ClearAllPoints() + _G["TradeSkillFrameCloseButton"]:SetPoint("TOPRIGHT", _G["TradeSkillFrame"], "TOPRIGHT", -30, -8) + + -- Position dropdown menus + TradeSkillInvSlotDropDown:ClearAllPoints() + TradeSkillInvSlotDropDown:SetPoint("TOPLEFT", TradeSkillFrame, "TOPLEFT", 510, -40) + TradeSkillSubClassDropDown:ClearAllPoints() + TradeSkillSubClassDropDown:SetPoint("RIGHT", TradeSkillInvSlotDropDown, "LEFT", 0, 0) + + -- Move search box below rank frame + TradeSkillFrameEditBox:ClearAllPoints() + TradeSkillFrameEditBox:SetPoint("TOPRIGHT", TradeSkillRankFrame, "BOTTOMRIGHT", 0, 1) + TradeSkillFrameEditBox:SetFrameLevel(3) + + -- Move have materials checkbox down slightly + TradeSkillFrameAvailableFilterCheckButton:ClearAllPoints() + TradeSkillFrameAvailableFilterCheckButton:SetPoint("TOPLEFT", TradeSkillFrame, "TOPLEFT", 70, -53) + + -- Ensure have materials checkbox doesn't overlap search box + TradeSkillFrameAvailableFilterCheckButtonText:SetWidth(110) + TradeSkillFrameAvailableFilterCheckButtonText:SetWordWrap(false) + TradeSkillFrameAvailableFilterCheckButtonText:SetJustifyH("LEFT") + + -- ElvUI fixes + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI + if E.private.skins.blizzard.enable and E.private.skins.blizzard.tradeskill then + regions[3]:Hide() + regions[4]:Hide() + RecipeInset:Hide() + DetailsInset:Hide() + _G["TradeSkillFrame"]:SetHeight(512 + tall) + _G["TradeSkillCancelButton"]:ClearAllPoints() + _G["TradeSkillCancelButton"]:SetPoint("BOTTOMRIGHT", _G["TradeSkillFrame"], "BOTTOMRIGHT", -42, 78) + _G["TradeSkillRankFrame"]:ClearAllPoints() + _G["TradeSkillRankFrame"]:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 24, -44) + _G["TradeSkillFrameEditBox"]:ClearAllPoints() + _G["TradeSkillFrameEditBox"]:SetPoint("TOPRIGHT", TradeSkillFrame, "TOPRIGHT", -392, -60) + _G["TradeSkillFrameAvailableFilterCheckButton"]:ClearAllPoints() + _G["TradeSkillFrameAvailableFilterCheckButton"]:SetPoint("TOPLEFT", TradeSkillFrame, "TOPLEFT", 20, -58) + end + end + + -- Classic Profession Filter addon fixes + if IsAddOnLoaded("ClassicProfessionFilter") and TradeSkillFrame.SearchBox and TradeSkillFrame.HaveMats and TradeSkillFrame.HaveMats.text and TradeSkillFrame.SearchMats and TradeSkillFrame.SearchMats.text then + TradeSkillFrame.SearchBox:ClearAllPoints() + TradeSkillFrame.SearchBox:SetPoint("LEFT", TradeSkillRankFrame, "RIGHT", 20, -10) + + TradeSkillFrame.HaveMats:ClearAllPoints() + TradeSkillFrame.HaveMats:SetPoint("LEFT", TradeSkillFrame.SearchBox, "RIGHT", 10, 8) + TradeSkillFrame.HaveMats.text:SetText(L["Have mats?"]) + TradeSkillFrame.HaveMats:SetHitRectInsets(0, -TradeSkillFrame.HaveMats.text:GetStringWidth() + 4, 0, 0) + TradeSkillFrame.HaveMats.text:SetJustifyH("LEFT") + TradeSkillFrame.HaveMats.text:SetWordWrap(false) + if TradeSkillFrame.HaveMats.text:GetWidth() > 80 then + TradeSkillFrame.HaveMats.text:SetWidth(80) + TradeSkillFrame.HaveMats:SetHitRectInsets(0, -80 + 4, 0, 0) + end + + TradeSkillFrame.SearchMats:ClearAllPoints() + TradeSkillFrame.SearchMats:SetPoint("BOTTOMLEFT", TradeSkillFrame.HaveMats, "BOTTOMLEFT", 0, -16) + TradeSkillFrame.SearchMats.text:SetText(L["Search mats?"]) + TradeSkillFrame.SearchMats:SetHitRectInsets(0, -TradeSkillFrame.SearchMats.text:GetStringWidth() + 2, 0, 0) + TradeSkillFrame.SearchMats.text:SetJustifyH("LEFT") + TradeSkillFrame.SearchMats.text:SetWordWrap(false) + if TradeSkillFrame.SearchMats.text:GetWidth() > 80 then + TradeSkillFrame.SearchMats.text:SetWidth(80) + TradeSkillFrame.SearchMats:SetHitRectInsets(0, -80 + 4, 0, 0) + end + end + + end + + -- Run function when TradeSkill UI has loaded + if IsAddOnLoaded("Blizzard_TradeSkillUI") then + TradeSkillFunc("TradeSkill") + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_TradeSkillUI" then + TradeSkillFunc("TradeSkill") + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Enhance quest log + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceQuestLog"] == "On" then + + -- Button to toggle quest headers + LeaPlusLC:CreateButton("ToggleQuestHeaders", QuestLogFrame, "Collapse", "BOTTOMLEFT", 344, 54, 0, 22, true, "", false) + LeaPlusCB["ToggleQuestHeaders"]:ClearAllPoints() + LeaPlusCB["ToggleQuestHeaders"]:SetPoint("TOPRIGHT", QuestLogFrame, "TOPRIGHT", -360, -44) + LeaPlusCB["ToggleQuestHeaders"]:GetFontString():SetWordWrap(false) + + local function SetHeadersButton() + if LeaPlusCB["ToggleQuestHeaders"].collapsed then + LeaPlusCB["ToggleQuestHeaders"]:SetText(L["Expand"]) + else + LeaPlusCB["ToggleQuestHeaders"]:SetText(L["Collapse"]) + end + local headerButtonWidth = LeaPlusCB["ToggleQuestHeaders"]:GetFontString():GetStringWidth() + 13.6 + if headerButtonWidth > 120 then headerButtonWidth = 120 end + LeaPlusCB["ToggleQuestHeaders"]:GetFontString():SetWidth(headerButtonWidth) + LeaPlusCB["ToggleQuestHeaders"]:SetWidth(headerButtonWidth) + end + + LeaPlusCB["ToggleQuestHeaders"]:HookScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + if self.collapsed then + self.collapsed = nil + ExpandQuestHeader(0) + SetHeadersButton() + else + self.collapsed = 1 + QuestLogListScrollFrameScrollBar:SetValue(0) + CollapseQuestHeader(0) + SetHeadersButton() + end + end + end) + + -- Show quest level in quest log detail frame (but not when turning in quest) + hooksecurefunc("QuestLog_UpdateQuestDetails", function() + if LeaPlusLC["EnhanceQuestLevels"] == "On" then + local quest = GetQuestLogSelection() + if quest then + local title, level, suggestedGroup = GetQuestLogTitle(quest) + if title and level then + if suggestedGroup then + if suggestedGroup == LFG_TYPE_DUNGEON then level = level .. "D" + elseif suggestedGroup == RAID then level = level .. "R" + elseif suggestedGroup == ELITE then level = level .. "+" + elseif suggestedGroup == GROUP then level = level .. "+" + elseif suggestedGroup == PVP then level = level .. "P" + end + end + QuestInfoTitleHeader:SetText("[" .. level .. "] " .. title) + end + end + end + end) + + -- Show quest levels in quest log + hooksecurefunc("QuestLogTitleButton_Resize", function(questLogTitle) + if LeaPlusLC["EnhanceQuestLevels"] == "On" and not questLogTitle.isHeader then + local questIndex = questLogTitle:GetID() + local title, level, suggestedGroup = GetQuestLogTitle(questIndex) + local questTitleTag = questLogTitle.tag + local questNormalText = questLogTitle.normalText + local questCheck = questLogTitle.check + + if level and level > 0 and level < 10 then level = "0" .. level end + + if suggestedGroup and LeaPlusLC["EnhanceQuestDifficulty"] == "On" then + if suggestedGroup == LFG_TYPE_DUNGEON then level = level .. "D" + elseif suggestedGroup == RAID then level = level .. "R" + elseif suggestedGroup == ELITE then level = level .. "+" + elseif suggestedGroup == GROUP then level = level .. "+" + elseif suggestedGroup == PVP then level = level .. "P" + end + end + + questNormalText:SetWidth(0) + questNormalText:SetText(" [" .. level .. "] " .. title) + + -- Debug + -- questLogTitle.normalText:SetText(" [80] Learning to Leave and Return The") + + -- From QuestLogTitleButton_Resize + local rightEdge + if questTitleTag:IsShown() then + if questCheck:IsShown() then + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() - questTitleTag:GetWidth() - 4 - questCheck:GetWidth() - 2 + else + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() - questTitleTag:GetWidth() - 4 + end + else + if questCheck:IsShown() then + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() - questCheck:GetWidth() - 2 + else + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() + end + end + -- subtract from the text width the number of pixels that overrun the right edge + local questNormalTextWidth = questNormalText:GetWidth() - max(questNormalText:GetRight() - rightEdge, 0) + questNormalText:SetWidth(questNormalTextWidth) + end + end) + + -- Create configuration panel + local EnhanceQuestPanel = LeaPlusLC:CreatePanel("Enhance quest log", "EnhanceQuestPanel") + + LeaPlusLC:MakeTx(EnhanceQuestPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(EnhanceQuestPanel, "EnhanceQuestHeaders", "Show toggle headers button", 16, -92, false, "If checked, the toggle headers button will be shown.") + + LeaPlusLC:MakeTx(EnhanceQuestPanel, "Levels", 16, -132) + LeaPlusLC:MakeCB(EnhanceQuestPanel, "EnhanceQuestLevels", "Show quest levels", 16, -152, false, "If checked, quest levels will be shown.") + LeaPlusLC:MakeCB(EnhanceQuestPanel, "EnhanceQuestDifficulty", "Show quest difficulty in quest log list", 16, -172, false, "If checked, the quest difficulty will be shown next to the quest level in the quest log list.|n|nThis will indicate whether the quest requires a group (+), dungeon (D), raid (R) or PvP (P).|n|nThe quest difficulty will always be shown in the quest log detail pane regardless of this setting.") + + -- Disable Show quest difficulty option if Show quest levels is disabled + LeaPlusCB["EnhanceQuestLevels"]:HookScript("OnClick", function() + LeaPlusLC:LockOption("EnhanceQuestLevels", "EnhanceQuestDifficulty", false) + end) + LeaPlusLC:LockOption("EnhanceQuestLevels", "EnhanceQuestDifficulty", false) + + -- Help button hidden + EnhanceQuestPanel.h:Hide() + + -- Back button handler + EnhanceQuestPanel.b:SetScript("OnClick", function() + EnhanceQuestPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show(); + return + end) + + -- Function to set toggle headers button + local function SetQuestHeaderFunc() + if LeaPlusLC["EnhanceQuestHeaders"] == "On" then + LeaPlusCB["ToggleQuestHeaders"]:Show() + else + LeaPlusCB["ToggleQuestHeaders"]:Hide() + end + end + + -- Set toggle headers button when setting is clicked and on startup + LeaPlusCB["EnhanceQuestHeaders"]:HookScript("OnClick", SetQuestHeaderFunc) + SetQuestHeaderFunc() + + -- Reset button handler + EnhanceQuestPanel.r.tiptext = EnhanceQuestPanel.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."] + EnhanceQuestPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["EnhanceQuestHeaders"] = "On"; SetQuestHeaderFunc() + LeaPlusLC["EnhanceQuestLevels"] = "On" + LeaPlusLC["EnhanceQuestDifficulty"] = "On" + + -- Refresh panel + EnhanceQuestPanel:Hide(); EnhanceQuestPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["EnhanceQuestLogBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["EnhanceQuestHeaders"] = "On"; SetQuestHeaderFunc() + LeaPlusLC["EnhanceQuestLevels"] = "On" + LeaPlusLC["EnhanceQuestDifficulty"] = "On" + else + EnhanceQuestPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Show bag search box + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowBagSearchBox"] == "On" and not LeaLockList["ShowBagSearchBox"] then + + -- Function to unregister search event for guild bank since it isn't used + local function SetGuildBankFunc() + for i = 1, 6 do + _G["GuildBankTab" .. i].Button:UnregisterEvent("INVENTORY_SEARCH_UPDATE") + end + end + + -- Run search event function when Blizzard addon is loaded + if IsAddOnLoaded("Blizzard_GuildBankUI") then + SetGuildBankFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_GuildBankUI" then + SetGuildBankFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + -- Create bag item search box + local BagItemSearchBox = CreateFrame("EditBox", "BagItemSearchBox", ContainerFrame1, "BagSearchBoxTemplate") + BagItemSearchBox:SetSize(110, 18) + BagItemSearchBox:SetMaxLetters(15) + + -- Create bank item search box + local BankItemSearchBox = CreateFrame("EditBox", "BankItemSearchBox", BankFrame, "BagSearchBoxTemplate") + BankItemSearchBox:SetSize(120, 14) + BankItemSearchBox:SetMaxLetters(15) + BankItemSearchBox:SetPoint("TOPRIGHT", -60, -40) + + -- Attach bag search box first bag only + hooksecurefunc("ContainerFrame_Update", function(self) + if self:GetID() == 0 then + BagItemSearchBox:SetParent(self) + BagItemSearchBox:SetPoint("TOPLEFT", self, "TOPLEFT", 54, -29) + BagItemSearchBox.anchorBag = self + BagItemSearchBox:Show() + elseif BagItemSearchBox.anchorBag == self then + BagItemSearchBox:ClearAllPoints() + BagItemSearchBox:Hide() + BagItemSearchBox.anchorBag = nil + end + end) + + end + + ---------------------------------------------------------------------- + -- Show vendor price + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowVendorPrice"] == "On" then + + -- Function to show vendor price + local function ShowSellPrice(tooltip, tooltipObject) + if tooltip.shownMoneyFrames then return end + tooltipObject = tooltipObject or GameTooltip + -- Get container + local container = GetMouseFocus() + if not container then return end + -- Get item + local itemName, itemlink = tooltipObject:GetItem() + if not itemlink then return end + local void, void, void, void, void, void, void, void, void, void, sellPrice, classID = GetItemInfo(itemlink) + if sellPrice and sellPrice > 0 then + local count = container and type(container.count) == "number" and container.count or 1 + if sellPrice and count > 0 then + if classID and classID == 11 then count = 1 end -- Fix for quiver/ammo pouch so ammo is not included + SetTooltipMoney(tooltip, sellPrice * count, "STATIC", SELL_PRICE .. ":") + end + end + -- Refresh chat tooltips + if tooltipObject == ItemRefTooltip then ItemRefTooltip:Show() end + end + + -- Show vendor price when tooltips are shown + GameTooltip:HookScript("OnTooltipSetItem", ShowSellPrice) + hooksecurefunc(GameTooltip, "SetHyperlink", function(tip) ShowSellPrice(tip, GameTooltip) end) + hooksecurefunc(ItemRefTooltip, "SetHyperlink", function(tip) ShowSellPrice(tip, ItemRefTooltip) end) + + end + + ---------------------------------------------------------------------- + -- Dismount me + ---------------------------------------------------------------------- + + if LeaPlusLC["StandAndDismount"] == "On" then + + local eFrame = CreateFrame("FRAME") + eFrame:RegisterEvent("UI_ERROR_MESSAGE") + eFrame:SetScript("OnEvent", function(self, event, messageType, msg) + -- Auto dismount + if msg == ERR_OUT_OF_RAGE and LeaPlusLC["DismountNoResource"] == "On" + or msg == ERR_OUT_OF_MANA and LeaPlusLC["DismountNoResource"] == "On" + or msg == ERR_OUT_OF_ENERGY and LeaPlusLC["DismountNoResource"] == "On" + or msg == SPELL_FAILED_MOVING and LeaPlusLC["DismountNoMoving"] == "On" + or msg == ERR_TAXIPLAYERSHAPESHIFTED + then + local void, class = UnitClass("player") + if class == "SHAMAN" and GetShapeshiftFormID() then + -- Cancel Ghost Wolf + RunScript('CancelShapeshiftForm()') + end + if IsMounted() then + Dismount() + UIErrorsFrame:Clear() + end + end + end) + + -- Dismount when flight point map is opened + local taxiFrame = CreateFrame("FRAME") + taxiFrame:RegisterEvent("TAXIMAP_OPENED") + taxiFrame:SetScript("OnEvent", function() + local void, class = UnitClass("player") + if class == "SHAMAN" and GetShapeshiftFormID() then + -- Cancel Ghost Wolf + RunScript('CancelShapeshiftForm()') + end + if IsMounted() then Dismount() end + end) + + -- Create configuration panel + local DismountFrame = LeaPlusLC:CreatePanel("Dismount me", "DismountFrame") + + LeaPlusLC:MakeTx(DismountFrame, "Settings", 16, -72) + LeaPlusLC:MakeCB(DismountFrame, "DismountNoResource", "Dismount when not enough rage, mana or energy", 16, -92, false, "If checked, you will be dismounted when you attempt to cast a spell but don't have the rage, mana or energy to cast it.") + LeaPlusLC:MakeCB(DismountFrame, "DismountNoMoving", "Dismount when casting a spell while moving", 16, -112, false, "If checked, you will be dismounted when you attempt to cast a non-instant cast spell while moving.") + LeaPlusLC:MakeCB(DismountFrame, "DismountNoTaxi", "Dismount when the flight map opens", 16, -132, false, "If checked, you will be dismounted when you instruct a flight master to open the flight map.") + LeaPlusLC:MakeCB(DismountFrame, "DismountShowFormBtn", "Show cancel form button on flight map", 16, -152, false, "If checked, a cancel form button will be shown on the flight map while you are playing as a shapeshifted druid or shaman.") + + -- Help button hidden + DismountFrame.h.tiptext = L["The game will dismount you if you successfully cast a spell without addons. These settings let you set some additional dismount rules."] + + -- Back button handler + DismountFrame.b:SetScript("OnClick", function() + DismountFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Function to set dismount options + local function SetDismount() + if LeaPlusLC["DismountNoTaxi"] == "On" then + taxiFrame:RegisterEvent("TAXIMAP_OPENED") + else + taxiFrame:UnregisterEvent("TAXIMAP_OPENED") + end + end + + -- Run function when certain options are clicked and on startup + LeaPlusCB["DismountNoTaxi"]:HookScript("OnClick", SetDismount) + SetDismount() + + -- Reset button handler + DismountFrame.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["DismountNoResource"] = "On" + LeaPlusLC["DismountNoMoving"] = "On" + LeaPlusLC["DismountNoTaxi"] = "On" + LeaPlusLC["DismountShowFormBtn"] = "On" + + -- Update settings and configuration panel + SetDismount() + DismountFrame:Hide(); DismountFrame:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["DismountBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["DismountNoResource"] = "On" + LeaPlusLC["DismountNoMoving"] = "On" + LeaPlusLC["DismountNoTaxi"] = "On" + LeaPlusLC["DismountShowFormBtn"] = "On" + SetDismount() + else + DismountFrame:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Druid cancel form button + local void, class = UnitClass("player") + if class == "DRUID" or class == "SHAMAN" then + + -- Create button + local cancelFormBtn = CreateFrame("Button", nil, TaxiFrame, "InsecureActionButtonTemplate") + cancelFormBtn:SetAttribute("type", "macro") + cancelFormBtn:SetAttribute("macrotext", "/cancelform") + cancelFormBtn:ClearAllPoints() + cancelFormBtn:SetSize(24, 24) + cancelFormBtn:SetPoint("TOPRIGHT", TaxiFrame, "TOPRIGHT", -46, -46) + cancelFormBtn:SetNormalTexture("Interface\\ICONS\\Achievement_Character_Nightelf_Female") + cancelFormBtn:SetPushedTexture("Interface\\ICONS\\Achievement_Character_Nightelf_Female") + cancelFormBtn:SetHighlightTexture("Interface\\ICONS\\Achievement_Character_Nightelf_Female") + + -- Button message + cancelFormBtn.f = cancelFormBtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + cancelFormBtn.f:SetHeight(32) + cancelFormBtn.f:SetPoint('RIGHT', cancelFormBtn, 'LEFT', -10, 0) + cancelFormBtn.f:SetText(L["Click to unshift"]) + + -- Toggle button when form changes + cancelFormBtn:SetScript("OnEvent", function() + local form = GetShapeshiftForm() or 0 + if form ~= 0 then + if not cancelFormBtn:IsShown() then cancelFormBtn:Show() end + else + cancelFormBtn:Hide() + end + end) + + -- Function to set event and button status + local function SetShiftEvent() + if LeaPlusLC["DismountShowFormBtn"] == "On" then + cancelFormBtn:RegisterEvent("UPDATE_SHAPESHIFT_FORM") + local form = GetShapeshiftForm() or 0 + if form ~= 0 then cancelFormBtn:Show() else cancelFormBtn:Hide() end + else + cancelFormBtn:UnregisterEvent("UPDATE_SHAPESHIFT_FORM") + cancelFormBtn:Hide() + end + end + + -- Set button when option is clicked, when reset button is clicked, preset profile and on startup + LeaPlusCB["DismountShowFormBtn"]:HookScript("OnClick", SetShiftEvent) + DismountFrame.r:HookScript("OnClick", SetShiftEvent) + LeaPlusCB["DismountBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then SetShiftEvent() end + end) + SetShiftEvent() + + end + + end + + ---------------------------------------------------------------------- + -- Use class colors in chat + ---------------------------------------------------------------------- + + if LeaPlusLC["ClassColorsInChat"] == "On" and not LeaLockList["ClassColorsInChat"] then + + SetCVar("chatClassColorOverride", "0") + + LibCompat.After(0.1, function() + + -- Set local channel colors and lock checkboxes + for i = 1, 18 do + if _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"] then + ToggleChatColorNamesByClassGroup(true, _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"]:GetParent().type) + if _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "ColorClasses"] then + LeaPlusLC:LockItem(_G["ChatConfigChatSettingsLeftCheckBox" .. i .. "ColorClasses"], true) + end + end + end + + -- Set global channel colors + for i = 1, 50 do + ToggleChatColorNamesByClassGroup(true, "CHANNEL" .. i) + end + + -- Lock global channel checkboxes on startup + hooksecurefunc("ChatConfig_CreateCheckboxes", function(self, checkBoxTable, checkBoxTemplate, title) + if ChatConfigChannelSettingsLeft.checkBoxTable then + for i = 1, 50 do + if _G["ChatConfigChannelSettingsLeftCheckBox" .. i .. "ColorClasses"] then + LeaPlusLC:LockItem(_G["ChatConfigChannelSettingsLeftCheckBox" .. i .. "ColorClasses"], true) + end + end + end + end) + + end) + + end + + ---------------------------------------------------------------------- + -- Disable screen glow (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set screen glow + local function SetGlow() + if LeaPlusLC["NoScreenGlow"] == "On" then + SetCVar("ffxGlow", "0") + else + SetCVar("ffxGlow", "1") + end + end + + -- Set screen glow on startup and when option is clicked (if enabled) + LeaPlusCB["NoScreenGlow"]:HookScript("OnClick", SetGlow) + if LeaPlusLC["NoScreenGlow"] == "On" then SetGlow() end + + end + + ---------------------------------------------------------------------- + -- Disable screen effects (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set screen effects + local function SetEffects() + if LeaPlusLC["NoScreenEffects"] == "On" then + SetCVar("ffxDeath", "0") + SetCVar("ffxNether", "0") + else + SetCVar("ffxDeath", "1") + SetCVar("ffxNether", "1") + end + end + + -- Set screen effects when option is clicked and on startup (if enabled) + LeaPlusCB["NoScreenEffects"]:HookScript("OnClick", SetEffects) + if LeaPlusLC["NoScreenEffects"] == "On" then SetEffects() end + + end + + ---------------------------------------------------------------------- + -- Universal group chat color (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set chat colors + local function SetCol() + if LeaPlusLC["UnivGroupColor"] == "On" then + ChangeChatColor("RAID", 0.67, 0.67, 1) + ChangeChatColor("RAID_LEADER", 0.46, 0.78, 1) + else + ChangeChatColor("RAID", 1, 0.50, 0) + ChangeChatColor("RAID_LEADER", 1, 0.28, 0.04) + end + end + + -- Set chat colors when option is clicked and on startup (if enabled) + LeaPlusCB["UnivGroupColor"]:HookScript("OnClick", SetCol) + if LeaPlusLC["UnivGroupColor"] == "On" then SetCol() end + + end + + ---------------------------------------------------------------------- + -- Minimap button (no reload required) + ---------------------------------------------------------------------- + + do + + -- Minimap button click function + local function MiniBtnClickFunc(arg1) + + -- Prevent options panel from showing if Blizzard options panel is showing + if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() or ChatConfigFrame:IsShown() then return end + -- Prevent options panel from showing if Blizzard Store is showing + if StoreFrame and StoreFrame:GetAttribute("isshown") then return end + -- Left button down + if arg1 == "LeftButton" then + + -- Shift key toggles music + if IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then + Sound_ToggleMusic() + return + end + + -- Control key does nothing (no minimap target tracking in Wrath) + if IsControlKeyDown() and not IsShiftKeyDown() and not IsAltKeyDown() then + return + end + + -- Alt key toggles error messages + if IsAltKeyDown() and not IsControlKeyDown() and not IsShiftKeyDown() then + if LeaPlusDB["HideErrorMessages"] == "On" then -- Checks global + if LeaPlusLC["ShowErrorsFlag"] == 1 then + LeaPlusLC["ShowErrorsFlag"] = 0 + ActionStatus_DisplayMessage(L["Error messages will be shown"], true); + else + LeaPlusLC["ShowErrorsFlag"] = 1 + ActionStatus_DisplayMessage(L["Error messages will be hidden"], true); + end + return + end + return + end + + -- Control key and shift key toggles Zygor addon + if IsControlKeyDown() and IsShiftKeyDown() and not IsAltKeyDown() then + LeaPlusLC:ZygorToggle() + return + end + + -- Control key and alt key toggles maximised window mode + if IsControlKeyDown() and IsAltKeyDown() and not IsShiftKeyDown() then + if LeaPlusLC:PlayerInCombat() then + return + else + SetCVar("gxMaximize", tostring(1 - GetCVar("gxMaximize"))); + UpdateWindow() + end + return + end + + -- No modifier key toggles the options panel + if LeaPlusLC:IsPlusShowing() then + LeaPlusLC:HideFrames() + LeaPlusLC:HideConfigPanels() + else + LeaPlusLC:HideFrames() + LeaPlusLC["PageF"]:Show() + end + LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show() + end + + -- Right button down + if arg1 == "RightButton" then + + -- No modifier key toggles the options panel + -- if LeaPlusLC:IsPlusShowing() then +ReloadUI() + -- end + -- LeaPlusLC["Page" .. LeaPlusLC["LeaStartPage"]]:Show() + + end + + end + + -- Create minimap button using LibDBIcon + local miniButton = LibStub("LibDataBroker-1.1"):NewDataObject("Leatrix_Plus", { + type = "data source", + text = "Leatrix Plus", + icon = "Interface\\HELPFRAME\\ReportLagIcon-Movement", + OnClick = function(self, btn) + MiniBtnClickFunc(btn) + end, + OnTooltipShow = function(tooltip) + if not tooltip or not tooltip.AddLine then return end + tooltip:AddLine("Leatrix Plus") + end, + }) + + local icon = LibStub("LibDBIcon-1.0", true) + icon:Register("Leatrix_Plus", miniButton, LeaPlusDB) + + -- Function to toggle LibDBIcon + local function SetLibDBIconFunc() + if LeaPlusLC["ShowMinimapIcon"] == "On" then + LeaPlusDB["hide"] = false + icon:Show("Leatrix_Plus") + else + LeaPlusDB["hide"] = true + icon:Hide("Leatrix_Plus") + end + end + + -- Set LibDBIcon when option is clicked and on startup + LeaPlusCB["ShowMinimapIcon"]:HookScript("OnClick", SetLibDBIconFunc) + SetLibDBIconFunc() + + end + + ---------------------------------------------------------------------- + -- Auction House Extras + ---------------------------------------------------------------------- + + if LeaPlusLC["AhExtras"] == "On" then + + local function AuctionFunc() + + -- Set default auction duration value to saved settings or default settings + AuctionFrameAuctions.duration = LeaPlusDB["AHDuration"] or 3 + + -- Update duration radio button + AuctionsShortAuctionButton:SetChecked(false) + AuctionsMediumAuctionButton:SetChecked(false) + AuctionsLongAuctionButton:SetChecked(false) + if AuctionFrameAuctions.duration == 1 then + AuctionsShortAuctionButton:SetChecked(true) + elseif AuctionFrameAuctions.duration == 2 then + AuctionsMediumAuctionButton:SetChecked(true) + elseif AuctionFrameAuctions.duration == 3 then + AuctionsLongAuctionButton:SetChecked(true) + end + + -- Functions + local function CreateAuctionCB(name, anchor, x, y, text) + LeaPlusCB[name] = CreateFrame("CheckButton", nil, AuctionFrameAuctions, "OptionsCheckButtonTemplate") + LeaPlusCB[name]:SetFrameStrata("HIGH") + LeaPlusCB[name]:SetSize(20, 20) + LeaPlusCB[name]:SetPoint(anchor, x, y) + LeaPlusCB[name].f = LeaPlusCB[name]:CreateFontString(nil, 'OVERLAY', "GameFontNormal") + LeaPlusCB[name].f:SetPoint("LEFT", 20, 0) + LeaPlusCB[name].f:SetText(L[text]) + LeaPlusCB[name].f:Show(); + LeaPlusCB[name]:SetScript('OnClick', function() + if LeaPlusCB[name]:GetChecked() then + LeaPlusLC[name] = "On" + else + LeaPlusLC[name] = "Off" + end + end) + LeaPlusCB[name]:SetScript('OnShow', function(self) + if LeaPlusLC[name] == "On" then + self:SetChecked(true) + else + self:SetChecked(false) + end + end) + end + + -- Show the correct fields in the AH frame and match prices + local function SetupAh() + if LeaPlusLC["AhBuyoutOnly"] == "On" then + -- Hide the start price + StartPrice:SetAlpha(0); + -- Set start price to buyout price + StartPriceGold:SetText(BuyoutPriceGold:GetText()); + StartPriceSilver:SetText(BuyoutPriceSilver:GetText()); + StartPriceCopper:SetText(BuyoutPriceCopper:GetText()); + else + -- Show the start price + StartPrice:SetAlpha(1); + end + -- If gold only is on, set copper and silver to 99 + if LeaPlusLC["AhGoldOnly"] == "On" then + StartPriceCopper:SetText("99"); StartPriceCopper:Disable(); + StartPriceSilver:SetText("99"); StartPriceSilver:Disable(); + BuyoutPriceCopper:SetText("99"); BuyoutPriceCopper:Disable(); + BuyoutPriceSilver:SetText("99"); BuyoutPriceSilver:Disable(); + else + StartPriceCopper:Enable(); + StartPriceSilver:Enable(); + BuyoutPriceCopper:Enable(); + BuyoutPriceSilver:Enable(); + end + -- Validate the auction (mainly for the create auction button status) + AuctionsFrameAuctions_ValidateAuction() + end + + -- Create checkboxes + CreateAuctionCB("AhBuyoutOnly", "BOTTOMLEFT", 200, 16, "Buyout Only") + CreateAuctionCB("AhGoldOnly", "BOTTOMLEFT", 320, 16, "Gold Only") + + -- Reposition Gold Only checkbox so it does not overlap Buyout Only checkbox label + LeaPlusCB["AhGoldOnly"]:ClearAllPoints() + LeaPlusCB["AhGoldOnly"]:SetPoint("LEFT", LeaPlusCB["AhBuyoutOnly"].f, "RIGHT", 20, 0) + + -- Set click boundaries + LeaPlusCB["AhBuyoutOnly"]:SetHitRectInsets(0, -LeaPlusCB["AhBuyoutOnly"].f:GetStringWidth() + 6, 0, 0); + LeaPlusCB["AhGoldOnly"]:SetHitRectInsets(0, -LeaPlusCB["AhGoldOnly"].f:GetStringWidth() + 6, 0, 0); + + LeaPlusCB["AhBuyoutOnly"]:HookScript('OnClick', SetupAh); + LeaPlusCB["AhBuyoutOnly"]:HookScript('OnShow', SetupAh); + + AuctionFrameAuctions:HookScript("OnShow", SetupAh) + BuyoutPriceGold:HookScript("OnTextChanged", SetupAh) + BuyoutPriceSilver:HookScript("OnTextChanged", SetupAh) + BuyoutPriceCopper:HookScript("OnTextChanged", SetupAh) + StartPriceGold:HookScript("OnTextChanged", SetupAh) + StartPriceSilver:HookScript("OnTextChanged", SetupAh) + StartPriceCopper:HookScript("OnTextChanged", SetupAh) + + -- Lock the create auction button if buyout gold box is empty (when using buyout only and gold only) + AuctionsCreateAuctionButton:HookScript("OnEnable", function() + -- Do nothing if wow token frame is showing + if AuctionsWowTokenAuctionFrame:IsShown() then return end + -- Lock the create auction button if both checkboxes are enabled and buyout gold price is empty + if LeaPlusLC["AhGoldOnly"] == "On" and LeaPlusLC["AhBuyoutOnly"] == "On" then + if BuyoutPriceGold:GetText() == "" then + AuctionsCreateAuctionButton:Disable() + end + end + end) + + -- Clear copper and silver prices if gold only box is unchecked + LeaPlusCB["AhGoldOnly"]:HookScript('OnClick', function() + if LeaPlusCB["AhGoldOnly"]:GetChecked() == false then + BuyoutPriceCopper:SetText("") + BuyoutPriceSilver:SetText("") + StartPriceCopper:SetText("") + StartPriceSilver:SetText("") + end + SetupAh(); + end) + + -- Create find button + AuctionsItemText:Hide() + LeaPlusLC:CreateButton("FindAuctionButton", AuctionsStackSizeMaxButton, "Find Item", "CENTER", 0, 68, 0, 21, false, "") + LeaPlusCB["FindAuctionButton"]:SetParent(AuctionFrameAuctions) + + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalFindItemButton = LeaPlusCB["FindAuctionButton"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalFindItemButton) + end + + -- Show find button when the auctions tab is shown + AuctionFrameAuctions:HookScript("OnShow", function() + LeaPlusCB["FindAuctionButton"]:SetEnabled(GetAuctionSellItemInfo() and true or false) + end) + + -- Show find button when a new item is added + AuctionsItemButton:HookScript("OnEvent", function(self, event) + if event == "NEW_AUCTION_UPDATE" then + LeaPlusCB["FindAuctionButton"]:SetEnabled(GetAuctionSellItemInfo() and true or false) + end + end) + + LeaPlusCB["FindAuctionButton"]:SetScript("OnClick", function() + if GetAuctionSellItemInfo() then + if BrowseWowTokenResults:IsShown() then + -- Stop if Game Time filter is currently shown + AuctionFrameTab1:Click() + LeaPlusLC:Print("To use the Find Item button, you need to deselect the WoW Token category.") + else + -- Otherwise, search for the required item + local name = GetAuctionSellItemInfo() + BrowseName:SetText('"' .. name .. '"') + AuctionFrameBrowse_Search() -- Workaround for quoted search from QueryAuctionItems(name, 0, 0, 0, false, 0, false, true) + AuctionFrameTab1:Click() + end + end + end) + + -- Clear the cursor and reset editboxes when a new item replaces an existing one + hooksecurefunc("AuctionsFrameAuctions_ValidateAuction", function() + if GetAuctionSellItemInfo() then + -- Return anything you might be holding + ClearCursor(); + -- Set copper and silver prices to 99 if gold mode is on + if LeaPlusLC["AhGoldOnly"] == "On" then + StartPriceCopper:SetText("99") + StartPriceSilver:SetText("99") + BuyoutPriceCopper:SetText("99") + BuyoutPriceSilver:SetText("99") + end + end + end) + + -- Clear gold editbox after an auction has been created (to force user to enter something) + AuctionsCreateAuctionButton:HookScript("OnClick", function() + StartPriceGold:SetText("") + BuyoutPriceGold:SetText("") + end) + + -- Set tab key actions (if different from defaults) + StartPriceGold:HookScript("OnTabPressed", function() + if not IsShiftKeyDown() then + if LeaPlusLC["AhBuyoutOnly"] == "Off" and LeaPlusLC["AhGoldOnly"] == "On" then + BuyoutPriceGold:SetFocus() + end + end + end) + + BuyoutPriceGold:HookScript("OnTabPressed", function() + if IsShiftKeyDown() then + if LeaPlusLC["AhBuyoutOnly"] == "Off" and LeaPlusLC["AhGoldOnly"] == "On" then + StartPriceGold:SetFocus() + end + end + end) + end + + -- Run function when Blizzard addon is loaded + if IsAddOnLoaded("Blizzard_AuctionUI") then + AuctionFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_AuctionUI" then + AuctionFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Show volume control on character frame + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowVolume"] == "On" then + + -- Function to update master volume + local function MasterVolUpdate() + if LeaPlusLC["ShowVolume"] == "On" then + -- Set the volume + SetCVar("Sound_MasterVolume", LeaPlusLC["LeaPlusMaxVol"]); + -- Format the slider text + LeaPlusCB["LeaPlusMaxVol"].f:SetFormattedText("%.0f", LeaPlusLC["LeaPlusMaxVol"] * 20) + end + end + + -- Create slider control + LeaPlusLC["LeaPlusMaxVol"] = tonumber(GetCVar("Sound_MasterVolume")); + LeaPlusLC:MakeSL(CharacterModelFrame, "LeaPlusMaxVol", "", 0, 1, 0.05, -42, -328, "%.2f") + LeaPlusCB["LeaPlusMaxVol"]:SetWidth(64) + LeaPlusCB["LeaPlusMaxVol"].f:ClearAllPoints() + LeaPlusCB["LeaPlusMaxVol"].f:SetPoint("LEFT", LeaPlusCB["LeaPlusMaxVol"], "RIGHT", 6, 0) + + -- Set slider control value when shown + LeaPlusCB["LeaPlusMaxVol"]:SetScript("OnShow", function() + LeaPlusCB["LeaPlusMaxVol"]:SetValue(GetCVar("Sound_MasterVolume")) + end) + + -- Update volume when slider control is changed + LeaPlusCB["LeaPlusMaxVol"]:HookScript("OnValueChanged", function() + if IsMouseButtonDown("RightButton") and IsShiftKeyDown() then + -- Dual layout is active so don't adjust slider + LeaPlusCB["LeaPlusMaxVol"].f:SetFormattedText("%.0f", LeaPlusLC["LeaPlusMaxVol"] * 20) + LeaPlusCB["LeaPlusMaxVol"]:Hide() + LeaPlusCB["LeaPlusMaxVol"]:Show() + return + else + -- Set sound level and refresh slider + MasterVolUpdate() + end + end) + + -- ElvUI skin for slider control + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalVolumeButton = LeaPlusCB["LeaPlusMaxVol"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleSliderFrame(_G.LeaPlusGlobalVolumeButton, false) + end + + end + + ---------------------------------------------------------------------- + -- Use arrow keys in chat + ---------------------------------------------------------------------- + + if LeaPlusLC["UseArrowKeysInChat"] == "On" and not LeaLockList["UseArrowKeysInChat"] then + -- Enable arrow keys for normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i .. "EditBox"]:SetAltArrowKeyMode(false) + end + end + -- Enable arrow keys for temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf .. "EditBox"]:SetAltArrowKeyMode(false) + end + end) + end + + ---------------------------------------------------------------------- + -- L41: Manage buffs + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageBuffs"] == "On" and not LeaLockList["ManageBuffs"] then + + -- Allow buff frame to be moved + BuffFrame:SetMovable(true) + BuffFrame:SetUserPlaced(true) + BuffFrame:SetDontSavePosition(true) + BuffFrame:SetClampedToScreen(true) + + -- Set buff frame position at startup + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + ConsolidatedBuffs:SetScale(LeaPlusLC["BuffFrameScale"]) + + -- Set buff frame position when the game resets it + hooksecurefunc("UIParent_UpdateTopFramePositions", function() + BuffFrame:SetMovable(true) + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + end) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("TOPRIGHT", BuffFrame, "TOPRIGHT", 0, 2.5) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0 }}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["BuffFrameScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + -- dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Buffs"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + BuffFrame:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + BuffFrame:StopMovingOrSizing() + LeaPlusLC["BuffFrameA"], void, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"] = BuffFrame:GetPoint() + BuffFrame:SetMovable(true) + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = -190, 225 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local BuffPanel = LeaPlusLC:CreatePanel("Manage buffs", "BuffPanel") + + LeaPlusLC:MakeTx(BuffPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(BuffPanel, "BuffFrameScale", "Drag to set the buffs frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["BuffFrameScale"]:HookScript("OnValueChanged", function() + BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + ConsolidatedBuffs:SetScale(LeaPlusLC["BuffFrameScale"]) + dragframe:SetScale(LeaPlusLC["BuffFrameScale"]) + -- Show formatted slider value + LeaPlusCB["BuffFrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["BuffFrameScale"] * 100) + end) + + -- Hide frame alignment grid with panel + BuffPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local BuffsToggleGridButton = LeaPlusLC:CreateButton("BuffsToggleGridButton", BuffPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["BuffsToggleGridButton"]:ClearAllPoints() + LeaPlusCB["BuffsToggleGridButton"]:SetPoint("LEFT", BuffPanel.h, "RIGHT", 10, 0) + LeaPlusCB["BuffsToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + BuffPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + BuffPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + BuffPanel.b:SetScript("OnClick", function() + BuffPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + BuffPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["BuffFrameA"] = "TOPRIGHT" + LeaPlusLC["BuffFrameR"] = "TOPRIGHT" + LeaPlusLC["BuffFrameX"] = -205 + LeaPlusLC["BuffFrameY"] = -13 + LeaPlusLC["BuffFrameScale"] = 1 + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + + -- Refresh configuration panel + BuffPanel:Hide(); BuffPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageBuffsButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["BuffFrameA"] = "TOPRIGHT" + LeaPlusLC["BuffFrameR"] = "TOPRIGHT" + LeaPlusLC["BuffFrameX"] = -271 + LeaPlusLC["BuffFrameY"] = 0 + LeaPlusLC["BuffFrameScale"] = 0.80 + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + ConsolidatedBuffs:SetScale(LeaPlusLC["BuffFrameScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(280 * LeaPlusLC["gscale"]) + dragframe:SetHeight(225 * LeaPlusLC["gscale"]) + + -- Show configuration panel + BuffPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + BuffPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- L42: Manage frames + ---------------------------------------------------------------------- + + -- Frame Movement + if LeaPlusLC["FrmEnabled"] == "On" and not LeaLockList["FrmEnabled"] then + + -- Lock the player and target frames + PlayerFrame:RegisterForDrag() + TargetFrame:RegisterForDrag() + + -- Remove integrated movement functions to avoid conflicts + _G.PlayerFrame_ResetUserPlacedPosition = function() end + _G.TargetFrame_ResetUserPlacedPosition = function() end + _G.PlayerFrame_SetLocked = function() end + _G.TargetFrame_SetLocked = function() end + + -- Create frame table (used for local traversal) + local FrameTable = {DragPlayerFrame = PlayerFrame, DragTargetFrame = TargetFrame} + + -- Create main table structure in saved variables if it doesn't exist + if (LeaPlusDB["Frames"]) == nil then + LeaPlusDB["Frames"] = {} + end + + -- Create frame based table structure in saved variables if it doesn't exist and set initial scales + for k,v in pairs(FrameTable) do + local vf = v:GetName() + -- Create frame table structure if it doesn't exist + if not LeaPlusDB["Frames"][vf] then + LeaPlusDB["Frames"][vf] = {} + end + -- Set saved scale value to default if it doesn't exist + if not LeaPlusDB["Frames"][vf]["Scale"] then + LeaPlusDB["Frames"][vf]["Scale"] = 1.00 + end + -- Set frame scale to saved value + _G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + -- Don't save frame position + _G[vf]:SetMovable(true) + _G[vf]:SetUserPlaced(true) + _G[vf]:SetDontSavePosition(true) + end + + -- Set frames to manual values + local function LeaFramesSetPos(frame, point, parent, relative, xoff, yoff) + frame:SetMovable(true) + frame:ClearAllPoints() + frame:SetPoint(point, parent, relative, xoff, yoff) + end + + -- Set frames to default values + local function LeaPlusFramesDefaults() + LeaFramesSetPos(PlayerFrame , "TOPLEFT" , UIParent, "TOPLEFT" , -19, -4) + LeaFramesSetPos(TargetFrame , "TOPLEFT" , UIParent, "TOPLEFT" , 250, -4) + end + + -- Create configuration panel + local SideFrames = LeaPlusLC:CreatePanel("Manage frames", "SideFrames") + + -- Variable used to store currently selected frame + local currentframe + + -- Create scale title + LeaPlusLC:MakeTx(SideFrames, "Scale", 16, -72) + + -- Set initial slider value (will be changed when drag frames are selected) + LeaPlusLC["FrameScale"] = 1.00 + + -- Create scale slider + LeaPlusLC:MakeSL(SideFrames, "FrameScale", "Drag to set the scale of the selected frame.", 0.5, 3.0, 0.05, 16, -92, "%.2f") + LeaPlusCB["FrameScale"]:HookScript("OnValueChanged", function(self, value) + if currentframe then -- If a frame is selected + -- Set real and drag frame scale + LeaPlusDB["Frames"][currentframe]["Scale"] = value + _G[currentframe]:SetScale(LeaPlusDB["Frames"][currentframe]["Scale"]) + LeaPlusLC["Drag" .. currentframe]:SetScale(LeaPlusDB["Frames"][currentframe]["Scale"]) + -- If target frame scale is changed, also change combo point frame + if currentframe == "TargetFrame" then + ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + end + -- Set slider formatted text + LeaPlusCB["FrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FrameScale"] * 100) + end + end) + + -- Set initial scale slider state and value + LeaPlusCB["FrameScale"]:HookScript("OnShow", function() + if not currentframe then + -- No frame selected so select the player frame + currentframe = PlayerFrame:GetName() + -- LeaPlusLC["DragPlayerFrame"].t:SetColorTexture(0.0, 1.0, 0.0,0.5) + end + -- Set the scale slider value to the selected frame + LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]) + -- Set slider formatted text + LeaPlusCB["FrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FrameScale"] * 100) + end) + + -- Hide frame alignment grid with panel + SideFrames:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local FramesToggleGridButton = LeaPlusLC:CreateButton("FramesToggleGridButton", SideFrames, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["FramesToggleGridButton"]:ClearAllPoints() + LeaPlusCB["FramesToggleGridButton"]:SetPoint("LEFT", SideFrames.h, "RIGHT", 10, 0) + LeaPlusCB["FramesToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + SideFrames:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + SideFrames.h.tiptext = L["Drag the frame overlays with the left button to position them freely or with the right button to position them using snap-to-grid.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] + + -- Back button handler + SideFrames.b:SetScript("OnClick", function() + -- Hide outer control frame + SideFrames:Hide() + -- Hide drag frames + for k, void in pairs(FrameTable) do + LeaPlusLC[k]:Hide() + end + -- Show options panel at frame section + LeaPlusLC["PageF"]:Show() + LeaPlusLC["Page6"]:Show() + end) + + -- Reset button handler + SideFrames.r:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + -- If player is in combat, print error and stop + return + else + -- Set frames to default positions (presets) + LeaPlusFramesDefaults() + for k,v in pairs(FrameTable) do + local vf = v:GetName() + -- Store frame locations + LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = _G[vf]:GetPoint() + -- Reset real frame scales and save them + LeaPlusDB["Frames"][vf]["Scale"] = 1.00 + _G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + -- Reset drag frame scales + LeaPlusLC[k]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + end + -- Set combo frame scale to match target frame scale + ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + -- Set the scale slider value to the selected frame scale + LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]) + -- Refresh the panel + SideFrames:Hide(); SideFrames:Show() + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Show drag frames with configuration panel + SideFrames:HookScript("OnShow", function() + for k, void in pairs(FrameTable) do + LeaPlusLC[k]:Show() + end + end) + SideFrames:HookScript("OnHide", function() + for k, void in pairs(FrameTable) do + LeaPlusLC[k]:Hide() + end + end) + + -- Save frame positions + local function SaveAllFrames(DoNotSetPoint) + for k, v in pairs(FrameTable) do + local vf = v:GetName() + -- Stop real frames from moving + v:StopMovingOrSizing() + -- Save frame positions + LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = v:GetPoint() + if not DoNotSetPoint then + v:SetMovable(true) + v:ClearAllPoints() + v:SetPoint(LeaPlusDB["Frames"][vf]["Point"], UIParent, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"]) + end + end + end + + -- Prevent changes during combat + SideFrames:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + -- Hide controls frame + SideFrames:Hide() + -- Hide drag frames + for k,void in pairs(FrameTable) do + LeaPlusLC[k]:Hide() + end + -- Save frame positions without setpoint + SaveAllFrames(true) + end + end) + + -- Create drag frames + local function LeaPlusMakeDrag(dragframe,realframe) + + local dragframe = CreateFrame("Frame", nil, nil) + LeaPlusLC[dragframe] = dragframe + dragframe:SetSize(realframe:GetSize()) + dragframe:SetPoint("TOP", realframe, "TOP", 0, 2.5) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({ + edgeFile = "Interface/Tooltips/UI-Tooltip-Border", + tile = false, tileSize = 0, edgeSize = 16, + insets = { left = 0, right = 0, top = 0, bottom = 0 }}) + dragframe:SetToplevel(true) + dragframe:SetFrameStrata("HIGH") + + -- Set frame clamps + realframe:SetClampedToScreen(false) + + -- Hide the drag frame and make real frame movable + dragframe:Hide() + realframe:SetMovable(true) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + + -- Start dragging if left clicked + if btn == "LeftButton" then + realframe:SetMovable(true) + realframe:StartMoving() + end + + -- Set all drag frames to blue then tint the selected frame to green + for k,v in pairs(FrameTable) do + -- LeaPlusLC[k].t:SetColorTexture(0.0, 0.5, 1.0, 0.5) + end + -- dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5) + + -- Set currentframe variable to selected frame and set the scale slider value + currentframe = realframe:GetName() + LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]) + + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + SaveAllFrames() + end) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + -- dragframe.t:SetColorTexture(0.0, 0.5, 1.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + + -- Add titles + if realframe:GetName() == "PlayerFrame" then dragframe.f:SetText(L["Player"]) end + if realframe:GetName() == "TargetFrame" then dragframe.f:SetText(L["Target"]) end + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = frame:GetWidth(), frame:GetHeight() + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + realframe:ClearAllPoints() + realframe:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Return frame + return LeaPlusLC[dragframe] + + end + + for k,v in pairs(FrameTable) do + LeaPlusLC[k] = LeaPlusMakeDrag(k,v) + end + + -- Set frame scales + for k,v in pairs(FrameTable) do + local vf = v:GetName() + _G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + LeaPlusLC[k]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + end + ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + + -- Load defaults first then overwrite with saved values if they exist + LeaPlusFramesDefaults() + if LeaPlusDB["Frames"] then + for k,v in pairs(FrameTable) do + local vf = v:GetName() + if LeaPlusDB["Frames"][vf] then + if LeaPlusDB["Frames"][vf]["Point"] and LeaPlusDB["Frames"][vf]["Relative"] and LeaPlusDB["Frames"][vf]["XOffset"] and LeaPlusDB["Frames"][vf]["YOffset"] then + _G[vf]:SetMovable(true) + _G[vf]:ClearAllPoints() + _G[vf]:SetPoint(LeaPlusDB["Frames"][vf]["Point"], UIParent, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"]) + end + end + end + end + + -- Add move button + LeaPlusCB["MoveFramesButton"]:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaFramesSetPos(PlayerFrame , "TOPLEFT" , UIParent, "TOPLEFT" , "-35" , "-14") + LeaFramesSetPos(TargetFrame , "TOPLEFT" , UIParent, "TOPLEFT" , "190" , "-14") + -- Player + LeaPlusDB["Frames"]["PlayerFrame"]["Scale"] = 1.20 + PlayerFrame:SetScale(LeaPlusDB["Frames"]["PlayerFrame"]["Scale"]) + LeaPlusLC["DragPlayerFrame"]:SetScale(LeaPlusDB["Frames"]["PlayerFrame"]["Scale"]) + -- Target + LeaPlusDB["Frames"]["TargetFrame"]["Scale"] = 1.20 + TargetFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + LeaPlusLC["DragTargetFrame"]:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + -- Set the slider to the selected frame (if there is one) + if currentframe then LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]); end + -- Save locations + for k,v in pairs(FrameTable) do + local vf = v:GetName() + LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = _G[vf]:GetPoint() + end + else + -- Show mover frame + SideFrames:Show() + LeaPlusLC:HideFrames() + + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set all scaled sizes + for k,v in pairs(FrameTable) do + LeaPlusLC[k]:SetWidth(v:GetWidth() * LeaPlusLC["gscale"]) + LeaPlusLC[k]:SetHeight(v:GetHeight() * LeaPlusLC["gscale"]) + end + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end + end) + + end + + ---------------------------------------------------------------------- + -- L43: Manage widget + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageWidget"] == "On" and not LeaLockList["ManageWidget"] then + + -- Create and manage container for UIWidgetTopCenterContainerFrame + local topCenterHolder = CreateFrame("Frame", nil, UIParent) + topCenterHolder:SetPoint("TOP", UIParent, "TOP", 0, -15) + topCenterHolder:SetSize(10, 58) + + local topCenterContainer = _G.UIWidgetTopCenterContainerFrame + topCenterContainer:ClearAllPoints() + topCenterContainer:SetPoint('CENTER', topCenterHolder) + + hooksecurefunc(topCenterContainer, 'SetPoint', function(self, void, b) + if b and (b ~= topCenterHolder) then + -- Reset parent if it changes from topCenterHolder + self:ClearAllPoints() + self:SetPoint('CENTER', topCenterHolder) + self:SetParent(topCenterHolder) + end + end) + + -- Allow widget frame to be moved + topCenterHolder:SetMovable(true) + topCenterHolder:SetUserPlaced(true) + topCenterHolder:SetDontSavePosition(true) + topCenterHolder:SetClampedToScreen(false) + + -- Set widget frame position at startup + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + topCenterHolder:SetScale(LeaPlusLC["WidgetScale"]) + UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("CENTER", topCenterHolder, "CENTER", 0, 1) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["WidgetScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + -- dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Widget"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + topCenterHolder:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame position + topCenterHolder:StopMovingOrSizing() + LeaPlusLC["WidgetA"], void, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"] = topCenterHolder:GetPoint() + topCenterHolder:SetMovable(true) + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 0, 60 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local WidgetPanel = LeaPlusLC:CreatePanel("Manage widget", "WidgetPanel") + + -- Create Titan Panel screen adjust warning + local titanFrame = CreateFrame("FRAME", nil, WidgetPanel) + titanFrame:SetAllPoints() + titanFrame:Hide() + LeaPlusLC:MakeTx(titanFrame, "Warning", 16, -172) + titanFrame.txt = LeaPlusLC:MakeWD(titanFrame, "Titan Panel screen adjust needs to be disabled for the frame to be saved correctly.", 16, -192, 500) + titanFrame.txt:SetWordWrap(false) + titanFrame.txt:SetWidth(520) + titanFrame.btn = LeaPlusLC:CreateButton("fixTitanBtn", titanFrame, "Okay, disable screen adjust for me", "TOPLEFT", 16, -212, 0, 25, true, "Click to disable Titan Panel screen adjust. Your UI will be reloaded.") + titanFrame.btn:SetScript("OnClick", function() + TitanPanelSetVar("ScreenAdjust", 1) + ReloadUI() + end) + + LeaPlusLC:MakeTx(WidgetPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(WidgetPanel, "WidgetScale", "Drag to set the widget scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["WidgetScale"]:HookScript("OnValueChanged", function() + topCenterHolder:SetScale(LeaPlusLC["WidgetScale"]) + UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"]) + dragframe:SetScale(LeaPlusLC["WidgetScale"]) + -- Show formatted slider value + LeaPlusCB["WidgetScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["WidgetScale"] * 100) + end) + + -- Hide frame alignment grid with panel + WidgetPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local WidgetToggleGridButton = LeaPlusLC:CreateButton("WidgetToggleGridButton", WidgetPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["WidgetToggleGridButton"]:ClearAllPoints() + LeaPlusCB["WidgetToggleGridButton"]:SetPoint("LEFT", WidgetPanel.h, "RIGHT", 10, 0) + LeaPlusCB["WidgetToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + WidgetPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + WidgetPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + WidgetPanel.b:SetScript("OnClick", function() + WidgetPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + WidgetPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["WidgetA"] = "TOP" + LeaPlusLC["WidgetR"] = "TOP" + LeaPlusLC["WidgetX"] = 0 + LeaPlusLC["WidgetY"] = -15 + LeaPlusLC["WidgetScale"] = 1 + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + + -- Refresh configuration panel + WidgetPanel:Hide(); WidgetPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageWidgetButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["WidgetA"] = "CENTER" + LeaPlusLC["WidgetR"] = "CENTER" + LeaPlusLC["WidgetX"] = 0 + LeaPlusLC["WidgetY"] = -160 + LeaPlusLC["WidgetScale"] = 1.25 + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + topCenterHolder:SetScale(LeaPlusLC["WidgetScale"]) + UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"]) + else + -- Show Titan Panel screen adjust warning if Titan Panel is installed with screen adjust enabled + if select(2, GetAddOnInfo("TitanClassic")) then + if IsAddOnLoaded("TitanClassic") then + if TitanPanelSetVar and TitanPanelGetVar then + if not TitanPanelGetVar("ScreenAdjust") then + titanFrame:Show() + end + end + end + end + + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(160 * LeaPlusLC["gscale"]) + dragframe:SetHeight(79 * LeaPlusLC["gscale"]) + + -- Show configuration panel + WidgetPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + WidgetPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- L44: Manage focus + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageFocus"] == "On" and not LeaLockList["ManageFocus"] then + + -- Remove integrated movement function to avoid conflicts + _G.FocusFrame_SetLock = function() end + _G.FocusFrame.SetSmallSize = function() end + + -- Allow focus frame to be moved + FocusFrame:SetMovable(true) + FocusFrame:SetUserPlaced(true) + FocusFrame:SetDontSavePosition(true) + FocusFrame:SetClampedToScreen(true) + + -- Set focus frame position at startup + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + FocusFrame:SetScale(LeaPlusLC["FocusScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["FocusScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + -- dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Focus"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + FocusFrame:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + FocusFrame:StopMovingOrSizing() + LeaPlusLC["FocusA"], void, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"] = FocusFrame:GetPoint() + FocusFrame:SetMovable(true) + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 196, 86 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local FocusPanel = LeaPlusLC:CreatePanel("Manage focus", "FocusPanel") + LeaPlusLC:MakeTx(FocusPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(FocusPanel, "FocusScale", "Drag to set the focus frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Hide panel during combat + FocusPanel:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + FocusFrame:StopMovingOrSizing() + FocusPanel:Hide() + end + end) + + -- Set scale when slider is changed + LeaPlusCB["FocusScale"]:HookScript("OnValueChanged", function() + FocusFrame:SetScale(LeaPlusLC["FocusScale"]) + dragframe:SetScale(LeaPlusLC["FocusScale"]) + -- Show formatted slider value + LeaPlusCB["FocusScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FocusScale"] * 100) + end) + + -- Hide frame alignment grid with panel + FocusPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local WidgetToggleGridButton = LeaPlusLC:CreateButton("FocusToggleGridButton", FocusPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["FocusToggleGridButton"]:ClearAllPoints() + LeaPlusCB["FocusToggleGridButton"]:SetPoint("LEFT", FocusPanel.h, "RIGHT", 10, 0) + LeaPlusCB["FocusToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + FocusPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + FocusPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid.|n|nThis panel will close automatically if you enter combat."] + + -- Back button handler + FocusPanel.b:SetScript("OnClick", function() + FocusPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + FocusPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["FocusA"] = "CENTER" + LeaPlusLC["FocusR"] = "CENTER" + LeaPlusLC["FocusX"] = 0 + LeaPlusLC["FocusY"] = 0 + LeaPlusLC["FocusScale"] = 1 + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + + -- Refresh configuration panel + FocusPanel:Hide(); FocusPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageFocusButton"]:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["FocusA"] = "TOPLEFT" + LeaPlusLC["FocusR"] = "TOPLEFT" + LeaPlusLC["FocusX"] = 250 + LeaPlusLC["FocusY"] = -240 + LeaPlusLC["FocusScale"] = 1.00 + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + FocusFrame:SetScale(LeaPlusLC["FocusScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size and position according to UI scale + dragframe:SetWidth(196 * LeaPlusLC["gscale"]) + dragframe:SetHeight(76 * LeaPlusLC["gscale"]) + dragframe:ClearAllPoints() + dragframe:SetPoint("CENTER", FocusFrame, "CENTER", -18 * LeaPlusLC["gscale"], 6 * LeaPlusLC["gscale"]) + + -- Show configuration panel + FocusPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end + end) + + -- Hide drag frame when configuration panel is closed + FocusPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Hide chat buttons + ---------------------------------------------------------------------- + + if LeaPlusLC["NoChatButtons"] == "On" and not LeaLockList["NoChatButtons"] then + + -- Create hidden frame to store unwanted frames (more efficient than creating functions) + local tframe = CreateFrame("FRAME") + tframe:Hide() + + -- Function to enable mouse scrolling with CTRL and SHIFT key modifiers + local function AddMouseScroll(chtfrm) + if _G[chtfrm] then + _G[chtfrm]:SetScript("OnMouseWheel", function(self, direction) + if direction == 1 then + if IsControlKeyDown() then + self:ScrollToTop() + elseif IsShiftKeyDown() then + self:PageUp() + else + self:ScrollUp() + end + else + if IsControlKeyDown() then + self:ScrollToBottom() + elseif IsShiftKeyDown() then + self:PageDown() + else + self:ScrollDown() + end + end + end) + _G[chtfrm]:EnableMouseWheel(true) + end + end + + -- Function to hide chat buttons + local function HideButtons(chtfrm) + _G[chtfrm .. "ButtonFrameUpButton"]:SetParent(tframe) + _G[chtfrm .. "ButtonFrameDownButton"]:SetParent(tframe) + _G[chtfrm .. "ButtonFrameMinimizeButton"]:SetParent(tframe) + _G[chtfrm .. "ButtonFrameUpButton"]:Hide(); + _G[chtfrm .. "ButtonFrameDownButton"]:Hide(); + _G[chtfrm .. "ButtonFrameMinimizeButton"]:Hide(); + _G[chtfrm .. "ButtonFrame"]:SetSize(0.1,0.1) + end + + -- Function to highlight chat tabs and click to scroll to bottom + local function HighlightTabs(chtfrm) + + -- Hide bottom button + _G[chtfrm .. "ButtonFrameBottomButton"]:SetSize(0.1, 0.1) -- Positions it away + + -- Remove click from the bottom button + _G[chtfrm .. "ButtonFrameBottomButton"]:SetScript("OnClick", nil) + + -- Remove textures + _G[chtfrm .. "ButtonFrameBottomButton"]:SetNormalTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetHighlightTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetPushedTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetDisabledTexture("") + + -- Resize bottom button according to tab size + _G[chtfrm .. "Tab"]:SetScript("OnSizeChanged", function() + for j = 1, 50 do + -- Resize bottom button to tab width + if _G["ChatFrame" .. j .. "ButtonFrameBottomButton"] then + _G["ChatFrame" .. j .. "ButtonFrameBottomButton"]:SetWidth(_G["ChatFrame" .. j .. "Tab"]:GetWidth()-10) + end + end + -- If combat log is hidden, resize it's bottom button + if LeaPlusLC["NoCombatLogTab"] == "On" and not LeaLockList["NoCombatLogTab"] then + if _G["ChatFrame2ButtonFrameBottomButton"] then + -- Resize combat log bottom button + _G["ChatFrame2ButtonFrameBottomButton"]:SetWidth(0.1); + end + end + end) + + -- Remove click from the bottom button + _G[chtfrm .. "ButtonFrameBottomButton"]:SetScript("OnClick", nil) + + -- Remove textures + _G[chtfrm .. "ButtonFrameBottomButton"]:SetNormalTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetHighlightTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetPushedTexture("") + + -- Always scroll to bottom when clicking a tab + _G[chtfrm .. "Tab"]:HookScript("OnClick", function(self,arg1) + if arg1 == "LeftButton" then + _G[chtfrm]:ScrollToBottom(); + end + end) + + -- Create new bottom button under tab + _G[chtfrm .. "Tab"].newglow = _G[chtfrm .. "Tab"]:CreateTexture(nil, "BACKGROUND") + _G[chtfrm .. "Tab"].newglow:ClearAllPoints() + _G[chtfrm .. "Tab"].newglow:SetPoint("BOTTOMLEFT", _G[chtfrm .. "Tab"], "BOTTOMLEFT", 0, 0) + _G[chtfrm .. "Tab"].newglow:SetTexture("Interface\\ChatFrame\\ChatFrameTab-NewMessage") + _G[chtfrm .. "Tab"].newglow:SetWidth(_G[chtfrm .. "Tab"]:GetWidth()) + _G[chtfrm .. "Tab"].newglow:SetVertexColor(0.6, 0.6, 1, 1) + _G[chtfrm .. "Tab"].newglow:Hide() + + -- Show new bottom button when old one glows + _G[chtfrm .. "ButtonFrameBottomButtonFlash"]:HookScript("OnShow", function(self,arg1) + _G[chtfrm .. "Tab"].newglow:Show() + end) + + _G[chtfrm .. "ButtonFrameBottomButtonFlash"]:HookScript("OnHide", function(self,arg1) + _G[chtfrm .. "Tab"].newglow:Hide() + end) + + -- Match new bottom button size to tab + _G[chtfrm .. "Tab"]:HookScript("OnSizeChanged", function() + _G[chtfrm .. "Tab"].newglow:SetWidth(_G[chtfrm .. "Tab"]:GetWidth()) + end) + + end + + -- Hide chat menu buttons + ChatFrameMenuButton:SetParent(tframe) + ChatFrameChannelButton:SetParent(tframe) + + -- Set options for normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + AddMouseScroll("ChatFrame" .. i); + HideButtons("ChatFrame" .. i); + HighlightTabs("ChatFrame" .. i) + end + end + + -- Do the functions above for temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function(chatType) + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + -- Set options for temporary frame + AddMouseScroll(cf) + HideButtons(cf) + HighlightTabs(cf) + -- Resize flashing alert to match tab width + _G[cf .. "Tab"]:SetScript("OnSizeChanged", function() + _G[cf .. "ButtonFrameBottomButton"]:SetWidth(_G[cf .. "Tab"]:GetWidth()-10) + end) + end + end) + + -- Hide text to speech button + TextToSpeechButton:SetParent(tframe) + + end + + ---------------------------------------------------------------------- + -- Recent chat window + ---------------------------------------------------------------------- + + if LeaPlusLC["RecentChatWindow"] == "On" and not LeaLockList["RecentChatWindow"] then + + -- Create recent chat frame + local editFrame = CreateFrame("ScrollFrame", nil, UIParent, "InputScrollFrameTemplate") + + -- Set frame parameters + editFrame:ClearAllPoints() + editFrame:SetPoint("BOTTOM", 0, 130) + editFrame:SetSize(600, LeaPlusLC["RecentChatSize"]) + editFrame:SetFrameStrata("MEDIUM") + editFrame:SetToplevel(true) + editFrame:Hide() + editFrame.CharCount:Hide() + + -- Add background color + editFrame.t = editFrame:CreateTexture(nil, "BACKGROUND") + editFrame.t:SetAllPoints() + -- editFrame.t:SetColorTexture(0.00, 0.00, 0.0, 0.6) + + -- Set textures + editFrame.LeftTex:SetTexture(editFrame.RightTex:GetTexture()); editFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + editFrame.BottomTex:SetTexture(editFrame.TopTex:GetTexture()); editFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomRightTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + editFrame.TopLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Create title bar + local titleFrame = CreateFrame("ScrollFrame", nil, editFrame, "InputScrollFrameTemplate") + titleFrame:ClearAllPoints() + titleFrame:SetPoint("TOP", 0, 32) + titleFrame:SetSize(600, 24) + titleFrame:SetFrameStrata("MEDIUM") + titleFrame:SetToplevel(true) + titleFrame:SetHitRectInsets(-6, -6, -6, -6) + titleFrame.CharCount:Hide() + titleFrame.t = titleFrame:CreateTexture(nil, "BACKGROUND") + titleFrame.t:SetAllPoints() + -- titleFrame.t:SetColorTexture(0.00, 0.00, 0.0, 0.6) + titleFrame.LeftTex:SetTexture(titleFrame.RightTex:GetTexture()); titleFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + titleFrame.BottomTex:SetTexture(titleFrame.TopTex:GetTexture()); titleFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomRightTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + titleFrame.TopLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Add message count + titleFrame.m = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.m:SetPoint("LEFT", 4, 0) + titleFrame.m:SetText(L["Messages"] .. ": 0") + titleFrame.m:SetFont(titleFrame.m:GetFont(), 16, nil) + + -- Add right-click to close message + titleFrame.x = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.x:SetPoint("RIGHT", -4, 0) + titleFrame.x:SetText(L["Drag to size"] .. " | " .. L["Right-click to close"]) + titleFrame.x:SetFont(titleFrame.x:GetFont(), 16, nil) + titleFrame.x:SetWidth(600 - titleFrame.m:GetStringWidth() - 30) + titleFrame.x:SetWordWrap(false) + titleFrame.x:SetJustifyH("RIGHT") + + local titleBox = titleFrame.EditBox + titleBox:Hide() + titleBox:SetEnabled(false) + + -- Drag to resize + editFrame:SetResizable(true) + editFrame:SetResizeBounds(600, 170, 600, 560) + + titleFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + editFrame:StartSizing("TOP") + end + end) + titleFrame:HookScript("OnMouseUp", function(self, btn) + if btn == "LeftButton" then + editFrame:StopMovingOrSizing() + LeaPlusLC["RecentChatSize"] = editFrame:GetHeight() + elseif btn == "MiddleButton" then + -- Reset frame size + LeaPlusLC["RecentChatSize"] = 170 + editFrame:SetSize(600, LeaPlusLC["RecentChatSize"]) + editFrame:ClearAllPoints() + editFrame:SetPoint("BOTTOM", 0, 130) + end + end) + + -- Create editbox + local editBox = editFrame.EditBox + editBox:SetAltArrowKeyMode(false) + editBox:SetTextInsets(4, 4, 4, 4) + editBox:SetWidth(editFrame:GetWidth() - 30) + editBox:SetSecurityDisablePaste() + editBox:SetMaxLetters(0) + + -- Manage focus + editBox:HookScript("OnEditFocusLost", function() + if MouseIsOver(titleFrame) and IsMouseButtonDown("LeftButton") then + editBox:SetFocus() + end + end) + + -- Close frame with right-click of editframe or editbox + local function CloseRecentChatWindow() + editBox:SetText("") + editBox:ClearFocus() + editFrame:Hide() + end + + editFrame:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then CloseRecentChatWindow() end + end) + + editBox:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then CloseRecentChatWindow() end + end) + + titleFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then CloseRecentChatWindow() end + end) + + -- Disable text changes while still allowing editing controls to work + editBox:EnableKeyboard(false) + editBox:SetScript("OnKeyDown", function() end) + + --- Clear highlighted text if escape key is pressed + editBox:HookScript("OnEscapePressed", function() + editBox:HighlightText(0, 0) + editBox:ClearFocus() + end) + + -- Clear highlighted text and clear focus if enter key is pressed + editBox:SetScript("OnEnterPressed", function() + editBox:HighlightText(0, 0) + editBox:ClearFocus() + end) + + -- Populate recent chat frame with chat messages + local function ShowChatbox(chtfrm) + editBox:SetText("") + local NumMsg = chtfrm:GetNumMessages() + local StartMsg = 1 + if NumMsg > 128 then StartMsg = NumMsg - 127 end + local totalMsgCount = 0 + for iMsg = StartMsg, NumMsg do + local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg) + if chatMessage then + + -- Handle Battle.net messages + if string.match(chatMessage, "k:(%d+):(%d+):BN_WHISPER:") + or string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_ALERT:") + or string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_BROADCAST:") + then + local ctype + if string.match(chatMessage, "k:(%d+):(%d+):BN_WHISPER:") then + ctype = "BN_WHISPER" + elseif string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_ALERT:") then + ctype = "BN_INLINE_TOAST_ALERT" + elseif string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_BROADCAST:") then + ctype = "BN_INLINE_TOAST_BROADCAST" + end + local id = tonumber(string.match(chatMessage, "k:(%d+):%d+:" .. ctype .. ":")) + local totalBNFriends = BNGetNumFriends() + for friendIndex = 1, totalBNFriends do + local bnetAccountID, void, battleTag = BNGetFriendInfo(friendIndex) + if id == bnetAccountID then + battleTag = strsplit("#", battleTag) + chatMessage = chatMessage:gsub("(|HBNplayer%S-|k)(%d-)(:%S-" .. ctype .. "%S-|h)%[(%S-)%](|?h?)(:?)", "[" .. battleTag .. "]:") + end + end + end + + -- Handle colors + if r and g and b then + local colorCode = RGBToColorCode(r, g, b) + chatMessage = colorCode .. chatMessage + end + + chatMessage = gsub(chatMessage, "|T.-|t", "") -- Remove textures + chatMessage = gsub(chatMessage, "|A.-|a", "") -- Remove atlases + editBox:Insert(chatMessage .. "|r|n") + + end + totalMsgCount = totalMsgCount + 1 + end + titleFrame.m:SetText(L["Messages"] .. ": " .. totalMsgCount) + editFrame:SetVerticalScroll(0) + LibCompat.After(0.1, function() editFrame.ScrollBar.ScrollDownButton:Click() end) + editFrame:Show() + editBox:ClearFocus() + end + + -- Hook normal chat frame tab clicks + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i .. "Tab"]:HookScript("OnClick", function() + if IsControlKeyDown() then + editBox:SetFont(_G["ChatFrame" .. i]:GetFont()) + ShowChatbox(_G["ChatFrame" .. i]) + end + end) + end + end + + -- Hook temporary chat frame tab clicks + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf .. "Tab"]:HookScript("OnClick", function() + if IsControlKeyDown() then + editBox:SetFont(_G[cf]:GetFont()) + ShowChatbox(_G[cf]) + end + end) + end + end) + + end + + ---------------------------------------------------------------------- + -- Show cooldowns + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowCooldowns"] == "On" then + + -- Create main table structure in saved variables if it doesn't exist + if LeaPlusDB["Cooldowns"] == nil then + LeaPlusDB["Cooldowns"] = {} + end + + -- Create class tables if they don't exist + local classList = {"WARRIOR", "PALADIN", "HUNTER", "SHAMAN", "ROGUE", "DRUID", "MAGE", "WARLOCK", "PRIEST", "DEATHKNIGHT"} + for index = 1, #classList do + if LeaPlusDB["Cooldowns"][classList[index]] == nil then + LeaPlusDB["Cooldowns"][classList[index]] = {} + end + end + + -- Get current class + local PlayerClass = select(2, UnitClass("player")) + local activeSpec = 1 -- Fixed to 1 for Classic + + -- Create local tables to store cooldown frames and editboxes + local icon = {} -- Used to store cooldown frames + local SpellEB = {} -- Used to store editbox values + local iCount = 5 -- Number of cooldowns + + -- Create cooldown frames + for i = 1, iCount do + + -- Create cooldown frame + icon[i] = CreateFrame("Frame", nil, UIParent) + icon[i]:SetFrameStrata("BACKGROUND") + icon[i]:SetWidth(20) + icon[i]:SetHeight(20) + + -- Create cooldown icon + icon[i].c = CreateFrame("Cooldown", nil, icon[i], "CooldownFrameTemplate") + icon[i].c:SetAllPoints() + icon[i].c:SetReverse(true) + + -- Create blank texture (will be assigned a cooldown texture later) + icon[i].t = icon[i]:CreateTexture(nil,"BACKGROUND") + icon[i].t:SetAllPoints() + + -- Show icon above target frame and set initial scale + icon[i]:ClearAllPoints() + icon[i]:SetPoint("TOPLEFT", TargetFrame, "TOPLEFT", 6 + (22 * (i - 1)), 5) + icon[i]:SetScale(TargetFrame:GetScale()) + + -- Show tooltip + icon[i]:SetScript("OnEnter", function(self) + GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT", 15, -25) + GameTooltip:SetText(GetSpellInfo(LeaPlusCB["Spell" .. i]:GetText())) + end) + + -- Hide tooltip + icon[i]:SetScript("OnLeave", GameTooltip_Hide) + + end + + -- Change cooldown icon scale when player frame scale changes + PlayerFrame:HookScript("OnSizeChanged", function() + if LeaPlusLC["CooldownsOnPlayer"] == "On" then + for i = 1, iCount do + icon[i]:SetScale(PlayerFrame:GetScale()) + end + end + end) + + -- Change cooldown icon scale when target frame scale changes + TargetFrame:HookScript("OnSizeChanged", function() + if LeaPlusLC["CooldownsOnPlayer"] == "Off" then + for i = 1, iCount do + icon[i]:SetScale(TargetFrame:GetScale()) + end + end + end) + + -- Function to show cooldown textures in the cooldown frames (run when icons are loaded or changed) + local function ShowIcon(i, id, owner) + + local void + + -- Get spell information + local spell, void, path = GetSpellInfo(id) + if spell and path then + + -- Set icon texture to the spell texture + icon[i].t:SetTexture(path) + + -- Set top level and raise frame strata (ensures tooltips show properly) + icon[i]:SetToplevel(true) + icon[i]:SetFrameStrata("LOW") + + -- Handle events + icon[i]:RegisterUnitEvent("UNIT_AURA", owner) + icon[i]:RegisterUnitEvent("UNIT_PET", "player") + icon[i]:SetScript("OnEvent", function(self, event, arg1) + + -- If pet was dismissed (or otherwise disappears such as when flying), hide pet cooldowns + if event == "UNIT_PET" then + if not UnitExists("pet") then + if LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] then + icon[i]:Hide() + end + end + + -- Ensure cooldown belongs to the owner we are watching (player or pet) + elseif arg1 == owner then + + -- Hide the cooldown frame (required for cooldowns to disappear after the duration) + icon[i]:Hide() + + -- If buff matches cooldown we want, start the cooldown + for q = 1, 40 do + local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff(owner, q) + if spellID and id == spellID then + icon[i]:Show() + local start = expire - length + CooldownFrame_Set(icon[i].c, start, length, 1) + end + end + + end + end) + + else + + -- Spell does not exist so stop watching it + icon[i]:SetScript("OnEvent", nil) + icon[i]:Hide() + + end + + end + + -- Create configuration panel + local CooldownPanel = LeaPlusLC:CreatePanel("Show cooldowns", "CooldownPanel") + + -- Function to refresh the editbox tooltip with the spell name + local function RefSpellTip(self,elapsed) + local spellinfo, void, icon = GetSpellInfo(self:GetText()) + if spellinfo and spellinfo ~= "" and icon and icon ~= "" then + GameTooltip:SetOwner(self, "ANCHOR_NONE") + GameTooltip:ClearAllPoints() + GameTooltip:SetPoint("RIGHT", self, "LEFT", -10, 0) + GameTooltip:SetText("|T" .. icon .. ":0|t " .. spellinfo, nil, nil, nil, nil, true) + else + GameTooltip:Hide() + end + end + + -- Function to create spell ID editboxes and pet checkboxes + local function MakeSpellEB(num, x, y, tab, shifttab) + + -- Create editbox for spell ID + SpellEB[num] = LeaPlusLC:CreateEditBox("Spell" .. num, CooldownPanel, 70, 6, "TOPLEFT", x, y - 20, "Spell" .. tab, "Spell" .. shifttab) + SpellEB[num]:SetNumeric(true) + + -- Set initial value (for current spec) + SpellEB[num]:SetText(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. num .. "Idn"] or "") + + -- Refresh tooltip when mouse is hovering over the editbox + SpellEB[num]:SetScript("OnEnter", function() + SpellEB[num]:SetScript("OnUpdate", RefSpellTip) + end) + SpellEB[num]:SetScript("OnLeave", function() + SpellEB[num]:SetScript("OnUpdate", nil) + GameTooltip:Hide() + end) + + -- Create checkbox for pet cooldown + LeaPlusLC:MakeCB(CooldownPanel, "Spell" .. num .."Pet", "", 462, y - 20, false, "") + LeaPlusCB["Spell" .. num .."Pet"]:SetHitRectInsets(0, 0, 0, 0) + + end + + -- Add titles + LeaPlusLC:MakeTx(CooldownPanel, "Spell ID", 384, -92) + LeaPlusLC:MakeTx(CooldownPanel, "Pet", 462, -92) + + -- Add editboxes and checkboxes + MakeSpellEB(1, 386, -92, "2", "5") + MakeSpellEB(2, 386, -122, "3", "1") + MakeSpellEB(3, 386, -152, "4", "2") + MakeSpellEB(4, 386, -182, "5", "3") + MakeSpellEB(5, 386, -212, "1", "4") + + -- Add checkboxes + LeaPlusLC:MakeTx(CooldownPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(CooldownPanel, "ShowCooldownID", "Show the spell ID in buff icon tooltips", 16, -92, false, "If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."); + LeaPlusLC:MakeCB(CooldownPanel, "NoCooldownDuration", "Hide cooldown duration numbers (if enabled)", 16, -112, false, "If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu).") + LeaPlusLC:MakeCB(CooldownPanel, "CooldownsOnPlayer", "Show cooldowns above the player frame", 16, -132, false, "If checked, cooldown icons will be shown above the player frame instead of the target frame.|n|nIf unchecked, cooldown icons will be shown above the target frame.") + + -- Function to save the panel control settings and refresh the cooldown icons + local function SavePanelControls() + for i = 1, iCount do + + -- Refresh the cooldown texture + icon[i].c:SetCooldown(0,0) + + -- Show icons above target or player frame + icon[i]:ClearAllPoints() + if LeaPlusLC["CooldownsOnPlayer"] == "On" then + icon[i]:SetPoint("TOPLEFT", PlayerFrame, "TOPLEFT", 116 + (22 * (i - 1)), 5) + icon[i]:SetScale(PlayerFrame:GetScale()) + else + icon[i]:SetPoint("TOPLEFT", TargetFrame, "TOPLEFT", 6 + (22 * (i - 1)), 5) + icon[i]:SetScale(TargetFrame:GetScale()) + end + + -- Save control states to globals + LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Idn"] = SpellEB[i]:GetText() + LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] = LeaPlusCB["Spell" .. i .."Pet"]:GetChecked() + + -- Set cooldowns + if LeaPlusCB["Spell" .. i .."Pet"]:GetChecked() then + ShowIcon(i, tonumber(SpellEB[i]:GetText()), "pet") + else + ShowIcon(i, tonumber(SpellEB[i]:GetText()), "player") + end + + -- Show or hide cooldown duration + if LeaPlusLC["NoCooldownDuration"] == "On" then + icon[i].c:SetHideCountdownNumbers(true) + else + icon[i].c:SetHideCountdownNumbers(false) + end + + -- Show or hide cooldown icons depending on current buffs + local newowner + local newspell = tonumber(SpellEB[i]:GetText()) + + if newspell then + if LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] then + newowner = "pet" + else + newowner = "player" + end + -- Hide cooldown icon + icon[i]:Hide() + + -- If buff matches spell we want, show cooldown icon + for q = 1, 40 do + local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff(newowner, q) + if spellID and newspell == spellID then + icon[i]:Show() + -- Set the cooldown to the buff cooldown + CooldownFrame_Set(icon[i].c, expire - length, length, 1) + end + end + end + + end + + end + + -- Update cooldown icons when checkboxes are clicked + LeaPlusCB["NoCooldownDuration"]:HookScript("OnClick", SavePanelControls) + LeaPlusCB["CooldownsOnPlayer"]:HookScript("OnClick", SavePanelControls) + + -- Help button tooltip + CooldownPanel.h.tiptext = L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] + + -- Back button handler + CooldownPanel.b:SetScript("OnClick", function() + CooldownPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + CooldownPanel.r:SetScript("OnClick", function() + -- Reset the checkboxes + LeaPlusLC["ShowCooldownID"] = "On" + LeaPlusLC["NoCooldownDuration"] = "On" + LeaPlusLC["CooldownsOnPlayer"] = "Off" + for i = 1, iCount do + -- Reset the panel controls + SpellEB[i]:SetText(""); + LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] = false + -- Hide cooldowns and clear scripts + icon[i]:Hide() + icon[i]:SetScript("OnEvent", nil) + end + CooldownPanel:Hide(); CooldownPanel:Show() + end) + + -- Save settings when changed + for i = 1, iCount do + -- Set initial checkbox states + LeaPlusCB["Spell" .. i .."Pet"]:SetChecked(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"]) + -- Set checkbox states when shown + LeaPlusCB["Spell" .. i .."Pet"]:SetScript("OnShow", function() + LeaPlusCB["Spell" .. i .."Pet"]:SetChecked(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"]) + end) + -- Set states when changed + SpellEB[i]:SetScript("OnTextChanged", SavePanelControls) + LeaPlusCB["Spell" .. i .."Pet"]:SetScript("OnClick", SavePanelControls) + end + + -- Show cooldowns on startup + SavePanelControls() + + -- Show panel when configuration button is clicked + LeaPlusCB["CooldownsButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- No preset profile + else + -- Show panel + CooldownPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Create class tag banner fontstring + local classTagBanner = CooldownPanel:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + local myClassName = UnitClass("player") + classTagBanner:SetPoint("TOPLEFT", 384, -72) + classTagBanner:SetText(myClassName) + + -- Function to show spell ID in tooltips + local function CooldownIDFunc(unit, target, index, auratype) + if LeaPlusLC["ShowCooldownID"] == "On" and auratype ~= "HARMFUL" then + local spellid = select(10, UnitAura(target, index)) + if spellid then + GameTooltip:AddLine(L["Spell ID"] .. ": " .. spellid) + GameTooltip:Show() + end + end + end + + -- Add spell ID to tooltip when buff frame buffs are hovered + hooksecurefunc(GameTooltip, 'SetUnitAura', CooldownIDFunc) + + -- Add spell ID to tooltip when target frame buffs are hovered + hooksecurefunc(GameTooltip, 'SetUnitBuff', CooldownIDFunc) + + end + + ---------------------------------------------------------------------- + -- Combat plates + ---------------------------------------------------------------------- + + if LeaPlusLC["CombatPlates"] == "On" then + + -- Toggle nameplates with combat + local f = CreateFrame("Frame") + f:RegisterEvent("PLAYER_REGEN_DISABLED") + f:RegisterEvent("PLAYER_REGEN_ENABLED") + f:SetScript("OnEvent", function(self, event) + SetCVar("nameplateShowEnemies", event == "PLAYER_REGEN_DISABLED" and 1 or 0) + end) + + -- Run combat check on startup + SetCVar("nameplateShowEnemies", UnitAffectingCombat("player") and 1 or 0) + + end + + ---------------------------------------------------------------------- + -- Enhance tooltip + ---------------------------------------------------------------------- + + if LeaPlusLC["TipModEnable"] == "On" and not LeaLockList["TipModEnable"] then + + ---------------------------------------------------------------------- + -- Position the tooltip + ---------------------------------------------------------------------- + + hooksecurefunc("GameTooltip_SetDefaultAnchor", function(tooltip, parent) + if LeaPlusLC["TooltipAnchorMenu"] ~= 1 then + if (not tooltip or not parent) then + return + end + if LeaPlusLC["TooltipAnchorMenu"] == 2 or GetMouseFocus() ~= WorldFrame then + local a,b,c,d,e = tooltip:GetPoint() + if a ~= "BOTTOMRIGHT" or c ~= "BOTTOMRIGHT" then + tooltip:ClearAllPoints() + end + tooltip:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]); + return + else + if LeaPlusLC["TooltipAnchorMenu"] == 3 then + tooltip:SetOwner(parent, "ANCHOR_CURSOR") + return + elseif LeaPlusLC["TooltipAnchorMenu"] == 4 then + tooltip:SetOwner(parent, "ANCHOR_CURSOR_LEFT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"]) + return + elseif LeaPlusLC["TooltipAnchorMenu"] == 5 then + tooltip:SetOwner(parent, "ANCHOR_CURSOR_RIGHT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"]) + return + end + end + end + end) + + ---------------------------------------------------------------------- + -- Tooltip Configuration + ---------------------------------------------------------------------- + + local LT = {} + + -- Create locale specific level string + LT["LevelLocale"] = strtrim(strtrim(string.gsub(TOOLTIP_UNIT_LEVEL, "%%s", ""))) + if GameLocale == "ruRU" then + LT["LevelLocale"] = "-ro уровня" + end + + -- Tooltip + LT["ColorBlind"] = GetCVar("colorblindMode") + + -- Create drag frame + local TipDrag = CreateFrame("Frame", nil, UIParent) + TipDrag:SetToplevel(true); + TipDrag:SetClampedToScreen(false); + TipDrag:SetSize(130, 64); + TipDrag:Hide(); + TipDrag:SetFrameStrata("TOOLTIP") + TipDrag:SetMovable(true) + TipDrag:SetBackdropColor(0.0, 0.5, 1.0); + TipDrag:SetBackdrop({ + edgeFile = "Interface/Tooltips/UI-Tooltip-Border", + tile = false, tileSize = 0, edgeSize = 16, + insets = { left = 0, right = 0, top = 0, bottom = 0 }}); + + -- Show text in drag frame + TipDrag.f = TipDrag:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + TipDrag.f:SetPoint("CENTER", 0, 0) + TipDrag.f:SetText(L["Tooltip"]) + + -- Create texture + TipDrag.t = TipDrag:CreateTexture(); + TipDrag.t:SetAllPoints(); + -- TipDrag.t:SetColorTexture(0.0, 0.5, 1.0, 0.5); + TipDrag.t:SetAlpha(0.5); + + --------------------------------------------------------------------------------------------------------- + -- Tooltip movement settings + --------------------------------------------------------------------------------------------------------- + + -- Create tooltip customisation side panel + local SideTip = LeaPlusLC:CreatePanel("Enhance tooltip", "SideTip") + + -- Add controls + LeaPlusLC:MakeTx(SideTip, "Settings", 16, -72) + LeaPlusLC:MakeCB(SideTip, "TipShowRank", "Show guild ranks for your guild", 16, -92, false, "If checked, guild ranks will be shown for players in your guild.") + LeaPlusLC:MakeCB(SideTip, "TipShowOtherRank", "Show guild ranks for other guilds", 16, -112, false, "If checked, guild ranks will be shown for players who are not in your guild.") + LeaPlusLC:MakeCB(SideTip, "TipShowTarget", "Show unit targets", 16, -132, false, "If checked, unit targets will be shown.") + LeaPlusLC:MakeCB(SideTip, "TipNoHealthBar", "Hide the health bar", 16, -152, true, "If checked, the health bar will not be shown.") + + LeaPlusLC:MakeTx(SideTip, "Hide tooltips", 16, -192) + LeaPlusLC:MakeCB(SideTip, "TipHideInCombat", "Hide tooltips for world units during combat", 16, -212, false, "If checked, tooltips for world units will be hidden during combat.") + LeaPlusLC:MakeCB(SideTip, "TipHideShiftOverride", "Show tooltips with shift key", 16, -232, false, "If checked, you can hold shift while tooltips are hidden to show them temporarily.") + + -- Handle show tooltips with shift key lock + local function SetTipHideShiftOverrideFunc() + if LeaPlusLC["TipHideInCombat"] == "On" then + LeaPlusLC:LockItem(LeaPlusCB["TipHideShiftOverride"], false) + else + LeaPlusLC:LockItem(LeaPlusCB["TipHideShiftOverride"], true) + end + end + + LeaPlusCB["TipHideInCombat"]:HookScript("OnClick", SetTipHideShiftOverrideFunc) + SetTipHideShiftOverrideFunc() + + LeaPlusLC:CreateDropDown("TooltipAnchorMenu", "Anchor", SideTip, 146, "TOPLEFT", 356, -115, {L["None"], L["Overlay"], L["Cursor"], L["Cursor Left"], L["Cursor Right"]}, "") + + local XOffsetHeading = LeaPlusLC:MakeTx(SideTip, "X Offset", 356, -132) + LeaPlusLC:MakeSL(SideTip, "TipCursorX", "Drag to set the cursor X offset.", -128, 128, 1, 356, -152, "%.0f") + + local YOffsetHeading = LeaPlusLC:MakeTx(SideTip, "Y Offset", 356, -182) + LeaPlusLC:MakeSL(SideTip, "TipCursorY", "Drag to set the cursor Y offset.", -128, 128, 1, 356, -202, "%.0f") + + LeaPlusLC:MakeTx(SideTip, "Scale", 356, -232) + LeaPlusLC:MakeSL(SideTip, "LeaPlusTipSize", "Drag to set the tooltip scale.", 0.50, 2.00, 0.05, 356, -252, "%.2f") + + -- Function to enable or disable anchor controls + local function SetAnchorControls() + -- Hide overlay if anchor is set to none + if LeaPlusLC["TooltipAnchorMenu"] == 1 then + TipDrag:Hide() + else + TipDrag:Show() + end + -- Set the X and Y sliders + if LeaPlusLC["TooltipAnchorMenu"] == 1 or LeaPlusLC["TooltipAnchorMenu"] == 2 or LeaPlusLC["TooltipAnchorMenu"] == 3 then + -- Dropdown is set to screen or cursor so disable X and Y offset sliders + LeaPlusLC:LockItem(LeaPlusCB["TipCursorX"], true) + LeaPlusLC:LockItem(LeaPlusCB["TipCursorY"], true) + XOffsetHeading:SetAlpha(0.3) + YOffsetHeading:SetAlpha(0.3) + LeaPlusCB["TipCursorX"]:SetScript("OnEnter", nil) + LeaPlusCB["TipCursorY"]:SetScript("OnEnter", nil) + else + -- Dropdown is set to cursor left or cursor right so enable X and Y offset sliders + LeaPlusLC:LockItem(LeaPlusCB["TipCursorX"], false) + LeaPlusLC:LockItem(LeaPlusCB["TipCursorY"], false) + XOffsetHeading:SetAlpha(1.0) + YOffsetHeading:SetAlpha(1.0) + LeaPlusCB["TipCursorX"]:SetScript("OnEnter", LeaPlusLC.TipSee) + LeaPlusCB["TipCursorY"]:SetScript("OnEnter", LeaPlusLC.TipSee) + end + end + + -- Set controls when anchor dropdown menu is changed and on startup + LeaPlusCB["ListFrameTooltipAnchorMenu"]:HookScript("OnHide", SetAnchorControls) + SetAnchorControls() + + -- Help button hidden + SideTip.h:Hide() + + -- Back button handler + SideTip.b:SetScript("OnClick", function() + SideTip:Hide(); + if TipDrag:IsShown() then + TipDrag:Hide(); + end + LeaPlusLC["PageF"]:Show(); + LeaPlusLC["Page5"]:Show(); + return + end) + + -- Reset button handler + SideTip.r.tiptext = SideTip.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."] + SideTip.r:SetScript("OnClick", function() + LeaPlusLC["TipShowRank"] = "On" + LeaPlusLC["TipShowOtherRank"] = "Off" + LeaPlusLC["TipShowTarget"] = "On" + LeaPlusLC["TipHideInCombat"] = "Off"; SetTipHideShiftOverrideFunc() + LeaPlusLC["TipHideShiftOverride"] = "On" + LeaPlusLC["LeaPlusTipSize"] = 1.00 + LeaPlusLC["TipOffsetX"] = -13 + LeaPlusLC["TipOffsetY"] = 94 + LeaPlusLC["TooltipAnchorMenu"] = 1 + LeaPlusLC["TipCursorX"] = 0 + LeaPlusLC["TipCursorY"] = 0 + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]); + SetAnchorControls() + LeaPlusLC:SetTipScale() + SideTip:Hide(); SideTip:Show(); + end) + + -- Show drag frame with configuration panel if anchor is not set to none + SideTip:HookScript("OnShow", function() + if LeaPlusLC["TooltipAnchorMenu"] == 1 then + TipDrag:Hide() + else + TipDrag:Show() + end + end) + SideTip:HookScript("OnHide", function() TipDrag:Hide() end) + + -- Control movement functions + local void, LTax, LTay, LTbx, LTby, LTcx, LTcy + TipDrag:SetScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + void, void, void, LTax, LTay = TipDrag:GetPoint() + TipDrag:StartMoving() + void, void, void, LTbx, LTby = TipDrag:GetPoint() + end + end) + TipDrag:SetScript("OnMouseUp", function(self, btn) + if btn == "LeftButton" then + void, void, void, LTcx, LTcy = TipDrag:GetPoint() + TipDrag:StopMovingOrSizing(); + LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"] = LTcx - LTbx + LTax, LTcy - LTby + LTay + TipDrag:ClearAllPoints() + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]) + end + end) + + -- Move the tooltip + LeaPlusCB["MoveTooltipButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["TipShowRank"] = "On" + LeaPlusLC["TipShowOtherRank"] = "Off" + LeaPlusLC["TipShowTarget"] = "On" + LeaPlusLC["TipHideInCombat"] = "Off"; SetTipHideShiftOverrideFunc() + LeaPlusLC["TipHideShiftOverride"] = "On" + LeaPlusLC["LeaPlusTipSize"] = 1.25 + LeaPlusLC["TipOffsetX"] = -13 + LeaPlusLC["TipOffsetY"] = 94 + LeaPlusLC["TooltipAnchorMenu"] = 2 + LeaPlusLC["TipCursorX"] = 0 + LeaPlusLC["TipCursorY"] = 0 + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]); + SetAnchorControls() + LeaPlusLC:SetTipScale() + LeaPlusLC:SetDim(); + LeaPlusLC:ReloadCheck() + SideTip:Show(); SideTip:Hide(); -- Needed to update tooltip scale + LeaPlusLC["PageF"]:Hide(); LeaPlusLC["PageF"]:Show() + else + -- Show tooltip configuration panel + LeaPlusLC:HideFrames() + SideTip:Show() + + -- Set scale + TipDrag:SetScale(LeaPlusLC["LeaPlusTipSize"]) + + -- Set position of the drag frame + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]) + end + + end) + + -- Hide health bar + if LeaPlusLC["TipNoHealthBar"] == "On" then + local tipHide = GameTooltip.Hide + GameTooltipStatusBar:HookScript("OnShow", tipHide) + GameTooltipStatusBar:Hide() + end + + --------------------------------------------------------------------------------------------------------- + -- Tooltip scale settings + --------------------------------------------------------------------------------------------------------- + + -- Function to set the tooltip scale + local function SetTipScale() + + -- General tooltip + if GameTooltip then GameTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Friends + if FriendsTooltip then FriendsTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- AutoCompleteBox + if AutoCompleteBox then AutoCompleteBox:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Items (links, comparisons) + if ItemRefTooltip then ItemRefTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ItemRefShoppingTooltip1 then ItemRefShoppingTooltip1:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ItemRefShoppingTooltip2 then ItemRefShoppingTooltip2:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ShoppingTooltip1 then ShoppingTooltip1:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ShoppingTooltip2 then ShoppingTooltip2:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Embedded item tooltip (as used in PVP UI) + if EmbeddedItemTooltip then EmbeddedItemTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Nameplate tooltip + if NamePlateTooltip then NamePlateTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Leatrix Plus + TipDrag:SetScale(LeaPlusLC["LeaPlusTipSize"]) + + -- Set slider formatted text + LeaPlusCB["LeaPlusTipSize"].f:SetFormattedText("%.0f%%", LeaPlusLC["LeaPlusTipSize"] * 100) + + end + + -- Give function a file level scope + LeaPlusLC.SetTipScale = SetTipScale + + -- Set tooltip scale when slider or checkbox changes and on startup + LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetTipScale) + SetTipScale() + + --------------------------------------------------------------------------------------------------------- + -- Total RP 3 + --------------------------------------------------------------------------------------------------------- + + -- Total RP 3 + local function TotalRP3Func() + if TRP3_MainTooltip and TRP3_CharacterTooltip then + + -- Function to set tooltip scale + local function SetTotalRP3TipScale() + TRP3_MainTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) + TRP3_CharacterTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) + end + + -- Set tooltip scale when slider changes and on startup + LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetTotalRP3TipScale) + SetTotalRP3TipScale() + + end + end + + -- Run function when Total RP 3 addon has loaded + if IsAddOnLoaded("totalRP3") then + TotalRP3Func() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "totalRP3" then + TotalRP3Func() + waitFrame:UnregisterAllEvents() + end + end) + end + + --------------------------------------------------------------------------------------------------------- + -- Other tooltip code + --------------------------------------------------------------------------------------------------------- + + -- Colorblind setting change + TipDrag:RegisterEvent("CVAR_UPDATE"); + TipDrag:SetScript("OnEvent", function(self, event, arg1, arg2) + if (arg1 == "USE_COLORBLIND_MODE") then + LT["ColorBlind"] = arg2; + end + end) + + -- Store locals + local TipMClass = LOCALIZED_CLASS_NAMES_MALE + local TipFClass = LOCALIZED_CLASS_NAMES_FEMALE + + -- Level string + local LevelString, LevelString2 + if GameLocale == "ruRU" then + -- Level string for ruRU + LevelString = "уровня" + LevelString2 = "уровень" + else + -- Level string for all other locales + LevelString = string.lower(TOOLTIP_UNIT_LEVEL:gsub("%%s",".+")) + LevelString2 = "" + end + + -- Tag locale (code construction from tiplang) + local ttYou, ttLevel, ttBoss, ttElite, ttRare, ttRareElite, ttRareBoss, ttTarget + if GameLocale == "zhCN" then ttYou = "您" ; ttLevel = "等级" ; ttBoss = "首领" ; ttElite = "精英" ; ttRare = "精良" ; ttRareElite = "精良 精英" ; ttRareBoss = "精良 首领" ; ttTarget = "目标" + elseif GameLocale == "zhTW" then ttYou = "您" ; ttLevel = "等級" ; ttBoss = "首領" ; ttElite = "精英" ; ttRare = "精良" ; ttRareElite = "精良 精英" ; ttRareBoss = "精良 首領" ; ttTarget = "目標" + elseif GameLocale == "ruRU" then ttYou = "ВЫ" ; ttLevel = "Уровень" ; ttBoss = "босс" ; ttElite = "элита" ; ttRare = "Редкое" ; ttRareElite = "Редкое элита" ; ttRareBoss = "Редкое босс" ; ttTarget = "Цель" + elseif GameLocale == "koKR" then ttYou = "당신" ; ttLevel = "레벨" ; ttBoss = "우두머리" ; ttElite = "정예" ; ttRare = "희귀" ; ttRareElite = "희귀 정예" ; ttRareBoss = "희귀 우두머리" ; ttTarget = "대상" + elseif GameLocale == "esMX" then ttYou = "TÚ" ; ttLevel = "Nivel" ; ttBoss = "Jefe" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Jefe" ; ttTarget = "Objetivo" + elseif GameLocale == "ptBR" then ttYou = "VOCÊ" ; ttLevel = "Nível" ; ttBoss = "Chefe" ; ttElite = "Elite" ; ttRare = "Raro" ; ttRareElite = "Raro Elite" ; ttRareBoss = "Raro Chefe" ; ttTarget = "Alvo" + elseif GameLocale == "deDE" then ttYou = "SIE" ; ttLevel = "Stufe" ; ttBoss = "Boss" ; ttElite = "Elite" ; ttRare = "Selten" ; ttRareElite = "Selten Elite" ; ttRareBoss = "Selten Boss" ; ttTarget = "Ziel" + elseif GameLocale == "esES" then ttYou = "TÚ" ; ttLevel = "Nivel" ; ttBoss = "Jefe" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Jefe" ; ttTarget = "Objetivo" + elseif GameLocale == "frFR" then ttYou = "TOI" ; ttLevel = "Niveau" ; ttBoss = "Boss" ; ttElite = "Élite" ; ttRare = "Rare" ; ttRareElite = "Rare Élite" ; ttRareBoss = "Rare Boss" ; ttTarget = "Cible" + elseif GameLocale == "itIT" then ttYou = "TU" ; ttLevel = "Livello" ; ttBoss = "Boss" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Boss" ; ttTarget = "Bersaglio" + else ttYou = "YOU" ; ttLevel = "Level" ; ttBoss = "Boss" ; ttElite = "Elite" ; ttRare = "Rare" ; ttRareElite = "Rare Elite" ; ttRareBoss = "Rare Boss" ; ttTarget = "Target" + end + + -- Show tooltip + local function ShowTip() + + -- Do nothing if CTRL, SHIFT and ALT are being held + if IsControlKeyDown() and IsAltKeyDown() and IsShiftKeyDown() then + return + end + + -- Get unit information + if GetMouseFocus() == WorldFrame then + LT["Unit"] = "mouseover" + -- Hide and quit if tips should be hidden during combat + if LeaPlusLC["TipHideInCombat"] == "On" and UnitAffectingCombat("player") then + if not IsShiftKeyDown() or LeaPlusLC["TipHideShiftOverride"] == "Off" then + GameTooltip:Hide() + return + end + end + else + LT["Unit"] = select(2, GameTooltip:GetUnit()) + if not (LT["Unit"]) then return end + end + + -- Quit if unit has no reaction to player + LT["Reaction"] = UnitReaction(LT["Unit"], "player") or nil + if not LT["Reaction"] then + return + end + + -- Setup variables + LT["TipUnitName"], LT["TipUnitRealm"] = UnitName(LT["Unit"]) + LT["TipIsPlayer"] = UnitIsPlayer(LT["Unit"]) + LT["UnitLevel"] = UnitLevel(LT["Unit"]) + LT["UnitClass"] = UnitClassBase(LT["Unit"]) + LT["PlayerControl"] = UnitPlayerControlled(LT["Unit"]) + LT["PlayerRace"] = UnitRace(LT["Unit"]) + + -- Get guild information + if LT["TipIsPlayer"] then + local unitGuild, unitRank = GetGuildInfo(LT["Unit"]) + if unitGuild and unitRank then + -- Unit is guilded + if LT["ColorBlind"] == "1" then + LT["GuildLine"], LT["InfoLine"] = 2, 4 + else + LT["GuildLine"], LT["InfoLine"] = 2, 3 + end + LT["GuildName"], LT["GuildRank"] = unitGuild, unitRank + else + -- Unit is not guilded + LT["GuildName"] = nil + if LT["ColorBlind"] == "1" then + LT["GuildLine"], LT["InfoLine"] = 0, 3 + else + LT["GuildLine"], LT["InfoLine"] = 0, 2 + end + end + -- Lower information line if unit is charmed + if UnitIsCharmed(LT["Unit"]) then + LT["InfoLine"] = LT["InfoLine"] + 1 + end + end + + -- Determine class color + if LT["UnitClass"] then + -- Define male or female (for certain locales) + LT["Sex"] = UnitSex(LT["Unit"]) + if LT["Sex"] == 2 then + LT["Class"] = TipMClass[LT["UnitClass"]] + else + LT["Class"] = TipFClass[LT["UnitClass"]] + end + -- Define class color + LT["ClassCol"] = LeaPlusLC["RaidColors"][LT["UnitClass"]] + LT["LpTipClassColor"] = "|cff" .. string.format("%02x%02x%02x", LT["ClassCol"].r * 255, LT["ClassCol"].g * 255, LT["ClassCol"].b * 255) + end + + ---------------------------------------------------------------------- + -- Name line + ---------------------------------------------------------------------- + + if ((LT["TipIsPlayer"]) or (LT["PlayerControl"])) or LT["Reaction"] > 4 then + + -- If it's a player show name in class color + if LT["TipIsPlayer"] then + LT["NameColor"] = LT["LpTipClassColor"] + else + -- If not, set to green or blue depending on PvP status + if UnitIsPVP(LT["Unit"]) then + LT["NameColor"] = "|cff00ff00" + else + LT["NameColor"] = "|cff00aaff" + end + end + + -- Show name + LT["NameText"] = UnitPVPName(LT["Unit"]) or LT["TipUnitName"] + + -- Show realm + if LT["TipUnitRealm"] then + LT["NameText"] = LT["NameText"] .. " - " .. LT["TipUnitRealm"] + end + + -- Show dead units in grey + if UnitIsDeadOrGhost(LT["Unit"]) then + LT["NameColor"] = "|c88888888" + end + + -- Show name line + _G["GameTooltipTextLeft1"]:SetText(LT["NameColor"] .. LT["NameText"] .. "|cffffffff|r") + + elseif UnitIsDeadOrGhost(LT["Unit"]) then + + -- Show grey name for other dead units + _G["GameTooltipTextLeft1"]:SetText("|c88888888" .. (_G["GameTooltipTextLeft1"]:GetText() or "") .. "|cffffffff|r") + return + + end + + ---------------------------------------------------------------------- + -- Guild line + ---------------------------------------------------------------------- + + if LT["TipIsPlayer"] and LT["GuildName"] then + + -- Show guild line + if UnitIsInMyGuild(LT["Unit"]) then + if LeaPlusLC["TipShowRank"] == "On" then + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. " - " .. LT["GuildRank"] .. "|r") + else + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. "|cffffffff|r") + end + else + if LeaPlusLC["TipShowOtherRank"] == "On" then + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. " - " .. LT["GuildRank"] .. "|r") + else + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. "|cffffffff|r") + end + end + + end + + ---------------------------------------------------------------------- + -- Information line (level, class, race) + ---------------------------------------------------------------------- + + if LT["TipIsPlayer"] then + + if GameLocale == "ruRU" then + + LT["InfoText"] = "" + + -- Show race + if LT["PlayerRace"] then + LT["InfoText"] = LT["InfoText"] .. LT["PlayerRace"] .. "," + end + + -- Show class + LT["InfoText"] = LT["InfoText"] .. " " .. LT["LpTipClassColor"] .. LT["Class"] .. "|r " or LT["InfoText"] .. "|r " + + -- Show level + if LT["Reaction"] < 5 then + if LT["UnitLevel"] == -1 then + LT["InfoText"] = LT["InfoText"] .. ("|cffff3333" .. "??-ro" .. " " .. ttLevel .. "|cffffffff") + else + LT["LevelColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["LevelColor"] = string.format('%02x%02x%02x', LT["LevelColor"].r * 255, LT["LevelColor"].g * 255, LT["LevelColor"].b * 255) + LT["InfoText"] = LT["InfoText"] .. ("|cff" .. LT["LevelColor"] .. LT["UnitLevel"] .. LT["LevelLocale"] .. "|cffffffff") + end + else + LT["InfoText"] = LT["InfoText"] .. LT["UnitLevel"] .. LT["LevelLocale"] + end + + -- Show information line + _G["GameTooltipTextLeft" .. LT["InfoLine"]]:SetText(LT["InfoText"] .. "|cffffffff|r") + + else + + -- Show level + if LT["Reaction"] < 5 then + if LT["UnitLevel"] == -1 then + LT["InfoText"] = ("|cffff3333" .. ttLevel .. " ??|cffffffff") + else + LT["LevelColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["LevelColor"] = string.format('%02x%02x%02x', LT["LevelColor"].r * 255, LT["LevelColor"].g * 255, LT["LevelColor"].b * 255) + LT["InfoText"] = ("|cff" .. LT["LevelColor"] .. LT["LevelLocale"] .. " " .. LT["UnitLevel"] .. "|cffffffff") + end + else + LT["InfoText"] = LT["LevelLocale"] .. " " .. LT["UnitLevel"] + end + + -- Show race + if LT["PlayerRace"] then + LT["InfoText"] = LT["InfoText"] .. " " .. LT["PlayerRace"] + end + + -- Show class + LT["InfoText"] = LT["InfoText"] .. " " .. LT["LpTipClassColor"] .. LT["Class"] or LT["InfoText"] + + -- Show information line + _G["GameTooltipTextLeft" .. LT["InfoLine"]]:SetText(LT["InfoText"] .. "|cffffffff|r") + + end + + end + + ---------------------------------------------------------------------- + -- Mob name in brighter red (alive) and steel blue (tap denied) + ---------------------------------------------------------------------- + + if not (LT["TipIsPlayer"]) and LT["Reaction"] < 4 and not (LT["PlayerControl"]) then + if UnitIsTapDenied(LT["Unit"]) then + LT["NameText"] = "|c8888bbbb" .. LT["TipUnitName"] .. "|r" + else + LT["NameText"] = "|cffff3333" .. LT["TipUnitName"] .. "|r" + end + _G["GameTooltipTextLeft1"]:SetText(LT["NameText"]) + end + + ---------------------------------------------------------------------- + -- Mob level in color (neutral or lower) + ---------------------------------------------------------------------- + + if UnitCanAttack(LT["Unit"], "player") and not (LT["TipIsPlayer"]) and LT["Reaction"] < 5 and not (LT["PlayerControl"]) then + + -- Find the level line + LT["MobInfoLine"] = 0 + local line2, line3, line4 + if _G["GameTooltipTextLeft2"] then line2 = _G["GameTooltipTextLeft2"]:GetText() end + if _G["GameTooltipTextLeft3"] then line3 = _G["GameTooltipTextLeft3"]:GetText() end + if _G["GameTooltipTextLeft4"] then line4 = _G["GameTooltipTextLeft4"]:GetText() end + if GameLocale == "ruRU" then -- Additional check for ruRU + if line2 and string.lower(line2):find(LevelString2) then LT["MobInfoLine"] = 2 end + if line3 and string.lower(line3):find(LevelString2) then LT["MobInfoLine"] = 3 end + if line4 and string.lower(line4):find(LevelString2) then LT["MobInfoLine"] = 4 end + end + if line2 and string.lower(line2):find(LevelString) then LT["MobInfoLine"] = 2 end + if line3 and string.lower(line3):find(LevelString) then LT["MobInfoLine"] = 3 end + if line4 and string.lower(line4):find(LevelString) then LT["MobInfoLine"] = 4 end + + -- Show level line + if LT["MobInfoLine"] > 1 then + + if GameLocale == "ruRU" then + + LT["InfoText"] = "" + + -- Show creature type and classification + LT["CreatureType"] = UnitCreatureType(LT["Unit"]) + if (LT["CreatureType"]) and not (LT["CreatureType"] == "Not specified") then + LT["InfoText"] = LT["InfoText"] .. "|cffffffff" .. LT["CreatureType"] .. "|cffffffff " + end + + -- Level ?? mob + if LT["UnitLevel"] == -1 then + LT["InfoText"] = LT["InfoText"] .. "|cffff3333" .. "??-ro " .. ttLevel .. "|cffffffff " + + -- Mobs within level range + else + LT["MobColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["MobColor"] = string.format('%02x%02x%02x', LT["MobColor"].r * 255, LT["MobColor"].g * 255, LT["MobColor"].b * 255) + LT["InfoText"] = LT["InfoText"] .. "|cff" .. LT["MobColor"] .. LT["UnitLevel"] .. LT["LevelLocale"] .. "|cffffffff " + end + + else + + -- Level ?? mob + if LT["UnitLevel"] == -1 then + LT["InfoText"] = "|cffff3333" .. ttLevel .. " ??|cffffffff " + + -- Mobs within level range + else + LT["MobColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["MobColor"] = string.format('%02x%02x%02x', LT["MobColor"].r * 255, LT["MobColor"].g * 255, LT["MobColor"].b * 255) + LT["InfoText"] = "|cff" .. LT["MobColor"] .. LT["LevelLocale"] .. " " .. LT["UnitLevel"] .. "|cffffffff " + end + + -- Show creature type and classification + LT["CreatureType"] = UnitCreatureType(LT["Unit"]) + if (LT["CreatureType"]) and not (LT["CreatureType"] == "Not specified") then + LT["InfoText"] = LT["InfoText"] .. "|cffffffff" .. LT["CreatureType"] .. "|cffffffff " + end + + end + + -- Rare, elite and boss mobs + LT["Special"] = UnitClassification(LT["Unit"]) + if LT["Special"] then + if LT["Special"] == "elite" then + if strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then + LT["Special"] = "(" .. ttBoss .. ")" + else + LT["Special"] = "(" .. ttElite .. ")" + end + elseif LT["Special"] == "rare" then + LT["Special"] = "|c00e066ff(" .. ttRare .. ")" + elseif LT["Special"] == "rareelite" then + if strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then + LT["Special"] = "|c00e066ff(" .. ttRareBoss .. ")" + else + LT["Special"] = "|c00e066ff(" .. ttRareElite .. ")" + end + elseif LT["Special"] == "worldboss" then + LT["Special"] = "(" .. ttBoss .. ")" + elseif LT["UnitLevel"] == -1 and LT["Special"] == "normal" and strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then + LT["Special"] = "(" .. ttBoss .. ")" + else + LT["Special"] = nil + end + + if (LT["Special"]) then + LT["InfoText"] = LT["InfoText"] .. LT["Special"] + end + end + + -- Show mob info line + _G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:SetText(LT["InfoText"]) + + end + + end + + ---------------------------------------------------------------------- + -- Show target + ---------------------------------------------------------------------- + + if LeaPlusLC["TipShowTarget"] == "On" then + + -- Get target + LT["Target"] = UnitName(LT["Unit"] .. "target"); + + -- If target doesn't exist, quit + if LT["Target"] == nil or LT["Target"] == "" then return end + + -- If target is you, set target to YOU + if (UnitIsUnit(LT["Target"], "player")) then + LT["Target"] = ("|c12ff4400" .. ttYou) + + -- If it's not you, but it's a player, show target in class color + elseif UnitIsPlayer(LT["Unit"] .. "target") then + LT["TargetBase"] = UnitClassBase(LT["Unit"] .. "target") + LT["TargetCol"] = LeaPlusLC["RaidColors"][LT["TargetBase"]] + LT["TargetCol"] = "|cff" .. string.format('%02x%02x%02x', LT["TargetCol"].r * 255, LT["TargetCol"].g * 255, LT["TargetCol"].b * 255) + LT["Target"] = (LT["TargetCol"] .. LT["Target"]) + + end + + -- Add target line + GameTooltip:AddLine(ttTarget .. ": " .. LT["Target"]) + + end + + end + + GameTooltip:HookScript("OnTooltipSetUnit", ShowTip) + + end + + ---------------------------------------------------------------------- + -- Move chat editbox to top + ---------------------------------------------------------------------- + + if LeaPlusLC["MoveChatEditBoxToTop"] == "On" and not LeaLockList["MoveChatEditBoxToTop"] then + + -- Set options for normal chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + -- Position the editbox + _G["ChatFrame" .. i .. "EditBox"]:ClearAllPoints(); + _G["ChatFrame" .. i .. "EditBox"]:SetPoint("TOPLEFT", _G["ChatFrame" .. i], 0, 0); + _G["ChatFrame" .. i .. "EditBox"]:SetWidth(_G["ChatFrame" .. i]:GetWidth()); + -- Ensure editbox width matches chatframe width + _G["ChatFrame" .. i]:HookScript("OnSizeChanged", function() + _G["ChatFrame" .. i .. "EditBox"]:SetWidth(_G["ChatFrame" .. i]:GetWidth()) + end) + end + end + + -- Do the functions above for other chat frames (pet battles, whispers, etc) + hooksecurefunc("FCF_OpenTemporaryWindow", function() + + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + + -- Position the editbox + _G[cf .. "EditBox"]:ClearAllPoints(); + _G[cf .. "EditBox"]:SetPoint("TOPLEFT", cf, "TOPLEFT", 0, 0); + _G[cf .. "EditBox"]:SetWidth(_G[cf]:GetWidth()); + + -- Ensure editbox width matches chatframe width + _G[cf]:HookScript("OnSizeChanged", function() + _G[cf .. "EditBox"]:SetWidth(_G[cf]:GetWidth()) + end) + + end + end) + + end + + ---------------------------------------------------------------------- + -- Viewport + ---------------------------------------------------------------------- + + if LeaPlusLC["ViewPortEnable"] == "On" then + + -- Create border textures + local BordTop = WorldFrame:CreateTexture(nil, "ARTWORK"); + -- BordTop:SetColorTexture(0, 0, 0, 1); + BordTop:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0); BordTop:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0) + local BordBot = WorldFrame:CreateTexture(nil, "ARTWORK"); + -- BordBot:SetColorTexture(0, 0, 0, 1); + BordBot:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 0); BordBot:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 0) + local BordLeft = WorldFrame:CreateTexture(nil, "ARTWORK"); + -- BordLeft:SetColorTexture(0, 0, 0, 1); + BordLeft:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0); BordLeft:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 0) + local BordRight = WorldFrame:CreateTexture(nil, "ARTWORK"); + -- BordRight:SetColorTexture(0, 0, 0, 1); + BordRight:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0); BordRight:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 0) + + -- Create viewport configuration panel + local SideViewport = LeaPlusLC:CreatePanel("Enable viewport", "SideViewport") + + -- Create resize screen button + local resizeScreenBtn = LeaPlusLC:CreateButton("resizeScreenBtn", SideViewport, "Resize Screen", "BOTTOMRIGHT", -16, 10, 0, 25, true, "Click to resize the screen to fit between the top and bottom borders.") + resizeScreenBtn:ClearAllPoints() + resizeScreenBtn:SetPoint("LEFT", SideViewport.h, "RIGHT", 10, 0) + resizeScreenBtn:SetScript("OnClick", function() + LeaPlusLC["ViewPortResizeTop"] = LeaPlusLC["ViewPortTop"] + LeaPlusLC["ViewPortResizeBottom"] = LeaPlusLC["ViewPortBottom"] + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + -- Disable lock button if borders match viewport size + if LeaPlusLC["ViewPortTop"] == LeaPlusLC["ViewPortResizeTop"] and LeaPlusLC["ViewPortBottom"] == LeaPlusLC["ViewPortResizeBottom"] then + LeaPlusLC:LockItem(resizeScreenBtn, true) + else + LeaPlusLC:LockItem(resizeScreenBtn, false) + end + end) + + -- Function to set viewport parameters + local function RefreshViewport() + + -- Set border size and transparency + BordTop:SetHeight(LeaPlusLC["ViewPortTop"]); BordTop:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + BordBot:SetHeight(LeaPlusLC["ViewPortBottom"]); BordBot:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + BordLeft:SetWidth(LeaPlusLC["ViewPortLeft"]); BordLeft:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + BordRight:SetWidth(LeaPlusLC["ViewPortRight"]); BordRight:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + + -- Show formatted slider value + LeaPlusCB["ViewPortAlpha"].f:SetFormattedText("%.0f%%", LeaPlusLC["ViewPortAlpha"] * 100) + + -- Disable lock button if borders match viewport size + if LeaPlusLC["ViewPortTop"] == LeaPlusLC["ViewPortResizeTop"] and LeaPlusLC["ViewPortBottom"] == LeaPlusLC["ViewPortResizeBottom"] then + LeaPlusLC:LockItem(resizeScreenBtn, true) + else + LeaPlusLC:LockItem(resizeScreenBtn, false) + end + + end + + -- Create slider controls + LeaPlusLC:MakeTx(SideViewport, "Top", 16, -72) + LeaPlusLC:MakeSL(SideViewport, "ViewPortTop", "Drag to set the size of the top border.", 0, 300, 5, 16, -92, "%.0f") + LeaPlusCB["ViewPortTop"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Bottom", 16, -132) + LeaPlusLC:MakeSL(SideViewport, "ViewPortBottom", "Drag to set the size of the bottom border.", 0, 300, 5, 16, -152, "%.0f") + LeaPlusCB["ViewPortBottom"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Left", 186, -72) + LeaPlusLC:MakeSL(SideViewport, "ViewPortLeft", "Drag to set the size of the left border.", 0, 300, 5, 186, -92, "%.0f") + LeaPlusCB["ViewPortLeft"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Right", 186, -132) + LeaPlusLC:MakeSL(SideViewport, "ViewPortRight", "Drag to set the size of the right border.", 0, 300, 5, 186, -152, "%.0f") + LeaPlusCB["ViewPortRight"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Transparency", 356, -132) + LeaPlusLC:MakeSL(SideViewport, "ViewPortAlpha", "Drag to set the transparency of the borders.", 0, 0.9, 0.1, 356, -152, "%.1f") + LeaPlusCB["ViewPortAlpha"]:HookScript("OnValueChanged", RefreshViewport) + + -- Help button tooltip + SideViewport.h.tiptext = L["This panel will close automatically if you enter combat."] + + -- Back button handler + SideViewport.b:SetScript("OnClick", function() + SideViewport:Hide() + LeaPlusLC["PageF"]:Show() + LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button handler + SideViewport.r:SetScript("OnClick", function() + LeaPlusLC["ViewPortTop"] = 0 + LeaPlusLC["ViewPortBottom"] = 0 + LeaPlusLC["ViewPortLeft"] = 0 + LeaPlusLC["ViewPortRight"] = 0 + LeaPlusLC["ViewPortResizeTop"] = 0 + LeaPlusLC["ViewPortResizeBottom"] = 0 + LeaPlusLC["ViewPortAlpha"] = 0 + SideViewport:Hide(); SideViewport:Show() + RefreshViewport() + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + end) + + -- Configuration button handler + LeaPlusCB["ModViewportBtn"]:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ViewPortTop"] = 0 + LeaPlusLC["ViewPortBottom"] = 0 + LeaPlusLC["ViewPortLeft"] = 0 + LeaPlusLC["ViewPortRight"] = 0 + LeaPlusLC["ViewPortResizeTop"] = 0 + LeaPlusLC["ViewPortResizeBottom"] = 0 + LeaPlusLC["ViewPortAlpha"] = 0.7 + RefreshViewport() + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + else + SideViewport:Show() + LeaPlusLC:HideFrames() + end + end + end) + + -- Set viewport on startup + RefreshViewport() + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + + -- Hide the configuration panel if combat starts + SideViewport:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + SideViewport:Hide() + end + end) + + -- Hide borders when cinematic is shown + hooksecurefunc(CinematicFrame, "Hide", function() + BordTop:Show(); BordBot:Show(); BordLeft:Show(); BordRight:Show() + end) + hooksecurefunc(CinematicFrame, "Show", function() + BordTop:Hide(); BordBot:Hide(); BordLeft:Hide(); BordRight:Hide() + end) + + end + + ---------------------------------------------------------------------- + -- Silence rested emotes + ---------------------------------------------------------------------- + + -- Manage emotes + if LeaPlusLC["NoRestedEmotes"] == "On" then + + -- Zone table English , French , German , Italian , Russian , S Chinese , Spanish , T Chinese , + local zonetable = { "The Grim Guzzler" , "Le Sinistre écluseur" , "Zum Grimmigen Säufer" , "Torvo Beone" , "Трактир Угрюмый обжора" , "黑铁酒吧" , "Tragapenas" , "黑鐵酒吧" ,} + + -- Function to set rested state + local function UpdateEmoteSound() + + -- Find character's current zone + local szone = GetSubZoneText() or "None" + + -- Find out if emote sounds are disabled or enabled + local emoset = GetCVar("Sound_EnableEmoteSounds") + + if IsResting() then + -- Character is resting so silence emotes + if emoset ~= "0" then + SetCVar("Sound_EnableEmoteSounds", "0") + end + return + end + + -- Traverse zone table and silence emotes if character is in a designated zone + for k, v in next, zonetable do + if szone == zonetable[k] then + if emoset ~= "0" then + SetCVar("Sound_EnableEmoteSounds", "0") + end + return + end + end + + -- If the above didn't return, emote sounds should be enabled + if emoset ~= "1" then + SetCVar("Sound_EnableEmoteSounds", "1") + end + return + + end + + -- Set emote sound when rest state or zone changes + local RestEvent = CreateFrame("FRAME") + RestEvent:RegisterEvent("PLAYER_UPDATE_RESTING") + RestEvent:RegisterEvent("ZONE_CHANGED_NEW_AREA") + RestEvent:RegisterEvent("ZONE_CHANGED") + RestEvent:RegisterEvent("ZONE_CHANGED_INDOORS") + RestEvent:SetScript("OnEvent", UpdateEmoteSound) + + -- Set sound setting at startup + UpdateEmoteSound() + + end + + ---------------------------------------------------------------------- + -- Create panel in game options panel + ---------------------------------------------------------------------- + + do + + local interPanel = CreateFrame("FRAME") + interPanel.name = "Leatrix Plus" + + local maintitle = LeaPlusLC:MakeTx(interPanel, "Leatrix Plus", 0, 0) + maintitle:SetFont(maintitle:GetFont(), 72) + maintitle:ClearAllPoints() + maintitle:SetPoint("TOP", 0, -72) + + local expTitle = LeaPlusLC:MakeTx(interPanel, "Wrath of the Lich King Classic", 0, 0) + expTitle:SetFont(expTitle:GetFont(), 32) + expTitle:ClearAllPoints() + expTitle:SetPoint("TOP", 0, -152) + + local subTitle = LeaPlusLC:MakeTx(interPanel, "www.leatrix.com", 0, 0) + subTitle:SetFont(subTitle:GetFont(), 20) + subTitle:ClearAllPoints() + subTitle:SetPoint("BOTTOM", 0, 72) + + local slashTitle = LeaPlusLC:MakeTx(interPanel, "/run leaplus()", 0, 0) + slashTitle:SetFont(slashTitle:GetFont(), 72) + slashTitle:ClearAllPoints() + slashTitle:SetPoint("BOTTOM", subTitle, "TOP", 0, 40) + + local pTex = interPanel:CreateTexture(nil, "BACKGROUND") + pTex:SetAllPoints() + pTex:SetTexture("Interface\\GLUES\\Models\\UI_MainMenu\\swordgradient2") + pTex:SetAlpha(0.2) + pTex:SetTexCoord(0, 1, 1, 0) + + InterfaceOptions_AddCategory(interPanel) + + end + + ---------------------------------------------------------------------- + -- Final code for Player + ---------------------------------------------------------------------- + + -- Show first run message + if not LeaPlusDB["FirstRunMessageSeen"] then + LibCompat.After(1, function() + LeaPlusLC:Print(L["Enter"] .. " |cff00ff00" .. "/run leaplus()" .. "|r " .. L["or click the minimap button to open Leatrix Plus."]) + LeaPlusDB["FirstRunMessageSeen"] = true + end) + end + + -- Register logout event to save settings + LpEvt:RegisterEvent("PLAYER_LOGOUT") + + -- Release memory + LeaPlusLC.Player = nil + + end + +---------------------------------------------------------------------- +-- L45: World +---------------------------------------------------------------------- + + function LeaPlusLC:World() + + ---------------------------------------------------------------------- + -- Max camera zoom (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set camera zoom + local function SetZoom() + if LeaPlusLC["MaxCameraZoom"] == "On" then + SetCVar("cameraDistanceMaxZoomFactor", 4.0) + else + SetCVar("cameraDistanceMaxZoomFactor", 1.9) + end + end + + -- Set camera zoom when option is clicked and on startup (if enabled) + LeaPlusCB["MaxCameraZoom"]:HookScript("OnClick", SetZoom) + if LeaPlusLC["MaxCameraZoom"] == "On" then SetZoom() end + + end + + end + +---------------------------------------------------------------------- +-- L50: RunOnce +---------------------------------------------------------------------- + + function LeaPlusLC:RunOnce() + + ---------------------------------------------------------------------- + -- Frame alignment grid + ---------------------------------------------------------------------- + + do + + -- Create frame alignment grid + local grid = CreateFrame('FRAME') + LeaPlusLC.grid = grid + grid:Hide() + grid:SetAllPoints(UIParent) + local w, h = GetScreenWidth() * UIParent:GetEffectiveScale(), GetScreenHeight() * UIParent:GetEffectiveScale() + local ratio = w / h + local sqsize = w / 20 + local wline = floor(sqsize - (sqsize % 2)) + local hline = floor(sqsize / ratio - ((sqsize / ratio) % 2)) + -- Plot vertical lines + for i = 0, wline do + local t = LeaPlusLC.grid:CreateTexture(nil, 'BACKGROUND') + -- if i == wline / 2 then t:SetColorTexture(1, 0, 0, 0.5) else t:SetColorTexture(0, 0, 0, 0.5) end + t:SetPoint('TOPLEFT', grid, 'TOPLEFT', i * w / wline - 1, 0) + t:SetPoint('BOTTOMRIGHT', grid, 'BOTTOMLEFT', i * w / wline + 1, 0) + end + -- Plot horizontal lines + for i = 0, hline do + local t = LeaPlusLC.grid:CreateTexture(nil, 'BACKGROUND') + -- if i == hline / 2 then t:SetColorTexture(1, 0, 0, 0.5) else t:SetColorTexture(0, 0, 0, 0.5) end + t:SetPoint('TOPLEFT', grid, 'TOPLEFT', 0, -i * h / hline + 1) + t:SetPoint('BOTTOMRIGHT', grid, 'TOPRIGHT', 0, -i * h / hline - 1) + end + + end + + ---------------------------------------------------------------------- + -- Media player + ---------------------------------------------------------------------- + + function LeaPlusLC:MediaFunc() + + -- Create tables for list data and zone listing + local ListData, playlist = {}, {} + local scrollFrame, willPlay, musicHandle, ZonePage, LastPlayed, LastFolder, TempFolder, HeadingOfClickedTrack, LastMusicHandle + local numButtons = 15 + local uframe = CreateFrame("FRAME") + + -- These categories will not appear in random track selections + local randomBannedList = {L["Narration"], L["Cinematics"]} + + -- Get media table + local ZoneList = Leatrix_Plus["ZoneList"] + + -- Show relevant list items + local function UpdateList() + FauxScrollFrame_Update(scrollFrame, #ListData, numButtons, 16) + for index = 1, numButtons do + local offset = index + FauxScrollFrame_GetOffset(scrollFrame) + local button = scrollFrame.buttons[index] + button.index = offset + if offset <= #ListData then + -- Show zone listing or track listing + button:SetText(ListData[offset].zone or ListData[offset]) + -- Set width of highlight texture + if button:GetTextWidth() > 290 then + button.t:SetSize(290, 16) + else + button.t:SetSize(button:GetTextWidth(), 16) + end + -- Show the button + button:Show() + -- Hide highlight bar texture by default + button.s:Hide() + -- Hide highlight bar if the button is a heading + if strfind(button:GetText(), "|c") then button.t:Hide() end + -- Show last played track highlight bar texture + if LastPlayed == button:GetText() then + local HeadingOfCurrentFolder = ListData[1] + if HeadingOfCurrentFolder == HeadingOfClickedTrack then + button.s:Show() + end + end + -- Show last played folder highlight bar texture + if LastFolder == button:GetText() then + button.s:Show() + end + -- Set width of highlight bar + if button:GetTextWidth() > 290 then + button.s:SetSize(290, 16) + else + button.s:SetSize(button:GetTextWidth(), 16) + end + -- Limit click to label width + local bWidth = button:GetFontString():GetStringWidth() or 0 + if bWidth > 290 then bWidth = 290 end + button:SetHitRectInsets(0, 454 - bWidth, 0, 0) + -- Disable label click movement + button:SetPushedTextOffset(0, 0) + -- Disable word wrap and set width + button:GetFontString():SetWidth(290) + button:GetFontString():SetWordWrap(false) + else + button:Hide() + end + end + end + + -- Give function file level scope (it's used in SetPlusScale to set the highlight bar scale) + LeaPlusLC.UpdateList = UpdateList + + -- Right-button click to go back + local function BackClick() + -- Return to the current zone list (back button) + if type(ListData[1]) == "string" then + -- Strip the color code from the list data + local nocol = string.gsub(ListData[1], "|cffffd800", "") + -- Strip the zone + local backzone = strsplit(":", nocol, 2) + -- Don't go back if random or search category is being shown + if backzone == L["Random"] or backzone == L["Search"] then return end + -- Show the tracklist continent + if ZoneList[backzone] then ListData = ZoneList[backzone] end + UpdateList() + scrollFrame:SetVerticalScroll(ZonePage or 0) + end + end + + -- Function to make navigation menu buttons + local function MakeButton(where, y) + local mbtn = CreateFrame("Button", nil, LeaPlusLC["Page9"]) + mbtn:Show() + mbtn:SetAlpha(1.0) + mbtn:SetPoint("TOPLEFT", 146, y) + + -- Create hover texture + mbtn.t = mbtn:CreateTexture(nil, "BACKGROUND") + -- mbtn.t:SetColorTexture(0.3, 0.3, 0.00, 0.8) + mbtn.t:SetAlpha(0.7) + mbtn.t:SetAllPoints() + mbtn.t:Hide() + + -- Create highlight texture + mbtn.s = mbtn:CreateTexture(nil, "BACKGROUND") + -- mbtn.s:SetColorTexture(0.3, 0.3, 0.00, 0.8) + mbtn.s:SetAlpha(1.0) + mbtn.s:SetAllPoints() + mbtn.s:Hide() + + -- Create fontstring + mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mbtn.f:SetPoint('LEFT', 1, 0) + mbtn.f:SetText(L[where]) + + mbtn:SetScript("OnEnter", function() + mbtn.t:Show() + end) + + mbtn:SetScript("OnLeave", function() + mbtn.t:Hide() + end) + + -- Set button size when shown + mbtn:SetScript("OnShow", function() + mbtn:SetSize(mbtn.f:GetStringWidth() + 1, 16) + end) + + mbtn:SetScript("OnClick", function() + -- Show zone listing for clicked item + ListData = ZoneList[where] + UpdateList() + end) + + return mbtn, mbtn.s + + end + + -- Create a table for each button + local conbtn = {} + for q, w in pairs(ZoneList) do + conbtn[q] = {} + end + + -- Create buttons + local function MakeButtonNow(title, anchor) + conbtn[title], conbtn[title].s = MakeButton(title, height) + conbtn[title]:ClearAllPoints() + if title == L["Zones"] then + -- Set first button position + conbtn[title]:SetPoint("TOPLEFT", LeaPlusLC["Page9"], "TOPLEFT", 145, -70) + elseif anchor then + -- Set subsequent button positions + conbtn[title]:SetPoint("TOPLEFT", conbtn[anchor], "BOTTOMLEFT", 0, 0) + conbtn[title].f:SetText(L[title]) + end + end + + MakeButtonNow(L["Zones"]) + MakeButtonNow(L["Dungeons"], L["Zones"]) + MakeButtonNow(L["Various"], L["Dungeons"]) + MakeButtonNow(L["Movies"], L["Various"]) + MakeButtonNow(L["Random"], L["Movies"]) + MakeButtonNow(L["Search"]) -- Positioned when search editbox is created + + -- Show button highlight for clicked button + for q, w in pairs(ZoneList) do + if type(w) == "string" and conbtn[w] then + conbtn[w]:HookScript("OnClick", function() + -- Hide all button highlights + for k, v in pairs(ZoneList) do + if type(v) == "string" and conbtn[v] then + conbtn[v].s:Hide() + end + end + -- Show clicked button highlight + conbtn[w].s:Show() + LeaPlusDB["MusicContinent"] = w + scrollFrame:SetVerticalScroll(0) + -- Set TempFolder for listings without folders + if w == L["Random"] then TempFolder = L["Random"] end + if w == L["Search"] then TempFolder = L["Search"] end + end) + end + end + + -- Create scroll bar + scrollFrame = CreateFrame("ScrollFrame", "LeaPlusScrollFrame", LeaPlusLC["Page9"], "FauxScrollFrameTemplate") + scrollFrame:SetPoint("TOPLEFT", 0, -32) + scrollFrame:SetPoint("BOTTOMRIGHT", -30, 50) + scrollFrame:SetFrameLevel(10) + scrollFrame:SetScript("OnVerticalScroll", function(self, offset) + FauxScrollFrame_OnVerticalScroll(self, offset, 16, UpdateList) + end) + + -- Add stop button + local stopBtn = LeaPlusLC:CreateButton("StopMusicBtn", LeaPlusLC["Page9"], "Stop", "TOPLEFT", 146, -292, 0, 25, true, "") + stopBtn:Hide(); stopBtn:Show() + LeaPlusLC:LockItem(stopBtn, true) + stopBtn:SetScript("OnClick", function() + if musicHandle then + StopSound(musicHandle) + musicHandle = nil + -- Hide highlight bars + LastPlayed = "" + LastFolder = "" + UpdateList() + end + -- Cancel sound file music timer + if LeaPlusLC.TrackTimer then LeaPlusLC.TrackTimer:Cancel() end + -- Lock button and unregister next track events + LeaPlusLC:LockItem(stopBtn, true) + uframe:UnregisterEvent("SOUNDKIT_FINISHED") + uframe:UnregisterEvent("LOADING_SCREEN_DISABLED") + end) + + -- Store currently playing track number + local tracknumber = 1 + + -- Function to play a track and show the static highlight bar + local function PlayTrack() + -- Play tracks + if musicHandle then StopSound(musicHandle) end + local file, soundID, trackTime + if strfind(playlist[tracknumber], "#") then + if strfind(playlist[tracknumber], ".mp3") then + -- Music file with track time + file, trackTime = playlist[tracknumber]:match("([^,]+)%#([^,]+)") + local cleanFile = file:gsub("(|C%a%a%a%a%a%a%a%a)[^|]*(|r)", "") -- Remove color tags + if strfind(file, "cinematics/") then + cleanFile = "interface/" .. cleanFile + elseif strfind(file, "cinematicvoices/") or strfind(file, "ambience/") or strfind(file, "spells/") then + cleanFile = "sound/" .. cleanFile + else + cleanFile = "sound/music/" .. cleanFile + end + willPlay, musicHandle = PlaySoundFile(cleanFile, "Master", false, true) + else + -- Sound kit without track time + file, soundID = playlist[tracknumber]:match("([^,]+)%#([^,]+)") + willPlay, musicHandle = PlaySound(soundID, "Master", false, true) + end + end + -- Cancel existing music timer for a sound file + if LeaPlusLC.TrackTimer then LeaPlusLC.TrackTimer:Cancel() end + if strfind(playlist[tracknumber], "#") then + if strfind(playlist[tracknumber], ".mp3") then + -- Track is a sound file with track time so create track timer + LeaPlusLC.TrackTimer = LibCompat.NewTimer(trackTime + 1, function() + if musicHandle then StopSound(musicHandle) end + if tracknumber == #playlist then + -- Playlist is at the end, restart from first track + tracknumber = 1 + end + PlayTrack() + end) + end + end + -- Store its handle for later use + LastMusicHandle = musicHandle + LastPlayed = playlist[tracknumber] + tracknumber = tracknumber + 1 + -- Show static highlight bar + for index = 1, numButtons do + local button = scrollFrame.buttons[index] + local item = button:GetText() + if item then + if strfind(item, "#") then + local item, void = item:match("([^,]+)%#([^,]+)") + if item then + if item == file and LastFolder == TempFolder then + button.s:Show() + else + button.s:Hide() + end + end + end + end + end + end + + -- Create editbox for search + local sBox = LeaPlusLC:CreateEditBox("MusicSearchBox", LeaPlusLC["Page9"], 78, 10, "TOPLEFT", 150, -260, "MusicSearchBox", "MusicSearchBox") + sBox:SetMaxLetters(50) + + -- Position search button above editbox + conbtn[L["Search"]]:ClearAllPoints() + conbtn[L["Search"]]:SetPoint("BOTTOMLEFT", sBox, "TOPLEFT", -4, 0) + + -- Set initial search data + for q, w in pairs(ZoneList) do + if conbtn[w] then + conbtn[w]:HookScript("OnClick", function() + if w == L["Search"] then + ListData[1] = "|cffffd800" .. L["Search"] + if #ListData == 1 then + ListData[2] = "|cffffffaa{" .. L["enter zone or track name"] .. "}" + end + UpdateList() + else + sBox:ClearFocus() + end + end) + end + end + + -- Function to show search results + local function ShowSearchResults() + -- Get unescaped editbox text + local searchText = gsub(strlower(sBox:GetText()), '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])', "%%%1") + -- Wipe the track listing + wipe(ListData) + -- Set the track list heading + ListData[1] = "|cffffd800" .. L["Search"] + -- Show the subheading only if no search results are being shown + if searchText == "" then + ListData[2] = "|cffffffaa{" .. L["enter zone or track name"] .. "}" + else + ListData[2] = "" + end + -- Traverse music listing and populate ListData + if searchText ~= "" then + local word1, word2, word3, word4, word5 = strsplit(" ", (strtrim(searchText):gsub("%s+", " "))) + RunScript('LeaPlusGlobalHash = {}') + local hash = LeaPlusGlobalHash + local trackCount = 0 + for i, e in pairs(ZoneList) do + if ZoneList[e] then + for a, b in pairs(ZoneList[e]) do + if b.tracks then + for k, v in pairs(b.tracks) do + if (strfind(v, "#") or strfind(v, "|r")) and (strfind(strlower(v), word1) or strfind(strlower(b.zone), word1) or strfind(strlower(b.category), word1)) then + if not word2 or word2 ~= "" and (strfind(strlower(v), word2) or strfind(strlower(b.zone), word2) or strfind(strlower(b.category), word2)) then + if not word3 or word3 ~= "" and (strfind(strlower(v), word3) or strfind(strlower(b.zone), word3) or strfind(strlower(b.category), word3)) then + if not word4 or word4 ~= "" and (strfind(strlower(v), word4) or strfind(strlower(b.zone), word4) or strfind(strlower(b.category), word4)) then + if not word5 or word5 ~= "" and (strfind(strlower(v), word5) or strfind(strlower(b.zone), word5) or strfind(strlower(b.category), word5)) then + -- Show category + if not hash[b.category] then + tinsert(ListData, "|cffffffff") + if b.category == e then + -- No category so just show ZoneList entry (such as Various) + tinsert(ListData, "|cffffd800" .. e) + else + -- Category exists so show that + tinsert(ListData, "|cffffd800" .. e .. ": " .. b.category) + end + hash[b.category] = true + end + -- Show track + tinsert(ListData, "|Cffffffaa" .. b.zone .. " |r" .. v) + trackCount = trackCount + 1 + hash[v] = true + end + end + end + end + end + end + end + end + end + end + + -- Set results tag + if trackCount == 1 then + ListData[2] = "|cffffffaa{" .. trackCount .. " " .. L["result"] .. "}" + else + ListData[2] = "|cffffffaa{" .. trackCount .. " " .. L["results"] .. "}" + end + end + -- Refresh the track listing + UpdateList() + -- Set track listing to top + scrollFrame:SetVerticalScroll(0) + end + + -- Populate ListData when editbox is changed by user + sBox:HookScript("OnTextChanged", function(self, userInput) + if userInput then + -- Show search page + conbtn[L["Search"]]:Click() + -- If search results are currently playing, stop playback since search results will be changed + if LastFolder == L["Search"] then stopBtn:Click() end + -- Show search results + ShowSearchResults() + end + end) + + -- Populate ListData when editbox enter key is pressed + sBox:HookScript("OnEnterPressed", function() + -- Show search page + conbtn[L["Search"]]:Click() + -- If search results are currently playing, stop playback since search results will be changed + if LastFolder == L["Search"] then stopBtn:Click() end + -- Show search results + ShowSearchResults() + end) + + -- Function to show random track listing + local function ShowRandomList() + -- If random track is currently playing, stop playback since random track list will be changed + if LastFolder == L["Random"] then + stopBtn:Click() + end + -- Wipe the track listing for random + wipe(ListData) + -- Set the track list heading + ListData[1] = "|cffffd800" .. L["Random"] + ListData[2] = "|Cffffffaa{" .. L["click here for new selection"] .. "}" -- Must be capital |C + ListData[3] = "|cffffd800" + ListData[4] = "|cffffd800" .. L["Selection of music tracks"] -- Must be lower case |c + -- Populate list data until it contains desired number of tracks + while #ListData < 50 do + -- Get random category + local rCategory = GetRandomArgument(L["Zones"], L["Dungeons"], L["Various"]) + -- Get random zone within category + local rZone = random(1, #ZoneList[rCategory]) + -- Get random track within zone + local rTrack = ZoneList[rCategory][rZone].tracks[random(1, #ZoneList[rCategory][rZone].tracks)] + -- Insert track into ListData if it's not a duplicate or on the banned list + if rTrack and rTrack ~= "" and strfind(rTrack, "#") and not tContains(ListData, "|Cffffffaa" .. ZoneList[rCategory][rZone].zone .. " |r" .. rTrack) then + if not tContains(randomBannedList, L[ZoneList[rCategory][rZone].zone]) and not tContains(randomBannedList, rTrack) then + tinsert(ListData, "|Cffffffaa" .. ZoneList[rCategory][rZone].zone .. " |r" .. rTrack) + end + end + end + -- Refresh the track listing + UpdateList() + -- Set track listing to top + scrollFrame:SetVerticalScroll(0) + end + + -- Show random track listing on startup when random button is clicked + for q, w in pairs(ZoneList) do + if conbtn[w] then + conbtn[w]:HookScript("OnClick", function() + if w == L["Random"] then + -- Generate initial playlist for first run + if #ListData == 0 then + ShowRandomList() + end + end + end) + end + end + + -- Create list items + scrollFrame.buttons = {} + for i = 1, numButtons do + scrollFrame.buttons[i] = CreateFrame("Button", nil, LeaPlusLC["Page9"]) + local button = scrollFrame.buttons[i] + + button:SetSize(470 - 14, 16) + button:SetNormalFontObject("GameFontHighlightLeft") + button:SetPoint("TOPLEFT", 246, -62+ -(i - 1) * 16 - 8) + + -- Create highlight bar texture + button.t = button:CreateTexture(nil, "BACKGROUND") + button.t:SetPoint("TOPLEFT", button, 0, 0) + button.t:SetSize(516, 16) + + -- button.t:SetColorTexture(0.3, 0.3, 0.0, 0.8) + button.t:SetAlpha(0.7) + button.t:Hide() + + -- Create last playing highlight bar texture + button.s = button:CreateTexture(nil, "BACKGROUND") + button.s:SetPoint("TOPLEFT", button, 0, 0) + button.s:SetSize(516, 16) + + -- button.s:SetColorTexture(0.3, 0.4, 0.00, 0.6) + button.s:Hide() + + button:SetScript("OnEnter", function() + -- Highlight links only + if not string.match(button:GetText() or "", "|c") then + button.t:Show() + end + end) + + button:SetScript("OnLeave", function() + button.t:Hide() + end) + + button:RegisterForClicks("LeftButtonUp", "RightButtonUp") + + -- Handler for playing next SoundKit track in playlist + uframe:SetScript("OnEvent", function(self, event, stoppedHandle) + if event == "SOUNDKIT_FINISHED" then + -- Do nothing if stopped sound kit handle doesnt match last played track handle + if LastMusicHandle and LastMusicHandle ~= stoppedHandle then return end + -- Reset track number if playlist has reached the end + if tracknumber == #playlist then tracknumber = 1 end + -- Play next track + PlayTrack() + elseif event == "LOADING_SCREEN_DISABLED" then + -- Restart player if it stopped between tracks during loading screen + if playlist and tracknumber and playlist[tracknumber] and not willPlay and not musicHandle then + tracknumber = tracknumber - 1 + LibCompat.After(0.1, PlayTrack) + end + end + end) + + -- Click handler for track, zone and back button + button:SetScript("OnClick", function(self, btn) + if btn == "LeftButton" then + -- Remove focus from search box + sBox:ClearFocus() + -- Get clicked track text + local item = self:GetText() + -- Do nothing if its a blank line or informational heading + if not item or strfind(item, "|c") then return end + if item == "|Cffffffaa{" .. L["click here for new selection"] .. "}" then -- must be capital |C + -- Create new random track listing + ShowRandomList() + return + elseif strfind(item, "#") then + -- Enable sound if required + if GetCVar("Sound_EnableAllSound") == "0" then SetCVar("Sound_EnableAllSound", "1") end + -- Disable music if it's currently enabled + if GetCVar("Sound_EnableMusic") == "1" then SetCVar("Sound_EnableMusic", "0") end + -- Add all tracks to playlist + wipe(playlist) + local StartItem = 0 + -- Get item clicked row number + for index = 1, #ListData do + local item = ListData[index] + if self:GetText() == item then StartItem = index end + end + -- Add all items from clicked item onwards to playlist + for index = StartItem, #ListData do + local item = ListData[index] + if item then + if strfind(item, "#") then + tinsert(playlist, item) + end + end + end + -- Add all items up to clicked item to playlist + for index = 1, StartItem do + local item = ListData[index] + if item then + if strfind(item, "#") then + tinsert(playlist, item) + end + end + end + -- Enable the stop button + LeaPlusLC:LockItem(stopBtn, false) + -- Set Temp Folder to Random if track is in Random + if ListData[1] == "|cffffd800" .. L["Random"] then TempFolder = L["Random"] end + -- Set Temp Folder to Search if track is in Search + if ListData[1] == "|cffffd800" .. L["Search"] then TempFolder = L["Search"] end + -- Store information about the track we are about to play + tracknumber = 1 + LastPlayed = item + LastFolder = TempFolder + HeadingOfClickedTrack = ListData[1] + -- Play first track + PlayTrack() + -- Play subsequent tracks + uframe:RegisterEvent("SOUNDKIT_FINISHED") + uframe:RegisterEvent("LOADING_SCREEN_DISABLED") + return + elseif strfind(item, "|r") then + -- A movie was clicked + local movieName, movieID = item:match("([^,]+)%|r([^,]+)") + movieID = strtrim(movieID, "()") + if IsMoviePlayable(movieID) then + stopBtn:Click() + MovieFrame_PlayMovie(MovieFrame, movieID) + else + LeaPlusLC:Print("Movie not playable.") + end + return + else + -- A zone was clicked so show track listing + ZonePage = scrollFrame:GetVerticalScroll() + -- Find the track listing for the clicked zone + for q, w in pairs(ZoneList) do + for k, v in pairs(ZoneList[w]) do + if item == v.zone then + -- Show track listing + TempFolder = item + LeaPlusDB["MusicZone"] = item + ListData = v.tracks + UpdateList() + -- Hide hover highlight if track under pointer is a heading + if strfind(scrollFrame.buttons[i]:GetText(), "|c") then + scrollFrame.buttons[i].t:Hide() + end + -- Show top of track list + scrollFrame:SetVerticalScroll(0) + return + end + end + end + end + elseif btn == "RightButton" then + -- Back button was clicked + BackClick() + end + end) + + end + + -- Right-click to go back (from anywhere on the main content area of the panel) + LeaPlusLC["PageF"]:HookScript("OnMouseUp", function(self, btn) + if LeaPlusLC["Page9"]:IsShown() and LeaPlusLC["Page9"]:IsMouseOver(0, 0, 0, -440) == false and LeaPlusLC["Page9"]:IsMouseOver(-330, 0, 0, 0) == false then + if btn == "RightButton" then + BackClick() + end + end + end) + + -- Delete the global scroll frame pointer + _G.LeaPlusScrollFrame = nil + + -- Set zone listing on startup + if LeaPlusDB["MusicContinent"] and LeaPlusDB["MusicContinent"] ~= "" then + -- Saved music continent exists + if conbtn[LeaPlusDB["MusicContinent"]] then + -- Saved continent is valid button so click it + conbtn[LeaPlusDB["MusicContinent"]]:Click() + else + -- Saved continent is not valid button so click default button + conbtn[L["Zones"]]:Click() + end + else + -- Saved music continent does not exist so click default button + conbtn[L["Zones"]]:Click() + end + UpdateList() + + -- Manage events + LeaPlusLC["Page9"]:RegisterEvent("PLAYER_LOGOUT") + LeaPlusLC["Page9"]:RegisterEvent("UI_SCALE_CHANGED") + LeaPlusLC["Page9"]:SetScript("OnEvent", function(self, event) + if event == "PLAYER_LOGOUT" then + -- Stop playing at reload or logout + if musicHandle then + StopSound(musicHandle) + end + elseif event == "UI_SCALE_CHANGED" then + -- Refresh list + UpdateList() + end + end) + + end + + -- Run on startup + LeaPlusLC:MediaFunc() + + -- Release memory + LeaPlusLC.MediaFunc = nil + + ---------------------------------------------------------------------- + -- Panel alpha + ---------------------------------------------------------------------- + + -- Function to set panel alpha + local function SetPlusAlpha() + -- Set panel alpha + LeaPlusLC["PageF"].t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + -- Show formatted value + LeaPlusCB["PlusPanelAlpha"].f:SetFormattedText("%.0f%%", LeaPlusLC["PlusPanelAlpha"] * 100) + end + + -- Set alpha on startup + SetPlusAlpha() + + -- Set alpha after changing slider + LeaPlusCB["PlusPanelAlpha"]:HookScript("OnValueChanged", SetPlusAlpha) + + ---------------------------------------------------------------------- + -- Panel scale + ---------------------------------------------------------------------- + + -- Function to set panel scale + local function SetPlusScale() + -- Reset panel position + LeaPlusLC["MainPanelA"], LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = "CENTER", "CENTER", 0, 0 + if LeaPlusLC["PageF"]:IsShown() then + LeaPlusLC["PageF"]:Hide() + LeaPlusLC["PageF"]:Show() + end + -- Set panel scale + LeaPlusLC["PageF"]:SetScale(LeaPlusLC["PlusPanelScale"]) + -- Update music player highlight bar scale + LeaPlusLC:UpdateList() + end + + -- Set scale on startup + LeaPlusLC["PageF"]:SetScale(LeaPlusLC["PlusPanelScale"]) + + -- Set scale and reset panel position after changing slider + LeaPlusCB["PlusPanelScale"]:HookScript("OnMouseUp", SetPlusScale) + LeaPlusCB["PlusPanelScale"]:HookScript("OnMouseWheel", SetPlusScale) + + -- Show formatted slider value + LeaPlusCB["PlusPanelScale"]:HookScript("OnValueChanged", function() + LeaPlusCB["PlusPanelScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["PlusPanelScale"] * 100) + end) + + ---------------------------------------------------------------------- + -- Options panel + ---------------------------------------------------------------------- + + -- Hide Leatrix Plus if game options panel is shown + InterfaceOptionsFrame:HookScript("OnShow", LeaPlusLC.HideFrames); + VideoOptionsFrame:HookScript("OnShow", LeaPlusLC.HideFrames); + + ---------------------------------------------------------------------- + -- Block friend requests + ---------------------------------------------------------------------- + + -- Function to decline friend requests + local function DeclineReqs() + if LeaPlusLC["NoFriendRequests"] == "On" then + for i = BNGetNumFriendInvites(), 1, -1 do + local id, player = BNGetFriendInviteInfo(i) + if id and player then + BNDeclineFriendInvite(id) + LibCompat.After(0.1, function() + LeaPlusLC:Print(L["A friend request from"] .. " " .. player .. " " .. L["was automatically declined."]) + end) + end + end + end + end + + -- Event frame for incoming friend requests + local DecEvt = CreateFrame("FRAME") + DecEvt:SetScript("OnEvent", DeclineReqs) + + -- Function to register or unregister the event + local function ControlEvent() + if LeaPlusLC["NoFriendRequests"] == "On" then + DecEvt:RegisterEvent("BN_FRIEND_INVITE_ADDED") + DeclineReqs() + else + DecEvt:UnregisterEvent("BN_FRIEND_INVITE_ADDED") + end + end + + -- Set event status when option is enabled + LeaPlusCB["NoFriendRequests"]:HookScript("OnClick", ControlEvent) + + -- Set event status on startup + ControlEvent() + + ---------------------------------------------------------------------- + -- Invite from whisper (configuration panel) + ---------------------------------------------------------------------- + + -- Create configuration panel + local InvPanel = LeaPlusLC:CreatePanel("Invite from whispers", "InvPanel") + + -- Add editbox + LeaPlusLC:MakeTx(InvPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(InvPanel, "InviteFriendsOnly", "Restrict to friends", 16, -92, false, "If checked, group invites will only be sent to friends.|n|nIf unchecked, group invites will be sent to everyone.") + + LeaPlusLC:MakeTx(InvPanel, "Keyword", 356, -72) + local KeyBox = LeaPlusLC:CreateEditBox("KeyBox", InvPanel, 140, 10, "TOPLEFT", 356, -92, "KeyBox", "KeyBox") + + -- Function to show the keyword in the option tooltip + local function SetKeywordTip() + LeaPlusCB["InviteFromWhisper"].tiptext = gsub(LeaPlusCB["InviteFromWhisper"].tiptext, "(|cffffffff)[^|]*(|r)", "%1" .. LeaPlusLC["InvKey"] .. "%2") + end + + -- Function to save the keyword + local function SetInvKey() + local keytext = KeyBox:GetText() + if keytext and keytext ~= "" then + LeaPlusLC["InvKey"] = strtrim(KeyBox:GetText()) + else + LeaPlusLC["InvKey"] = "inv" + end + -- Show the keyword in the option tooltip + SetKeywordTip() + end + + -- Show the keyword in the option tooltip on startup + SetKeywordTip() + + -- Save the keyword when it changes + KeyBox:SetScript("OnTextChanged", SetInvKey) + + -- Refresh editbox with trimmed keyword when edit focus is lost (removes additional spaces) + KeyBox:SetScript("OnEditFocusLost", function() + KeyBox:SetText(LeaPlusLC["InvKey"]) + end) + + -- Help button hidden + InvPanel.h:Hide() + + -- Back button handler + InvPanel.b:SetScript("OnClick", function() + -- Save the keyword + SetInvKey() + -- Show the options panel + InvPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page2"]:Show() + return + end) + + -- Add reset button + InvPanel.r:SetScript("OnClick", function() + -- Settings + LeaPlusLC["InviteFriendsOnly"] = "Off" + -- Reset the keyword to default + LeaPlusLC["InvKey"] = "inv" + -- Set the editbox to default + KeyBox:SetText("inv") + -- Save the keyword + SetInvKey() + -- Refresh panel + InvPanel:Hide(); InvPanel:Show() + end) + + -- Ensure keyword is a string on startup + LeaPlusLC["InvKey"] = tostring(LeaPlusLC["InvKey"]) or "inv" + + -- Set editbox value when shown + KeyBox:HookScript("OnShow", function() + KeyBox:SetText(LeaPlusLC["InvKey"]) + end) + + -- Configuration button handler + LeaPlusCB["InvWhisperBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["InviteFriendsOnly"] = "On" + LeaPlusLC["InvKey"] = "inv" + KeyBox:SetText(LeaPlusLC["InvKey"]) + SetInvKey() + else + -- Show panel + InvPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + ---------------------------------------------------------------------- + -- Final code for RunOnce + ---------------------------------------------------------------------- + + -- Update addon memory usage (speeds up initial value) + UpdateAddOnMemoryUsage(); + + -- Release memory + LeaPlusLC.RunOnce = nil + + end + +---------------------------------------------------------------------- +-- L60: Default events +---------------------------------------------------------------------- + + local function eventHandler(self, event, arg1, arg2, ...) + + ---------------------------------------------------------------------- + -- Invite from whisper + ---------------------------------------------------------------------- + + if event == "CHAT_MSG_WHISPER" or event == "CHAT_MSG_BN_WHISPER" then + if (not UnitExists("party1") or UnitIsGroupLeader("player") or UnitIsGroupAssistant("player")) and strlower(strtrim(arg1)) == strlower(LeaPlusLC["InvKey"]) then + if not LeaPlusLC:IsInLFGQueue() then + if event == "CHAT_MSG_WHISPER" then + local void, void, void, void, viod, void, void, void, void, guid = ... + if LeaPlusLC:FriendCheck(arg2, guid) or LeaPlusLC["InviteFriendsOnly"] == "Off" then + InviteUnit(arg2) + end + elseif event == "CHAT_MSG_BN_WHISPER" then + local presenceID = select(11, ...) + if presenceID and BNIsFriend(presenceID) then + local index = BNGetFriendIndex(presenceID) + if index then + local accountInfo = C_BattleNet.GetFriendAccountInfo(index) + local gameAccountInfo = accountInfo.gameAccountInfo + local gameAccountID = gameAccountInfo.gameAccountID + if gameAccountID then + BNInviteFriend(gameAccountID) + end + end + end + end + end + end + return + end + + ---------------------------------------------------------------------- + -- Block duel requests + ---------------------------------------------------------------------- + + if event == "DUEL_REQUESTED" and not LeaPlusLC:FriendCheck(arg1) then + CancelDuel() + StaticPopup_Hide("DUEL_REQUESTED") + return + end + + ---------------------------------------------------------------------- + -- Accept summon + ---------------------------------------------------------------------- + + if event == "CONFIRM_SUMMON" then + if not UnitAffectingCombat("player") then + local sName = C_SummonInfo.GetSummonConfirmSummoner() + local sLocation = C_SummonInfo.GetSummonConfirmAreaName() + LeaPlusLC:Print(L["The summon from"] .. " " .. sName .. " (" .. sLocation .. ") " .. L["will be automatically accepted in 10 seconds unless cancelled."]) + LibCompat.After(10, function() + local sNameNew = C_SummonInfo.GetSummonConfirmSummoner() + local sLocationNew = C_SummonInfo.GetSummonConfirmAreaName() + if sName == sNameNew and sLocation == sLocationNew then + -- Automatically accept summon after 10 seconds if summoner name and location have not changed + C_SummonInfo.ConfirmSummon() + StaticPopup_Hide("CONFIRM_SUMMON") + end + end) + end + return + end + + ---------------------------------------------------------------------- + -- Block party invites and party from friends + ---------------------------------------------------------------------- + + if event == "PARTY_INVITE_REQUEST" then + + -- If a friend, accept if you're accepting friends and not in battleground queue + local void, void, void, void, guid = ... + if (LeaPlusLC["AcceptPartyFriends"] == "On" and LeaPlusLC:FriendCheck(arg1, guid)) then + if not LeaPlusLC:IsInLFGQueue() then + AcceptGroup() + for i=1, STATICPOPUP_NUMDIALOGS do + if _G["StaticPopup"..i].which == "PARTY_INVITE" then + _G["StaticPopup"..i].inviteAccepted = 1 + StaticPopup_Hide("PARTY_INVITE") + break + elseif _G["StaticPopup"..i].which == "PARTY_INVITE_XREALM" then + _G["StaticPopup"..i].inviteAccepted = 1 + StaticPopup_Hide("PARTY_INVITE_XREALM") + break + end + end + return + end + end + + -- If not a friend and you're blocking invites, decline + if LeaPlusLC["NoPartyInvites"] == "On" then + if LeaPlusLC:FriendCheck(arg1, guid) then + return + else + DeclineGroup() + StaticPopup_Hide("PARTY_INVITE") + StaticPopup_Hide("PARTY_INVITE_XREALM") + return + end + end + + return + end + + ---------------------------------------------------------------------- + -- Disable loot warnings + ---------------------------------------------------------------------- + + -- Disable warnings for attempting to roll Need on loot + if event == "CONFIRM_LOOT_ROLL" then + ConfirmLootRoll(arg1, arg2) + StaticPopup_Hide("CONFIRM_LOOT_ROLL") + return + end + + -- Disable warning for attempting to loot a Bind on Pickup item + if event == "LOOT_BIND_CONFIRM" then + ConfirmLootSlot(arg1, arg2) + StaticPopup_Hide("LOOT_BIND",...) + return + end + + -- Disable warning for attempting to vendor an item within its refund window + if event == "MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL" then + SellCursorItem() + return + end + + -- Disable warning for attempting to mail an item within its refund window + if event == "MAIL_LOCK_SEND_ITEMS" then + RespondMailLockSendItem(arg1, true) + return + end + + ---------------------------------------------------------------------- + -- Hide the combat log + ---------------------------------------------------------------------- + + if event == "UPDATE_CHAT_WINDOWS" then + ChatFrame2Tab:EnableMouse(false) + ChatFrame2Tab:SetText(" ") -- Needs to be something for chat settings to function + ChatFrame2Tab:SetScale(0.01) + ChatFrame2Tab:SetWidth(0.01) + ChatFrame2Tab:SetHeight(0.01) + end + + ---------------------------------------------------------------------- + -- L62: Profile events + ---------------------------------------------------------------------- + + if event == "ADDON_LOADED" then + if arg1 == "Leatrix_Plus" then + + -- Replace old var names with new ones + local function UpdateVars(oldvar, newvar) + if LeaPlusDB[oldvar] and not LeaPlusDB[newvar] then LeaPlusDB[newvar] = LeaPlusDB[oldvar]; LeaPlusDB[oldvar] = nil end + end + + UpdateVars("MuteStriders", "MuteMechSteps") -- 2.5.108 (1st June 2022) + UpdateVars("MinimapMod", "MinimapModder") -- 2.5.120 (24th August 2022) + + -- Automation + LeaPlusLC:LoadVarChk("AutomateQuests", "Off") -- Automate quests + LeaPlusLC:LoadVarChk("AutoQuestShift", "Off") -- Automate quests requires shift + LeaPlusLC:LoadVarChk("AutoQuestAvailable", "On") -- Accept available quests + LeaPlusLC:LoadVarChk("AutoQuestCompleted", "On") -- Turn-in completed quests + LeaPlusLC:LoadVarNum("AutoQuestKeyMenu", 1, 1, 4) -- Automate quests override key + LeaPlusLC:LoadVarChk("AutomateGossip", "Off") -- Automate gossip + LeaPlusLC:LoadVarChk("AutoAcceptSummon", "Off") -- Accept summon + LeaPlusLC:LoadVarChk("AutoAcceptRes", "Off") -- Accept resurrection + LeaPlusLC:LoadVarChk("AutoResNoCombat", "On") -- Accept resurrection exclude combat + LeaPlusLC:LoadVarChk("AutoReleasePvP", "Off") -- Release in PvP + LeaPlusLC:LoadVarChk("AutoReleaseNoAlterac", "Off") -- Release in PvP Exclude Alterac Valley + LeaPlusLC:LoadVarNum("AutoReleaseDelay", 200, 200, 3000) -- Release in PvP Delay + + LeaPlusLC:LoadVarChk("AutoSellJunk", "Off") -- Sell junk automatically + LeaPlusLC:LoadVarChk("AutoSellShowSummary", "On") -- Sell junk summary in chat + LeaPlusLC:LoadVarStr("AutoSellExcludeList", "") -- Sell junk exclude list + LeaPlusLC:LoadVarChk("AutoRepairGear", "Off") -- Repair automatically + LeaPlusLC:LoadVarChk("AutoRepairGuildFunds", "On") -- Repair using guild funds + LeaPlusLC:LoadVarChk("AutoRepairShowSummary", "On") -- Repair show summary in chat + + -- Social + LeaPlusLC:LoadVarChk("NoDuelRequests", "Off") -- Block duels + LeaPlusLC:LoadVarChk("NoPartyInvites", "Off") -- Block party invites + LeaPlusLC:LoadVarChk("NoFriendRequests", "Off") -- Block friend requests + LeaPlusLC:LoadVarChk("NoSharedQuests", "Off") -- Block shared quests + + LeaPlusLC:LoadVarChk("AcceptPartyFriends", "Off") -- Party from friends + LeaPlusLC:LoadVarChk("InviteFromWhisper", "Off") -- Invite from whispers + LeaPlusLC:LoadVarChk("InviteFriendsOnly", "Off") -- Restrict invites to friends + LeaPlusLC["InvKey"] = LeaPlusDB["InvKey"] or "inv" -- Invite from whisper keyword + LeaPlusLC:LoadVarChk("FriendlyGuild", "On") -- Friendly guild + + -- Chat + LeaPlusLC:LoadVarChk("UseEasyChatResizing", "Off") -- Use easy resizing + LeaPlusLC:LoadVarChk("NoCombatLogTab", "Off") -- Hide the combat log + LeaPlusLC:LoadVarChk("NoChatButtons", "Off") -- Hide chat buttons + LeaPlusLC:LoadVarChk("UnclampChat", "Off") -- Unclamp chat frame + LeaPlusLC:LoadVarChk("MoveChatEditBoxToTop", "Off") -- Move editbox to top + LeaPlusLC:LoadVarChk("MoreFontSizes", "Off") -- More font sizes + + LeaPlusLC:LoadVarChk("NoStickyChat", "Off") -- Disable sticky chat + LeaPlusLC:LoadVarChk("UseArrowKeysInChat", "Off") -- Use arrow keys in chat + LeaPlusLC:LoadVarChk("NoChatFade", "Off") -- Disable chat fade + LeaPlusLC:LoadVarChk("UnivGroupColor", "Off") -- Universal group color + LeaPlusLC:LoadVarChk("ClassColorsInChat", "Off") -- Use class colors in chat + LeaPlusLC:LoadVarChk("RecentChatWindow", "Off") -- Recent chat window + LeaPlusLC:LoadVarNum("RecentChatSize", 170, 170, 600) -- Recent chat size + LeaPlusLC:LoadVarChk("MaxChatHstory", "Off") -- Increase chat history + LeaPlusLC:LoadVarChk("FilterChatMessages", "Off") -- Filter chat messages + LeaPlusLC:LoadVarChk("BlockSpellLinks", "Off") -- Block spell links + LeaPlusLC:LoadVarChk("BlockDrunkenSpam", "Off") -- Block drunken spam + LeaPlusLC:LoadVarChk("BlockDuelSpam", "Off") -- Block duel spam + LeaPlusLC:LoadVarChk("RestoreChatMessages", "Off") -- Restore chat messages + + -- Text + LeaPlusLC:LoadVarChk("HideErrorMessages", "Off") -- Hide error messages + LeaPlusLC:LoadVarChk("NoHitIndicators", "Off") -- Hide portrait text + LeaPlusLC:LoadVarChk("HideZoneText", "Off") -- Hide zone text + LeaPlusLC:LoadVarChk("HideKeybindText", "Off") -- Hide keybind text + LeaPlusLC:LoadVarChk("HideMacroText", "Off") -- Hide macro text + + LeaPlusLC:LoadVarChk("MailFontChange", "Off") -- Resize mail text + LeaPlusLC:LoadVarNum("LeaPlusMailFontSize", 15, 10, 36) -- Mail text slider + + LeaPlusLC:LoadVarChk("QuestFontChange", "Off") -- Resize quest text + LeaPlusLC:LoadVarNum("LeaPlusQuestFontSize", 12, 10, 36) -- Quest text slider + + LeaPlusLC:LoadVarChk("BookFontChange", "Off") -- Resize book text + LeaPlusLC:LoadVarNum("LeaPlusBookFontSize", 15, 10, 36) -- Book text slider + + -- Interface + LeaPlusLC:LoadVarChk("MinimapModder", "Off") -- Enhance minimap + LeaPlusLC:LoadVarChk("SquareMinimap", "Off") -- Square minimap + LeaPlusLC:LoadVarChk("ShowWhoPinged", "On") -- Show who pinged + LeaPlusLC:LoadVarChk("CombineAddonButtons", "Off") -- Combine addon buttons + LeaPlusLC:LoadVarStr("MiniExcludeList", "") -- Minimap exclude list + LeaPlusLC:LoadVarChk("HideMiniZoomBtns", "Off") -- Hide zoom buttons + LeaPlusLC:LoadVarChk("HideMiniZoneText", "Off") -- Hide the zone text bar + LeaPlusLC:LoadVarChk("HideMiniAddonButtons", "On") -- Hide addon buttons + LeaPlusLC:LoadVarChk("HideMiniMapButton", "On") -- Hide the world map button + LeaPlusLC:LoadVarChk("HideMiniTracking", "Off") -- Hide the tracking button + LeaPlusLC:LoadVarNum("MinimapScale", 1, 1, 4) -- Minimap scale slider + LeaPlusLC:LoadVarNum("MinimapSize", 140, 140, 560) -- Minimap size slider + LeaPlusLC:LoadVarNum("MiniClusterScale", 1, 1, 2) -- Minimap cluster scale + LeaPlusLC:LoadVarChk("MinimapNoScale", "Off") -- Minimap not minimap + LeaPlusLC:LoadVarAnc("MinimapA", "TOPRIGHT") -- Minimap anchor + LeaPlusLC:LoadVarAnc("MinimapR", "TOPRIGHT") -- Minimap relative + LeaPlusLC:LoadVarNum("MinimapX", -17, -5000, 5000) -- Minimap X + LeaPlusLC:LoadVarNum("MinimapY", -22, -5000, 5000) -- Minimap Y + LeaPlusLC:LoadVarChk("TipModEnable", "Off") -- Enhance tooltip + LeaPlusLC:LoadVarChk("TipShowRank", "On") -- Show rank + LeaPlusLC:LoadVarChk("TipShowOtherRank", "Off") -- Show rank for other guilds + LeaPlusLC:LoadVarChk("TipShowTarget", "On") -- Show target + LeaPlusLC:LoadVarChk("TipHideInCombat", "Off") -- Hide tooltips during combat + LeaPlusLC:LoadVarChk("TipHideShiftOverride", "On") -- Hide tooltips shift override + LeaPlusLC:LoadVarChk("TipNoHealthBar", "Off") -- Hide health bar + LeaPlusLC:LoadVarNum("LeaPlusTipSize", 1.00, 0.50, 2.00) -- Tooltip scale slider + LeaPlusLC:LoadVarNum("TipOffsetX", -13, -5000, 5000) -- Tooltip X offset + LeaPlusLC:LoadVarNum("TipOffsetY", 94, -5000, 5000) -- Tooltip Y offset + LeaPlusLC:LoadVarNum("TooltipAnchorMenu", 1, 1, 5) -- Tooltip anchor menu + LeaPlusLC:LoadVarNum("TipCursorX", 0, -128, 128) -- Tooltip cursor X offset + LeaPlusLC:LoadVarNum("TipCursorY", 0, -128, 128) -- Tooltip cursor Y offset + + LeaPlusLC:LoadVarChk("EnhanceDressup", "Off") -- Enhance dressup + LeaPlusLC:LoadVarChk("DressupItemButtons", "On") -- Dressup item buttons + LeaPlusLC:LoadVarChk("DressupAnimControl", "On") -- Dressup animation control + LeaPlusLC:LoadVarChk("HideDressupStats", "Off") -- Hide dressup stats + LeaPlusLC:LoadVarChk("EnhanceQuestLog", "Off") -- Enhance quest log + LeaPlusLC:LoadVarChk("EnhanceQuestHeaders", "On") -- Enhance quest log toggle headers + LeaPlusLC:LoadVarChk("EnhanceQuestLevels", "On") -- Enhance quest log quest levels + LeaPlusLC:LoadVarChk("EnhanceQuestDifficulty", "On") -- Enhance quest log quest difficulty + LeaPlusLC:LoadVarChk("EnhanceProfessions", "Off") -- Enhance professions + LeaPlusLC:LoadVarChk("EnhanceTrainers", "Off") -- Enhance trainers + LeaPlusLC:LoadVarChk("ShowTrainAllBtn", "On") -- Enhance trainers train all button + + LeaPlusLC:LoadVarChk("ShowVolume", "Off") -- Show volume slider + LeaPlusLC:LoadVarChk("AhExtras", "Off") -- Show auction controls + LeaPlusLC:LoadVarChk("AhBuyoutOnly", "Off") -- Auction buyout only + LeaPlusLC:LoadVarChk("AhGoldOnly", "Off") -- Auction gold only + + LeaPlusLC:LoadVarChk("ShowCooldowns", "Off") -- Show cooldowns + LeaPlusLC:LoadVarChk("ShowCooldownID", "On") -- Show cooldown ID in tips + LeaPlusLC:LoadVarChk("NoCooldownDuration", "On") -- Hide cooldown duration + LeaPlusLC:LoadVarChk("CooldownsOnPlayer", "Off") -- Anchor to player + LeaPlusLC:LoadVarChk("DurabilityStatus", "Off") -- Show durability status + LeaPlusLC:LoadVarChk("ShowVanityControls", "Off") -- Show vanity controls + LeaPlusLC:LoadVarChk("VanityAltLayout", "Off") -- Vanity alternative layout + LeaPlusLC:LoadVarChk("ShowBagSearchBox", "Off") -- Show bag search box + LeaPlusLC:LoadVarChk("ShowRaidToggle", "Off") -- Show raid button + LeaPlusLC:LoadVarChk("ShowPlayerChain", "Off") -- Show player chain + LeaPlusLC:LoadVarNum("PlayerChainMenu", 2, 1, 3) -- Player chain dropdown value + LeaPlusLC:LoadVarChk("ShowReadyTimer", "Off") -- Show ready timer + LeaPlusLC:LoadVarChk("ShowWowheadLinks", "Off") -- Show Wowhead links + LeaPlusLC:LoadVarChk("WowheadLinkComments", "Off") -- Show Wowhead links to comments + + LeaPlusLC:LoadVarChk("ShowFlightTimes", "Off") -- Show flight times + LeaPlusLC:LoadVarChk("FlightBarBackground", "On") -- Show flight times bar background + LeaPlusLC:LoadVarChk("FlightBarDestination", "On") -- Show flight times bar destination + LeaPlusLC:LoadVarChk("FlightBarFillBar", "Off") -- Show flight times bar fill mode + LeaPlusLC:LoadVarChk("FlightBarSpeech", "Off") -- Show flight times bar speech + + LeaPlusLC:LoadVarChk("FlightBarContribute", "On") -- Show flight times contribute + LeaPlusLC:LoadVarAnc("FlightBarA", "TOP") -- Show flight times anchor + LeaPlusLC:LoadVarAnc("FlightBarR", "TOP") -- Show flight times relative + LeaPlusLC:LoadVarNum("FlightBarX", 0, -5000, 5000) -- Show flight position X + LeaPlusLC:LoadVarNum("FlightBarY", -66, -5000, 5000) -- Show flight position Y + LeaPlusLC:LoadVarNum("FlightBarScale", 2, 1, 5) -- Show flight times bar scale + LeaPlusLC:LoadVarNum("FlightBarWidth", 230, 40, 460) -- Show flight times bar width + + -- Frames + LeaPlusLC:LoadVarChk("FrmEnabled", "Off") -- Manage frames + + LeaPlusLC:LoadVarChk("ManageBuffs", "Off") -- Manage buffs + LeaPlusLC:LoadVarAnc("BuffFrameA", "TOPRIGHT") -- Manage buffs anchor + LeaPlusLC:LoadVarAnc("BuffFrameR", "TOPRIGHT") -- Manage buffs relative + LeaPlusLC:LoadVarNum("BuffFrameX", -205, -5000, 5000) -- Manage buffs position X + LeaPlusLC:LoadVarNum("BuffFrameY", -13, -5000, 5000) -- Manage buffs position Y + LeaPlusLC:LoadVarNum("BuffFrameScale", 1, 0.5, 2) -- Manage buffs scale + + LeaPlusLC:LoadVarChk("ManageWidget", "Off") -- Manage widget + LeaPlusLC:LoadVarAnc("WidgetA", "TOP") -- Manage widget anchor + LeaPlusLC:LoadVarAnc("WidgetR", "TOP") -- Manage widget relative + LeaPlusLC:LoadVarNum("WidgetX", 0, -5000, 5000) -- Manage widget position X + LeaPlusLC:LoadVarNum("WidgetY", -15, -5000, 5000) -- Manage widget position Y + LeaPlusLC:LoadVarNum("WidgetScale", 1, 0.5, 2) -- Manage widget scale + + LeaPlusLC:LoadVarChk("ManageFocus", "Off") -- Manage focus + LeaPlusLC:LoadVarAnc("FocusA", "CENTER") -- Manage focus anchor + LeaPlusLC:LoadVarAnc("FocusR", "CENTER") -- Manage focus relative + LeaPlusLC:LoadVarNum("FocusX", 0, -5000, 5000) -- Manage focus position X + LeaPlusLC:LoadVarNum("FocusY", 0, -5000, 5000) -- Manage focus position Y + LeaPlusLC:LoadVarNum("FocusScale", 1, 0.5, 2) -- Manage focus scale + + LeaPlusLC:LoadVarChk("ManageTimer", "Off") -- Manage timer + LeaPlusLC:LoadVarAnc("TimerA", "TOP") -- Manage timer anchor + LeaPlusLC:LoadVarAnc("TimerR", "TOP") -- Manage timer relative + LeaPlusLC:LoadVarNum("TimerX", -5, -5000, 5000) -- Manage timer position X + LeaPlusLC:LoadVarNum("TimerY", -96, -5000, 5000) -- Manage timer position Y + LeaPlusLC:LoadVarNum("TimerScale", 1, 0.5, 2) -- Manage timer scale + + LeaPlusLC:LoadVarChk("ManageDurability", "Off") -- Manage durability + LeaPlusLC:LoadVarAnc("DurabilityA", "TOPRIGHT") -- Manage durability anchor + LeaPlusLC:LoadVarAnc("DurabilityR", "TOPRIGHT") -- Manage durability relative + LeaPlusLC:LoadVarNum("DurabilityX", 0, -5000, 5000) -- Manage durability position X + LeaPlusLC:LoadVarNum("DurabilityY", -192, -5000, 5000) -- Manage durability position Y + LeaPlusLC:LoadVarNum("DurabilityScale", 1, 0.5, 2) -- Manage durability scale + + LeaPlusLC:LoadVarChk("ManageVehicle", "Off") -- Manage vehicle + LeaPlusLC:LoadVarAnc("VehicleA", "TOPRIGHT") -- Manage vehicle anchor + LeaPlusLC:LoadVarAnc("VehicleR", "TOPRIGHT") -- Manage vehicle relative + LeaPlusLC:LoadVarNum("VehicleX", -100, -5000, 5000) -- Manage vehicle position X + LeaPlusLC:LoadVarNum("VehicleY", -192, -5000, 5000) -- Manage vehicle position Y + LeaPlusLC:LoadVarNum("VehicleScale", 1, 0.5, 2) -- Manage vehicle scale + + LeaPlusLC:LoadVarChk("ClassColFrames", "Off") -- Class colored frames + LeaPlusLC:LoadVarChk("ClassColPlayer", "On") -- Class colored player frame + LeaPlusLC:LoadVarChk("ClassColTarget", "On") -- Class colored target frame + + LeaPlusLC:LoadVarChk("NoAlerts", "Off") -- Hide alerts + LeaPlusLC:LoadVarChk("NoGryphons", "Off") -- Hide gryphons + LeaPlusLC:LoadVarChk("NoClassBar", "Off") -- Hide stance bar + + -- System + LeaPlusLC:LoadVarChk("NoScreenGlow", "Off") -- Disable screen glow + LeaPlusLC:LoadVarChk("NoScreenEffects", "Off") -- Disable screen effects + LeaPlusLC:LoadVarChk("SetWeatherDensity", "Off") -- Set weather density + LeaPlusLC:LoadVarNum("WeatherLevel", 3, 0, 3) -- Weather density level + LeaPlusLC:LoadVarChk("MaxCameraZoom", "Off") -- Max camera zoom + LeaPlusLC:LoadVarChk("ViewPortEnable", "Off") -- Enable viewport + LeaPlusLC:LoadVarNum("ViewPortTop", 0, 0, 300) -- Top border + LeaPlusLC:LoadVarNum("ViewPortBottom", 0, 0, 300) -- Bottom border + LeaPlusLC:LoadVarNum("ViewPortLeft", 0, 0, 300) -- Left border + LeaPlusLC:LoadVarNum("ViewPortRight", 0, 0, 300) -- Right border + LeaPlusLC:LoadVarNum("ViewPortResizeTop", 0, 0, 300) -- Resize top border + LeaPlusLC:LoadVarNum("ViewPortResizeBottom", 0, 0, 300) -- Resize bottom border + LeaPlusLC:LoadVarNum("ViewPortAlpha", 0, 0, 0.9) -- Border alpha + + LeaPlusLC:LoadVarChk("NoRestedEmotes", "Off") -- Silence rested emotes + LeaPlusLC:LoadVarChk("MuteGameSounds", "Off") -- Mute game sounds + LeaPlusLC:LoadVarChk("MuteCustomSounds", "Off") -- Mute custom sounds + LeaPlusLC:LoadVarStr("MuteCustomList", "") -- Mute custom sounds list + + LeaPlusLC:LoadVarChk("NoBagAutomation", "Off") -- Disable bag automation + LeaPlusLC:LoadVarChk("CharAddonList", "Off") -- Show character addons + LeaPlusLC:LoadVarChk("NoConfirmLoot", "Off") -- Disable loot warnings + LeaPlusLC:LoadVarChk("FasterLooting", "Off") -- Faster auto loot + LeaPlusLC:LoadVarChk("FasterMovieSkip", "Off") -- Faster movie skip + LeaPlusLC:LoadVarChk("StandAndDismount", "Off") -- Dismount me + LeaPlusLC:LoadVarChk("DismountNoResource", "On") -- Dismount on resource error + LeaPlusLC:LoadVarChk("DismountNoMoving", "On") -- Dismount on moving + LeaPlusLC:LoadVarChk("DismountNoTaxi", "On") -- Dismount on flight map open + LeaPlusLC:LoadVarChk("DismountShowFormBtn", "On") -- Dismount cancel form button + LeaPlusLC:LoadVarChk("ShowVendorPrice", "Off") -- Show vendor price + LeaPlusLC:LoadVarChk("CombatPlates", "Off") -- Combat plates + LeaPlusLC:LoadVarChk("EasyItemDestroy", "Off") -- Easy item destroy + + -- Settings + LeaPlusLC:LoadVarChk("ShowMinimapIcon", "On") -- Show minimap button + LeaPlusLC:LoadVarNum("PlusPanelScale", 1, 1, 2) -- Panel scale + LeaPlusLC:LoadVarNum("PlusPanelAlpha", 0, 0, 1) -- Panel alpha + + -- Panel position + LeaPlusLC:LoadVarAnc("MainPanelA", "CENTER") -- Panel anchor + LeaPlusLC:LoadVarAnc("MainPanelR", "CENTER") -- Panel relative + LeaPlusLC:LoadVarNum("MainPanelX", 0, -5000, 5000) -- Panel X axis + LeaPlusLC:LoadVarNum("MainPanelY", 0, -5000, 5000) -- Panel Y axis + + -- Start page + LeaPlusLC:LoadVarNum("LeaStartPage", 0, 0, LeaPlusLC["NumberOfPages"]) + + -- Lock conflicting options + do + + -- Function to disable and lock an option and add a note to the tooltip + local function Lock(option, reason, optmodule) + LeaLockList[option] = LeaPlusLC[option] + LeaPlusLC:LockItem(LeaPlusCB[option], true) + LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. "|n|n|cff00AAFF" .. reason + if optmodule then + LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. " " .. optmodule .. " " .. L["module"] + end + LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. "." + -- Remove hover from configuration button if there is one + local temp = {LeaPlusCB[option]:GetChildren()} + if temp and temp[1] and temp[1].t and temp[1].t:GetTexture() == "Interface\\WorldMap\\Gear_64.png" then + temp[1]:SetHighlightTexture(0) + temp[1]:SetScript("OnEnter", nil) + end + end + + -- Disable items that conflict with Glass + if LeaPlusLC.Glass then + local reason = L["Cannot be used with Glass"] + Lock("UseEasyChatResizing", reason) -- Use easy resizing + Lock("NoCombatLogTab", reason) -- Hide the combat log + Lock("NoChatButtons", reason) -- Hide chat buttons + Lock("UnclampChat", reason) -- Unclamp chat frame + Lock("MoveChatEditBoxToTop", reason) -- Move editbox to top + Lock("MoreFontSizes", reason) -- More font sizes + Lock("NoChatFade", reason) -- Disable chat fade + Lock("ClassColorsInChat", reason) -- Use class colors in chat + Lock("RecentChatWindow", reason) -- Recent chat window + end + + -- Disable items that conflict with ElvUI + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI + if E and E.private then + + local reason = L["Cannot be used with ElvUI"] + + -- Chat + if E.private.chat.enable then + Lock("UseEasyChatResizing", reason, "Chat") -- Use easy resizing + Lock("NoCombatLogTab", reason, "Chat") -- Hide the combat log + Lock("NoChatButtons", reason, "Chat") -- Hide chat buttons + Lock("UnclampChat", reason, "Chat") -- Unclamp chat frame + Lock("MoreFontSizes", reason, "Chat") -- More font sizes + Lock("NoStickyChat", reason, "Chat") -- Disable sticky chat + Lock("UseArrowKeysInChat", reason, "Chat") -- Use arrow keys in chat + Lock("NoChatFade", reason, "Chat") -- Disable chat fade + Lock("MaxChatHstory", reason, "Chat") -- Increase chat history + Lock("RestoreChatMessages", reason, "Chat") -- Restore chat messages + end + + -- Minimap + if E.private.general.minimap.enable then + Lock("MinimapModder", reason, "Minimap") -- Enhance minimap + end + + -- UnitFrames + if E.private.unitframe.enable then + Lock("ShowRaidToggle", reason, "UnitFrames") -- Show raid button + end + + -- ActionBars + if E.private.actionbar.enable then + Lock("NoGryphons", reason, "ActionBars") -- Hide gryphons + Lock("NoClassBar", reason, "ActionBars") -- Hide stance bar + Lock("HideKeybindText", reason, "ActionBars") -- Hide keybind text + Lock("HideMacroText", reason, "ActionBars") -- Hide macro text + end + + -- Bags + if E.private.bags.enable then + Lock("NoBagAutomation", reason, "Bags") -- Disable bag automation + Lock("ShowBagSearchBox", reason, "Bags") -- Show bag search box + end + + -- Tooltip + if E.private.tooltip.enable then + Lock("TipModEnable", reason, "Tooltip") -- Enhance tooltip + end + + -- Buffs: Disable Blizzard + if E.private.auras.disableBlizzard then + Lock("ManageBuffs", reason, "Buffs and Debuffs (Disable Blizzard)") -- Manage buffs + end + + -- UnitFrames: Disabled Blizzard: Focus + if E.private.unitframe.disabledBlizzardFrames.focus then + Lock("ManageFocus", reason, "UnitFrames (Disabled Blizzard Frames Focus)") -- Manage focus + end + + -- UnitFrames: Disabled Blizzard: Player + if E.private.unitframe.disabledBlizzardFrames.player then + Lock("ShowPlayerChain", reason, "UnitFrames (Disabled Blizzard Frames Player)") -- Show player chain + Lock("NoHitIndicators", reason, "UnitFrames (Disabled Blizzard Frames Player)") -- Hide portrait numbers + end + + -- UnitFrames: Disabled Blizzard: Player and Target + if E.private.unitframe.disabledBlizzardFrames.player or E.private.unitframe.disabledBlizzardFrames.target then + Lock("FrmEnabled", reason, "UnitFrames (Disabled Blizzard Frames Player and Target)") -- Manage frames + end + + -- UnitFrames: Disabled Blizzard: Player, Target and Focus + if E.private.unitframe.disabledBlizzardFrames.player or E.private.unitframe.disabledBlizzardFrames.target or E.private.unitframe.disabledBlizzardFrames.focus then + Lock("ClassColFrames", reason, "UnitFrames (Disabled Blizzard Frames Player, Target and Focus)") -- Class-colored frames + end + + -- Skins: Blizzard Gossip Frame + if E.private.skins.blizzard.enable and E.private.skins.blizzard.gossip then + Lock("QuestFontChange", reason, "Skins (Blizzard Gossip Frame)") -- Resize quest font + end + + -- Base + do + Lock("ManageWidget", reason) -- Manage widget + Lock("ManageTimer", reason) -- Manage timer + Lock("ManageDurability", reason) -- Manage durability + Lock("ManageVehicle", reason) -- Manage vehicle + end + + end + + EnableAddOn("Leatrix_Plus") + end + + end + + -- Run other startup items + LeaPlusLC:Live() + LeaPlusLC:Isolated() + LeaPlusLC:RunOnce() + LeaPlusLC:SetDim() + + end + return + end + + if event == "PLAYER_LOGIN" then + LeaPlusLC:Player() + collectgarbage() + return + end + + if event == "PLAYER_ENTERING_WORLD" then + LeaPlusLC:World() + LpEvt:UnregisterEvent("PLAYER_ENTERING_WORLD") + return + end + + -- Save locals back to globals on logout + if event == "PLAYER_LOGOUT" then + + -- Run the logout function without wipe flag + LeaPlusLC:PlayerLogout(false) + + -- Automation + LeaPlusDB["AutomateQuests"] = LeaPlusLC["AutomateQuests"] + LeaPlusDB["AutoQuestShift"] = LeaPlusLC["AutoQuestShift"] + LeaPlusDB["AutoQuestAvailable"] = LeaPlusLC["AutoQuestAvailable"] + LeaPlusDB["AutoQuestCompleted"] = LeaPlusLC["AutoQuestCompleted"] + LeaPlusDB["AutoQuestKeyMenu"] = LeaPlusLC["AutoQuestKeyMenu"] + LeaPlusDB["AutomateGossip"] = LeaPlusLC["AutomateGossip"] + LeaPlusDB["AutoAcceptSummon"] = LeaPlusLC["AutoAcceptSummon"] + LeaPlusDB["AutoAcceptRes"] = LeaPlusLC["AutoAcceptRes"] + LeaPlusDB["AutoResNoCombat"] = LeaPlusLC["AutoResNoCombat"] + LeaPlusDB["AutoReleasePvP"] = LeaPlusLC["AutoReleasePvP"] + LeaPlusDB["AutoReleaseNoAlterac"] = LeaPlusLC["AutoReleaseNoAlterac"] + LeaPlusDB["AutoReleaseDelay"] = LeaPlusLC["AutoReleaseDelay"] + + LeaPlusDB["AutoSellJunk"] = LeaPlusLC["AutoSellJunk"] + LeaPlusDB["AutoSellShowSummary"] = LeaPlusLC["AutoSellShowSummary"] + LeaPlusDB["AutoSellExcludeList"] = LeaPlusLC["AutoSellExcludeList"] + LeaPlusDB["AutoRepairGear"] = LeaPlusLC["AutoRepairGear"] + LeaPlusDB["AutoRepairGuildFunds"] = LeaPlusLC["AutoRepairGuildFunds"] + LeaPlusDB["AutoRepairShowSummary"] = LeaPlusLC["AutoRepairShowSummary"] + + -- Social + LeaPlusDB["NoDuelRequests"] = LeaPlusLC["NoDuelRequests"] + LeaPlusDB["NoPartyInvites"] = LeaPlusLC["NoPartyInvites"] + LeaPlusDB["NoFriendRequests"] = LeaPlusLC["NoFriendRequests"] + LeaPlusDB["NoSharedQuests"] = LeaPlusLC["NoSharedQuests"] + + LeaPlusDB["AcceptPartyFriends"] = LeaPlusLC["AcceptPartyFriends"] + LeaPlusDB["InviteFromWhisper"] = LeaPlusLC["InviteFromWhisper"] + LeaPlusDB["InviteFriendsOnly"] = LeaPlusLC["InviteFriendsOnly"] + LeaPlusDB["InvKey"] = LeaPlusLC["InvKey"] + LeaPlusDB["FriendlyGuild"] = LeaPlusLC["FriendlyGuild"] + + -- Chat + LeaPlusDB["UseEasyChatResizing"] = LeaPlusLC["UseEasyChatResizing"] + LeaPlusDB["NoCombatLogTab"] = LeaPlusLC["NoCombatLogTab"] + LeaPlusDB["NoChatButtons"] = LeaPlusLC["NoChatButtons"] + LeaPlusDB["UnclampChat"] = LeaPlusLC["UnclampChat"] + LeaPlusDB["MoveChatEditBoxToTop"] = LeaPlusLC["MoveChatEditBoxToTop"] + LeaPlusDB["MoreFontSizes"] = LeaPlusLC["MoreFontSizes"] + + LeaPlusDB["NoStickyChat"] = LeaPlusLC["NoStickyChat"] + LeaPlusDB["UseArrowKeysInChat"] = LeaPlusLC["UseArrowKeysInChat"] + LeaPlusDB["NoChatFade"] = LeaPlusLC["NoChatFade"] + LeaPlusDB["UnivGroupColor"] = LeaPlusLC["UnivGroupColor"] + LeaPlusDB["ClassColorsInChat"] = LeaPlusLC["ClassColorsInChat"] + LeaPlusDB["RecentChatWindow"] = LeaPlusLC["RecentChatWindow"] + LeaPlusDB["RecentChatSize"] = LeaPlusLC["RecentChatSize"] + LeaPlusDB["MaxChatHstory"] = LeaPlusLC["MaxChatHstory"] + LeaPlusDB["FilterChatMessages"] = LeaPlusLC["FilterChatMessages"] + LeaPlusDB["BlockSpellLinks"] = LeaPlusLC["BlockSpellLinks"] + LeaPlusDB["BlockDrunkenSpam"] = LeaPlusLC["BlockDrunkenSpam"] + LeaPlusDB["BlockDuelSpam"] = LeaPlusLC["BlockDuelSpam"] + LeaPlusDB["RestoreChatMessages"] = LeaPlusLC["RestoreChatMessages"] + + -- Text + LeaPlusDB["HideErrorMessages"] = LeaPlusLC["HideErrorMessages"] + LeaPlusDB["NoHitIndicators"] = LeaPlusLC["NoHitIndicators"] + LeaPlusDB["HideZoneText"] = LeaPlusLC["HideZoneText"] + LeaPlusDB["HideKeybindText"] = LeaPlusLC["HideKeybindText"] + LeaPlusDB["HideMacroText"] = LeaPlusLC["HideMacroText"] + + LeaPlusDB["MailFontChange"] = LeaPlusLC["MailFontChange"] + LeaPlusDB["LeaPlusMailFontSize"] = LeaPlusLC["LeaPlusMailFontSize"] + + LeaPlusDB["QuestFontChange"] = LeaPlusLC["QuestFontChange"] + LeaPlusDB["LeaPlusQuestFontSize"] = LeaPlusLC["LeaPlusQuestFontSize"] + + LeaPlusDB["BookFontChange"] = LeaPlusLC["BookFontChange"] + LeaPlusDB["LeaPlusBookFontSize"] = LeaPlusLC["LeaPlusBookFontSize"] + + -- Interface + LeaPlusDB["MinimapModder"] = LeaPlusLC["MinimapModder"] + LeaPlusDB["SquareMinimap"] = LeaPlusLC["SquareMinimap"] + LeaPlusDB["ShowWhoPinged"] = LeaPlusLC["ShowWhoPinged"] + LeaPlusDB["CombineAddonButtons"] = LeaPlusLC["CombineAddonButtons"] + LeaPlusDB["MiniExcludeList"] = LeaPlusLC["MiniExcludeList"] + LeaPlusDB["HideMiniZoomBtns"] = LeaPlusLC["HideMiniZoomBtns"] + LeaPlusDB["HideMiniZoneText"] = LeaPlusLC["HideMiniZoneText"] + LeaPlusDB["HideMiniAddonButtons"] = LeaPlusLC["HideMiniAddonButtons"] + LeaPlusDB["HideMiniMapButton"] = LeaPlusLC["HideMiniMapButton"] + LeaPlusDB["HideMiniTracking"] = LeaPlusLC["HideMiniTracking"] + LeaPlusDB["MinimapScale"] = LeaPlusLC["MinimapScale"] + LeaPlusDB["MinimapSize"] = LeaPlusLC["MinimapSize"] + LeaPlusDB["MiniClusterScale"] = LeaPlusLC["MiniClusterScale"] + LeaPlusDB["MinimapNoScale"] = LeaPlusLC["MinimapNoScale"] + LeaPlusDB["MinimapA"] = LeaPlusLC["MinimapA"] + LeaPlusDB["MinimapR"] = LeaPlusLC["MinimapR"] + LeaPlusDB["MinimapX"] = LeaPlusLC["MinimapX"] + LeaPlusDB["MinimapY"] = LeaPlusLC["MinimapY"] + + LeaPlusDB["TipModEnable"] = LeaPlusLC["TipModEnable"] + LeaPlusDB["TipShowRank"] = LeaPlusLC["TipShowRank"] + LeaPlusDB["TipShowOtherRank"] = LeaPlusLC["TipShowOtherRank"] + LeaPlusDB["TipShowTarget"] = LeaPlusLC["TipShowTarget"] + LeaPlusDB["TipHideInCombat"] = LeaPlusLC["TipHideInCombat"] + LeaPlusDB["TipHideShiftOverride"] = LeaPlusLC["TipHideShiftOverride"] + LeaPlusDB["TipNoHealthBar"] = LeaPlusLC["TipNoHealthBar"] + LeaPlusDB["LeaPlusTipSize"] = LeaPlusLC["LeaPlusTipSize"] + LeaPlusDB["TipOffsetX"] = LeaPlusLC["TipOffsetX"] + LeaPlusDB["TipOffsetY"] = LeaPlusLC["TipOffsetY"] + LeaPlusDB["TooltipAnchorMenu"] = LeaPlusLC["TooltipAnchorMenu"] + LeaPlusDB["TipCursorX"] = LeaPlusLC["TipCursorX"] + LeaPlusDB["TipCursorY"] = LeaPlusLC["TipCursorY"] + + LeaPlusDB["EnhanceDressup"] = LeaPlusLC["EnhanceDressup"] + LeaPlusDB["DressupItemButtons"] = LeaPlusLC["DressupItemButtons"] + LeaPlusDB["DressupAnimControl"] = LeaPlusLC["DressupAnimControl"] + LeaPlusDB["HideDressupStats"] = LeaPlusLC["HideDressupStats"] + LeaPlusDB["EnhanceQuestLog"] = LeaPlusLC["EnhanceQuestLog"] + LeaPlusDB["EnhanceQuestHeaders"] = LeaPlusLC["EnhanceQuestHeaders"] + LeaPlusDB["EnhanceQuestLevels"] = LeaPlusLC["EnhanceQuestLevels"] + LeaPlusDB["EnhanceQuestDifficulty"] = LeaPlusLC["EnhanceQuestDifficulty"] + + LeaPlusDB["EnhanceProfessions"] = LeaPlusLC["EnhanceProfessions"] + LeaPlusDB["EnhanceTrainers"] = LeaPlusLC["EnhanceTrainers"] + LeaPlusDB["ShowTrainAllBtn"] = LeaPlusLC["ShowTrainAllBtn"] + + LeaPlusDB["ShowVolume"] = LeaPlusLC["ShowVolume"] + LeaPlusDB["AhExtras"] = LeaPlusLC["AhExtras"] + LeaPlusDB["AhBuyoutOnly"] = LeaPlusLC["AhBuyoutOnly"] + LeaPlusDB["AhGoldOnly"] = LeaPlusLC["AhGoldOnly"] + + LeaPlusDB["ShowCooldowns"] = LeaPlusLC["ShowCooldowns"] + LeaPlusDB["ShowCooldownID"] = LeaPlusLC["ShowCooldownID"] + LeaPlusDB["NoCooldownDuration"] = LeaPlusLC["NoCooldownDuration"] + LeaPlusDB["CooldownsOnPlayer"] = LeaPlusLC["CooldownsOnPlayer"] + LeaPlusDB["DurabilityStatus"] = LeaPlusLC["DurabilityStatus"] + LeaPlusDB["ShowVanityControls"] = LeaPlusLC["ShowVanityControls"] + LeaPlusDB["VanityAltLayout"] = LeaPlusLC["VanityAltLayout"] + LeaPlusDB["ShowBagSearchBox"] = LeaPlusLC["ShowBagSearchBox"] + LeaPlusDB["ShowRaidToggle"] = LeaPlusLC["ShowRaidToggle"] + LeaPlusDB["ShowPlayerChain"] = LeaPlusLC["ShowPlayerChain"] + LeaPlusDB["PlayerChainMenu"] = LeaPlusLC["PlayerChainMenu"] + LeaPlusDB["ShowReadyTimer"] = LeaPlusLC["ShowReadyTimer"] + LeaPlusDB["ShowWowheadLinks"] = LeaPlusLC["ShowWowheadLinks"] + LeaPlusDB["WowheadLinkComments"] = LeaPlusLC["WowheadLinkComments"] + + LeaPlusDB["ShowFlightTimes"] = LeaPlusLC["ShowFlightTimes"] + LeaPlusDB["FlightBarBackground"] = LeaPlusLC["FlightBarBackground"] + LeaPlusDB["FlightBarDestination"] = LeaPlusLC["FlightBarDestination"] + LeaPlusDB["FlightBarFillBar"] = LeaPlusLC["FlightBarFillBar"] + LeaPlusDB["FlightBarSpeech"] = LeaPlusLC["FlightBarSpeech"] + + LeaPlusDB["FlightBarContribute"] = LeaPlusLC["FlightBarContribute"] + LeaPlusDB["FlightBarA"] = LeaPlusLC["FlightBarA"] + LeaPlusDB["FlightBarR"] = LeaPlusLC["FlightBarR"] + LeaPlusDB["FlightBarX"] = LeaPlusLC["FlightBarX"] + LeaPlusDB["FlightBarY"] = LeaPlusLC["FlightBarY"] + LeaPlusDB["FlightBarScale"] = LeaPlusLC["FlightBarScale"] + LeaPlusDB["FlightBarWidth"] = LeaPlusLC["FlightBarWidth"] + + -- Frames + LeaPlusDB["FrmEnabled"] = LeaPlusLC["FrmEnabled"] + + LeaPlusDB["ManageBuffs"] = LeaPlusLC["ManageBuffs"] + LeaPlusDB["BuffFrameA"] = LeaPlusLC["BuffFrameA"] + LeaPlusDB["BuffFrameR"] = LeaPlusLC["BuffFrameR"] + LeaPlusDB["BuffFrameX"] = LeaPlusLC["BuffFrameX"] + LeaPlusDB["BuffFrameY"] = LeaPlusLC["BuffFrameY"] + LeaPlusDB["BuffFrameScale"] = LeaPlusLC["BuffFrameScale"] + + LeaPlusDB["ManageWidget"] = LeaPlusLC["ManageWidget"] + LeaPlusDB["WidgetA"] = LeaPlusLC["WidgetA"] + LeaPlusDB["WidgetR"] = LeaPlusLC["WidgetR"] + LeaPlusDB["WidgetX"] = LeaPlusLC["WidgetX"] + LeaPlusDB["WidgetY"] = LeaPlusLC["WidgetY"] + LeaPlusDB["WidgetScale"] = LeaPlusLC["WidgetScale"] + + LeaPlusDB["ManageFocus"] = LeaPlusLC["ManageFocus"] + LeaPlusDB["FocusA"] = LeaPlusLC["FocusA"] + LeaPlusDB["FocusR"] = LeaPlusLC["FocusR"] + LeaPlusDB["FocusX"] = LeaPlusLC["FocusX"] + LeaPlusDB["FocusY"] = LeaPlusLC["FocusY"] + LeaPlusDB["FocusScale"] = LeaPlusLC["FocusScale"] + + LeaPlusDB["ManageTimer"] = LeaPlusLC["ManageTimer"] + LeaPlusDB["TimerA"] = LeaPlusLC["TimerA"] + LeaPlusDB["TimerR"] = LeaPlusLC["TimerR"] + LeaPlusDB["TimerX"] = LeaPlusLC["TimerX"] + LeaPlusDB["TimerY"] = LeaPlusLC["TimerY"] + LeaPlusDB["TimerScale"] = LeaPlusLC["TimerScale"] + + LeaPlusDB["ManageDurability"] = LeaPlusLC["ManageDurability"] + LeaPlusDB["DurabilityA"] = LeaPlusLC["DurabilityA"] + LeaPlusDB["DurabilityR"] = LeaPlusLC["DurabilityR"] + LeaPlusDB["DurabilityX"] = LeaPlusLC["DurabilityX"] + LeaPlusDB["DurabilityY"] = LeaPlusLC["DurabilityY"] + LeaPlusDB["DurabilityScale"] = LeaPlusLC["DurabilityScale"] + + LeaPlusDB["ManageVehicle"] = LeaPlusLC["ManageVehicle"] + LeaPlusDB["VehicleA"] = LeaPlusLC["VehicleA"] + LeaPlusDB["VehicleR"] = LeaPlusLC["VehicleR"] + LeaPlusDB["VehicleX"] = LeaPlusLC["VehicleX"] + LeaPlusDB["VehicleY"] = LeaPlusLC["VehicleY"] + LeaPlusDB["VehicleScale"] = LeaPlusLC["VehicleScale"] + + LeaPlusDB["ClassColFrames"] = LeaPlusLC["ClassColFrames"] + LeaPlusDB["ClassColPlayer"] = LeaPlusLC["ClassColPlayer"] + LeaPlusDB["ClassColTarget"] = LeaPlusLC["ClassColTarget"] + + LeaPlusDB["NoAlerts"] = LeaPlusLC["NoAlerts"] + LeaPlusDB["NoGryphons"] = LeaPlusLC["NoGryphons"] + LeaPlusDB["NoClassBar"] = LeaPlusLC["NoClassBar"] + + -- System + LeaPlusDB["NoScreenGlow"] = LeaPlusLC["NoScreenGlow"] + LeaPlusDB["NoScreenEffects"] = LeaPlusLC["NoScreenEffects"] + LeaPlusDB["SetWeatherDensity"] = LeaPlusLC["SetWeatherDensity"] + LeaPlusDB["WeatherLevel"] = LeaPlusLC["WeatherLevel"] + LeaPlusDB["MaxCameraZoom"] = LeaPlusLC["MaxCameraZoom"] + LeaPlusDB["ViewPortEnable"] = LeaPlusLC["ViewPortEnable"] + LeaPlusDB["ViewPortTop"] = LeaPlusLC["ViewPortTop"] + LeaPlusDB["ViewPortBottom"] = LeaPlusLC["ViewPortBottom"] + LeaPlusDB["ViewPortLeft"] = LeaPlusLC["ViewPortLeft"] + LeaPlusDB["ViewPortRight"] = LeaPlusLC["ViewPortRight"] + LeaPlusDB["ViewPortResizeTop"] = LeaPlusLC["ViewPortResizeTop"] + LeaPlusDB["ViewPortResizeBottom"] = LeaPlusLC["ViewPortResizeBottom"] + LeaPlusDB["ViewPortAlpha"] = LeaPlusLC["ViewPortAlpha"] + + LeaPlusDB["NoRestedEmotes"] = LeaPlusLC["NoRestedEmotes"] + LeaPlusDB["MuteGameSounds"] = LeaPlusLC["MuteGameSounds"] + LeaPlusDB["MuteCustomSounds"] = LeaPlusLC["MuteCustomSounds"] + LeaPlusDB["MuteCustomList"] = LeaPlusLC["MuteCustomList"] + + LeaPlusDB["NoBagAutomation"] = LeaPlusLC["NoBagAutomation"] + LeaPlusDB["CharAddonList"] = LeaPlusLC["CharAddonList"] + LeaPlusDB["NoConfirmLoot"] = LeaPlusLC["NoConfirmLoot"] + LeaPlusDB["FasterLooting"] = LeaPlusLC["FasterLooting"] + LeaPlusDB["FasterMovieSkip"] = LeaPlusLC["FasterMovieSkip"] + LeaPlusDB["StandAndDismount"] = LeaPlusLC["StandAndDismount"] + LeaPlusDB["DismountNoResource"] = LeaPlusLC["DismountNoResource"] + LeaPlusDB["DismountNoMoving"] = LeaPlusLC["DismountNoMoving"] + LeaPlusDB["DismountNoTaxi"] = LeaPlusLC["DismountNoTaxi"] + LeaPlusDB["DismountShowFormBtn"] = LeaPlusLC["DismountShowFormBtn"] + LeaPlusDB["ShowVendorPrice"] = LeaPlusLC["ShowVendorPrice"] + LeaPlusDB["CombatPlates"] = LeaPlusLC["CombatPlates"] + LeaPlusDB["EasyItemDestroy"] = LeaPlusLC["EasyItemDestroy"] + + -- Settings + LeaPlusDB["ShowMinimapIcon"] = LeaPlusLC["ShowMinimapIcon"] + LeaPlusDB["PlusPanelScale"] = LeaPlusLC["PlusPanelScale"] + LeaPlusDB["PlusPanelAlpha"] = LeaPlusLC["PlusPanelAlpha"] + + -- Panel position + LeaPlusDB["MainPanelA"] = LeaPlusLC["MainPanelA"] + LeaPlusDB["MainPanelR"] = LeaPlusLC["MainPanelR"] + LeaPlusDB["MainPanelX"] = LeaPlusLC["MainPanelX"] + LeaPlusDB["MainPanelY"] = LeaPlusLC["MainPanelY"] + + -- Start page + LeaPlusDB["LeaStartPage"] = LeaPlusLC["LeaStartPage"] + + -- Mute game sounds (LeaPlusLC["MuteGameSounds"]) + for k, v in pairs(LeaPlusLC["muteTable"]) do + LeaPlusDB[k] = LeaPlusLC[k] + end + + end + + end + +-- Register event handler + LpEvt:SetScript("OnEvent", eventHandler); + +---------------------------------------------------------------------- +-- L70: Player logout +---------------------------------------------------------------------- + + -- Player Logout + function LeaPlusLC:PlayerLogout(wipe) + + ---------------------------------------------------------------------- + -- Restore default values for options that do not require reloads + ---------------------------------------------------------------------- + + if wipe then + + -- Disable screen glow (LeaPlusLC["NoScreenGlow"]) + SetCVar("ffxGlow", "1") + + -- Disable screen effects (LeaPlusLC["NoScreenEffects"]) + SetCVar("ffxDeath", "1") + SetCVar("ffxNether", "1") + + -- Set weather density (LeaPlusLC["SetWeatherDensity"]) + SetCVar("WeatherDensity", "3") + SetCVar("RAIDweatherDensity", "3") + + -- Max camera zoom (LeaPlusLC["MaxCameraZoom"]) + SetCVar("cameraDistanceMaxZoomFactor", 1.9) + + -- Universal group color (LeaPlusLC["UnivGroupColor"]) + ChangeChatColor("RAID", 1, 0.50, 0) + ChangeChatColor("RAID_LEADER", 1, 0.28, 0.04) + + -- Use class colors in chat (LeaPlusLC["ClassColorsInChat"]) + SetCVar("chatClassColorOverride", "1") + + -- Mute game sounds (LeaPlusLC["MuteGameSounds"]) + for k, v in pairs(LeaPlusLC["muteTable"]) do + for i, e in pairs(v) do + local file, soundID = e:match("([^,]+)%#([^,]+)") + UnmuteSoundFile(soundID) + end + end + + end + + ---------------------------------------------------------------------- + -- Restore default values for options that require reloads + ---------------------------------------------------------------------- + + -- Use class colors + if LeaPlusDB["ClassColorsInChat"] == "On" then + if wipe or (not wipe and LeaPlusLC["ClassColorsInChat"] == "Off") and not LeaLockList["ClassColorsInChat"] then + -- Restore local channel color + for i = 1, 18 do + if _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"] then + ToggleChatColorNamesByClassGroup(false, _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"]:GetParent().type) + end + end + -- Restore global channel color + for i = 1, 50 do + ToggleChatColorNamesByClassGroup(false, "CHANNEL" .. i) + end + end + end + + -- Enhance minimap restore round minimap if wipe or enhance minimap is toggled off + if LeaPlusDB["MinimapModder"] == "On" and LeaPlusDB["SquareMinimap"] == "On" and not LeaLockList["MinimapModder"] then + if wipe or (not wipe and LeaPlusLC["MinimapModder"] == "Off") then + Minimap:SetMaskTexture([[Interface\CharacterFrame\TempPortraitAlphaMask]]) + end + end + + -- Silence rested emotes + if LeaPlusDB["NoRestedEmotes"] == "On" then + if wipe or (not wipe and LeaPlusLC["NoRestedEmotes"] == "Off") then + SetCVar("Sound_EnableEmoteSounds", "1") + end + end + + -- More font sizes + if LeaPlusDB["MoreFontSizes"] == "On" and not LeaLockList["MoreFontSizes"] then + if wipe or (not wipe and LeaPlusLC["MoreFontSizes"] == "Off") then + RunScript('for i = 1, 50 do if _G["ChatFrame" .. i] then local void, fontSize = FCF_GetChatWindowInfo(i); if fontSize and fontSize ~= 12 and fontSize ~= 14 and fontSize ~= 16 and fontSize ~= 18 then FCF_SetChatWindowFontSize(self, _G["ChatFrame" .. i], CHAT_FRAME_DEFAULT_FONT_SIZE) end end end') + end + end + + ---------------------------------------------------------------------- + -- Do other stuff during logout + ---------------------------------------------------------------------- + + -- Store the auction house duration and price type values if auction house option is enabled + if LeaPlusDB["AhExtras"] == "On" then + if AuctionFrameAuctions then + if AuctionFrameAuctions.duration then + LeaPlusDB["AHDuration"] = AuctionFrameAuctions.duration + end + end + end + + end + +---------------------------------------------------------------------- +-- Options panel functions +---------------------------------------------------------------------- + + -- Function to add textures to panels + function LeaPlusLC:CreateBar(name, parent, width, height, anchor, r, g, b, alp, tex) + local ft = parent:CreateTexture(nil, "BORDER") + ft:SetTexture(tex) + ft:SetSize(width, height) + ft:SetPoint(anchor) + ft:SetVertexColor(r ,g, b, alp) + if name == "MainTexture" then + ft:SetTexCoord(0.09, 1, 0, 1); + end + end + + -- Create a configuration panel + function LeaPlusLC:CreatePanel(title, globref) + + -- Create the panel + local Side = CreateFrame("Frame", nil, UIParent) + + -- Make it a system frame + _G["LeaPlusGlobalPanel_" .. globref] = Side + table.insert(UISpecialFrames, "LeaPlusGlobalPanel_" .. globref) + + -- Store it in the configuration panel table + tinsert(LeaConfigList, Side) + + -- Set frame parameters + Side:Hide(); + Side:SetSize(570, 370); + Side:SetClampedToScreen(true) + Side:SetClampRectInsets(500, -500, -300, 300) + Side:SetFrameStrata("FULLSCREEN_DIALOG") + + -- Set the background color + Side.t = Side:CreateTexture(nil, "BACKGROUND") + Side.t:SetAllPoints() + -- Side.t:SetColorTexture(0.05, 0.05, 0.05, 0.9) + + -- Add a close Button + Side.c = CreateFrame("Button", nil, Side, "UIPanelCloseButton") + Side.c:SetSize(30, 30) + Side.c:SetPoint("TOPRIGHT", 0, 0) + Side.c:SetScript("OnClick", function() Side:Hide() end) + + -- Add reset, help and back buttons + Side.r = LeaPlusLC:CreateButton("ResetButton", Side, "Reset", "TOPLEFT", 16, -292, 0, 25, true, "Click to reset the settings on this page.") + Side.h = LeaPlusLC:CreateButton("HelpButton", Side, "Help", "TOPLEFT", 76, -292, 0, 25, true, "No help is available for this page.") + Side.b = LeaPlusLC:CreateButton("BackButton", Side, "Back to Main Menu", "TOPRIGHT", -16, -292, 0, 25, true, "Click to return to the main menu.") + + -- Reposition help button so it doesn't overlap reset button + Side.h:ClearAllPoints() + Side.h:SetPoint("LEFT", Side.r, "RIGHT", 10, 0) + + -- Remove the click texture from the help button + Side.h:SetPushedTextOffset(0, 0) + + -- Add a reload button and syncronise it with the main panel reload button + local reloadb = LeaPlusLC:CreateButton("ConfigReload", Side, "Reload", "BOTTOMRIGHT", -16, 10, 0, 25, true, LeaPlusCB["ReloadUIButton"].tiptext) + LeaPlusLC:LockItem(reloadb,true) + reloadb:SetScript("OnClick", ReloadUI) + + reloadb.f = reloadb:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall') + reloadb.f:SetHeight(32); + reloadb.f:SetPoint('RIGHT', reloadb, 'LEFT', -10, 0) + reloadb.f:SetText(LeaPlusCB["ReloadUIButton"].f:GetText()) + reloadb.f:Hide() + + LeaPlusCB["ReloadUIButton"]:HookScript("OnEnable", function() + LeaPlusLC:LockItem(reloadb, false) + reloadb.f:Show() + end) + + LeaPlusCB["ReloadUIButton"]:HookScript("OnDisable", function() + LeaPlusLC:LockItem(reloadb, true) + reloadb.f:Hide() + end) + + -- Set textures + LeaPlusLC:CreateBar("FootTexture", Side, 570, 48, "BOTTOM", 0.5, 0.5, 0.5, 1.0, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png") + LeaPlusLC:CreateBar("MainTexture", Side, 570, 323, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png") + + -- Allow movement + Side:EnableMouse(true) + Side:SetMovable(true) + Side:RegisterForDrag("LeftButton") + Side:SetScript("OnDragStart", Side.StartMoving) + Side:SetScript("OnDragStop", function () + Side:StopMovingOrSizing(); + Side:SetUserPlaced(false); + -- Save panel position + LeaPlusLC["MainPanelA"], void, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = Side:GetPoint() + end) + + -- Set panel attributes when shown + Side:SetScript("OnShow", function() + Side:ClearAllPoints() + Side:SetPoint(LeaPlusLC["MainPanelA"], UIParent, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"]) + Side:SetScale(LeaPlusLC["PlusPanelScale"]) + Side.t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + end) + + -- Add title + Side.f = Side:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + Side.f:SetPoint('TOPLEFT', 16, -16); + Side.f:SetText(L[title]) + + -- Add description + Side.v = Side:CreateFontString(nil, 'ARTWORK', 'GameFontHighlightSmall') + Side.v:SetHeight(32); + Side.v:SetPoint('TOPLEFT', Side.f, 'BOTTOMLEFT', 0, -8); + Side.v:SetPoint('RIGHT', Side, -32, 0) + Side.v:SetJustifyH('LEFT'); Side.v:SetJustifyV('TOP'); + Side.v:SetText(L["Configuration Panel"]) + + -- Prevent options panel from showing while side panel is showing + LeaPlusLC["PageF"]:HookScript("OnShow", function() + if Side:IsShown() then LeaPlusLC["PageF"]:Hide(); end + end) + + -- Return the frame + return Side + + end + + -- Define subheadings + function LeaPlusLC:MakeTx(frame, title, x, y) + local text = frame:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + text:SetPoint("TOPLEFT", x, y) + text:SetText(L[title]) + return text + end + + -- Define text + function LeaPlusLC:MakeWD(frame, title, x, y) + local text = frame:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') + text:SetPoint("TOPLEFT", x, y) + text:SetText(L[title]) + text:SetJustifyH"LEFT"; + return text + end + + -- Create a slider control (uses standard template) + function LeaPlusLC:MakeSL(frame, field, caption, low, high, step, x, y, form) + + -- Create slider control + local Slider = CreateFrame("Slider", "LeaPlusGlobalSlider" .. field, frame, "OptionssliderTemplate") + LeaPlusCB[field] = Slider; + Slider:SetMinMaxValues(low, high) + Slider:SetValueStep(step) + Slider:EnableMouseWheel(true) + Slider:SetPoint('TOPLEFT', x,y) + Slider:SetWidth(100) + Slider:SetHeight(20) + Slider:SetHitRectInsets(0, 0, 0, 0); + Slider.tiptext = L[caption] + Slider:SetScript("OnEnter", LeaPlusLC.TipSee) + Slider:SetScript("OnLeave", GameTooltip_Hide) + + -- Remove slider text + _G[Slider:GetName().."Low"]:SetText(''); + _G[Slider:GetName().."High"]:SetText(''); + + -- Create slider label + Slider.f = Slider:CreateFontString(nil, 'BACKGROUND') + Slider.f:SetFontObject('GameFontHighlight') + Slider.f:SetPoint('LEFT', Slider, 'RIGHT', 12, 0) + Slider.f:SetFormattedText("%.2f", Slider:GetValue()) + + -- Process mousewheel scrolling + Slider:SetScript("OnMouseWheel", function(self, arg1) + if Slider:IsEnabled() then + local step = step * arg1 + local value = self:GetValue() + if step > 0 then + self:SetValue(min(value + step, high)) + else + self:SetValue(max(value + step, low)) + end + end + end) + + -- Process value changed + Slider:SetScript("OnValueChanged", function(self, value) + local value = floor((value - low) / step + 0.5) * step + low + Slider.f:SetFormattedText(form, value) + LeaPlusLC[field] = value + end) + + -- Set slider value when shown + Slider:SetScript("OnShow", function(self) + self:SetValue(LeaPlusLC[field]) + end) + + end + + -- Create a checkbox control (uses standard template) + function LeaPlusLC:MakeCB(parent, field, caption, x, y, reload, tip, tipstyle) + + -- Create the checkbox + local Cbox = CreateFrame('CheckButton', nil, parent, "ChatConfigCheckButtonTemplate") + LeaPlusCB[field] = Cbox + Cbox:SetPoint("TOPLEFT",x, y) + Cbox:SetScript("OnEnter", LeaPlusLC.TipSee) + Cbox:SetScript("OnLeave", GameTooltip_Hide) + + -- Add label and tooltip + Cbox.f = Cbox:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') + Cbox.f:SetPoint('LEFT', 20, 0) + if reload then + -- Checkbox requires UI reload + Cbox.f:SetText(L[caption] .. "*") + Cbox.tiptext = L[tip] .. "|n|n* " .. L["Requires UI reload."] + else + -- Checkbox does not require UI reload + Cbox.f:SetText(L[caption]) + Cbox.tiptext = L[tip] + end + + -- Set label parameters + Cbox.f:SetJustifyH("LEFT") + Cbox.f:SetWordWrap(false) + + -- Set maximum label width + if parent:GetParent() == LeaPlusLC["PageF"] then + -- Main panel checkbox labels + if Cbox.f:GetWidth() > 152 then + Cbox.f:SetWidth(152) + LeaPlusLC["TruncatedLabelsList"] = LeaPlusLC["TruncatedLabelsList"] or {} + LeaPlusLC["TruncatedLabelsList"][Cbox.f] = L[caption] + end + -- Set checkbox click width + if Cbox.f:GetStringWidth() > 152 then + Cbox:SetHitRectInsets(0, -142, 0, 0) + else + Cbox:SetHitRectInsets(0, -Cbox.f:GetStringWidth() + 4, 0, 0) + end + else + -- Configuration panel checkbox labels (other checkboxes either have custom functions or blank labels) + if Cbox.f:GetWidth() > 302 then + Cbox.f:SetWidth(302) + LeaPlusLC["TruncatedLabelsList"] = LeaPlusLC["TruncatedLabelsList"] or {} + LeaPlusLC["TruncatedLabelsList"][Cbox.f] = L[caption] + end + -- Set checkbox click width + if Cbox.f:GetStringWidth() > 302 then + Cbox:SetHitRectInsets(0, -292, 0, 0) + else + Cbox:SetHitRectInsets(0, -Cbox.f:GetStringWidth() + 4, 0, 0) + end + end + + -- Set default checkbox state and click area + Cbox:SetScript('OnShow', function(self) + if LeaPlusLC[field] == "On" then + self:SetChecked(true) + else + self:SetChecked(false) + end + end) + + -- Process clicks + Cbox:SetScript('OnClick', function() + if Cbox:GetChecked() then + LeaPlusLC[field] = "On" + else + LeaPlusLC[field] = "Off" + end + LeaPlusLC:SetDim(); -- Lock invalid options + LeaPlusLC:ReloadCheck(); -- Show reload button if needed + LeaPlusLC:Live(); -- Run live code + end) + end + + -- Create an editbox (uses standard template) + function LeaPlusLC:CreateEditBox(frame, parent, width, maxchars, anchor, x, y, tab, shifttab) + + -- Create editbox + local eb = CreateFrame("EditBox", nil, parent, "InputBoxTemplate") + LeaPlusCB[frame] = eb + eb:SetPoint(anchor, x, y) + eb:SetWidth(width) + eb:SetHeight(24) + eb:SetFontObject("GameFontNormal") + eb:SetTextColor(1.0, 1.0, 1.0) + eb:SetAutoFocus(false) + eb:SetMaxLetters(maxchars) + eb:SetScript("OnEscapePressed", eb.ClearFocus) + eb:SetScript("OnEnterPressed", eb.ClearFocus) + + -- Add editbox border and backdrop + eb.f = CreateFrame("FRAME", nil, eb) + eb.f:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = false, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }}) + eb.f:SetPoint("LEFT", -6, 0) + eb.f:SetWidth(eb:GetWidth()+6) + eb.f:SetHeight(eb:GetHeight()) + eb.f:SetBackdropColor(1.0, 1.0, 1.0, 0.3) + + -- Move onto next editbox when tab key is pressed + eb:SetScript("OnTabPressed", function(self) + self:ClearFocus() + if IsShiftKeyDown() then + LeaPlusCB[shifttab]:SetFocus() + else + LeaPlusCB[tab]:SetFocus() + end + end) + + return eb + + end + + -- Create a standard button (using standard button template) + function LeaPlusLC:CreateButton(name, frame, label, anchor, x, y, width, height, reskin, tip, naked) + local mbtn = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate") + LeaPlusCB[name] = mbtn + mbtn:SetSize(width, height) + mbtn:SetPoint(anchor, x, y) + mbtn:SetHitRectInsets(0, 0, 0, 0) + mbtn:SetText(L[label]) + + -- Create fontstring so the button can be sized correctly + mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mbtn.f:SetText(L[label]) + if width > 0 then + -- Button should have static width + mbtn:SetWidth(width) + else + -- Button should have variable width + mbtn:SetWidth(mbtn.f:GetStringWidth() + 20) + end + + -- Tooltip handler + mbtn.tiptext = L[tip] + mbtn:SetScript("OnEnter", LeaPlusLC.TipSee) + mbtn:SetScript("OnLeave", GameTooltip_Hide) + + -- Texture the button + if reskin then + + -- Set skinned button textures + if not naked then + mbtn:SetNormalTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp") + mbtn:GetNormalTexture():SetTexCoord(0.125, 0.25, 0.4375, 0.5) + end + mbtn:SetHighlightTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp") + mbtn:GetHighlightTexture():SetTexCoord(0, 0.125, 0.4375, 0.5) + + -- Hide the default textures + -- mbtn:HookScript("OnShow", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnEnable", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnDisable", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnMouseDown", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnMouseUp", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + + end + + return mbtn + end + + -- Create a dropdown menu (using custom function to avoid taint) + function LeaPlusLC:CreateDropDown(ddname, label, parent, width, anchor, x, y, items, tip) + + -- Add the dropdown name to a table + tinsert(LeaDropList, ddname) + + -- Populate variable with item list + LeaPlusLC[ddname .. "Table"] = items + + -- Create outer frame + local frame = CreateFrame("FRAME", nil, parent); frame:SetWidth(width); frame:SetHeight(42); frame:SetPoint("BOTTOMLEFT", parent, anchor, x, y); + + -- Create dropdown inside outer frame + local dd = CreateFrame("Frame", nil, frame); dd:SetPoint("BOTTOMLEFT", -16, -8); dd:SetPoint("BOTTOMRIGHT", 15, -4); dd:SetHeight(32); + + -- Create dropdown textures + local lt = dd:CreateTexture(nil, "ARTWORK"); lt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); lt:SetTexCoord(0, 0.1953125, 0, 1); lt:SetPoint("TOPLEFT", dd, 0, 17); lt:SetWidth(25); lt:SetHeight(64); + local rt = dd:CreateTexture(nil, "BORDER"); rt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); rt:SetTexCoord(0.8046875, 1, 0, 1); rt:SetPoint("TOPRIGHT", dd, 0, 17); rt:SetWidth(25); rt:SetHeight(64); + local mt = dd:CreateTexture(nil, "BORDER"); mt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); mt:SetTexCoord(0.1953125, 0.8046875, 0, 1); mt:SetPoint("LEFT", lt, "RIGHT"); mt:SetPoint("RIGHT", rt, "LEFT"); mt:SetHeight(64); + + -- Create dropdown label + local lf = dd:CreateFontString(nil, "OVERLAY", "GameFontNormal"); lf:SetPoint("TOPLEFT", frame, 0, 0); lf:SetPoint("TOPRIGHT", frame, -5, 0); lf:SetJustifyH("LEFT"); lf:SetText(L[label]) + + -- Create dropdown placeholder for value (set it using OnShow) + local value = dd:CreateFontString(nil, "OVERLAY", "GameFontHighlight") + value:SetPoint("LEFT", lt, 26, 2); value:SetPoint("RIGHT", rt, -43, 0); value:SetJustifyH("LEFT"); value:SetWordWrap(false) + dd:SetScript("OnShow", function() value:SetText(LeaPlusLC[ddname.."Table"][LeaPlusLC[ddname]]) end) + + -- Create dropdown button (clicking it opens the dropdown list) + local dbtn = CreateFrame("Button", nil, dd) + dbtn:SetPoint("TOPRIGHT", rt, -16, -18); dbtn:SetWidth(24); dbtn:SetHeight(24) + dbtn:SetNormalTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Up"); dbtn:SetPushedTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Down"); dbtn:SetDisabledTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Disabled"); dbtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight"); dbtn:GetHighlightTexture():SetBlendMode("ADD") + dbtn.tiptext = tip; dbtn:SetScript("OnEnter", LeaPlusLC.ShowDropTip) + dbtn:SetScript("OnLeave", GameTooltip_Hide) + + -- Create dropdown list + local ddlist = CreateFrame("Frame",nil,frame) + LeaPlusCB["ListFrame"..ddname] = ddlist + ddlist:SetPoint("TOP",0,-42) + ddlist:SetWidth(frame:GetWidth()) + ddlist:SetHeight((#items * 16) + 16 + 16) + ddlist:SetFrameStrata("FULLSCREEN_DIALOG") + ddlist:SetFrameLevel(12) + ddlist:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background-Dark", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = false, tileSize = 0, edgeSize = 32, insets = { left = 4, right = 4, top = 4, bottom = 4 }}); + ddlist:Hide() + + -- Hide list if parent is closed + parent:HookScript("OnHide", function() ddlist:Hide() end) + + -- Create checkmark (it marks the currently selected item) + local ddlistchk = CreateFrame("FRAME", nil, ddlist) + ddlistchk:SetHeight(16); ddlistchk:SetWidth(16) + ddlistchk.t = ddlistchk:CreateTexture(nil, "ARTWORK"); ddlistchk.t:SetAllPoints(); ddlistchk.t:SetTexture("Interface\\Common\\UI-DropDownRadioChecks"); ddlistchk.t:SetTexCoord(0, 0.5, 0.5, 1.0); + + -- Create dropdown list items + for k, v in pairs(items) do + + local dditem = CreateFrame("Button", nil, LeaPlusCB["ListFrame"..ddname]) + LeaPlusCB["Drop"..ddname..k] = dditem; + dditem:Show(); + dditem:SetWidth(ddlist:GetWidth() - 22) + dditem:SetHeight(16) + dditem:SetPoint("TOPLEFT", 12, -k * 16) + + dditem.f = dditem:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') + dditem.f:SetPoint('LEFT', 16, 0) + dditem.f:SetText(items[k]) + + dditem.f:SetWordWrap(false) + dditem.f:SetJustifyH("LEFT") + dditem.f:SetWidth(ddlist:GetWidth()-36) + + dditem.t = dditem:CreateTexture(nil, "BACKGROUND") + dditem.t:SetAllPoints() + -- dditem.t:SetColorTexture(0.3, 0.3, 0.00, 0.8) + dditem.t:Hide(); + + dditem:SetScript("OnEnter", function() dditem.t:Show() end) + dditem:SetScript("OnLeave", function() dditem.t:Hide() end) + dditem:SetScript("OnClick", function() + LeaPlusLC[ddname] = k + value:SetText(LeaPlusLC[ddname.."Table"][k]) + ddlist:Hide(); -- Must be last in click handler as other functions hook it + end) + + -- Show list when button is clicked + dbtn:SetScript("OnClick", function() + -- Show the dropdown + if ddlist:IsShown() then ddlist:Hide() else + ddlist:Show(); + ddlistchk:SetPoint("TOPLEFT",10,select(5,LeaPlusCB["Drop"..ddname..LeaPlusLC[ddname]]:GetPoint())) + ddlistchk:Show(); + end; + -- Hide all other dropdowns except the one we're dealing with + for void,v in pairs(LeaDropList) do + if v ~= ddname then + LeaPlusCB["ListFrame"..v]:Hide() + end + end + end) + + -- Expand the clickable area of the button to include the entire menu width + dbtn:SetHitRectInsets(-width+28, 0, 0, 0) + + end + + return frame + + end + +---------------------------------------------------------------------- +-- Create main options panel frame +---------------------------------------------------------------------- + + function LeaPlusLC:CreateMainPanel() + + -- Create the panel + local PageF = CreateFrame("Frame", nil, UIParent); + + -- Make it a system frame + _G["LeaPlusGlobalPanel"] = PageF + table.insert(UISpecialFrames, "LeaPlusGlobalPanel") + + -- Set frame parameters + LeaPlusLC["PageF"] = PageF + PageF:SetSize(570,370) + PageF:Hide(); + PageF:SetFrameStrata("FULLSCREEN_DIALOG") + PageF:SetClampedToScreen(true) + PageF:SetClampRectInsets(500, -500, -300, 300) + PageF:EnableMouse(true) + PageF:SetMovable(true) + PageF:RegisterForDrag("LeftButton") + PageF:SetScript("OnDragStart", PageF.StartMoving) + PageF:SetScript("OnDragStop", function () + PageF:StopMovingOrSizing(); + PageF:SetUserPlaced(false); + -- Save panel position + LeaPlusLC["MainPanelA"], void, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = PageF:GetPoint() + end) + + -- Add background color + PageF.t = PageF:CreateTexture(nil, "BACKGROUND") + PageF.t:SetAllPoints() + -- PageF.t:SetColorTexture(0.05, 0.05, 0.05, 0.9) + + -- Add textures + LeaPlusLC:CreateBar("FootTexture", PageF, 570, 48, "BOTTOM", 0.5, 0.5, 0.5, 1.0, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png") + LeaPlusLC:CreateBar("MainTexture", PageF, 440, 323, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png") + LeaPlusLC:CreateBar("MenuTexture", PageF, 130, 323, "TOPLEFT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png") + + -- Set panel position when shown + PageF:SetScript("OnShow", function() + PageF:ClearAllPoints() + PageF:SetPoint(LeaPlusLC["MainPanelA"], UIParent, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"]) + end) + + -- Add main title (shown above menu in the corner) + PageF.mt = PageF:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + PageF.mt:SetPoint('TOPLEFT', 16, -16) + PageF.mt:SetText("Leatrix Plus") + + -- Add version text (shown underneath main title) + PageF.v = PageF:CreateFontString(nil, 'ARTWORK', 'GameFontHighlightSmall') + PageF.v:SetHeight(32); + PageF.v:SetPoint('TOPLEFT', PageF.mt, 'BOTTOMLEFT', 0, -8); + PageF.v:SetPoint('RIGHT', PageF, -32, 0) + PageF.v:SetJustifyH('LEFT'); PageF.v:SetJustifyV('TOP'); + PageF.v:SetNonSpaceWrap(true); PageF.v:SetText(L["WC"] .. " " .. LeaPlusLC["AddonVer"]) + + -- Add reload UI Button + local reloadb = LeaPlusLC:CreateButton("ReloadUIButton", PageF, "Reload", "BOTTOMRIGHT", -16, 10, 0, 25, true, "Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect.") + LeaPlusLC:LockItem(reloadb,true) + reloadb:SetScript("OnClick", ReloadUI) + + reloadb.f = reloadb:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall') + reloadb.f:SetHeight(32); + reloadb.f:SetPoint('RIGHT', reloadb, 'LEFT', -10, 0) + reloadb.f:SetText(L["Your UI needs to be reloaded."]) + reloadb.f:Hide() + + -- Add close Button + local CloseB = CreateFrame("Button", nil, PageF, "UIPanelCloseButton") + CloseB:SetSize(30, 30) + CloseB:SetPoint("TOPRIGHT", 0, 0) + CloseB:SetScript("OnClick", LeaPlusLC.HideFrames) + + -- Add web link Button + local PageFAlertButton = LeaPlusLC:CreateButton("PageFAlertButton", PageF, "You should keybind web link!", "BOTTOMLEFT", 16, 10, 0, 25, true, "You should set a keybind for the web link feature. It's very useful.|n|nOpen the key bindings window (accessible from the game menu) and click Leatrix Plus.|n|nSet a keybind for Show web link.|n|nNow when your pointer is over an item, NPC or spell (and more), press your keybind to get a web link.", true) + PageFAlertButton:SetPushedTextOffset(0, 0) + PageF:HookScript("OnShow", function() + if GetBindingKey("LEATRIX_PLUS_GLOBAL_WEBLINK") then PageFAlertButton:Hide() else PageFAlertButton:Show() end + end) + + -- Release memory + LeaPlusLC.CreateMainPanel = nil + + end + + LeaPlusLC:CreateMainPanel(); + +---------------------------------------------------------------------- +-- L80: Commands +---------------------------------------------------------------------- + + -- Slash command function + function LeaPlusLC:SlashFunc(str) + if str and str ~= "" then + -- Get parameters in lower case with duplicate spaces removed + local str, arg1, arg2, arg3 = strsplit(" ", string.lower(str:gsub("%s+", " "))) + -- Traverse parameters + if str == "wipe" then + -- Wipe settings + LeaPlusLC:PlayerLogout(true) -- Run logout function with wipe parameter + wipe(LeaPlusDB) + LpEvt:UnregisterAllEvents(); -- Don't save any settings + ReloadUI(); + elseif str == "nosave" then + -- Prevent Leatrix Plus from overwriting LeaPlusDB at next logout + LpEvt:UnregisterEvent("PLAYER_LOGOUT") + LeaPlusLC:Print("Leatrix Plus will not overwrite LeaPlusDB at next logout.") + return + elseif str == "reset" then + -- Reset panel positions + LeaPlusLC["MainPanelA"], LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = "CENTER", "CENTER", 0, 0 + LeaPlusLC["PlusPanelScale"] = 1 + LeaPlusLC["PlusPanelAlpha"] = 0 + LeaPlusLC["PageF"]:SetScale(1) + LeaPlusLC["PageF"].t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + -- Refresh panels + LeaPlusLC["PageF"]:ClearAllPoints() + LeaPlusLC["PageF"]:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + -- Reset currently showing configuration panel + for k, v in pairs(LeaConfigList) do + if v:IsShown() then + v:ClearAllPoints() + v:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + v:SetScale(1) + v.t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + end + end + -- Refresh Leatrix Plus settings menu only + if LeaPlusLC["Page8"]:IsShown() then + LeaPlusLC["Page8"]:Hide() + LeaPlusLC["Page8"]:Show() + end + return + elseif str == "taint" then + -- Set taint log level + if arg1 and arg1 ~= "" then + arg1 = tonumber(arg1) + if arg1 and arg1 >= 0 and arg1 <= 2 then + if arg1 == 0 then + -- Disable taint log + ConsoleExec("taintLog 0") + LeaPlusLC:Print("Taint level: Disabled (0).") + elseif arg1 == 1 then + -- Basic taint log + ConsoleExec("taintLog 1") + LeaPlusLC:Print("Taint level: Basic (1).") + elseif arg1 == 2 then + -- Full taint log + ConsoleExec("taintLog 2") + LeaPlusLC:Print("Taint level: Full (2).") + end + else + LeaPlusLC:Print("Invalid taint level.") + end + else + -- Show current taint level + local taintCurrent = GetCVar("taintLog") + if taintCurrent == "0" then + LeaPlusLC:Print("Taint level: Disabled (0).") + elseif taintCurrent == "1" then + LeaPlusLC:Print("Taint level: Basic (1).") + elseif taintCurrent == "2" then + LeaPlusLC:Print("Taint level: Full (2).") + end + end + return + elseif str == "quest" then + -- Show quest completed status + if arg1 and arg1 ~= "" then + if tonumber(arg1) and tonumber(arg1) < 999999999 then + local questCompleted = C_QuestLog.IsQuestFlaggedCompleted(arg1) + local questTitle = C_QuestLog.GetQuestInfo(arg1) or L["Unknown"] + LibCompat.After(0.5, function() + local questTitle = C_QuestLog.GetQuestInfo(arg1) or L["Unknown"] + if questCompleted then + LeaPlusLC:Print(questTitle .. " (" .. arg1 .. "):" .. "|cffffffff " .. L["Completed."]) + else + LeaPlusLC:Print(questTitle .. " (" .. arg1 .. "):" .. "|cffffffff " .. L["Not completed."]) + end + end) + else + LeaPlusLC:Print("Invalid quest ID.") + end + else + LeaPlusLC:Print("Missing quest ID.") + end + return + elseif str == "rest" then + -- Show rested bubbles + LeaPlusLC:Print(L["Rested bubbles"] .. ": |cffffffff" .. (math.floor(20 * (GetXPExhaustion() or 0) / UnitXPMax("player") + 0.5))) + return + elseif str == "zygor" then + -- Toggle Zygor addon + LeaPlusLC:ZygorToggle() + return + elseif str == "npcid" then + -- Print NPC ID + local npcName = UnitName("target") + local npcGuid = UnitGUID("target") or nil + if npcName and npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + LeaPlusLC:Print(npcName .. ": |cffffffff" .. npcID) + end + end + return + elseif str == "id" then + -- Show web link + if not LeaPlusLC.WowheadLock then + -- Set Wowhead link prefix + if GameLocale == "deDE" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/de" + elseif GameLocale == "esMX" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/es" + elseif GameLocale == "esES" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/es" + elseif GameLocale == "frFR" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/fr" + elseif GameLocale == "itIT" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/it" + elseif GameLocale == "ptBR" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/pt" + elseif GameLocale == "ruRU" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/ru" + elseif GameLocale == "koKR" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/ko" + elseif GameLocale == "zhCN" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/cn" + elseif GameLocale == "zhTW" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/cn" + else LeaPlusLC.WowheadLock = "wowhead.com/wotlk" + end + end + -- Store frame under mouse + local mouseFocus = GetMouseFocus() + -- ItemRefTooltip or GameTooltip + local tooltip + if mouseFocus == ItemRefTooltip then tooltip = ItemRefTooltip else tooltip = GameTooltip end + -- Process tooltip + if tooltip:IsShown() then + -- Item + local void, itemLink = tooltip:GetItem() + if itemLink then + local itemID = GetItemInfoFromHyperlink(itemLink) + if itemID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/item=" .. itemID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Item"] .. ": " .. itemLink .. " (" .. itemID .. ")") + return + end + end + -- Spell + local name, spellID = tooltip:GetSpell() + if name and spellID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. name .. " (" .. spellID .. ")") + return + end + -- NPC + local npcName = UnitName("mouseover") + local npcGuid = UnitGUID("mouseover") or nil + if npcName and npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/npc=" .. npcID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["NPC"] .. ": " .. npcName .. " (" .. npcID .. ")") + return + end + end + -- Buffs and debuffs + for i = 1, BUFF_MAX_DISPLAY do + if _G["BuffButton" .. i] and mouseFocus == _G["BuffButton" .. i] then + local spellName, void, void, void, void, void, void, void, void, spellID = UnitBuff("player", i) + if spellName and spellID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. spellName .. " (" .. spellID .. ")") + end + return + end + end + for i = 1, DEBUFF_MAX_DISPLAY do + if _G["DebuffButton" .. i] and mouseFocus == _G["DebuffButton" .. i] then + local spellName, void, void, void, void, void, void, void, void, spellID = UnitDebuff("player", i) + if spellName and spellID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. spellName .. " (" .. spellID .. ")") + end + return + end + end + -- Unknown tooltip (this must be last) + local tipTitle = GameTooltipTextLeft1:GetText() + if tipTitle then + -- Show unknown link + local unitFocus + if mouseFocus == WorldFrame then unitFocus = "mouseover" else unitFocus = select(2, GameTooltip:GetUnit()) end + if not unitFocus or not UnitIsPlayer(unitFocus) then + tipTitle = tipTitle:gsub("|c%x%x%x%x%x%x%x%x", "") -- Remove color tag + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/search?q=" .. tipTitle, false) + LeaPlusLC.FactoryEditBox.f:SetText("|cffff0000" .. L["Link will search Wowhead"]) + return + end + end + end + return + elseif str == "tooltip" then + -- Print tooltip frame name + local enumf = EnumerateFrames() + while enumf do + if (enumf:GetObjectType() == "GameTooltip" or strfind((enumf:GetName() or ""):lower(),"tip")) and enumf:IsVisible() and enumf:GetPoint() then + print(enumf:GetName()) + end + enumf = EnumerateFrames(enumf) + end + collectgarbage() + return + elseif str == "rsnd" then + -- Restart sound system + if LeaPlusCB["StopMusicBtn"] then LeaPlusCB["StopMusicBtn"]:Click() end + Sound_GameSystem_RestartSoundSystem() + LeaPlusLC:Print("Sound system restarted.") + return + elseif str == "event" then + -- List events (used for debug) + LeaPlusLC["DbF"] = LeaPlusLC["DbF"] or CreateFrame("FRAME") + if not LeaPlusLC["DbF"]:GetScript("OnEvent") then + LeaPlusLC:Print("Tracing started.") + LeaPlusLC["DbF"]:RegisterAllEvents() + LeaPlusLC["DbF"]:SetScript("OnEvent", function(self, event) + if event == "ACTIONBAR_UPDATE_COOLDOWN" + or event == "BAG_UPDATE_COOLDOWN" + or event == "CHAT_MSG_TRADESKILLS" + or event == "COMBAT_LOG_EVENT_UNFILTERED" + or event == "SPELL_UPDATE_COOLDOWN" + or event == "SPELL_UPDATE_USABLE" + or event == "UNIT_POWER_FREQUENT" + or event == "UPDATE_INVENTORY_DURABILITY" + then return + else + print(event) + end + end) + else + LeaPlusLC["DbF"]:UnregisterAllEvents() + LeaPlusLC["DbF"]:SetScript("OnEvent", nil) + LeaPlusLC:Print("Tracing stopped.") + end + return + elseif str == "game" then + -- Show game build + local version, build, gdate, tocversion = GetBuildInfo() + LeaPlusLC:Print(L["World of Warcraft"] .. ": |cffffffff" .. version .. "." .. build .. " (" .. gdate .. ") (" .. tocversion .. ")") + return + elseif str == "config" then + -- Show maximum camera distance + LeaPlusLC:Print(L["Camera distance"] .. ": |cffffffff" .. GetCVar("cameraDistanceMaxZoomFactor")) + -- Show particle density + LeaPlusLC:Print(L["Particle density"] .. ": |cffffffff" .. GetCVar("particleDensity")) + LeaPlusLC:Print(L["Weather density"] .. ": |cffffffff" .. GetCVar("weatherDensity")) + -- Show config + LeaPlusLC:Print("SynchroniseConfig: |cffffffff" .. GetCVar("synchronizeConfig")) + -- Show raid restrictions + local unRaid = GetAllowLowLevelRaid() + if unRaid and unRaid == true then + LeaPlusLC:Print("GetAllowLowLevelRaid: |cffffffff" .. "True") + else + LeaPlusLC:Print("GetAllowLowLevelRaid: |cffffffff" .. "False") + end + return + elseif str == "move" then + -- Move minimap + MinimapZoneTextButton:Hide() + MinimapBorderTop:SetTexture("") + MiniMapWorldMapButton:Hide() + MinimapBackdrop:ClearAllPoints() + MinimapBackdrop:SetPoint("CENTER", UIParent, "CENTER", -330, -75) + Minimap:SetPoint("CENTER", UIParent, "CENTER", -320, -50) + return + elseif str == "tipcol" then + -- Show default tooltip title color + if GameTooltipTextLeft1:IsShown() then + local r, g, b, a = GameTooltipTextLeft1:GetTextColor() + r = r <= 1 and r >= 0 and r or 0 + g = g <= 1 and g >= 0 and g or 0 + b = b <= 1 and b >= 0 and b or 0 + LeaPlusLC:Print(L["Tooltip title color"] .. ": " .. strupper(string.format("%02x%02x%02x", r * 255, g * 255, b * 255) .. ".")) + else + LeaPlusLC:Print("No tooltip showing.") + end + return + elseif str == "list" then + -- Enumerate frames + local frame = EnumerateFrames() + while frame do + if (frame:IsVisible() and MouseIsOver(frame)) then + LeaPlusLC:Print(frame:GetName() or string.format("[Unnamed Frame: %s]", tostring(frame))) + end + frame = EnumerateFrames(frame) + end + return + elseif str == "grid" then + -- Toggle frame alignment grid + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + return + elseif str == "chk" then + -- List truncated checkbox labels + if LeaPlusLC["TruncatedLabelsList"] then + for i, v in pairs(LeaPlusLC["TruncatedLabelsList"]) do + LeaPlusLC:Print(LeaPlusLC["TruncatedLabelsList"][i]) + end + else + LeaPlusLC:Print("Checkbox labels are Ok.") + end + return + elseif str == "cv" then + -- Print and set console variable setting + if arg1 and arg1 ~= "" then + if GetCVar(arg1) then + if arg2 and arg2 ~= "" then + if tonumber(arg2) then + SetCVar(arg1, arg2) + else + LeaPlusLC:Print("Value must be a number.") + return + end + end + LeaPlusLC:Print(arg1 .. ": |cffffffff" .. GetCVar(arg1)) + else + LeaPlusLC:Print("Invalid console variable.") + end + else + LeaPlusLC:Print("Missing console variable.") + end + return + elseif str == "play" then + -- Play sound ID + if arg1 and arg1 ~= "" then + if tonumber(arg1) then + -- Stop last played sound ID + if LeaPlusLC.SNDcanitHandle then + StopSound(LeaPlusLC.SNDcanitHandle) + end + -- Play sound ID + LeaPlusLC.SNDcanitPlay, LeaPlusLC.SNDcanitHandle = PlaySound(arg1, "Master", false, false) + if not LeaPlusLC.SNDcanitPlay then LeaPlusLC:Print(L["Invalid sound ID"] .. ": |cffffffff" .. arg1) end + else + LeaPlusLC:Print(L["Invalid sound ID"] .. ": |cffffffff" .. arg1) + end + else + LeaPlusLC:Print("Missing sound ID.") + end + return + elseif str == "stop" then + -- Stop last played sound ID + if LeaPlusLC.SNDcanitHandle then + StopSound(LeaPlusLC.SNDcanitHandle) + end + return + elseif str == "wipecds" then + -- Wipe cooldowns + LeaPlusDB["Cooldowns"] = nil + ReloadUI() + return + elseif str == "tipchat" then + -- Print tooltip contents in chat + local numLines = GameTooltip:NumLines() + if numLines then + for i = 1, numLines do + print(_G["GameTooltipTextLeft" .. i]:GetText() or "") + end + end + return + elseif str == "tiplang" then + -- Tooltip tag locale code constructor + local msg = "" + msg = msg .. 'if GameLocale == "' .. GameLocale .. '" then ' + msg = msg .. 'ttLevel = "' .. LEVEL .. '"; ' + msg = msg .. 'ttBoss = "' .. BOSS .. '"; ' + msg = msg .. 'ttElite = "' .. ELITE .. '"; ' + msg = msg .. 'ttRare = "' .. ITEM_QUALITY3_DESC .. '"; ' + msg = msg .. 'ttRareElite = "' .. ITEM_QUALITY3_DESC .. " " .. ELITE .. '"; ' + msg = msg .. 'ttRareBoss = "' .. ITEM_QUALITY3_DESC .. " " .. BOSS .. '"; ' + msg = msg .. 'ttTarget = "' .. TARGET .. '"; ' + msg = msg .. "end" + print(msg) + return + elseif str == "con" then + -- Show the developer console + C_Console.SetFontHeight(28) + DeveloperConsole:Toggle(true) + return + elseif str == "movlist" then + -- List playable movie IDs + local count = 0 + for i = 1, 1000 do + if IsMoviePlayable(i) then + print(i) + count = count + 1 + end + end + LeaPlusLC:Print("Total movies: |cffffffff" .. count) + return + elseif str == "movie" then + -- Playback movie by ID + arg1 = tonumber(arg1) + if arg1 and arg1 ~= "" then + if IsMoviePlayable(arg1) then + MovieFrame_PlayMovie(MovieFrame, arg1) + else + LeaPlusLC:Print("Movie not playable.") + end + else + LeaPlusLC:Print("Missing movie ID.") + end + return + elseif str == "cin" then + -- Play opening cinematic (only works if character has never gained XP) (used for testing) + OpeningCinematic() + return + elseif str == "skit" then + -- Play a test sound kit + PlaySound("1020", "Master", false, true) + return + elseif str == "marker" then + -- Prevent showing raid target markers on self + if not LeaPlusLC.MarkerFrame then + LeaPlusLC.MarkerFrame = CreateFrame("FRAME") + LeaPlusLC.MarkerFrame:RegisterEvent("RAID_TARGET_UPDATE") + end + LeaPlusLC.MarkerFrame.Update = true + if LeaPlusLC.MarkerFrame.Toggle == false then + -- Show markers + LeaPlusLC.MarkerFrame:SetScript("OnEvent", nil) + ActionStatus_DisplayMessage(L["Self Markers Allowed"], true) + LeaPlusLC.MarkerFrame.Toggle = true + else + -- Hide markers + SetRaidTarget("player", 0) + LeaPlusLC.MarkerFrame:SetScript("OnEvent", function() + if LeaPlusLC.MarkerFrame.Update == true then + LeaPlusLC.MarkerFrame.Update = false + SetRaidTarget("player", 0) + end + LeaPlusLC.MarkerFrame.Update = true + end) + ActionStatus_DisplayMessage(L["Self Markers Blocked"], true) + LeaPlusLC.MarkerFrame.Toggle = false + end + return + elseif str == "pos" then + -- Map POI code builder + local mapID = C_Map.GetBestMapForUnit("player") or nil + local mapName = C_Map.GetMapInfo(mapID).name or nil + local mapRects = {} + local tempVec2D = CreateVector2D(0, 0) + local void + -- Get player map position + tempVec2D.x, tempVec2D.y = UnitPosition("player") + if not tempVec2D.x then return end + local mapRect = mapRects[mapID] + if not mapRect then + mapRect = {} + void, mapRect[1] = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(0, 0)) + void, mapRect[2] = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(1, 1)) + mapRect[2]:Subtract(mapRect[1]) + mapRects[mapID] = mapRect + end + tempVec2D:Subtract(mapRects[mapID][1]) + local pX, pY = tempVec2D.y/mapRects[mapID][2].y, tempVec2D.x/mapRects[mapID][2].x + pX = string.format("%0.1f", 100 * pX) + pY = string.format("%0.1f", 100 * pY) + if mapID and mapName and pX and pY then + ChatFrame1:Clear() + local dnType, dnTex = "Dungeon", "dnTex" + if arg1 == "raid" then dnType, dnTex = "Raid", "rdTex" end + if arg1 == "portal" then dnType = "Portal" end + print('[' .. mapID .. '] = --[[' .. mapName .. ']] {{' .. pX .. ', ' .. pY .. ', L[' .. '"Name"' .. '], L[' .. '"' .. dnType .. '"' .. '], ' .. dnTex .. '},},') + end + return + elseif str == "mapref" then + -- Print map reveal structure code + if not WorldMapFrame:IsShown() then + LeaPlusLC:Print("Open the map first!") + return + end + ChatFrame1:Clear() + local msg = "" + local mapID = WorldMapFrame.mapID + local mapName = C_Map.GetMapInfo(mapID).name + local mapArt = C_Map.GetMapArtID(mapID) + msg = msg .. "--[[" .. mapName .. "]] [" .. mapArt .. "] = {" + local exploredMapTextures = C_MapExplorationInfo.GetExploredMapTextures(mapID); + if exploredMapTextures then + for i, exploredTextureInfo in ipairs(exploredMapTextures) do + local twidth = exploredTextureInfo.textureWidth or 0 + if twidth > 0 then + local theight = exploredTextureInfo.textureHeight or 0 + local offsetx = exploredTextureInfo.offsetX + local offsety = exploredTextureInfo.offsetY + local filedataIDS = exploredTextureInfo.fileDataIDs + msg = msg .. "[" .. '"' .. twidth .. ":" .. theight .. ":" .. offsetx .. ":" .. offsety .. '"' .. "] = " .. '"' + for fileData = 1, #filedataIDS do + msg = msg .. filedataIDS[fileData] + if fileData < #filedataIDS then + msg = msg .. ", " + else + msg = msg .. '",' + if i < #exploredMapTextures then + msg = msg .. " " + end + end + end + end + end + msg = msg .. "}," + print(msg) + end + return + elseif str == "mk" then + -- Print a map key + if not arg1 then LeaPlusLC:Print("Key missing!") return end + if not tonumber(arg1) then LeaPlusLC:Print("Must be a number!") return end + local key = arg1 + ChatFrame1:Clear() + print('"' .. mod(floor(key / 2^36), 2^12) .. ":" .. mod(floor(key / 2^24), 2^12) .. ":" .. mod(floor(key / 2^12), 2^12) .. ":" .. mod(key, 2^12) .. '"') + return + elseif str == "map" then + -- Set map by ID, print currently showing map ID or print character map ID + if not arg1 then + -- Print map ID + if WorldMapFrame:IsShown() then + -- Show world map ID + local mapID = WorldMapFrame.mapID or nil + local artID = C_Map.GetMapArtID(mapID) or nil + local mapName = C_Map.GetMapInfo(mapID).name or nil + if mapID and artID and mapName then + LeaPlusLC:Print(mapID .. " (" .. artID .. "): " .. mapName .. " (map)") + end + else + -- Show character map ID + local mapID = C_Map.GetBestMapForUnit("player") or nil + local artID = C_Map.GetMapArtID(mapID) or nil + local mapName = C_Map.GetMapInfo(mapID).name or nil + if mapID and artID and mapName then + LeaPlusLC:Print(mapID .. " (" .. artID .. "): " .. mapName .. " (player)") + end + end + return + elseif not tonumber(arg1) or not C_Map.GetMapInfo(arg1) then + -- Invalid map ID + LeaPlusLC:Print("Invalid map ID.") + else + -- Set map by ID + WorldMapFrame:SetMapID(tonumber(arg1)) + end + return + elseif str == "cls" then + -- Clear chat frame + ChatFrame1:Clear() + return + elseif str == "al" then + -- Enable auto loot + SetCVar("autoLootDefault", "1") + LeaPlusLC:Print("Auto loot is now enabled.") + return + elseif str == "realm" then + -- Show list of connected realms + local titleRealm = GetRealmName() + local userRealm = GetNormalizedRealmName() + local connectedServers = GetAutoCompleteRealms() + if titleRealm and userRealm and connectedServers then + LeaPlusLC:Print(L["Connections for"] .. "|cffffffff " .. titleRealm) + if #connectedServers > 0 then + local count = 1 + for i = 1, #connectedServers do + if userRealm ~= connectedServers[i] then + LeaPlusLC:Print(count .. ". " .. connectedServers[i]) + count = count + 1 + end + end + else + LeaPlusLC:Print("None") + end + end + return + elseif str == "dup" then + -- Print music track duplicates + local mask, found, badidfound = false, false, false + for i, e in pairs(Leatrix_Plus["ZoneList"]) do + if Leatrix_Plus["ZoneList"][e] then + for a, b in pairs(Leatrix_Plus["ZoneList"][e]) do + local same = {} + if b.tracks then + for k, v in pairs(b.tracks) do + -- Check for bad sound IDs + if not strfind(v, "|c") then + if not strfind(v, ".mp3") then + local temFile, temSoundID = v:match("([^,]+)%#([^,]+)") + if temSoundID then + local temPlay, temHandle = PlaySound(temSoundID, "Master", false, true) + if temHandle then StopSound(temHandle) end + temPlay, temHandle = PlaySound(temSoundID, "Master", false, true) + if not temPlay and not temHandle then + print("|cffff5400" .. L["Bad ID"] .. ": |r" .. e, v) + badidfound = true + else + if temHandle then StopSound(temHandle) end + end + end + end + -- Check for duplicate IDs + if tContains(same, v) and mask == false then + mask = true + found = true + print("|cffec51ff" .. L["Dup ID"] .. ": |r" .. e, v) + end + tinsert(same, v) + mask = false + end + end + end + end + end + end + if badidfound == false then + LeaPlusLC:Print("No bad sound IDs found.") + end + if found == false then + LeaPlusLC:Print("No media duplicates found.") + end + Sound_GameSystem_RestartSoundSystem() + collectgarbage() + return + elseif str == "help" then + -- Help panel + if not LeaPlusLC.HelpFrame then + local frame = CreateFrame("FRAME", nil, UIParent) + frame:SetSize(570, 340); frame:SetFrameStrata("FULLSCREEN_DIALOG"); frame:SetFrameLevel(100) + frame.tex = frame:CreateTexture(nil, "BACKGROUND"); frame.tex:SetAllPoints(); + -- frame.tex:SetColorTexture(0.05, 0.05, 0.05, 0.9) + frame.close = CreateFrame("Button", nil, frame, "UIPanelCloseButton"); frame.close:SetSize(30, 30); frame.close:SetPoint("TOPRIGHT", 0, 0); frame.close:SetScript("OnClick", function() frame:Hide() end) + frame:ClearAllPoints(); frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + frame:SetClampedToScreen(true) + frame:SetClampRectInsets(450, -450, -300, 300) + frame:EnableMouse(true) + frame:SetMovable(true) + frame:RegisterForDrag("LeftButton") + frame:SetScript("OnDragStart", frame.StartMoving) + frame:SetScript("OnDragStop", function() frame:StopMovingOrSizing() frame:SetUserPlaced(false) end) + frame:Hide() + LeaPlusLC:CreateBar("HelpPanelMainTexture", frame, 570, 340, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png") + -- Panel contents + local col1, col2, color1 = 10, 120, "|cffffffaa" + LeaPlusLC:MakeTx(frame, "Leatrix Plus Help", col1, -10) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp", col1, -30) + LeaPlusLC:MakeWD(frame, "Toggle opttions panel.", col2, -30) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp reset", col1, -50) + LeaPlusLC:MakeWD(frame, "Reset addon panel position and scale.", col2, -50) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp wipe", col1, -70) + LeaPlusLC:MakeWD(frame, "Wipe all addon settings (reloads UI).", col2, -70) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp realm", col1, -90) + LeaPlusLC:MakeWD(frame, "Show realms connected to yours.", col2, -90) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp rest", col1, -110) + LeaPlusLC:MakeWD(frame, "Show number of rested XP bubbles remaining.", col2, -110) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp quest ", col1, -130) + LeaPlusLC:MakeWD(frame, "Show quest completion status for .", col2, -130) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp grid", col1, -150) + LeaPlusLC:MakeWD(frame, "Toggle a frame alignment grid.", col2, -150) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp id", col1, -170) + LeaPlusLC:MakeWD(frame, "Show a web link for whatever the pointer is over.", col2, -170) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp zygor", col1, -190) + LeaPlusLC:MakeWD(frame, "Toggle the Zygor addon (reloads UI).", col2, -190) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp movie ", col1, -210) + LeaPlusLC:MakeWD(frame, "Play a movie by its ID.", col2, -210) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp marker", col1, -230) + LeaPlusLC:MakeWD(frame, "Block target markers (toggle) (requires assistant or leader in raid).", col2, -230) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp rsnd", col1, -250) + LeaPlusLC:MakeWD(frame, "Restart the sound system.", col2, -250) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp ra", col1, -270) + LeaPlusLC:MakeWD(frame, "Announce target in General chat channel (useful for rares).", col2, -270) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp con", col1, -290) + LeaPlusLC:MakeWD(frame, "Launch the developer console with a large font.", col2, -290) + LeaPlusLC:MakeWD(frame, color1 .. "/rl", col1, -310) + LeaPlusLC:MakeWD(frame, "Reload the UI.", col2, -310) + LeaPlusLC.HelpFrame = frame + _G["LeaPlusGlobalHelpPanel"] = frame + table.insert(UISpecialFrames, "LeaPlusGlobalHelpPanel") + end + if LeaPlusLC.HelpFrame:IsShown() then LeaPlusLC.HelpFrame:Hide() else LeaPlusLC.HelpFrame:Show() end + return + elseif str == "ra" then + -- Announce target name, health percentage, coordinates and map pin link in General chat channel + local genChannel + if GameLocale == "deDE" then genChannel = "Allgemein" + elseif GameLocale == "esMX" then genChannel = "General" + elseif GameLocale == "esES" then genChannel = "General" + elseif GameLocale == "frFR" then genChannel = "Général" + elseif GameLocale == "itIT" then genChannel = "Generale" + elseif GameLocale == "ptBR" then genChannel = "Geral" + elseif GameLocale == "ruRU" then genChannel = "Общий" + elseif GameLocale == "koKR" then genChannel = "공개" + elseif GameLocale == "zhCN" then genChannel = "综合" + elseif GameLocale == "zhTW" then genChannel = "綜合" + else genChannel = "General" + end + if genChannel then + local index = GetChannelName(genChannel) + if index and index > 0 then + local mapID = C_Map.GetBestMapForUnit("player") + local pos = C_Map.GetPlayerMapPosition(mapID, "player") + if pos.x and pos.x ~= "0" and pos.y and pos.y ~= "0" then + local uHealth = UnitHealth("target") + local uHealthMax = UnitHealthMax("target") + -- Announce in chat + if uHealth and uHealth > 0 and uHealthMax and uHealthMax > 0 then + -- Get unit classification (elite, rare, rare elite or boss) + local unitType, unitTag = UnitClassification("target"), "" + if unitType then + if unitType == "rare" or unitType == "rareelite" then unitTag = "(" .. L["Rare"] .. ") " elseif unitType == "worldboss" then unitTag = "(" .. L["Boss"] .. ") " end + end + SendChatMessage(format("%%t " .. unitTag .. "(%d%%)%s", uHealth / uHealthMax * 100, " " .. string.format("%.0f", pos.x * 100) .. ":" .. string.format("%.0f", pos.y * 100)), "CHANNEL", nil, index) + -- SendChatMessage(format("%%t " .. unitTag .. "(%d%%)%s", uHealth / uHealthMax * 100, " " .. string.format("%.0f", pos.x * 100) .. ":" .. string.format("%.0f", pos.y * 100)), "WHISPER", nil, GetUnitName("player")) -- Debug + else + LeaPlusLC:Print("Invalid target.") + end + else + LeaPlusLC:Print("Cannot announce in this zone.") + end + else + LeaPlusLC:Print("Cannot find General chat channel.") + end + end + return + elseif str == "camp" then + -- Camp + if not LeaPlusLC.NoCampFrame then + -- Load LibChatAnims + Leatrix_Plus:LeaPlusLCA() + -- Chat filter + function LeaPlusLC.CampFilterFunc(self, event, msg) + if msg:match(_G["MARKED_AFK_MESSAGE"]:gsub("%%s", "%s-")) + or msg:match(_G["MARKED_AFK"]) + or msg:match(_G["CLEARED_AFK"]) + or msg:match(_G["IDLE_MESSAGE"]) + then return true + end + end + LeaPlusLC.NoCampFrame = CreateFrame("FRAME", nil, UIParent) + end + if LeaPlusLC.NoCampFrame:IsEventRegistered("PLAYER_CAMPING") then + -- Disable camp + LeaPlusLC.NoCampFrame:UnregisterEvent("PLAYER_CAMPING") + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", LeaPlusLC.CampFilterFunc) + LeaPlusLC:Print("Camping enabled. You will camp.") + else + -- Enable camp + LeaPlusLC.NoCampFrame:RegisterEvent("PLAYER_CAMPING") + ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", LeaPlusLC.CampFilterFunc) + LeaPlusLC:Print("Camping disabled. You won't camp.") + end + -- Event handler + LeaPlusLC.NoCampFrame:SetScript("OnEvent", function() + local p = StaticPopup_Visible("CAMP") + _G[p .. "Button1"]:Click() + end) + return + elseif str == "perf" then + -- Average FPS during combat + local fTab = {} + if not LeaPlusLC.perf then + LeaPlusLC.perf = CreateFrame("FRAME") + end + local fFrm = LeaPlusLC.perf + local k, startTime = 0, 0 + if fFrm:IsEventRegistered("PLAYER_REGEN_DISABLED") then + fFrm:UnregisterAllEvents() + fFrm:SetScript("OnUpdate", nil) + LeaPlusLC:Print("PERF unloaded.") + else + fFrm:RegisterEvent("PLAYER_REGEN_DISABLED") + fFrm:RegisterEvent("PLAYER_REGEN_ENABLED") + LeaPlusLC:Print("Waiting for combat to start...") + end + fFrm:SetScript("OnEvent", function(self, event) + if event == "PLAYER_REGEN_DISABLED" then + LeaPlusLC:Print("Monitoring FPS during combat...") + fFrm:SetScript("OnUpdate", function() + k = k + 1 + fTab[k] = GetFramerate() + end) + startTime = GetTime() + else + fFrm:SetScript("OnUpdate", nil) + local tSum = 0 + for i = 1, #fTab do + tSum = tSum + fTab[i] + end + local timeTaken = string.format("%.0f", GetTime() - startTime) + if tSum > 0 then + LeaPlusLC:Print("Average FPS for " .. timeTaken .. " seconds of combat: " .. string.format("%.0f", tSum / #fTab)) + end + end + end) + return + elseif str == "col" then + -- Convert color values + LeaPlusLC:Print("|n") + local r, g, b = tonumber(arg1), tonumber(arg2), tonumber(arg3) + if r and g and b then + -- RGB source + LeaPlusLC:Print("Source: |cffffffff" .. r .. " " .. g .. " " .. b .. " ") + -- RGB to Hex + if r > 1 and g > 1 and b > 1 then + -- RGB to Hex + LeaPlusLC:Print("Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r, g, b)) .. " (from RGB)") + else + -- Wow to Hex + LeaPlusLC:Print("Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r * 255, g * 255, b * 255)) .. " (from Wow)") + -- Wow to RGB + local rwow = string.format("%.0f", r * 255) + local gwow = string.format("%.0f", g * 255) + local bwow = string.format("%.0f", b * 255) + if rwow ~= "0.0" and gwow ~= "0.0" and bwow ~= "0.0" then + LeaPlusLC:Print("RGB: |cffffffff" .. rwow .. " " .. gwow .. " " .. bwow .. " (from Wow)") + end + end + -- RGB to Wow + local rwow = string.format("%.1f", r / 255) + local gwow = string.format("%.1f", g / 255) + local bwow = string.format("%.1f", b / 255) + if rwow ~= "0.0" and gwow ~= "0.0" and bwow ~= "0.0" then + LeaPlusLC:Print("Wow: |cffffffff" .. rwow .. " " .. gwow .. " " .. bwow) + end + LeaPlusLC:Print("|n") + elseif arg1 and strlen(arg1) == 6 and strmatch(arg1,"%x") and arg2 == nil and arg3 == nil then + -- Hex source + local rhex, ghex, bhex = string.sub(arg1, 1, 2), string.sub(arg1, 3, 4), string.sub(arg1, 5, 6) + if strmatch(rhex,"%x") and strmatch(ghex,"%x") and strmatch(bhex,"%x") then + LeaPlusLC:Print("Source: |cffffffff" .. strupper(arg1)) + LeaPlusLC:Print("Wow: |cffffffff" .. string.format("%.1f", tonumber(rhex, 16) / 255) .. " " .. string.format("%.1f", tonumber(ghex, 16) / 255) .. " " .. string.format("%.1f", tonumber(bhex, 16) / 255)) + LeaPlusLC:Print("RGB: |cffffffff" .. tonumber(rhex, 16) .. " " .. tonumber(ghex, 16) .. " " .. tonumber(bhex, 16)) + else + LeaPlusLC:Print("Invalid arguments.") + end + LeaPlusLC:Print("|n") + else + LeaPlusLC:Print("Invalid arguments.") + end + return + elseif str == "click" then + -- Click a button + local frame = GetMouseFocus() + local ftype = frame:GetObjectType() + if frame and ftype and ftype == "Button" then + frame:Click() + else + LeaPlusLC:Print("Hover the pointer over a button.") + end + return + elseif str == "frame" then + -- Print frame name under mouse + local frame = GetMouseFocus() + local ftype = frame:GetObjectType() + if frame and ftype then + local fname = frame:GetName() + local issecure, tainted = issecurevariable(fname) + if issecure then issecure = "Yes" else issecure = "No" end + if tainted then tainted = "Yes" else tainted = "No" end + if fname then + LeaPlusLC:Print("Name: |cffffffff" .. fname) + LeaPlusLC:Print("Type: |cffffffff" .. ftype) + LeaPlusLC:Print("Secure: |cffffffff" .. issecure) + LeaPlusLC:Print("Tainted: |cffffffff" .. tainted) + end + end + return + elseif str == "arrow" then + -- Arrow (left: drag, shift/ctrl: rotate, mouseup: loc, pointer must be on arrow stem) + local f = CreateFrame("Frame", nil, WorldMapFrame.ScrollContainer) + f:SetSize(64, 64) + f:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + f:SetFrameLevel(500) + f:SetParent(WorldMapFrame.ScrollContainer) + f:SetScale(0.6) + + f.t = f:CreateTexture(nil, "ARTWORK") + f.t:SetAtlas("Garr_LevelUpgradeArrow") + f.t:SetAllPoints() + + f.f = f:CreateFontString(nil, "ARTWORK", "GameFontNormal") + f.f:SetText("0.0") + + local x = 0 + f:SetScript("OnUpdate", function() + if IsShiftKeyDown() then + x = x + 0.01 + if x > 6.3 then x = 0 end + f.t:SetRotation(x) + f.f:SetFormattedText("%.1f", x) + elseif IsControlKeyDown() then + x = x - 0.01 + if x < 0 then x = 6.3 end + f.t:SetRotation(x) + f.f:SetFormattedText("%.1f", x) + end + -- Print coordinates when mouse is in right place + local x, y = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition() + if x and y and x > 0 and y > 0 then + if MouseIsOver(f, -31, 31, 31, -31) then + ChatFrame1:Clear() + print(('{"Arrow", ' .. floor(x * 1000 + 0.5) / 10) .. ',', (floor(y * 1000 + 0.5) / 10) .. ', L["Step 1"], L["Start here."], arTex, nil, nil, nil, nil, nil, ' .. f.f:GetText() .. "},") + PlaySoundFile(567412, "Master", false, true) + end + end + end) + + f:SetMovable(true) + f:SetScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + f:StartMoving() + end + end) + + f:SetScript("OnMouseUp", function() + f:StopMovingOrSizing() + --ChatFrame1:Clear() + --local x, y = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition() + --if x and y and x > 0 and y > 0 and MouseIsOver(f) then + -- print(('{"Arrow", ' .. floor(x * 1000 + 0.5) / 10) .. ',', (floor(y * 1000 + 0.5) / 10) .. ', L["Step 1"], L["Start here."], ' .. f.f:GetText() .. "},") + --end + end) + return + elseif str == "dis" then + -- Disband group + if not LeaPlusLC:IsInLFGQueue() and not IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then + local x = GetNumGroupMembers() or 0 + for i = x, 1, -1 do + if GetNumGroupMembers() > 0 then + local name = GetRaidRosterInfo(i) + if name and name ~= UnitName("player") then + UninviteUnit(name) + end + end + end + else + LeaPlusLC:Print("You cannot do that while in group finder.") + end + return + elseif str == "reinv" then + -- Disband and reinvite raid + if not LeaPlusLC:IsInLFGQueue() then + if UnitIsGroupLeader("player") then + -- Disband + local groupNames = {} + local x = GetNumGroupMembers() or 0 + for i = x, 1, -1 do + if GetNumGroupMembers() > 0 then + local name = GetRaidRosterInfo(i) + if name and name ~= UnitName("player") then + UninviteUnit(name) + tinsert(groupNames, name) + end + end + end + -- Reinvite + LibCompat.After(0.1, function() + for k, v in pairs(groupNames) do + C_PartyInfo.InviteUnit(v) + end + end) + else + LeaPlusLC:Print("You need to be group leader.") + end + else + LeaPlusLC:Print("You cannot do that while in group finder.") + end + return + elseif str == "limit" then + -- Sound Limit + if not LeaPlusLC.MuteFrame then + -- Panel frame + local frame = CreateFrame("FRAME", nil, UIParent) + frame:SetSize(294, 86); frame:SetFrameStrata("FULLSCREEN_DIALOG"); frame:SetFrameLevel(100); frame:SetScale(2) + frame.tex = frame:CreateTexture(nil, "BACKGROUND"); frame.tex:SetAllPoints(); + -- frame.tex:SetColorTexture(0.05, 0.05, 0.05, 0.9) + frame.close = CreateFrame("Button", nil, frame, "UIPanelCloseButton"); frame.close:SetSize(30, 30); frame.close:SetPoint("TOPRIGHT", 0, 0); frame.close:SetScript("OnClick", function() frame:Hide() end) + frame:ClearAllPoints(); frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + frame:SetClampedToScreen(true) + frame:EnableMouse(true) + frame:SetMovable(true) + frame:RegisterForDrag("LeftButton") + frame:SetScript("OnDragStart", frame.StartMoving) + frame:SetScript("OnDragStop", function() frame:StopMovingOrSizing() frame:SetUserPlaced(false) end) + frame:Hide() + LeaPlusLC:CreateBar("MutePanelMainTexture", frame, 294, 86, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png") + -- Panel contents + LeaPlusLC:MakeTx(frame, "Sound Limit", 16, -12) + local endBox = LeaPlusLC:CreateEditBox("SoundEndBox", frame, 116, 10, "TOPLEFT", 16, -32, "SoundEndBox", "SoundEndBox") + endBox:SetText(3000000) + endBox:SetScript("OnMouseWheel", function(self, delta) + local endSound = tonumber(endBox:GetText()) + if endSound then + if delta == 1 then endSound = endSound + LeaPlusLC.SoundByte else endSound = endSound - LeaPlusLC.SoundByte end + if endSound < 1 then endSound = 1 elseif endSound >= 3000000 then endSound = 3000000 end + endBox:SetText(endSound) + else + endSound = 100000 + endBox:SetText(endSound) + end + end) + -- Set limit button + frame.btn = LeaPlusLC:CreateButton("muteRangeButton", frame, "SET LIMIT", "TOPLEFT", 16, -72, 0, 25, true, "Click to set the sound file limit. Use the mousewheel on the editbox along with the step buttons below to adjust the sound limit. Acceptable range is from 1 to 3000000. Sound files higher than this limit will be muted.") + frame.btn:ClearAllPoints() + frame.btn:SetPoint("LEFT", endBox, "RIGHT", 10, 0) + frame.btn:SetScript("OnClick", function() + local endSound = tonumber(endBox:GetText()) + if endSound then + if endSound > 3000000 then endSound = 3000000 endBox:SetText(endSound) end + frame.btn:SetText("WAIT") + LibCompat.After(0.1, function() + for i = 1, 3000000 do + MuteSoundFile(i) + end + for i = 1, endSound do + UnmuteSoundFile(i) + end + Sound_GameSystem_RestartSoundSystem() + frame.btn:SetText("SET LIMIT") + end) + else + frame.btn:SetText("INVALID") + frame.btn:EnableMouse(false) + LibCompat.After(2, function() + frame.btn:SetText("SET LIMIT") + frame.btn:EnableMouse(true) + end) + end + end) + -- Mute all button + frame.MuteAllBtn = LeaPlusLC:CreateButton("muteMuteAllButton", frame, "MUTE ALL", "TOPLEFT", 16, -92, 0, 25, true, "Click to mute every sound in the game.") + frame.MuteAllBtn:SetScale(0.5) + frame.MuteAllBtn:ClearAllPoints() + frame.MuteAllBtn:SetPoint("TOPLEFT", frame.btn, "TOPRIGHT", 20, 0) + frame.MuteAllBtn:SetScript("OnClick", function() + frame.MuteAllBtn:SetText("WAIT") + LibCompat.After(0.1, function() + for i = 1, 3000000 do + MuteSoundFile(i) + end + Sound_GameSystem_RestartSoundSystem() + frame.MuteAllBtn:SetText("MUTE ALL") + end) + return + end) + -- Unmute all button + frame.UnmuteAllBtn = LeaPlusLC:CreateButton("muteUnmuteAllButton", frame, "UNMUTE ALL", "TOPLEFT", 16, -92, 0, 25, true, "Click to unmute every sound in the game.") + frame.UnmuteAllBtn:SetScale(0.5) + frame.UnmuteAllBtn:ClearAllPoints() + frame.UnmuteAllBtn:SetPoint("TOPLEFT", frame.MuteAllBtn, "BOTTOMLEFT", 0, -10) + frame.UnmuteAllBtn:SetScript("OnClick", function() + frame.UnmuteAllBtn:SetText("WAIT") + LibCompat.After(0.1, function() + for i = 1, 3000000 do + UnmuteSoundFile(i) + end + Sound_GameSystem_RestartSoundSystem() + frame.UnmuteAllBtn:SetText("UNMUTE ALL") + end) + return + end) + -- Step buttons + frame.millionBtn = LeaPlusLC:CreateButton("SoundMillionButton", frame, "1000000", "TOPLEFT", 26, -122, 0, 25, true, "Set the editbox step value to 1000000.") + frame.millionBtn:SetScale(0.5) + + frame.hundredThousandBtn = LeaPlusLC:CreateButton("SoundHundredThousandButton", frame, "100000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 100000.") + frame.hundredThousandBtn:ClearAllPoints() + frame.hundredThousandBtn:SetPoint("LEFT", frame.millionBtn, "RIGHT", 10, 0) + frame.hundredThousandBtn:SetScale(0.5) + + frame.tenThousandBtn = LeaPlusLC:CreateButton("SoundTenThousandButton", frame, "10000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 10000.") + frame.tenThousandBtn:ClearAllPoints() + frame.tenThousandBtn:SetPoint("LEFT", frame.hundredThousandBtn, "RIGHT", 10, 0) + frame.tenThousandBtn:SetScale(0.5) + + frame.thousandBtn = LeaPlusLC:CreateButton("SoundThousandButton", frame, "1000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 1000.") + frame.thousandBtn:ClearAllPoints() + frame.thousandBtn:SetPoint("LEFT", frame.tenThousandBtn, "RIGHT", 10, 0) + frame.thousandBtn:SetScale(0.5) + + frame.hundredBtn = LeaPlusLC:CreateButton("SoundHundredButton", frame, "100", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 100.") + frame.hundredBtn:ClearAllPoints() + frame.hundredBtn:SetPoint("LEFT", frame.thousandBtn, "RIGHT", 10, 0) + frame.hundredBtn:SetScale(0.5) + + frame.tenBtn = LeaPlusLC:CreateButton("SoundTenButton", frame, "10", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 10.") + frame.tenBtn:ClearAllPoints() + frame.tenBtn:SetPoint("LEFT", frame.hundredBtn, "RIGHT", 10, 0) + frame.tenBtn:SetScale(0.5) + + frame.oneBtn = LeaPlusLC:CreateButton("SoundTenButton", frame, "1", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 1.") + frame.oneBtn:ClearAllPoints() + frame.oneBtn:SetPoint("LEFT", frame.tenBtn, "RIGHT", 10, 0) + frame.oneBtn:SetScale(0.5) + + local function DimAllBoxes() + frame.millionBtn:SetAlpha(0.3) + frame.hundredThousandBtn:SetAlpha(0.3) + frame.tenThousandBtn:SetAlpha(0.3) + frame.thousandBtn:SetAlpha(0.3) + frame.hundredBtn:SetAlpha(0.3) + frame.tenBtn:SetAlpha(0.3) + frame.oneBtn:SetAlpha(0.3) + end + + LeaPlusLC.SoundByte = 1000000 + DimAllBoxes() + frame.millionBtn:SetAlpha(1) + + -- Step button handlers + frame.millionBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 1000000 + DimAllBoxes() + frame.millionBtn:SetAlpha(1) + end) + + frame.hundredThousandBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 100000 + DimAllBoxes() + frame.hundredThousandBtn:SetAlpha(1) + end) + + frame.tenThousandBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 10000 + DimAllBoxes() + frame.tenThousandBtn:SetAlpha(1) + end) + + frame.thousandBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 1000 + DimAllBoxes() + frame.thousandBtn:SetAlpha(1) + end) + + frame.hundredBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 100 + DimAllBoxes() + frame.hundredBtn:SetAlpha(1) + end) + + frame.tenBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 10 + DimAllBoxes() + frame.tenBtn:SetAlpha(1) + end) + + frame.oneBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 1 + DimAllBoxes() + frame.oneBtn:SetAlpha(1) + end) + + -- Final code + LeaPlusLC.MuteFrame = frame + _G["LeaPlusGlobalMutePanel"] = frame + table.insert(UISpecialFrames, "LeaPlusGlobalMutePanel") + end + if LeaPlusLC.MuteFrame:IsShown() then LeaPlusLC.MuteFrame:Hide() else LeaPlusLC.MuteFrame:Show() end + return + elseif str == "mem" or str == "m" then + -- Show addon panel with memory usage + if LeaPlusLC.ShowMemoryUsage then + LeaPlusLC:ShowMemoryUsage(LeaPlusLC["Page8"], "TOPLEFT", 146, -262) + end + -- Prevent options panel from showing if a game options panel is showing + if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() or ChatConfigFrame:IsShown() then return end + -- Prevent options panel from showing if Blizzard Store is showing + if StoreFrame and StoreFrame:GetAttribute("isshown") then return end + -- Toggle the options panel if game options panel is not showing + if LeaPlusLC:IsPlusShowing() then + LeaPlusLC:HideFrames() + LeaPlusLC:HideConfigPanels() + else + LeaPlusLC:HideFrames() + LeaPlusLC["PageF"]:Show() + end + LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show() + return + elseif str == "gossinfo" then + -- Print gossip frame information + if GossipFrame:IsShown() then + local npcName = UnitName("target") + local npcGuid = UnitGUID("target") or nil + if npcName and npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + LeaPlusLC:Print(npcName .. ": |cffffffff" .. npcID) + end + end + LeaPlusLC:Print("Available quests: |cffffffff" .. GetNumGossipAvailableQuests()) + LeaPlusLC:Print("Active quests: |cffffffff" .. GetNumGossipActiveQuests()) + LeaPlusLC:Print("Gossip count: |cffffffff" .. GetNumGossipOptions()) + if GetGossipOptions() then + local void, gossipType = GetGossipOptions() + LeaPlusLC:Print("Gossip type: |cffffffff" .. gossipType) + else + LeaPlusLC:Print("Gossip type: |cffffffff" .. "Nil") + end + if GossipTitleButton1 and GossipTitleButton1:GetText() then + LeaPlusLC:Print("First option: |cffffffff" .. GossipTitleButton1:GetText()) + end + -- LeaPlusLC:Print("Gossip text: |cffffffff" .. GetGossipText()) + if not IsShiftKeyDown() then + SelectGossipOption(1) + end + else + LeaPlusLC:Print("Gossip frame not open.") + end + return + elseif str == "admin" then + -- Preset profile (used for testing) + LpEvt:UnregisterAllEvents() -- Prevent changes + wipe(LeaPlusDB) -- Wipe settings + LeaPlusLC:PlayerLogout(true) -- Reset permanent settings + -- Automation + LeaPlusDB["AutomateQuests"] = "On" -- Automate quests + LeaPlusDB["AutoQuestShift"] = "Off" -- Automate quests requires shift + LeaPlusDB["AutoQuestAvailable"] = "On" -- Accept available quests + LeaPlusDB["AutoQuestCompleted"] = "On" -- Turn-in completed quests + LeaPlusDB["AutoQuestKeyMenu"] = 1 -- Automate quests override key + LeaPlusDB["AutomateGossip"] = "On" -- Automate gossip + LeaPlusDB["AutoAcceptSummon"] = "On" -- Accept summon + LeaPlusDB["AutoAcceptRes"] = "On" -- Accept resurrection + LeaPlusDB["AutoReleasePvP"] = "On" -- Release in PvP + LeaPlusDB["AutoSellJunk"] = "On" -- Sell junk automatically + LeaPlusDB["AutoSellExcludeList"] = "" -- Sell junk exclusions list + LeaPlusDB["AutoRepairGear"] = "On" -- Repair automatically + + -- Social + LeaPlusDB["NoDuelRequests"] = "On" -- Block duels + LeaPlusDB["NoPartyInvites"] = "Off" -- Block party invites + LeaPlusDB["NoFriendRequests"] = "Off" -- Block friend requests + LeaPlusDB["NoSharedQuests"] = "Off" -- Block shared quests + + LeaPlusDB["AcceptPartyFriends"] = "On" -- Party from friends + LeaPlusDB["InviteFromWhisper"] = "On" -- Invite from whispers + LeaPlusDB["InviteFriendsOnly"] = "On" -- Restrict invites to friends + LeaPlusDB["FriendlyGuild"] = "On" -- Friendly guild + + -- Chat + LeaPlusDB["UseEasyChatResizing"] = "On" -- Use easy resizing + LeaPlusDB["NoCombatLogTab"] = "On" -- Hide the combat log + LeaPlusDB["NoChatButtons"] = "On" -- Hide chat buttons + LeaPlusDB["UnclampChat"] = "On" -- Unclamp chat frame + LeaPlusDB["MoveChatEditBoxToTop"] = "On" -- Move editbox to top + LeaPlusDB["MoreFontSizes"] = "On" -- More font sizes + + LeaPlusDB["NoStickyChat"] = "On" -- Disable sticky chat + LeaPlusDB["UseArrowKeysInChat"] = "On" -- Use arrow keys in chat + LeaPlusDB["NoChatFade"] = "On" -- Disable chat fade + LeaPlusDB["UnivGroupColor"] = "On" -- Universal group color + LeaPlusDB["ClassColorsInChat"] = "On" -- Use class colors in chat + LeaPlusDB["RecentChatWindow"] = "On" -- Recent chat window + LeaPlusDB["RecentChatSize"] = 170 -- Recent chat size + LeaPlusDB["MaxChatHstory"] = "Off" -- Increase chat history + LeaPlusDB["FilterChatMessages"] = "On" -- Filter chat messages + LeaPlusDB["BlockSpellLinks"] = "On" -- Block spell links + LeaPlusDB["BlockDrunkenSpam"] = "On" -- Block drunken spam + LeaPlusDB["BlockDuelSpam"] = "On" -- Block duel spam + LeaPlusDB["RestoreChatMessages"] = "On" -- Restore chat messages + + -- Text + LeaPlusDB["HideErrorMessages"] = "On" -- Hide error messages + LeaPlusDB["NoHitIndicators"] = "On" -- Hide portrait text + LeaPlusDB["HideKeybindText"] = "On" -- Hide keybind text + LeaPlusDB["HideMacroText"] = "On" -- Hide macro text + + LeaPlusDB["MailFontChange"] = "On" -- Resize mail text + LeaPlusDB["LeaPlusMailFontSize"] = 22 -- Mail font size + LeaPlusDB["QuestFontChange"] = "On" -- Resize quest text + LeaPlusDB["LeaPlusQuestFontSize"] = 18 -- Quest font size + LeaPlusDB["BookFontChange"] = "On" -- Resize book text + LeaPlusDB["LeaPlusBookFontSize"] = 22 -- Book font size + + -- Interface + LeaPlusDB["MinimapModder"] = "On" -- Enhance minimap + LeaPlusDB["SquareMinimap"] = "On" -- Square minimap + LeaPlusDB["ShowWhoPinged"] = "On" -- Show who pinged + LeaPlusDB["CombineAddonButtons"] = "Off" -- Combine addon buttons + LeaPlusDB["MiniExcludeList"] = "BugSack, Leatrix_Plus" -- Excluded addon list + LeaPlusDB["MinimapScale"] = 1.40 -- Minimap scale slider + LeaPlusDB["MinimapSize"] = 180 -- Minimap size slider + LeaPlusDB["MiniClusterScale"] = 1 -- Minimap cluster scale + LeaPlusDB["MinimapNoScale"] = "Off" -- Minimap not minimap + LeaPlusDB["HideMiniZoneText"] = "On" -- Hide zone text bar + LeaPlusDB["HideMiniMapButton"] = "On" -- Hide world map button + LeaPlusDB["HideMiniTracking"] = "On" -- Hide tracking button + LeaPlusDB["MinimapA"] = "TOPRIGHT" -- Minimap anchor + LeaPlusDB["MinimapR"] = "TOPRIGHT" -- Minimap relative + LeaPlusDB["MinimapX"] = 0 -- Minimap X + LeaPlusDB["MinimapY"] = 0 -- Minimap Y + + LeaPlusDB["TipModEnable"] = "On" -- Enhance tooltip + LeaPlusDB["LeaPlusTipSize"] = 1.25 -- Tooltip scale slider + LeaPlusDB["TooltipAnchorMenu"] = 2 -- Tooltip anchor + LeaPlusDB["TipCursorX"] = 0 -- X offset + LeaPlusDB["TipCursorY"] = 0 -- Y offset + LeaPlusDB["EnhanceDressup"] = "On" -- Enhance dressup + LeaPlusDB["HideDressupStats"] = "On" -- Hide dressup stats + LeaPlusDB["EnhanceQuestLog"] = "On" -- Enhance quest log + LeaPlusDB["EnhanceQuestHeaders"] = "On" -- Enhance quest log toggle headers + LeaPlusDB["EnhanceQuestLevels"] = "On" -- Enhance quest log quest levels + LeaPlusDB["EnhanceQuestDifficulty"] = "On" -- Enhance quest log quest difficulty + + LeaPlusDB["EnhanceProfessions"] = "On" -- Enhance professions + LeaPlusDB["EnhanceTrainers"] = "On" -- Enhance trainers + LeaPlusDB["ShowTrainAllBtn"] = "On" -- Show train all button + + LeaPlusDB["ShowVolume"] = "On" -- Show volume slider + LeaPlusDB["AhExtras"] = "On" -- Show auction controls + LeaPlusDB["ShowCooldowns"] = "On" -- Show cooldowns + LeaPlusDB["DurabilityStatus"] = "On" -- Show durability status + LeaPlusDB["ShowVanityControls"] = "On" -- Show vanity controls + LeaPlusDB["ShowBagSearchBox"] = "On" -- Show bag search box + LeaPlusDB["ShowRaidToggle"] = "On" -- Show raid button + LeaPlusDB["ShowPlayerChain"] = "On" -- Show player chain + LeaPlusDB["PlayerChainMenu"] = 3 -- Player chain style + LeaPlusDB["ShowReadyTimer"] = "On" -- Show ready timer + LeaPlusDB["ShowWowheadLinks"] = "On" -- Show Wowhead links + LeaPlusDB["WowheadLinkComments"] = "On" -- Show Wowhead links to comments + LeaPlusDB["ShowFlightTimes"] = "On" -- Show flight times + LeaPlusDB["FlightBarBackground"] = "Off" -- Show flight times bar background + LeaPlusDB["FlightBarDestination"] = "On" -- Show flight times bar destination + LeaPlusDB["FlightBarFillBar"] = "Off" -- Show flight times bar fill mode + LeaPlusDB["FlightBarSpeech"] = "On" -- Show flight times bar speech + LeaPlusDB["FlightBarContribute"] = "On" -- Show flight times contribute + + -- Interface: Manage frames + LeaPlusDB["FrmEnabled"] = "On" + + LeaPlusDB["Frames"] = {} + LeaPlusDB["Frames"]["PlayerFrame"] = {} + LeaPlusDB["Frames"]["PlayerFrame"]["Point"] = "TOPLEFT" + LeaPlusDB["Frames"]["PlayerFrame"]["Relative"] = "TOPLEFT" + LeaPlusDB["Frames"]["PlayerFrame"]["XOffset"] = -35 + LeaPlusDB["Frames"]["PlayerFrame"]["YOffset"] = -14 + LeaPlusDB["Frames"]["PlayerFrame"]["Scale"] = 1.20 + + LeaPlusDB["Frames"]["TargetFrame"] = {} + LeaPlusDB["Frames"]["TargetFrame"]["Point"] = "TOPLEFT" + LeaPlusDB["Frames"]["TargetFrame"]["Relative"] = "TOPLEFT" + LeaPlusDB["Frames"]["TargetFrame"]["XOffset"] = 190 + LeaPlusDB["Frames"]["TargetFrame"]["YOffset"] = -14 + LeaPlusDB["Frames"]["TargetFrame"]["Scale"] = 1.20 + + LeaPlusDB["ManageBuffs"] = "On" -- Manage buffs + LeaPlusDB["BuffFrameA"] = "TOPRIGHT" -- Manage buffs anchor + LeaPlusDB["BuffFrameR"] = "TOPRIGHT" -- Manage buffs relative + LeaPlusDB["BuffFrameX"] = -271 -- Manage buffs position X + LeaPlusDB["BuffFrameY"] = 0 -- Manage buffs position Y + LeaPlusDB["BuffFrameScale"] = 0.8 -- Manage buffs scale + + LeaPlusDB["ManageWidget"] = "On" -- Manage widget + LeaPlusDB["WidgetA"] = "TOP" -- Manage widget anchor + LeaPlusDB["WidgetR"] = "TOP" -- Manage widget relative + LeaPlusDB["WidgetX"] = 0 -- Manage widget position X + LeaPlusDB["WidgetY"] = -432 -- Manage widget position Y + LeaPlusDB["WidgetScale"] = 1.25 -- Manage widget scale + + LeaPlusDB["ManageFocus"] = "On" -- Manage focus + LeaPlusDB["FocusA"] = "TOPLEFT" -- Manage focus anchor + LeaPlusDB["FocusR"] = "TOPLEFT" -- Manage focus relative + LeaPlusDB["FocusX"] = 250 -- Manage focus position X + LeaPlusDB["FocusY"] = -240 -- Manage focus position Y + LeaPlusDB["FocusScale"] = 1.00 -- Manage focus scale + + LeaPlusDB["ManageTimer"] = "On" -- Manage timer + LeaPlusDB["TimerA"] = "TOP" -- Manage timer anchor + LeaPlusDB["TimerR"] = "TOP" -- Manage timer relative + LeaPlusDB["TimerX"] = 0 -- Manage timer position X + LeaPlusDB["TimerY"] = -120 -- Manage timer position Y + LeaPlusDB["TimerScale"] = 1.00 -- Manage timer scale + + LeaPlusDB["ManageDurability"] = "On" -- Manage durability + LeaPlusDB["DurabilityA"] = "TOPRIGHT" -- Manage durability anchor + LeaPlusDB["DurabilityR"] = "TOPRIGHT" -- Manage durability relative + LeaPlusDB["DurabilityX"] = 0 -- Manage durability position X + LeaPlusDB["DurabilityY"] = -192 -- Manage durability position Y + LeaPlusDB["DurabilityScale"] = 1.00 -- Manage durability scale + + LeaPlusDB["ManageVehicle"] = "On" -- Manage vehicle + LeaPlusDB["VehicleA"] = "TOPRIGHT" -- Manage vehicle anchor + LeaPlusDB["VehicleR"] = "TOPRIGHT" -- Manage vehicle relative + LeaPlusDB["VehicleX"] = -100 -- Manage vehicle position X + LeaPlusDB["VehicleY"] = -192 -- Manage vehicle position Y + LeaPlusDB["VehicleScale"] = 1.00 -- Manage vehicle scale + + LeaPlusDB["ClassColFrames"] = "On" -- Class colored frames + + LeaPlusDB["NoAlerts"] = "On" -- Hide alerts + LeaPlusDB["NoGryphons"] = "On" -- Hide gryphons + LeaPlusDB["NoClassBar"] = "On" -- Hide stance bar + + -- System + LeaPlusDB["NoScreenGlow"] = "On" -- Disable screen glow + LeaPlusDB["NoScreenEffects"] = "On" -- Disable screen effects + LeaPlusDB["SetWeatherDensity"] = "On" -- Set weather density + LeaPlusDB["WeatherLevel"] = 0 -- Weather density level + LeaPlusDB["MaxCameraZoom"] = "On" -- Max camera zoom + LeaPlusDB["ViewPortEnable"] = "On" -- Enable viewport + LeaPlusDB["NoRestedEmotes"] = "On" -- Silence rested emotes + LeaPlusDB["MuteGameSounds"] = "On" -- Mute game sounds + LeaPlusDB["MuteCustomSounds"] = "On" -- Mute custom sounds + LeaPlusDB["MuteCustomList"] = "" -- Mute custom sounds list + + LeaPlusDB["NoBagAutomation"] = "On" -- Disable bag automation + LeaPlusDB["CharAddonList"] = "On" -- Show character addons + LeaPlusDB["NoConfirmLoot"] = "On" -- Disable loot warnings + LeaPlusDB["FasterLooting"] = "On" -- Faster auto loot + LeaPlusDB["FasterMovieSkip"] = "On" -- Faster movie skip + LeaPlusDB["StandAndDismount"] = "On" -- Dismount me + LeaPlusDB["ShowVendorPrice"] = "On" -- Show vendor price + LeaPlusDB["CombatPlates"] = "On" -- Combat plates + LeaPlusDB["EasyItemDestroy"] = "On" -- Easy item destroy + + -- Function to assign cooldowns + local function setIcon(pclass, pspec, sp1, pt1, sp2, pt2, sp3, pt3, sp4, pt4, sp5, pt5) + -- Set spell ID + if sp1 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Idn"] = sp1 end + if sp2 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Idn"] = sp2 end + if sp3 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Idn"] = sp3 end + if sp4 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Idn"] = sp4 end + if sp5 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Idn"] = sp5 end + -- Set pet checkbox + if pt1 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Pet"] = true end + if pt2 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Pet"] = true end + if pt3 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Pet"] = true end + if pt4 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Pet"] = true end + if pt5 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Pet"] = true end + end + + -- Create main table + LeaPlusDB["Cooldowns"] = {} + + -- Create class tables + local classList = {"WARRIOR", "PALADIN", "HUNTER", "SHAMAN", "ROGUE", "DRUID", "MAGE", "WARLOCK", "PRIEST"} + for index = 1, #classList do + if LeaPlusDB["Cooldowns"][classList[index]] == nil then + LeaPlusDB["Cooldowns"][classList[index]] = {} + end + end + + -- Assign cooldowns + setIcon("WARRIOR", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) + setIcon("PALADIN", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 19740, 0) -- nil, nil, nil, nil, Might + setIcon("HUNTER", 1, --[[1]] 136, 1, --[[2]] 118455, 1, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 5384, 0) -- Mend Pet, nil, nil, nil, Feign Death + setIcon("SHAMAN", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 215864, 0, --[[5]] 546, 0) -- nil, nil, nil, Rainfall, Water Walking + setIcon("ROGUE", 1, --[[1]] 1784, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 2823, 0, --[[5]] 3408, 0) -- Stealth, nil, nil, Deadly Poison, Crippling Poison + setIcon("DRUID", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) + setIcon("MAGE", 1, --[[1]] 235450, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Prismatic Barrier + setIcon("WARLOCK", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) + setIcon("PRIEST", 1, --[[1]] 17, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Power Word: Shield + + -- Mute game sounds (LeaPlusLC["MuteGameSounds"]) + for k, v in pairs(LeaPlusLC["muteTable"]) do + LeaPlusDB[k] = "On" + end + LeaPlusDB["MuteReady"] = "Off" -- Mute ready check + + -- Set chat font sizes + RunScript('for i = 1, 50 do if _G["ChatFrame" .. i] then FCF_SetChatWindowFontSize(self, _G["ChatFrame" .. i], 20) end end') + + -- Reload + ReloadUI() + else + LeaPlusLC:Print("Invalid parameter.") + end + return + else + -- Prevent options panel from showing if a game options panel is showing + if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() or ChatConfigFrame:IsShown() then return end + -- Prevent options panel from showing if Blizzard Store is showing + if StoreFrame and StoreFrame:GetAttribute("isshown") then return end + -- Toggle the options panel if game options panel is not showing + if LeaPlusLC:IsPlusShowing() then + LeaPlusLC:HideFrames() + LeaPlusLC:HideConfigPanels() + else + LeaPlusLC:HideFrames() + LeaPlusLC["PageF"]:Show() + end + LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show() + end + end + + -- Slash command for global function + -- _G.SLASH_Leatrix_Plus1 = "/ltp" + -- _G.SLASH_Leatrix_Plus2 = "/leaplus" + _G.SLASH_Leatrix_Plus1 = "/ztp" -- temp + + SlashCmdList["Leatrix_Plus"] = function(self) + -- Run slash command function + LeaPlusLC:SlashFunc(self) + -- Redirect tainted variables + RunScript('ACTIVE_CHAT_EDIT_BOX = ACTIVE_CHAT_EDIT_BOX') + RunScript('LAST_ACTIVE_CHAT_EDIT_BOX = LAST_ACTIVE_CHAT_EDIT_BOX') + end + + -- Slash command for UI reload + _G.SLASH_LEATRIX_PLUS_RL1 = "/rl" + SlashCmdList["LEATRIX_PLUS_RL"] = function() + ReloadUI() + end + + -- Replacement for broken slash command system + function leaplus(self) + LeaPlusLC:SlashFunc(self) + end + + -- To reproduce slash command bug, enter combat, enter an addn related slash command, toggle tracking on a + -- quest 4 times then click that quest in the objective tracker. + +---------------------------------------------------------------------- +-- L90: Create options panel pages (no content yet) +---------------------------------------------------------------------- + + -- Function to add menu button + function LeaPlusLC:MakeMN(name, text, parent, anchor, x, y, width, height) + + local mbtn = CreateFrame("Button", nil, parent) + LeaPlusLC[name] = mbtn + mbtn:Show(); + mbtn:SetSize(width, height) + mbtn:SetAlpha(1.0) + mbtn:SetPoint(anchor, x, y) + + mbtn.t = mbtn:CreateTexture(nil, "BACKGROUND") + mbtn.t:SetAllPoints() + -- mbtn.t:SetColorTexture(0.3, 0.3, 0.00, 0.8) + mbtn.t:SetAlpha(0.7) + mbtn.t:Hide() + + mbtn.s = mbtn:CreateTexture(nil, "BACKGROUND") + mbtn.s:SetAllPoints() + -- mbtn.s:SetColorTexture(0.3, 0.3, 0.00, 0.8) + mbtn.s:Hide() + + mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mbtn.f:SetPoint('LEFT', 16, 0) + mbtn.f:SetText(L[text]) + + mbtn:SetScript("OnEnter", function() + mbtn.t:Show() + end) + + mbtn:SetScript("OnLeave", function() + mbtn.t:Hide() + end) + + return mbtn, mbtn.s + + end + + -- Function to create individual options panel pages + function LeaPlusLC:MakePage(name, title, menu, menuname, menuparent, menuanchor, menux, menuy, menuwidth, menuheight) + + -- Create frame + local oPage = CreateFrame("Frame", nil, LeaPlusLC["PageF"]); + LeaPlusLC[name] = oPage + oPage:SetAllPoints(LeaPlusLC["PageF"]) + oPage:Hide(); + + -- Add page title + oPage.s = oPage:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + oPage.s:SetPoint('TOPLEFT', 146, -16) + oPage.s:SetText(L[title]) + + -- Add menu item if needed + if menu then + LeaPlusLC[menu], LeaPlusLC[menu .. ".s"] = LeaPlusLC:MakeMN(menu, menuname, menuparent, menuanchor, menux, menuy, menuwidth, menuheight) + LeaPlusLC[name]:SetScript("OnShow", function() LeaPlusLC[menu .. ".s"]:Show(); end) + LeaPlusLC[name]:SetScript("OnHide", function() LeaPlusLC[menu .. ".s"]:Hide(); end) + end + + return oPage; + + end + + -- Create options pages + LeaPlusLC["Page0"] = LeaPlusLC:MakePage("Page0", "Home" , "LeaPlusNav0", "Home" , LeaPlusLC["PageF"], "TOPLEFT", 16, -72, 112, 20) + LeaPlusLC["Page1"] = LeaPlusLC:MakePage("Page1", "Automation" , "LeaPlusNav1", "Automation" , LeaPlusLC["PageF"], "TOPLEFT", 16, -112, 112, 20) + LeaPlusLC["Page2"] = LeaPlusLC:MakePage("Page2", "Social" , "LeaPlusNav2", "Social" , LeaPlusLC["PageF"], "TOPLEFT", 16, -132, 112, 20) + LeaPlusLC["Page3"] = LeaPlusLC:MakePage("Page3", "Chat" , "LeaPlusNav3", "Chat" , LeaPlusLC["PageF"], "TOPLEFT", 16, -152, 112, 20) + LeaPlusLC["Page4"] = LeaPlusLC:MakePage("Page4", "Text" , "LeaPlusNav4", "Text" , LeaPlusLC["PageF"], "TOPLEFT", 16, -172, 112, 20) + LeaPlusLC["Page5"] = LeaPlusLC:MakePage("Page5", "Interface" , "LeaPlusNav5", "Interface" , LeaPlusLC["PageF"], "TOPLEFT", 16, -192, 112, 20) + LeaPlusLC["Page6"] = LeaPlusLC:MakePage("Page6", "Frames" , "LeaPlusNav6", "Frames" , LeaPlusLC["PageF"], "TOPLEFT", 16, -212, 112, 20) + LeaPlusLC["Page7"] = LeaPlusLC:MakePage("Page7", "System" , "LeaPlusNav7", "System" , LeaPlusLC["PageF"], "TOPLEFT", 16, -232, 112, 20) + LeaPlusLC["Page8"] = LeaPlusLC:MakePage("Page8", "Settings" , "LeaPlusNav8", "Settings" , LeaPlusLC["PageF"], "TOPLEFT", 16, -272, 112, 20) + LeaPlusLC["Page9"] = LeaPlusLC:MakePage("Page9", "Media" , "LeaPlusNav9", "Media" , LeaPlusLC["PageF"], "TOPLEFT", 16, -292, 112, 20) + + -- Page navigation mechanism + for i = 0, LeaPlusLC["NumberOfPages"] do + LeaPlusLC["LeaPlusNav"..i]:SetScript("OnClick", function() + LeaPlusLC:HideFrames() + LeaPlusLC["PageF"]:Show(); + LeaPlusLC["Page"..i]:Show(); + LeaPlusLC["LeaStartPage"] = i + end) + end + + -- Use a variable to contain the page number (makes it easier to move options around) + local pg; + +---------------------------------------------------------------------- +-- LC0: Welcome +---------------------------------------------------------------------- + + pg = "Page0"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Welcome to Leatrix Plus.", 146, -72); + LeaPlusLC:MakeWD(LeaPlusLC[pg], "To begin, choose an options page.", 146, -92); + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Support", 146, -132); + LeaPlusLC:MakeWD(LeaPlusLC[pg], "www.leatrix.com", 146, -152); + +---------------------------------------------------------------------- +-- LC1: Automation +---------------------------------------------------------------------- + + pg = "Page1"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Character" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutomateQuests" , "Automate quests" , 146, -92, false, "If checked, quests will be selected, accepted and turned-in automatically.|n|nQuests which have a gold requirement will not be turned-in automatically.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutomateGossip" , "Automate gossip" , 146, -112, false, "If checked, you can hold down the alt key while opening a gossip window to automatically select a single gossip item.|n|nIf the gossip item type is banker, taxi, trainer, vendor, battlemaster or stable master, gossip will be skipped without needing to hold the alt key. You can hold the shift key down to prevent this.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoAcceptSummon" , "Accept summon" , 146, -132, false, "If checked, summon requests will be accepted automatically unless you are in combat.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoAcceptRes" , "Accept resurrection" , 146, -152, false, "If checked, resurrection requests will be accepted automatically.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoReleasePvP" , "Release in PvP" , 146, -172, false, "If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Vendors" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoSellJunk" , "Sell junk automatically" , 340, -92, false, "If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoRepairGear" , "Repair automatically" , 340, -112, false, "If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting.") + + LeaPlusLC:CfgBtn("AutomateQuestsBtn", LeaPlusCB["AutomateQuests"]) + LeaPlusLC:CfgBtn("AutoAcceptResBtn", LeaPlusCB["AutoAcceptRes"]) + LeaPlusLC:CfgBtn("AutoReleasePvPBtn", LeaPlusCB["AutoReleasePvP"]) + LeaPlusLC:CfgBtn("AutoSellJunkBtn", LeaPlusCB["AutoSellJunk"]) + LeaPlusLC:CfgBtn("AutoRepairBtn", LeaPlusCB["AutoRepairGear"]) + +---------------------------------------------------------------------- +-- LC2: Social +---------------------------------------------------------------------- + + pg = "Page2"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Blocks" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoDuelRequests" , "Block duels" , 146, -92, false, "If checked, duel requests will be blocked unless the player requesting the duel is a friend.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoPartyInvites" , "Block party invites" , 146, -112, false, "If checked, party invitations will be blocked unless the player inviting you is a friend.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoFriendRequests" , "Block friend requests" , 146, -132, false, "If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoSharedQuests" , "Block shared quests" , 146, -152, false, "If checked, shared quests will be declined unless the player sharing the quest is a friend.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Groups" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AcceptPartyFriends" , "Party from friends" , 340, -92, false, "If checked, party invitations from friends will be automatically accepted unless you are queued for a battleground.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "InviteFromWhisper" , "Invite from whispers" , 340, -112, false, L["If checked, a group invite will be sent to anyone who whispers you with a set keyword as long as you are ungrouped, group leader or raid assistant and not queued for a battleground.|n|nFriends who message the keyword using Battle.net will not be sent a group invite if they are appearing offline. They need to either change their online status or use character whispers."] .. "|n|n" .. L["Keyword"] .. ": |cffffffff" .. "dummy" .. "|r") + + LeaPlusLC:MakeFT(LeaPlusLC[pg], "For all of the social options above, you can treat guild members as friends too.", 146, 380) + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FriendlyGuild" , "Guild" , 146, -282, false, "If checked, members of your guild will be treated as friends for all of the options on this page.") + + if LeaPlusCB["FriendlyGuild"].f:GetStringWidth() > 90 then + LeaPlusCB["FriendlyGuild"].f:SetWidth(90) + LeaPlusCB["FriendlyGuild"]:SetHitRectInsets(0, -84, 0, 0) + end + + LeaPlusLC:CfgBtn("InvWhisperBtn", LeaPlusCB["InviteFromWhisper"]) + +---------------------------------------------------------------------- +-- LC3: Chat +---------------------------------------------------------------------- + + pg = "Page3"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Chat Frame" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UseEasyChatResizing" , "Use easy resizing" , 146, -92, true, "If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoCombatLogTab" , "Hide the combat log" , 146, -112, true, "If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu).") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoChatButtons" , "Hide chat buttons" , 146, -132, true, "If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UnclampChat" , "Unclamp chat frame" , 146, -152, true, "If checked, you will be able to drag the chat frame to the edge of the screen.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MoveChatEditBoxToTop" , "Move editbox to top" , 146, -172, true, "If checked, the editbox will be moved to the top of the chat frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MoreFontSizes" , "More font sizes" , 146, -192, true, "If checked, additional font sizes will be available in the chat frame font size menu.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Mechanics" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoStickyChat" , "Disable sticky chat" , 340, -92, true, "If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UseArrowKeysInChat" , "Use arrow keys in chat" , 340, -112, true, "If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoChatFade" , "Disable chat fade" , 340, -132, true, "If checked, chat text will not fade out after a time period.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UnivGroupColor" , "Universal group color" , 340, -152, false, "If checked, raid chat will be colored blue (to match the default party chat color).") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ClassColorsInChat" , "Use class colors in chat" , 340, -172, true, "If checked, class colors will be used in the chat frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "RecentChatWindow" , "Recent chat window" , 340, -192, true, "If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MaxChatHstory" , "Increase chat history" , 340, -212, true, "If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FilterChatMessages" , "Filter chat messages" , 340, -232, true, "If checked, you can block spell links, drunken spam and duel spam.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "RestoreChatMessages" , "Restore chat messages" , 340, -252, true, "If checked, recent chat will be restored when you reload your interface.") + + LeaPlusLC:CfgBtn("FilterChatMessagesBtn", LeaPlusCB["FilterChatMessages"]) + +---------------------------------------------------------------------- +-- LC4: Text +---------------------------------------------------------------------- + + pg = "Page4"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Visibility" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideErrorMessages" , "Hide error messages" , 146, -92, true, "If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the alt key and click it to toggle error messages without affecting this setting.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoHitIndicators" , "Hide portrait numbers" , 146, -112, true, "If checked, damage and healing numbers in the player and pet portrait frames will be hidden.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideZoneText" , "Hide zone text" , 146, -132, true, "If checked, zone text will not be shown (eg. 'Ironforge').") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideKeybindText" , "Hide keybind text" , 146, -152, true, "If checked, keybind text will not be shown on action buttons.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideMacroText" , "Hide macro text" , 146, -172, true, "If checked, macro text will not be shown on action buttons.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Text Size" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MailFontChange" , "Resize mail text" , 340, -92, true, "If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices).") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "QuestFontChange" , "Resize quest text" , 340, -112, true, "If checked, you will be able to change the font size of quest text.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "BookFontChange" , "Resize book text" , 340, -132, true, "If checked, you will be able to change the font size of book text.") + + LeaPlusLC:CfgBtn("MailTextBtn", LeaPlusCB["MailFontChange"]) + LeaPlusLC:CfgBtn("QuestTextBtn", LeaPlusCB["QuestFontChange"]) + LeaPlusLC:CfgBtn("BookTextBtn", LeaPlusCB["BookFontChange"]) + +---------------------------------------------------------------------- +-- LC5: Interface +---------------------------------------------------------------------- + + pg = "Page5"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Enhancements" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MinimapModder" , "Enhance minimap" , 146, -92, true, "If checked, you will be able to customise the minimap.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "TipModEnable" , "Enhance tooltip" , 146, -112, true, "If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceDressup" , "Enhance dressup" , 146, -132, true, "If checked, you will be able to pan (right-button) and zoom (mousewheel) in the character frame, dressup frame and inspect frame.|n|nA toggle stats button will be shown in the character frame. You can also middle-click the character model to toggle stats.|n|nModel rotation controls will be hidden. Buttons to toggle gear will be added to the dressup frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceQuestLog" , "Enhance quest log" , 146, -152, true, "If checked, you will be able to customise the quest log frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceProfessions" , "Enhance professions" , 146, -172, true, "If checked, the professions frame will be larger.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceTrainers" , "Enhance trainers" , 146, -192, true, "If checked, the skill trainer frame will be larger and feature a train all skills button.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Extras" , 146, -232); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowVolume" , "Show volume slider" , 146, -252, true, "If checked, a master volume slider will be shown in the character frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AhExtras" , "Show auction controls" , 146, -272, true, "If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Extras" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowCooldowns" , "Show cooldowns" , 340, -92, true, "If checked, you will be able to place up to five beneficial cooldown icons above the target frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "DurabilityStatus" , "Show durability status" , 340, -112, true, "If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowVanityControls" , "Show vanity controls" , 340, -132, true, "If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowBagSearchBox" , "Show bag search box" , 340, -152, true, "If checked, a bag search box will be shown in the backpack frame and the bank frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowRaidToggle" , "Show raid button" , 340, -172, true, "If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowPlayerChain" , "Show player chain" , 340, -192, true, "If checked, you will be able to show a rare, elite or rare elite chain around the player frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowReadyTimer" , "Show ready timer" , 340, -212, true, "If checked, a timer will be shown under the PvP encounter ready frame so that you know how long you have left to click the enter button.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowWowheadLinks" , "Show Wowhead links" , 340, -232, true, "If checked, Wowhead links will be shown in the world map frame and the achievements frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowFlightTimes" , "Show flight times" , 340, -252, true, "If checked, flight times will be shown in the flight map and when you take a flight.") + + LeaPlusLC:CfgBtn("ModMinimapBtn", LeaPlusCB["MinimapModder"]) + LeaPlusLC:CfgBtn("MoveTooltipButton", LeaPlusCB["TipModEnable"]) + LeaPlusLC:CfgBtn("EnhanceDressupBtn", LeaPlusCB["EnhanceDressup"]) + LeaPlusLC:CfgBtn("EnhanceQuestLogBtn", LeaPlusCB["EnhanceQuestLog"]) + LeaPlusLC:CfgBtn("EnhanceTrainersBtn", LeaPlusCB["EnhanceTrainers"]) + LeaPlusLC:CfgBtn("CooldownsButton", LeaPlusCB["ShowCooldowns"]) + LeaPlusLC:CfgBtn("ModPlayerChain", LeaPlusCB["ShowPlayerChain"]) + LeaPlusLC:CfgBtn("ShowWowheadLinksBtn", LeaPlusCB["ShowWowheadLinks"]) + LeaPlusLC:CfgBtn("ShowFlightTimesBtn", LeaPlusCB["ShowFlightTimes"]) + +---------------------------------------------------------------------- +-- LC6: Frames +---------------------------------------------------------------------- + + pg = "Page6"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Features" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FrmEnabled" , "Manage frames" , 146, -92, true, "If checked, you will be able to change the position and scale of the player frame and target frame.|n|nNote that enabling this option will prevent you from using the default UI to move the player and target frames.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageBuffs" , "Manage buffs" , 146, -112, true, "If checked, you will be able to change the position and scale of the buffs frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageWidget" , "Manage widget" , 146, -132, true, "If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageFocus" , "Manage focus" , 146, -152, true, "If checked, you will be able to change the position and scale of the focus frame.|n|nNote that enabling this option will prevent you from using the default UI to move the focus frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageTimer" , "Manage timer" , 146, -172, true, "If checked, you will be able to change the position and scale of the timer bar.|n|nThe timer bar is used for showing remaining breath when underwater as well as other things.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageDurability" , "Manage durability" , 146, -192, true, "If checked, you will be able to change the position and scale of the armored man durability frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageVehicle" , "Manage vehicle" , 146, -212, true, "If checked, you will be able to change the position and scale of the vehicle seat indicator frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ClassColFrames" , "Class colored frames" , 146, -232, true, "If checked, class coloring will be used in the player frame, target frame and focus frame.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Visibility" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoAlerts" , "Hide alerts" , 340, -92, true, "If checked, alert frames will not be shown.|n|nWhen you earn an achievement, a message will be shown in chat instead.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoGryphons" , "Hide gryphons" , 340, -112, true, "If checked, the main bar gryphons will not be shown.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoClassBar" , "Hide stance bar" , 340, -132, true, "If checked, the stance bar will not be shown.") + + LeaPlusLC:CfgBtn("MoveFramesButton", LeaPlusCB["FrmEnabled"]) + LeaPlusLC:CfgBtn("ManageBuffsButton", LeaPlusCB["ManageBuffs"]) + LeaPlusLC:CfgBtn("ManageWidgetButton", LeaPlusCB["ManageWidget"]) + LeaPlusLC:CfgBtn("ManageFocusButton", LeaPlusCB["ManageFocus"]) + LeaPlusLC:CfgBtn("ManageTimerButton", LeaPlusCB["ManageTimer"]) + LeaPlusLC:CfgBtn("ManageDurabilityButton", LeaPlusCB["ManageDurability"]) + LeaPlusLC:CfgBtn("ManageVehicleButton", LeaPlusCB["ManageVehicle"]) + LeaPlusLC:CfgBtn("ClassColFramesBtn", LeaPlusCB["ClassColFrames"]) + +---------------------------------------------------------------------- +-- LC7: System +---------------------------------------------------------------------- + + pg = "Page7"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Graphics and Sound" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoScreenGlow" , "Disable screen glow" , 146, -92, false, "If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoScreenEffects" , "Disable screen effects" , 146, -112, false, "If checked, the grey screen of death and the netherworld effect will be disabled.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "SetWeatherDensity" , "Set weather density" , 146, -132, false, "If checked, you will be able to set the density of weather effects.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MaxCameraZoom" , "Max camera zoom" , 146, -152, false, "If checked, you will be able to zoom out to a greater distance.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ViewPortEnable" , "Enable viewport" , 146, -172, true, "If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoRestedEmotes" , "Silence rested emotes" , 146, -192, true, "If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MuteGameSounds" , "Mute game sounds" , 146, -212, false, "If checked, you will be able to mute a selection of game sounds.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MuteCustomSounds" , "Mute custom sounds" , 146, -232, false, "If checked, you will be able to mute your own choice of sounds.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Game Options" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoBagAutomation" , "Disable bag automation" , 340, -92, true, "If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "CharAddonList" , "Show character addons" , 340, -112, true, "If checked, the addon list (accessible from the game menu) will show character based addons by default.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoConfirmLoot" , "Disable loot warnings" , 340, -132, false, "If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FasterLooting" , "Faster auto loot" , 340, -152, true, "If checked, the amount of time it takes to auto loot creatures will be significantly reduced.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FasterMovieSkip" , "Faster movie skip" , 340, -172, true, "If checked, you will be able to cancel cinematics without being prompted for confirmation.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "StandAndDismount" , "Dismount me" , 340, -192, true, "If checked, you will be able to set some additional rules for when your character is automatically dismounted.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowVendorPrice" , "Show vendor price" , 340, -212, true, "If checked, the vendor price will be shown in item tooltips.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "CombatPlates" , "Combat plates" , 340, -232, true, "If checked, enemy nameplates will be shown during combat and hidden when combat ends.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EasyItemDestroy" , "Easy item destroy" , 340, -252, true, "If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows.") + + LeaPlusLC:CfgBtn("SetWeatherDensityBtn", LeaPlusCB["SetWeatherDensity"]) + LeaPlusLC:CfgBtn("ModViewportBtn", LeaPlusCB["ViewPortEnable"]) + LeaPlusLC:CfgBtn("MuteGameSoundsBtn", LeaPlusCB["MuteGameSounds"]) + LeaPlusLC:CfgBtn("MuteCustomSoundsBtn", LeaPlusCB["MuteCustomSounds"]) + LeaPlusLC:CfgBtn("DismountBtn", LeaPlusCB["StandAndDismount"]) + +---------------------------------------------------------------------- +-- LC8: Settings +---------------------------------------------------------------------- + + pg = "Page8"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Addon" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowMinimapIcon" , "Show minimap button" , 146, -92, false, "If checked, a minimap button will be available.|n|nClick - Toggle options panel.|n|nSHIFT-click - Toggle music.|n|nALT-click - Toggle errors (if enabled).|n|nCTRL/SHIFT-click - Toggle Zygor (if installed).|n|nCTRL/ALT-click - Toggle windowed mode.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Scale", 340, -72); + LeaPlusLC:MakeSL(LeaPlusLC[pg], "PlusPanelScale", "Drag to set the scale of the Leatrix Plus panel.", 1, 2, 0.1, 340, -92, "%.1f") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Transparency", 340, -132); + LeaPlusLC:MakeSL(LeaPlusLC[pg], "PlusPanelAlpha", "Drag to set the transparency of the Leatrix Plus panel.", 0, 1, 0.1, 340, -152, "%.1f") diff --git a/Leatrix_Plus.blp b/Leatrix_Plus.blp new file mode 100644 index 0000000..bab52bc Binary files /dev/null and b/Leatrix_Plus.blp differ diff --git a/Leatrix_Plus.lua b/Leatrix_Plus.lua new file mode 100644 index 0000000..2353d53 --- /dev/null +++ b/Leatrix_Plus.lua @@ -0,0 +1,15957 @@ +---------------------------------------------------------------------- +-- Leatrix Plus 3.0.131 (10th May 2023) +---------------------------------------------------------------------- + +-- 01:Functns, 02:Locks, 03:Restart, 20:Live, 30:Isolated, 40:Player +-- 50:RunOnce, 60:Evnts, 62:Profile, 70:Lgot, 80:Commands, 90:Panel + +---------------------------------------------------------------------- +-- Leatrix Plus +---------------------------------------------------------------------- + + LibCompat = LibStub:GetLibrary("LibCompat-1.0") + -- Create global table + _G.LeaPlusDB = _G.LeaPlusDB or {} + + -- Create locals + local LeaPlusLC, LeaPlusCB, LeaDropList, LeaConfigList, LeaLockList = {}, {}, {}, {}, {} + local ClientVersion = GetBuildInfo() + local GameLocale = GetLocale() + local void + + -- Version + LeaPlusLC["AddonVer"] = "3.0.131" + + -- Get locale table + local void, Leatrix_Plus = ... + local L = Leatrix_Plus.L + + -- Check Wow version is valid + do + local gameversion, gamebuild, gamedate, gametocversion = GetBuildInfo() + if gametocversion and gametocversion < 30000 or gametocversion > 39999 then + -- Game client is not Wow Classic + LibCompat.After(2, function() + print(L["LEATRIX PLUS: WRONG VERSION INSTALLED!"]) + end) + return + end + end + + -- Check for addons + if IsAddOnLoaded("ElvUI") then LeaPlusLC.ElvUI = unpack(ElvUI) end + if IsAddOnLoaded("Glass") then LeaPlusLC.Glass = true end + +---------------------------------------------------------------------- +-- L00: Leatrix Plus +---------------------------------------------------------------------- + + -- Initialise variables + LeaPlusLC["ShowErrorsFlag"] = 1 + LeaPlusLC["NumberOfPages"] = 9 + LeaPlusLC["RaidColors"] = RAID_CLASS_COLORS + + -- Create event frame + local LpEvt = CreateFrame("FRAME") + LpEvt:RegisterEvent("ADDON_LOADED") + LpEvt:RegisterEvent("PLAYER_LOGIN") + LpEvt:RegisterEvent("PLAYER_ENTERING_WORLD") + + -- Set bindings translations + _G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_TOGGLE = L["Toggle panel"] + _G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_WEBLINK = L["Show web link"] + _G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_RARE = L["Announce rare"] + + -- Slash command taint + -- Enter combat, enter any addon slash command, open quest log with L, toggle tracking on a quest 4 times, + -- click the tracked quest in the objective tracker, taint and objective tracker no longer functions + +---------------------------------------------------------------------- +-- L01: Functions +---------------------------------------------------------------------- + + -- Print text + function LeaPlusLC:Print(text) + DEFAULT_CHAT_FRAME:AddMessage(L[text], 1.0, 0.85, 0.0) + end + + -- Lock and unlock an item + function LeaPlusLC:LockItem(item, lock) + if lock then + item:Disable() + item:SetAlpha(0.3) + else + item:Enable() + item:SetAlpha(1.0) + end + end + + -- Hide configuration panels + function LeaPlusLC:HideConfigPanels() + for k, v in pairs(LeaConfigList) do + v:Hide() + end + end + + -- Decline a shared quest if needed + function LeaPlusLC:CheckIfQuestIsSharedAndShouldBeDeclined() + if LeaPlusLC["NoSharedQuests"] == "On" then + local npcName = UnitName("questnpc") + if npcName then + if UnitInParty(npcName) or UnitInRaid(npcName) then + if not LeaPlusLC:FriendCheck(npcName) then + DeclineQuest() + return + end + end + end + end + end + + -- Show a single line prefilled editbox with copy functionality + function LeaPlusLC:ShowSystemEditBox(word, focuschat) + if not LeaPlusLC.FactoryEditBox then + -- Create frame for first time + local eFrame = CreateFrame("FRAME", nil, UIParent) + LeaPlusLC.FactoryEditBox = eFrame + eFrame:SetSize(700, 110) + eFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 150) + eFrame:SetFrameStrata("FULLSCREEN_DIALOG") + eFrame:SetFrameLevel(5000) + eFrame:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + eFrame:Hide() + end + end) + -- Add background color + eFrame.t = eFrame:CreateTexture(nil, "BACKGROUND") + eFrame.t:SetAllPoints() + eFrame.t:SetVertexColor(0.05, 0.05, 0.05, 0.9) + -- Add copy title + eFrame.f = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.f:SetPoint("TOPLEFT", x, y) + eFrame.f:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 12, -52) + eFrame.f:SetWidth(676) + eFrame.f:SetJustifyH("LEFT") + eFrame.f:SetWordWrap(false) + -- Add copy label + eFrame.c = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.c:SetPoint("TOPLEFT", x, y) + eFrame.c:SetText(L["Press CTRL/C to copy"]) + eFrame.c:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 12, -82) + -- Add feedback label + eFrame.x = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.x:SetPoint("TOPRIGHT", x, y) + eFrame.x:SetText(L["feedback@leatrix.com"]) + eFrame.x:SetPoint("TOPRIGHT", eFrame, "TOPRIGHT", -12, -52) + hooksecurefunc(eFrame.f, "SetText", function() + eFrame.f:SetWidth(676 - eFrame.x:GetStringWidth() - 26) + end) + -- Add cancel label + eFrame.x = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + eFrame.x:SetPoint("TOPRIGHT", x, y) + eFrame.x:SetText(L["Right-click to close"]) + eFrame.x:SetPoint("TOPRIGHT", eFrame, "TOPRIGHT", -12, -82) + -- Create editbox + eFrame.b = CreateFrame("EditBox", nil, eFrame, "InputBoxTemplate") + eFrame.b:ClearAllPoints() + eFrame.b:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 16, -12) + eFrame.b:SetSize(672, 24) + eFrame.b:SetFontObject("GameFontNormalLarge") + eFrame.b:SetTextColor(1.0, 1.0, 1.0, 1) + eFrame.b:SetBlinkSpeed(0) + eFrame.b:SetHitRectInsets(99, 99, 99, 99) + eFrame.b:SetAutoFocus(true) + eFrame.b:SetAltArrowKeyMode(true) + -- Editbox texture + eFrame.t = CreateFrame("FRAME", nil, eFrame.b) + eFrame.t:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = false, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }}) + eFrame.t:SetPoint("LEFT", -6, 0) + eFrame.t:SetWidth(eFrame.b:GetWidth() + 6) + eFrame.t:SetHeight(eFrame.b:GetHeight()) + eFrame.t:SetBackdropColor(1.0, 1.0, 1.0, 0.3) + -- Handler + eFrame.b:SetScript("OnKeyDown", function(void, key) + if key == "C" and IsControlKeyDown() then + LibCompat.After(0.1, function() + eFrame:Hide() + ActionStatus_DisplayMessage(L["Copied to clipboard."], true) + if LeaPlusLC.FactoryEditBoxFocusChat then + local eBox = ChatEdit_ChooseBoxForSend() + ChatEdit_ActivateChat(eBox) + end + end) + end + end) + -- Prevent changes + eFrame.b:SetScript("OnEscapePressed", function() eFrame:Hide() end) + eFrame.b:SetScript("OnEnterPressed", eFrame.b.HighlightText) + eFrame.b:SetScript("OnMouseDown", eFrame.b.ClearFocus) + eFrame.b:SetScript("OnMouseUp", eFrame.b.HighlightText) + eFrame.b:SetFocus(true) + eFrame.b:HighlightText() + eFrame:Show() + end + if focuschat then LeaPlusLC.FactoryEditBoxFocusChat = true else LeaPlusLC.FactoryEditBoxFocusChat = nil end + LeaPlusLC.FactoryEditBox:Show() + LeaPlusLC.FactoryEditBox.b:SetText(word) + LeaPlusLC.FactoryEditBox.b:HighlightText() + LeaPlusLC.FactoryEditBox.b:SetScript("OnChar", function() LeaPlusLC.FactoryEditBox.b:SetFocus(true) LeaPlusLC.FactoryEditBox.b:SetText(word) LeaPlusLC.FactoryEditBox.b:HighlightText() end) + LeaPlusLC.FactoryEditBox.b:SetScript("OnKeyUp", function() LeaPlusLC.FactoryEditBox.b:SetFocus(true) LeaPlusLC.FactoryEditBox.b:SetText(word) LeaPlusLC.FactoryEditBox.b:HighlightText() end) + end + + -- Load a string variable or set it to default if it's not set to "On" or "Off" + function LeaPlusLC:LoadVarChk(var, def) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" and LeaPlusDB[var] == "On" or LeaPlusDB[var] == "Off" then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Load a numeric variable and set it to default if it's not within a given range + function LeaPlusLC:LoadVarNum(var, def, valmin, valmax) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "number" and LeaPlusDB[var] >= valmin and LeaPlusDB[var] <= valmax then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Load an anchor point variable and set it to default if the anchor point is invalid + function LeaPlusLC:LoadVarAnc(var, def) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" and LeaPlusDB[var] == "CENTER" or LeaPlusDB[var] == "TOP" or LeaPlusDB[var] == "BOTTOM" or LeaPlusDB[var] == "LEFT" or LeaPlusDB[var] == "RIGHT" or LeaPlusDB[var] == "TOPLEFT" or LeaPlusDB[var] == "TOPRIGHT" or LeaPlusDB[var] == "BOTTOMLEFT" or LeaPlusDB[var] == "BOTTOMRIGHT" then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Load a string variable and set it to default if it is not a string (used with minimap exclude list) + function LeaPlusLC:LoadVarStr(var, def) + if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" then + LeaPlusLC[var] = LeaPlusDB[var] + else + LeaPlusLC[var] = def + LeaPlusDB[var] = def + end + end + + -- Show tooltips for checkboxes + function LeaPlusLC:TipSee() + GameTooltip:SetOwner(self, "ANCHOR_NONE") + local parent = self:GetParent() + local pscale = parent:GetEffectiveScale() + local gscale = UIParent:GetEffectiveScale() + local tscale = GameTooltip:GetEffectiveScale() + local gap = ((UIParent:GetRight() * gscale) - (parent:GetRight() * pscale)) + if gap < (250 * tscale) then + GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0) + else + GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0) + end + GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true) + end + + -- Show tooltips for dropdown menu tooltips + function LeaPlusLC:ShowDropTip() + GameTooltip:SetOwner(self, "ANCHOR_NONE") + local parent = self:GetParent():GetParent():GetParent() + local pscale = parent:GetEffectiveScale() + local gscale = UIParent:GetEffectiveScale() + local tscale = GameTooltip:GetEffectiveScale() + local gap = ((UIParent:GetRight() * gscale) - (parent:GetRight() * pscale)) + if gap < (250 * tscale) then + GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0) + else + GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0) + end + GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true) + end + + -- Show tooltips for configuration buttons and dropdown menus + function LeaPlusLC:ShowTooltip() + GameTooltip:SetOwner(self, "ANCHOR_NONE") + local parent = LeaPlusLC["PageF"] + local pscale = parent:GetEffectiveScale() + local gscale = UIParent:GetEffectiveScale() + local tscale = GameTooltip:GetEffectiveScale() + local gap = ((UIParent:GetRight() * gscale) - (LeaPlusLC["PageF"]:GetRight() * pscale)) + if gap < (250 * tscale) then + GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0) + else + GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0) + end + GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true) + end + + -- Create configuration button + function LeaPlusLC:CfgBtn(name, parent) + local CfgBtn = CreateFrame("BUTTON", nil, parent) + LeaPlusCB[name] = CfgBtn + CfgBtn:SetWidth(20) + CfgBtn:SetHeight(20) + CfgBtn:SetPoint("LEFT", parent.f, "RIGHT", 0, 0) + + CfgBtn.t = CfgBtn:CreateTexture(nil, "BORDER") + CfgBtn.t:SetAllPoints() + CfgBtn.t:SetTexture("Interface\\WorldMap\\Gear_64.png") + CfgBtn.t:SetTexCoord(0, 0.50, 0, 0.50); + CfgBtn.t:SetVertexColor(1.0, 0.82, 0, 1.0) + + CfgBtn:SetHighlightTexture("Interface\\WorldMap\\Gear_64.png") + CfgBtn:GetHighlightTexture():SetTexCoord(0, 0.50, 0, 0.50); + + CfgBtn.tiptext = L["Click to configure the settings for this option."] + CfgBtn:SetScript("OnEnter", LeaPlusLC.ShowTooltip) + CfgBtn:SetScript("OnLeave", GameTooltip_Hide) + end + + -- Create a help button to the right of a fontstring + function LeaPlusLC:CreateHelpButton(frame, panel, parent, tip) + LeaPlusLC:CfgBtn(frame, panel) + LeaPlusCB[frame]:ClearAllPoints() + LeaPlusCB[frame]:SetPoint("LEFT", parent, "RIGHT", -parent:GetWidth() + parent:GetStringWidth(), 0) + LeaPlusCB[frame]:SetSize(25, 25) + LeaPlusCB[frame].t:SetTexture("Interface\\COMMON\\help-i.blp") + LeaPlusCB[frame].t:SetTexCoord(0, 1, 0, 1) + LeaPlusCB[frame].t:SetVertexColor(0.9, 0.8, 0.0) + LeaPlusCB[frame]:SetHighlightTexture("Interface\\COMMON\\help-i.blp") + LeaPlusCB[frame]:GetHighlightTexture():SetTexCoord(0, 1, 0, 1) + LeaPlusCB[frame].tiptext = L[tip] + LeaPlusCB[frame]:SetScript("OnEnter", LeaPlusLC.TipSee) + end + + -- Show a footer + function LeaPlusLC:MakeFT(frame, text, left, width) + local footer = LeaPlusLC:MakeTx(frame, text, left, 96) + footer:SetWidth(width); footer:SetJustifyH("LEFT"); footer:SetWordWrap(true); footer:ClearAllPoints() + footer:SetPoint("BOTTOMLEFT", left, 96) + end + + -- Capitalise first character in a string + function LeaPlusLC:CapFirst(str) + return gsub(string.lower(str), "^%l", strupper) + end + + -- Toggle Zygor addon + function LeaPlusLC:ZygorToggle() + if select(2, GetAddOnInfo("ZygorGuidesViewerClassic")) then + if not IsAddOnLoaded("ZygorGuidesViewerClassic") then + if LeaPlusLC:PlayerInCombat() then + return + else + EnableAddOn("ZygorGuidesViewerClassic") + ReloadUI(); + end + else + DisableAddOn("ZygorGuidesViewerClassic") + ReloadUI(); + end + else + -- Zygor cannot be found + LeaPlusLC:Print("Zygor addon not found."); + end + return + end + + -- Show memory usage stat + function LeaPlusLC:ShowMemoryUsage(frame, anchor, x, y) + + -- Create frame + local memframe = CreateFrame("FRAME", nil, frame) + memframe:ClearAllPoints() + memframe:SetPoint(anchor, x, y) + memframe:SetWidth(100) + memframe:SetHeight(20) + + -- Create labels + local pretext = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + pretext:SetPoint("TOPLEFT", 0, 0) + pretext:SetText(L["Memory Usage"]) + + local memtext = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + memtext:SetPoint("TOPLEFT", 0, 0 - 30) + + -- Create stat + local memstat = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + memstat:SetPoint("BOTTOMLEFT", memtext, "BOTTOMRIGHT") + memstat:SetText("(calculating...)") + + -- Create update script + local memtime = -1 + memframe:SetScript("OnUpdate", function(self, elapsed) + if memtime > 2 or memtime == -1 then + UpdateAddOnMemoryUsage(); + memtext = GetAddOnMemoryUsage("Leatrix_Plus") + memtext = math.floor(memtext + .5) .. " KB" + memstat:SetText(memtext); + memtime = 0; + end + memtime = memtime + elapsed; + end) + + -- Release memory + LeaPlusLC.ShowMemoryUsage = nil + + end + + -- Check if player is in LFG queue (battleground) + function LeaPlusLC:IsInLFGQueue() + for i = 1, GetMaxBattlefieldID() do + local status = GetBattlefieldStatus(i) + if status == "queued" or status == "confirmed" then + return true + end + end + end + + -- Check if player is in combat + function LeaPlusLC:PlayerInCombat() + if (UnitAffectingCombat("player")) then + LeaPlusLC:Print("You cannot do that in combat.") + return true + end + end + + -- Hide panel and pages + function LeaPlusLC:HideFrames() + + -- Hide option pages + for i = 0, LeaPlusLC["NumberOfPages"] do + if LeaPlusLC["Page"..i] then + LeaPlusLC["Page"..i]:Hide(); + end; + end + + -- Hide options panel + LeaPlusLC["PageF"]:Hide(); + + end + + -- Find out if Leatrix Plus is showing (main panel or config panel) + function LeaPlusLC:IsPlusShowing() + if LeaPlusLC["PageF"]:IsShown() then return true end + for k, v in pairs(LeaConfigList) do + if v:IsShown() then + return true + end + end + end + + -- Check if a name is in your friends list or guild (does not check realm as realm is unknown for some checks) + function LeaPlusLC:FriendCheck(name, guid) + + -- Do nothing if name is empty (such as whispering from the Battle.net app) + if not name then return end + + -- Update friends list + C_FriendList.ShowFriends() + + -- Remove realm + name = strsplit("-", name, 2) + + -- Check character friends + for i = 1, C_FriendList.GetNumFriends() do + -- Return true is character name matches and GUID matches if there is one (realm is not checked) + local friendInfo = C_FriendList.GetFriendInfoByIndex(i) + local charFriendName = C_FriendList.GetFriendInfoByIndex(i).name + charFriendName = strsplit("-", charFriendName, 2) + if (name == charFriendName) and (guid and (guid == friendInfo.guid) or true) then + return true + end + end + + -- Check Battle.net friends + local numfriends = BNGetNumFriends() + for i = 1, numfriends do + local numtoons = C_BattleNet.GetFriendNumGameAccounts(i) + for j = 1, numtoons do + local gameAccountInfo = C_BattleNet.GetFriendGameAccountInfo(i, j) + local characterName = gameAccountInfo.characterName + local client = gameAccountInfo.clientProgram + if client == "WoW" and characterName == name then + return true + end + end + end + + -- Check guild members if guild is enabled (new members may need to press J to refresh roster) + if LeaPlusLC["FriendlyGuild"] == "On" then + local gCount = GetNumGuildMembers() + for i = 1, gCount do + local gName, void, void, void, void, void, void, void, gOnline, void, void, void, void, gMobile, void, void, gGUID = GetGuildRosterInfo(i) + if gOnline and not gMobile then + gName = strsplit("-", gName, 2) + -- Return true if character name matches including GUID if there is one + if (name == gName) and (guid and (guid == gGUID) or true) then + return true + end + end + end + end + + end + +---------------------------------------------------------------------- +-- L02: Locks +---------------------------------------------------------------------- + + -- Function to set lock state for configuration buttons + function LeaPlusLC:LockOption(option, item, reloadreq) + if reloadreq then + -- Option change requires UI reload + if LeaPlusLC[option] ~= LeaPlusDB[option] or LeaPlusLC[option] == "Off" then + LeaPlusLC:LockItem(LeaPlusCB[item], true) + else + LeaPlusLC:LockItem(LeaPlusCB[item], false) + end + else + -- Option change does not require UI reload + if LeaPlusLC[option] == "Off" then + LeaPlusLC:LockItem(LeaPlusCB[item], true) + else + LeaPlusLC:LockItem(LeaPlusCB[item], false) + end + end + end + +-- Set lock state for configuration buttons + function LeaPlusLC:SetDim() + LeaPlusLC:LockOption("AutomateQuests", "AutomateQuestsBtn", false) -- Automate quests + LeaPlusLC:LockOption("AutoAcceptRes", "AutoAcceptResBtn", false) -- Accept resurrection + LeaPlusLC:LockOption("AutoReleasePvP", "AutoReleasePvPBtn", false) -- Release in PvP + LeaPlusLC:LockOption("AutoSellJunk", "AutoSellJunkBtn", false) -- Sell junk automatically + LeaPlusLC:LockOption("AutoRepairGear", "AutoRepairBtn", false) -- Repair automatically + LeaPlusLC:LockOption("InviteFromWhisper", "InvWhisperBtn", false) -- Invite from whispers + LeaPlusLC:LockOption("FilterChatMessages", "FilterChatMessagesBtn", true) -- Filter chat messages + LeaPlusLC:LockOption("MailFontChange", "MailTextBtn", true) -- Resize mail text + LeaPlusLC:LockOption("QuestFontChange", "QuestTextBtn", true) -- Resize quest text + LeaPlusLC:LockOption("BookFontChange", "BookTextBtn", true) -- Resize book text + LeaPlusLC:LockOption("MinimapModder", "ModMinimapBtn", true) -- Enhance minimap + LeaPlusLC:LockOption("TipModEnable", "MoveTooltipButton", true) -- Enhance tooltip + LeaPlusLC:LockOption("EnhanceDressup", "EnhanceDressupBtn", true) -- Enhance dressup + LeaPlusLC:LockOption("EnhanceQuestLog", "EnhanceQuestLogBtn", true) -- Enhance quest log + LeaPlusLC:LockOption("EnhanceTrainers", "EnhanceTrainersBtn", true) -- Enhance trainers + LeaPlusLC:LockOption("ShowCooldowns", "CooldownsButton", true) -- Show cooldowns + LeaPlusLC:LockOption("ShowPlayerChain", "ModPlayerChain", true) -- Show player chain + LeaPlusLC:LockOption("ShowWowheadLinks", "ShowWowheadLinksBtn", true) -- Show Wowhead links + LeaPlusLC:LockOption("ShowFlightTimes", "ShowFlightTimesBtn", true) -- Show flight times + LeaPlusLC:LockOption("FrmEnabled", "MoveFramesButton", true) -- Manage frames + LeaPlusLC:LockOption("ManageBuffs", "ManageBuffsButton", true) -- Manage buffs + LeaPlusLC:LockOption("ManageWidget", "ManageWidgetButton", true) -- Manage widget + LeaPlusLC:LockOption("ManageFocus", "ManageFocusButton", true) -- Manage focus + LeaPlusLC:LockOption("ManageTimer", "ManageTimerButton", true) -- Manage timer + LeaPlusLC:LockOption("ManageDurability", "ManageDurabilityButton", true) -- Manage durability + LeaPlusLC:LockOption("ManageVehicle", "ManageVehicleButton", true) -- Manage vehicle + LeaPlusLC:LockOption("ClassColFrames", "ClassColFramesBtn", true) -- Class colored frames + LeaPlusLC:LockOption("SetWeatherDensity", "SetWeatherDensityBtn", false) -- Set weather density + LeaPlusLC:LockOption("ViewPortEnable", "ModViewportBtn", true) -- Enable viewport + LeaPlusLC:LockOption("MuteGameSounds", "MuteGameSoundsBtn", false) -- Mute game sounds + LeaPlusLC:LockOption("MuteCustomSounds", "MuteCustomSoundsBtn", false) -- Mute custom sounds + LeaPlusLC:LockOption("StandAndDismount", "DismountBtn", true) -- Dismount me + end + +---------------------------------------------------------------------- +-- L03: Restarts +---------------------------------------------------------------------- + + -- Set the reload button state + function LeaPlusLC:ReloadCheck() + + -- Chat + if (LeaPlusLC["UseEasyChatResizing"] ~= LeaPlusDB["UseEasyChatResizing"]) -- Use easy resizing + or (LeaPlusLC["NoCombatLogTab"] ~= LeaPlusDB["NoCombatLogTab"]) -- Hide the combat log + or (LeaPlusLC["NoChatButtons"] ~= LeaPlusDB["NoChatButtons"]) -- Hide chat buttons + or (LeaPlusLC["UnclampChat"] ~= LeaPlusDB["UnclampChat"]) -- Unclamp chat frame + or (LeaPlusLC["MoveChatEditBoxToTop"] ~= LeaPlusDB["MoveChatEditBoxToTop"]) -- Move editbox to top + or (LeaPlusLC["MoreFontSizes"] ~= LeaPlusDB["MoreFontSizes"]) -- More font sizes + or (LeaPlusLC["NoStickyChat"] ~= LeaPlusDB["NoStickyChat"]) -- Disable sticky chat + or (LeaPlusLC["UseArrowKeysInChat"] ~= LeaPlusDB["UseArrowKeysInChat"]) -- Use arrow keys in chat + or (LeaPlusLC["NoChatFade"] ~= LeaPlusDB["NoChatFade"]) -- Disable chat fade + or (LeaPlusLC["ClassColorsInChat"] ~= LeaPlusDB["ClassColorsInChat"]) -- Use class colors in chat + or (LeaPlusLC["RecentChatWindow"] ~= LeaPlusDB["RecentChatWindow"]) -- Recent chat window + or (LeaPlusLC["MaxChatHstory"] ~= LeaPlusDB["MaxChatHstory"]) -- Increase chat history + or (LeaPlusLC["FilterChatMessages"] ~= LeaPlusDB["FilterChatMessages"]) -- Filter chat messages + or (LeaPlusLC["RestoreChatMessages"] ~= LeaPlusDB["RestoreChatMessages"]) -- Restore chat messages + + -- Text + or (LeaPlusLC["HideErrorMessages"] ~= LeaPlusDB["HideErrorMessages"]) -- Hide error messages + or (LeaPlusLC["NoHitIndicators"] ~= LeaPlusDB["NoHitIndicators"]) -- Hide portrait text + or (LeaPlusLC["HideZoneText"] ~= LeaPlusDB["HideZoneText"]) -- Hide zone text + or (LeaPlusLC["HideKeybindText"] ~= LeaPlusDB["HideKeybindText"]) -- Hide keybind text + or (LeaPlusLC["HideMacroText"] ~= LeaPlusDB["HideMacroText"]) -- Hide macro text + + or (LeaPlusLC["MailFontChange"] ~= LeaPlusDB["MailFontChange"]) -- Resize mail text + or (LeaPlusLC["QuestFontChange"] ~= LeaPlusDB["QuestFontChange"]) -- Resize quest text + or (LeaPlusLC["BookFontChange"] ~= LeaPlusDB["BookFontChange"]) -- Resize book text + + -- Interface + or (LeaPlusLC["MinimapModder"] ~= LeaPlusDB["MinimapModder"]) -- Enhance minimap + or (LeaPlusLC["SquareMinimap"] ~= LeaPlusDB["SquareMinimap"]) -- Square minimap + or (LeaPlusLC["CombineAddonButtons"] ~= LeaPlusDB["CombineAddonButtons"]) -- Combine addon buttons + or (LeaPlusLC["HideMiniTracking"] ~= LeaPlusDB["HideMiniTracking"]) -- Hide tracking button + or (LeaPlusLC["MiniExcludeList"] ~= LeaPlusDB["MiniExcludeList"]) -- Minimap exclude list + or (LeaPlusLC["TipModEnable"] ~= LeaPlusDB["TipModEnable"]) -- Enhance tooltip + or (LeaPlusLC["TipNoHealthBar"] ~= LeaPlusDB["TipNoHealthBar"]) -- Tooltip hide health bar + or (LeaPlusLC["EnhanceDressup"] ~= LeaPlusDB["EnhanceDressup"]) -- Enhance dressup + or (LeaPlusLC["EnhanceQuestLog"] ~= LeaPlusDB["EnhanceQuestLog"]) -- Enhance quest log + or (LeaPlusLC["EnhanceProfessions"] ~= LeaPlusDB["EnhanceProfessions"]) -- Enhance professions + or (LeaPlusLC["EnhanceTrainers"] ~= LeaPlusDB["EnhanceTrainers"]) -- Enhance trainers + or (LeaPlusLC["ShowVolume"] ~= LeaPlusDB["ShowVolume"]) -- Show volume slider + or (LeaPlusLC["AhExtras"] ~= LeaPlusDB["AhExtras"]) -- Show auction controls + or (LeaPlusLC["ShowCooldowns"] ~= LeaPlusDB["ShowCooldowns"]) -- Show cooldowns + or (LeaPlusLC["DurabilityStatus"] ~= LeaPlusDB["DurabilityStatus"]) -- Show durability status + or (LeaPlusLC["ShowVanityControls"] ~= LeaPlusDB["ShowVanityControls"]) -- Show vanity controls + or (LeaPlusLC["ShowBagSearchBox"] ~= LeaPlusDB["ShowBagSearchBox"]) -- Show bag search box + or (LeaPlusLC["ShowRaidToggle"] ~= LeaPlusDB["ShowRaidToggle"]) -- Show raid button + or (LeaPlusLC["ShowPlayerChain"] ~= LeaPlusDB["ShowPlayerChain"]) -- Show player chain + or (LeaPlusLC["ShowReadyTimer"] ~= LeaPlusDB["ShowReadyTimer"]) -- Show ready timer + or (LeaPlusLC["ShowWowheadLinks"] ~= LeaPlusDB["ShowWowheadLinks"]) -- Show Wowhead links + or (LeaPlusLC["ShowFlightTimes"] ~= LeaPlusDB["ShowFlightTimes"]) -- Show flight times + + -- Frames + or (LeaPlusLC["FrmEnabled"] ~= LeaPlusDB["FrmEnabled"]) -- Manage frames + or (LeaPlusLC["ManageBuffs"] ~= LeaPlusDB["ManageBuffs"]) -- Manage buffs + or (LeaPlusLC["ManageWidget"] ~= LeaPlusDB["ManageWidget"]) -- Manage widget + or (LeaPlusLC["ManageFocus"] ~= LeaPlusDB["ManageFocus"]) -- Manage focus + or (LeaPlusLC["ManageTimer"] ~= LeaPlusDB["ManageTimer"]) -- Manage timer + or (LeaPlusLC["ManageDurability"] ~= LeaPlusDB["ManageDurability"]) -- Manage durability + or (LeaPlusLC["ManageVehicle"] ~= LeaPlusDB["ManageVehicle"]) -- Manage vehicle + or (LeaPlusLC["ClassColFrames"] ~= LeaPlusDB["ClassColFrames"]) -- Class colored frames + or (LeaPlusLC["NoAlerts"] ~= LeaPlusDB["NoAlerts"]) -- Hide alerts + or (LeaPlusLC["NoGryphons"] ~= LeaPlusDB["NoGryphons"]) -- Hide gryphons + or (LeaPlusLC["NoClassBar"] ~= LeaPlusDB["NoClassBar"]) -- Hide stance bar + + -- System + or (LeaPlusLC["ViewPortEnable"] ~= LeaPlusDB["ViewPortEnable"]) -- Enable viewport + or (LeaPlusLC["NoRestedEmotes"] ~= LeaPlusDB["NoRestedEmotes"]) -- Silence rested emotes + or (LeaPlusLC["NoBagAutomation"] ~= LeaPlusDB["NoBagAutomation"]) -- Disable bag automation + or (LeaPlusLC["CharAddonList"] ~= LeaPlusDB["CharAddonList"]) -- Show character addons + or (LeaPlusLC["FasterLooting"] ~= LeaPlusDB["FasterLooting"]) -- Faster auto loot + or (LeaPlusLC["FasterMovieSkip"] ~= LeaPlusDB["FasterMovieSkip"]) -- Faster movie skip + or (LeaPlusLC["StandAndDismount"] ~= LeaPlusDB["StandAndDismount"]) -- Dismount me + or (LeaPlusLC["ShowVendorPrice"] ~= LeaPlusDB["ShowVendorPrice"]) -- Show vendor price + or (LeaPlusLC["CombatPlates"] ~= LeaPlusDB["CombatPlates"]) -- Combat plates + or (LeaPlusLC["EasyItemDestroy"] ~= LeaPlusDB["EasyItemDestroy"]) -- Easy item destroy + + then + -- Enable the reload button + LeaPlusLC:LockItem(LeaPlusCB["ReloadUIButton"], false) + LeaPlusCB["ReloadUIButton"].f:Show() + else + -- Disable the reload button + LeaPlusLC:LockItem(LeaPlusCB["ReloadUIButton"], true) + LeaPlusCB["ReloadUIButton"].f:Hide() + end + + end + +---------------------------------------------------------------------- +-- L20: Live +---------------------------------------------------------------------- + + function LeaPlusLC:Live() + + ---------------------------------------------------------------------- + -- Invite from whispers + ---------------------------------------------------------------------- + + if LeaPlusLC["InviteFromWhisper"] == "On" then + LpEvt:RegisterEvent("CHAT_MSG_WHISPER"); + LpEvt:RegisterEvent("CHAT_MSG_BN_WHISPER"); + else + LpEvt:UnregisterEvent("CHAT_MSG_WHISPER"); + LpEvt:UnregisterEvent("CHAT_MSG_BN_WHISPER"); + end + + ---------------------------------------------------------------------- + -- Block duels + ---------------------------------------------------------------------- + + if LeaPlusLC["NoDuelRequests"] == "On" then + LpEvt:RegisterEvent("DUEL_REQUESTED"); + else + LpEvt:UnregisterEvent("DUEL_REQUESTED"); + end + + ---------------------------------------------------------------------- + -- Block party invites and Party from friends + ---------------------------------------------------------------------- + + if LeaPlusLC["NoPartyInvites"] == "On" or LeaPlusLC["AcceptPartyFriends"] == "On" then + LpEvt:RegisterEvent("PARTY_INVITE_REQUEST"); + else + LpEvt:UnregisterEvent("PARTY_INVITE_REQUEST"); + end + + ---------------------------------------------------------------------- + -- Automatic summon + ---------------------------------------------------------------------- + + if LeaPlusLC["AutoAcceptSummon"] == "On" then + LpEvt:RegisterEvent("CONFIRM_SUMMON"); + else + LpEvt:UnregisterEvent("CONFIRM_SUMMON"); + end + + ---------------------------------------------------------------------- + -- Disable loot warnings + ---------------------------------------------------------------------- + + if LeaPlusLC["NoConfirmLoot"] == "On" then + LpEvt:RegisterEvent("CONFIRM_LOOT_ROLL") + LpEvt:RegisterEvent("LOOT_BIND_CONFIRM") + LpEvt:RegisterEvent("MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL") + LpEvt:RegisterEvent("MAIL_LOCK_SEND_ITEMS") + else + LpEvt:UnregisterEvent("CONFIRM_LOOT_ROLL") + LpEvt:UnregisterEvent("LOOT_BIND_CONFIRM") + LpEvt:UnregisterEvent("MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL") + LpEvt:UnregisterEvent("MAIL_LOCK_SEND_ITEMS") + end + + end + +---------------------------------------------------------------------- +-- L30: Isolated +---------------------------------------------------------------------- + + function LeaPlusLC:Isolated() + + ---------------------------------------------------------------------- + -- Easy item destroy + ---------------------------------------------------------------------- + + if LeaPlusLC["EasyItemDestroy"] == "On" then + + -- Get the type "DELETE" into the field to confirm text + local TypeDeleteLine = gsub(DELETE_GOOD_ITEM, "[\r\n]", "@") + local void, TypeDeleteLine = strsplit("@", TypeDeleteLine, 2) + + -- Add hyperlinks to regular item destroy + RunScript('StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter = function(self, link, text, region, boundsLeft, boundsBottom, boundsWidth, boundsHeight) GameTooltip:SetOwner(self, "ANCHOR_PRESERVE") GameTooltip:ClearAllPoints() local cursorClearance = 30 GameTooltip:SetPoint("TOPLEFT", region, "BOTTOMLEFT", boundsLeft, boundsBottom - cursorClearance) GameTooltip:SetHyperlink(link) end') + RunScript('StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave = function(self) GameTooltip:Hide() end') + RunScript('StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter') + RunScript('StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave') + RunScript('StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter') + RunScript('StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave') + RunScript('StaticPopupDialogs["DELETE_GOOD_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter') + RunScript('StaticPopupDialogs["DELETE_GOOD_QUEST_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave') + + -- Hide editbox and set item link + local easyDelFrame = CreateFrame("FRAME") + easyDelFrame:RegisterEvent("DELETE_ITEM_CONFIRM") + easyDelFrame:SetScript("OnEvent", function() + if StaticPopup1EditBox:IsShown() then + -- Item requires player to type delete so hide editbox and show link + StaticPopup1:SetHeight(StaticPopup1:GetHeight() - 10) + StaticPopup1EditBox:Hide() + StaticPopup1Button1:Enable() + local link = select(3, GetCursorInfo()) + if link then + StaticPopup1Text:SetText(gsub(StaticPopup1Text:GetText(), gsub(TypeDeleteLine, "@", ""), "") .. "|n" .. link) + end + else + -- Item does not require player to type delete so just show item link + StaticPopup1:SetHeight(StaticPopup1:GetHeight() + 40) + StaticPopup1EditBox:Hide() + StaticPopup1Button1:Enable() + local link = select(3, GetCursorInfo()) + if link then + StaticPopup1Text:SetText(gsub(StaticPopup1Text:GetText(), gsub(TypeDeleteLine, "@", ""), "") .. "|n|n" .. link) + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Mute game sounds (no reload required) (MuteGameSounds) + ---------------------------------------------------------------------- + + do + + -- Create soundtable + local muteTable = { + + ["MuteFizzle"] = { "sound/spells/fizzle/fizzlefirea.ogg#569773", "sound/spells/fizzle/FizzleFrostA.ogg#569775", "sound/spells/fizzle/FizzleHolyA.ogg#569772", "sound/spells/fizzle/FizzleNatureA.ogg#569774", "sound/spells/fizzle/FizzleShadowA.ogg#569776",}, + ["MuteInterface"] = { "sound/interface/iUiInterfaceButtonA.ogg#567481", "sound/interface/uChatScrollButton.ogg#567407", "sound/interface/uEscapeScreenClose.ogg#567464", "sound/interface/uEscapeScreenOpen.ogg#567490",}, + + -- Trains + ["MuteTrains"] = { + + --[[Blood Elf]] "sound#539219", "sound#539203", + --[[Draenei]] "sound#539516", "sound#539730", + --[[Dwarf]] "sound#539802", "sound#539881", + --[[Gnome]] "sound#540271", "sound#540275", + --[[Human]] "sound#540535", "sound#540734", + --[[Night Elf]] "sound#540870", "sound#540947", + --[[Orc]] "sound#541157", "sound#541239", + --[[Tauren]] "sound#542818", "sound#542896", + --[[Troll]] "sound#543085", "sound#543093", + --[[Undead]] "sound#542526", "sound#542600", + + }, + + -- Chimes (sound/doodad/) + ["MuteChimes"] = { + "belltollalliance.ogg#566564", + "belltollhorde.ogg#565853", + "belltollnightelf.ogg#566558", + "belltolltribal.ogg#566027", + "kharazahnbelltoll.ogg#566254", + "dwarfhorn.ogg#566064", + }, + + -- Vaults + ["MuteVaults"] = { + + -- Mechanical guild vault idle sound (such as those found in Booty Bay and Winterspring) + "sound/doodad/guildvault_goblin_01stand.ogg#566289", + + }, + + -- Ready check (sound/interface/) + ["MuteReady"] = { + "levelup2.ogg#567478", + }, + + -- Login (sound/interface/) + ["MuteLogin"] = { + + -- This is handled with the PLAYER_LOGOUT event + + }, + + -- Bikes + ["MuteBikes"] = { + + -- Mekgineer's Chopper/Mechano Hog/Chauffeured (sound/vehicles/motorcyclevehicle, sound/vehicles) + "motorcyclevehicleattackthrown.ogg#569858", "motorcyclevehiclejumpend1.ogg#569863", "motorcyclevehiclejumpend2.ogg#569857", "motorcyclevehiclejumpend3.ogg#569855", "motorcyclevehiclejumpstart1.ogg#569856", "motorcyclevehiclejumpstart2.ogg#569862", "motorcyclevehiclejumpstart3.ogg#569860", "motorcyclevehicleloadthrown.ogg#569861", "motorcyclevehiclestand.ogg#569859", "motorcyclevehiclewalkrun.ogg#569854", "vehicle_ground_gearshift_1.ogg#598748", "vehicle_ground_gearshift_2.ogg#598736", "vehicle_ground_gearshift_3.ogg#569852", "vehicle_ground_gearshift_4.ogg#598745", "vehicle_ground_gearshift_5.ogg#569845", + + }, + + -- Events + ["MuteEvents"] = { + + -- Headless Horseman (sound/creature/headlesshorseman/) + "horseman_beckon_01.ogg#551670", + "horseman_bodydefeat_01.ogg#551706", + "horseman_bomb_01.ogg#551705", + "horseman_conflag_01.ogg#551686", + "horseman_death_01.ogg#551695", + "horseman_failing_01.ogg#551684", + "horseman_failing_02.ogg#551700", + "horseman_fire_01.ogg#551673", + "horseman_laugh_01.ogg#551703", + "horseman_laugh_02.ogg#551682", + "horseman_out_01.ogg#551680", + "horseman_request_01.ogg#551687", + "horseman_return_01.ogg#551698", + "horseman_slay_01.ogg#551676", + "horseman_special_01.ogg#551696", + + }, + + -- Gyrocopters + ["MuteGyrocopters"] = { + + -- Mimiron's Head (sound/creature/mimironheadmount/) + "mimironheadmount_jumpend.ogg#595097", + "mimironheadmount_jumpstart.ogg#595103", + "mimironheadmount_run.ogg#555364", + "mimironheadmount_walk.ogg#595100", + + -- sound/creature/gyrocopter/ + "gyrocopterfly.ogg#551390", + "gyrocopterflyidle.ogg#551398", + "gyrocopterflyup.ogg#551389", + "gyrocoptergearshift1.ogg#551384", + "gyrocoptergearshift2.ogg#551391", + "gyrocoptergearshift3.ogg#551387", + "gyrocopterjumpend.ogg#551396", + "gyrocopterjumpstart.ogg#551399", + "gyrocopterrun.ogg#551386", + "gyrocoptershuffleleftorright1.ogg#551385", + "gyrocoptershuffleleftorright2.ogg#551382", + "gyrocoptershuffleleftorright3.ogg#551392", + "gyrocopterstallinair.ogg#551395", + "gyrocopterstallinairlong.ogg#551394", + "gyrocopterstallongroundlong.ogg#551393", + "gyrocopterstand.ogg#551383", + "gyrocopterstandvar1_a.ogg#551388", + "gyrocopterstandvar1_b.ogg#551397", + "gyrocopterstandvar1_bnew.ogg#551400", + "gyrocopterwalk.ogg#551401", + + -- Gear shift sounds (sound/vehicles/) + "vehicle_airplane_gearshift_1.ogg#569846", + "vehicle_airplane_gearshift_2.ogg#598739", + "vehicle_airplane_gearshift_3.ogg#569851", + "vehicle_airplane_gearshift_4.ogg#598742", + "vehicle_airplane_gearshift_5.ogg#598733", + "vehicle_airplane_gearshift_6.ogg#569850", + + -- sound/spells/ + "summongyrocopter.ogg#568252", + + }, + + -- Yawns (sound/creature/tiger/) + ["MuteYawns"] = { + + "mtigerstand2a.ogg#562388", + + }, + + -- Screech (sound/spells/) + ["MuteScreech"] = { + + "screech.ogg#569429", + + }, + + -- A'dal + ["MuteAdal"] = { + + -- sound/creature/naaru/ + "naruuloopgood.ogg#601649", + + -- sound/doodad/ + "ancient_d_lights.ogg#567134", + + }, + + -- Ripper (Arcanite ripper guitar sound) + ["MuteRipper"] = { + + -- sound/events/ + "archaniteripper.ogg#567384", + + }, + + -- Rhonin + ["MuteRhonin"] = { + + -- sound/creature/rhonin/ur_rhonin_event + "01.ogg#559130", "02.ogg#559131", "03.ogg#559126", "04.ogg#559128", "05.ogg#559133", "06.ogg#559129", "07.ogg#559132", "08.ogg#559127", + + }, + + -- Travelers (gnimo sounds are handled in SetupMute() as they are shared with striders) + ["MuteTravelers"] = { + + -- Traveler's Tundra Mammoth (sound/creature/npcdraeneimalestandard, sound/creature/goblinmalezanynpc, sound/creature/trollfemalelaidbacknpc, sound/creature/trollfemalelaidbacknpc) + "npcdraeneimalestandardvendor01.ogg#557341", "npcdraeneimalestandardvendor02.ogg#557335", "npcdraeneimalestandardvendor03.ogg#557328", "npcdraeneimalestandardvendor04.ogg#557331", "npcdraeneimalestandardvendor05.ogg#557325", "npcdraeneimalestandardvendor06.ogg#557324", + "npcdraeneimalestandardfarewell01.ogg#557342", "npcdraeneimalestandardfarewell02.ogg#557326", "npcdraeneimalestandardfarewell03.ogg#557322", "npcdraeneimalestandardfarewell05.ogg#557332", "npcdraeneimalestandardfarewell06.ogg#557338", "npcdraeneimalestandardfarewell08.ogg#557334", + "goblinmalezanynpcvendor01.ogg#550818", "goblinmalezanynpcvendor02.ogg#550817", "goblinmalezanynpcgreeting01.ogg#550805", "goblinmalezanynpcgreeting02.ogg#550813", "goblinmalezanynpcgreeting03.ogg#550819", "goblinmalezanynpcgreeting04.ogg#550806", "goblinmalezanynpcgreeting05.ogg#550820", "goblinmalezanynpcgreeting06.ogg#550809", + "goblinmalezanynpcfarewell01.ogg#550807", "goblinmalezanynpcfarewell03.ogg#550808", "goblinmalezanynpcfarewell04.ogg#550812", + "trollfemalelaidbacknpcvendor01.ogg#562812","trollfemalelaidbacknpcvendor02.ogg#562802", "trollfemalelaidbacknpcgreeting01.ogg#562815","trollfemalelaidbacknpcgreeting02.ogg#562814", "trollfemalelaidbacknpcgreeting03.ogg#562816", "trollfemalelaidbacknpcgreeting04.ogg#562807", "trollfemalelaidbacknpcgreeting05.ogg#562804", "trollfemalelaidbacknpcgreeting06.ogg#562803", + "trollfemalelaidbacknpcfarewell01.ogg#562809", "trollfemalelaidbacknpcfarewell02.ogg#562808", "trollfemalelaidbacknpcfarewell03.ogg#562813", "trollfemalelaidbacknpcfarewell04.ogg#562817", "trollfemalelaidbacknpcfarewell05.ogg#562806", + + }, + + -- Striders (footsteps are in another setting) (wound sounds are handled in SetupMute() as they are shared with travelers) + ["MuteStriders"] = { + + -- sound/creature/mechastrider/ + "mechastrideraggro.ogg#555127", + "mechastriderattacka.ogg#555125", + "smechastriderattackb.ogg#555123", + "mechastriderattackc.ogg#555132", + "mechastriderloop.ogg#555124", + "mechastriderwoundcrit.ogg#555131", + + }, + + -- Mechanical mount footsteps + ["MuteMechSteps"] = { + + -- sound/creature/gnomespidertank/ + "gnomespidertankfootstepa.ogg#550507", + "gnomespidertankfootstepb.ogg#550514", + "gnomespidertankfootstepc.ogg#550501", + "gnomespidertankfootstepd.ogg#550500", + "gnomespidertankwoundd.ogg#550511", + "gnomespidertankwounde.ogg#550504", + "gnomespidertankwoundf.ogg#550498", + + }, + + -- Netherdrakes + ["MuteNetherdrakes"] = { + + -- sound/creature/netherdrake/ + "hugewingflap1.ogg#556477", + "hugewingflap2.ogg#556479", + "hugewingflap3.ogg#556476", + "netherdrakea.ogg#556475", + "netherdrakeb.ogg#556478", + + }, + + -- Brooms + ["MuteBrooms"] = { + + -- sound/creature/broomstickmount/ + "broomstickmountland.ogg#545651", + "broomstickmounttakeoff.ogg#545652", + + -- sound/spells/ + "summonbroomstick1.ogg#567986", + "summonbroomstick3.ogg#569547", + "summonbroomstick2.ogg#568335", + + }, + + } + + -- Give table file level scope (its used during logout and for wipe and admin commands) + LeaPlusLC["muteTable"] = muteTable + + -- Load saved settings or set default values + for k, v in pairs(muteTable) do + if LeaPlusDB[k] and type(LeaPlusDB[k]) == "string" and LeaPlusDB[k] == "On" or LeaPlusDB[k] == "Off" then + LeaPlusLC[k] = LeaPlusDB[k] + else + LeaPlusLC[k] = "Off" + LeaPlusDB[k] = "Off" + end + end + + -- Create configuration panel + local SoundPanel = LeaPlusLC:CreatePanel("Mute game sounds", "SoundPanel") + + -- Add checkboxes + LeaPlusLC:MakeTx(SoundPanel, "General", 16, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteChimes", "Chimes", 16, -92, false, "If checked, clock hourly chimes will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteEvents", "Events", 16, -112, false, "If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman.") + LeaPlusLC:MakeCB(SoundPanel, "MuteFizzle", "Fizzle", 16, -132, false, "If checked, the spell fizzle sounds will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteInterface", "Interface", 16, -152, false, "If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteLogin", "Login", 16, -172, false, "If checked, login screen sounds will be muted when you logout of the game.|n|nNote that login screen sounds will not be muted when you initially launch the game.|n|nThey will only be muted when you logout of the game. This includes manually logging out as well as being forcefully logged out by the game server for reasons such as being away for an extended period of time.|n|nNo more dragons roaring when you fall asleep while the game is running!") + LeaPlusLC:MakeCB(SoundPanel, "MuteReady", "Ready", 16, -192, false, "If checked, the ready check sound will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteTrains", "Trains", 16, -212, false, "If checked, train sounds will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteVaults", "Vaults", 16, -232, false, "If checked, the mechanical guild vault idle sound will be muted.") + + LeaPlusLC:MakeTx(SoundPanel, "Mounts", 150, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteBikes", "Bikes", 150, -92, false, "If checked, bike mount sounds will be muted.|n|nThis applies to Mekgineer's Chopper and Mechano-hog.") + LeaPlusLC:MakeCB(SoundPanel, "MuteBrooms", "Brooms", 150, -112, false, "If checked, broom mounts will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteGyrocopters", "Gyrocopters", 150, -132, false, "If checked, gyrocopters will be muted.|n|nThis applies to the engineering flying machine mounts.") + LeaPlusLC:MakeCB(SoundPanel, "MuteMechSteps", "Mechsteps", 150, -152, false, "If checked, footsteps for mechanical mounts will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteStriders", "Mechstriders", 150, -172, false, "If checked, mechanostriders will be quieter.") + LeaPlusLC:MakeCB(SoundPanel, "MuteNetherdrakes", "Netherdrakes", 150, -192, false, "If checked, netherdrakes will be quieter.") + LeaPlusLC:MakeCB(SoundPanel, "MuteTravelers", "Travelers", 150, -212, false, "If checked, traveling merchant greetings and farewells will be muted.|n|nThis applies to Traveler's Tundra Mammoth.") + + LeaPlusLC:MakeTx(SoundPanel, "Pets", 284, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteScreech", "Screech", 284, -92, false, "If checked, Screech will be muted.|n|nThis is a spell used by some flying pets.") + LeaPlusLC:MakeCB(SoundPanel, "MuteYawns", "Yawns", 284, -112, false, "If checked, yawns from hunter pet cats will be muted.") + + LeaPlusLC:MakeTx(SoundPanel, "Misc", 418, -72) + LeaPlusLC:MakeCB(SoundPanel, "MuteAdal", "A'dal", 418, -92, false, "If checked, A'dal in Shattrath City will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteRipper", "Ripper", 418, -112, false, "If checked, the Arcanite Ripper guitar sound will be muted.") + LeaPlusLC:MakeCB(SoundPanel, "MuteRhonin", "Rhonin", 418, -132, false, "If checked, Rhonin will be muted.") + + -- Set click width for sounds checkboxes + for k, v in pairs(muteTable) do + LeaPlusCB[k].f:SetWidth(90) + if LeaPlusCB[k].f:GetStringWidth() > 90 then + LeaPlusCB[k]:SetHitRectInsets(0, -80, 0, 0) + else + LeaPlusCB[k]:SetHitRectInsets(0, -LeaPlusCB[k].f:GetStringWidth() + 4, 0, 0) + end + end + + -- Function to mute and unmute sounds + local function SetupMute() + for k, v in pairs(muteTable) do + if LeaPlusLC["MuteGameSounds"] == "On" and LeaPlusLC[k] == "On" then + for i, e in pairs(v) do + local file, soundID = e:match("([^,]+)%#([^,]+)") + MuteSoundFile(soundID) + end + else + for i, e in pairs(v) do + local file, soundID = e:match("([^,]+)%#([^,]+)") + UnmuteSoundFile(soundID) + end + end + end + -- Handle special cases where sounds overlap + if LeaPlusLC["MuteGameSounds"] == "On" and (LeaPlusLC["MuteTravelers"] == "On" or LeaPlusLC["MuteStriders"] == "On") then + -- Mute travelers and mute striders share same sounds + MuteSoundFile(555128) -- mechastriderwounda + MuteSoundFile(555129) -- mechastriderwoundb + MuteSoundFile(555130) -- mechastriderwoundc + else + -- Mute travelers and mute striders share same sounds + UnmuteSoundFile(555128) -- mechastriderwounda + UnmuteSoundFile(555129) -- mechastriderwoundb + UnmuteSoundFile(555130) -- mechastriderwoundc + end + end + + -- Setup mute on startup if option is enabled + if LeaPlusLC["MuteGameSounds"] == "On" then SetupMute() end + + -- Setup mute when options are clicked + for k, v in pairs(muteTable) do + LeaPlusCB[k]:HookScript("OnClick", SetupMute) + end + LeaPlusCB["MuteGameSounds"]:HookScript("OnClick", SetupMute) + + -- Help button hidden + SoundPanel.h:Hide() + + -- Back button handler + SoundPanel.b:SetScript("OnClick", function() + SoundPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button handler + SoundPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + for k, v in pairs(muteTable) do + LeaPlusLC[k] = "Off" + end + SetupMute() + + -- Refresh panel + SoundPanel:Hide(); SoundPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["MuteGameSoundsBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + for k, v in pairs(muteTable) do + LeaPlusLC[k] = "On" + end + LeaPlusLC["MuteReady"] = "Off" + SetupMute() + else + SoundPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + ---------------------------------------------------------------------- + -- Login setting + ---------------------------------------------------------------------- + + -- Create soundtable for PLAYER_LOGOUT (these sounds are only muted or unmuted when logging out + local muteLogoutTable = { + + -- Ambiance (sound/ambience/gluescreen/gluescreenlogin.ogg) + "538968", + + -- Dragon roaring sounds (sound/ambience/gluescreen/wrath_login_) + "538970", "538969", "538971", "538972", + + -- Game music (sound/music/gluescreenmusic/wotlk_main_title.mp3) + "53222", + + } + + -- Handle sounds that get muted or unmuted when logging out + local logoutEvent = CreateFrame("FRAME") + logoutEvent:RegisterEvent("PLAYER_LOGOUT") + + -- Mute or unmute sounds when logging out + logoutEvent:SetScript("OnEvent", function() + if LeaPlusLC["MuteGameSounds"] == "On" and LeaPlusLC["MuteLogin"] == "On" then + -- Mute logout table sounds on logout + for void, soundID in pairs(muteLogoutTable) do + --FIX ME + -- MuteSoundFile(soundID) + end + else + -- Unmute logout table sounds on logout + for void, soundID in pairs(muteLogoutTable) do + --FIX ME + -- UnmuteSoundFile(soundID) + end + end + end) + + -- Unmute sounds when logging in + -- for void, soundID in pairs(muteLogoutTable) do + -- UnmuteSoundFile(soundID) + -- end + + end + + ---------------------------------------------------------------------- + -- Faster movie skip + ---------------------------------------------------------------------- + + if LeaPlusLC["FasterMovieSkip"] == "On" then + + -- Allow space bar, escape key and enter key to cancel cinematic without confirmation + CinematicFrame:HookScript("OnKeyDown", function(self, key) + if key == "ESCAPE" then + if CinematicFrame:IsShown() and CinematicFrame.closeDialog and CinematicFrameCloseDialogConfirmButton then + CinematicFrameCloseDialog:Hide() + end + end + end) + CinematicFrame:HookScript("OnKeyUp", function(self, key) + if key == "SPACE" or key == "ESCAPE" or key == "ENTER" then + if CinematicFrame:IsShown() and CinematicFrame.closeDialog and CinematicFrameCloseDialogConfirmButton then + CinematicFrameCloseDialogConfirmButton:Click() + end + end + end) + MovieFrame:HookScript("OnKeyUp", function(self, key) + if key == "SPACE" or key == "ESCAPE" or key == "ENTER" then + if MovieFrame:IsShown() and MovieFrame.CloseDialog and MovieFrame.CloseDialog.ConfirmButton then + MovieFrame.CloseDialog.ConfirmButton:Click() + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Unclamp chat frame + ---------------------------------------------------------------------- + + if LeaPlusLC["UnclampChat"] == "On" and not LeaLockList["UnclampChat"] then + + -- Process normal and existing chat frames on startup + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i]:SetClampRectInsets(0, 0, 0, 0); + end + end + + -- Process new chat frames and combat log + hooksecurefunc("FloatingChatFrame_UpdateBackgroundAnchors", function(self) + self:SetClampRectInsets(0, 0, 0, 0); + end) + + -- Process temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf]:SetClampRectInsets(0, 0, 0, 0); + end + end) + + end + + ---------------------------------------------------------------------- + -- Wowhead Links + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowWowheadLinks"] == "On" then + + -- Create configuration panel + local WowheadPanel = LeaPlusLC:CreatePanel("Show Wowhead links", "WowheadPanel") + + LeaPlusLC:MakeTx(WowheadPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(WowheadPanel, "WowheadLinkComments", "Links go directly to the comments section", 16, -92, false, "If checked, Wowhead links will go directly to the comments section.") + + -- Help button hidden + WowheadPanel.h:Hide() + + -- Back button handler + WowheadPanel.b:SetScript("OnClick", function() + WowheadPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + WowheadPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["WowheadLinkComments"] = "Off" + + -- Refresh configuration panel + WowheadPanel:Hide(); WowheadPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["ShowWowheadLinksBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["WowheadLinkComments"] = "Off" + else + WowheadPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Get localised Wowhead URL + local wowheadLoc + if GameLocale == "deDE" then wowheadLoc = "wowhead.com/wotlk/de" + elseif GameLocale == "esMX" then wowheadLoc = "wowhead.com/wotlk/es" + elseif GameLocale == "esES" then wowheadLoc = "wowhead.com/wotlk/es" + elseif GameLocale == "frFR" then wowheadLoc = "wowhead.com/wotlk/fr" + elseif GameLocale == "itIT" then wowheadLoc = "wowhead.com/wotlk/it" + elseif GameLocale == "ptBR" then wowheadLoc = "wowhead.com/wotlk/pt" + elseif GameLocale == "ruRU" then wowheadLoc = "wowhead.com/wotlk/ru" + elseif GameLocale == "koKR" then wowheadLoc = "wowhead.com/wotlk/ko" + elseif GameLocale == "zhCN" then wowheadLoc = "wowhead.com/wotlk/cn" + elseif GameLocale == "zhTW" then wowheadLoc = "wowhead.com/wotlk/cn" + else wowheadLoc = "wowhead.com/wotlk" + end + + ---------------------------------------------------------------------- + -- Achievements frame + ---------------------------------------------------------------------- + + -- Achievement link function + local function DoWowheadAchievementFunc() + + -- Create editbox + local aEB = CreateFrame("EditBox", nil, AchievementFrame) + aEB:ClearAllPoints() + aEB:SetPoint("BOTTOMRIGHT", -50, 1) + aEB:SetHeight(16) + aEB:SetFontObject("GameFontNormalSmall") + aEB:SetBlinkSpeed(0) + aEB:SetJustifyH("RIGHT") + aEB:SetAutoFocus(false) + aEB:EnableKeyboard(false) + aEB:SetHitRectInsets(90, 0, 0, 0) + aEB:SetScript("OnKeyDown", function() end) + aEB:SetScript("OnMouseUp", function() + if aEB:IsMouseOver() then + aEB:HighlightText() + else + aEB:HighlightText(0, 0) + end + end) + + -- Create hidden font string (used for setting width of editbox) + aEB.z = aEB:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall') + aEB.z:Hide() + + -- Store last link in case editbox is cleared + local lastAchievementLink + + -- Function to set editbox value + hooksecurefunc("AchievementFrameAchievements_SelectButton", function(self) + local achievementID = self.id or nil + if achievementID then + -- Set editbox text + if LeaPlusLC["WowheadLinkComments"] == "On" then + aEB:SetText("https://" .. wowheadLoc .. "/achievement=" .. achievementID .. "#comments") + else + aEB:SetText("https://" .. wowheadLoc .. "/achievement=" .. achievementID) + end + lastAchievementLink = aEB:GetText() + -- Set hidden fontstring then resize editbox to match + aEB.z:SetText(aEB:GetText()) + aEB:SetWidth(aEB.z:GetStringWidth() + 90) + -- Get achievement title for tooltip + local achievementLink = GetAchievementLink(self.id) + if achievementLink then + aEB.tiptext = achievementLink:match("%[(.-)%]") .. "|n" .. L["Press CTRL/C to copy."] + end + -- Show the editbox + aEB:Show() + end + end) + + -- Create tooltip + aEB:HookScript("OnEnter", function() + aEB:HighlightText() + aEB:SetFocus() + GameTooltip:SetOwner(aEB, "ANCHOR_TOP", 0, 10) + GameTooltip:SetText(aEB.tiptext, nil, nil, nil, nil, true) + GameTooltip:Show() + end) + + aEB:HookScript("OnLeave", function() + -- Set link text again if it's changed since it was set + if aEB:GetText() ~= lastAchievementLink then aEB:SetText(lastAchievementLink) end + aEB:HighlightText(0, 0) + aEB:ClearFocus() + GameTooltip:Hide() + end) + + -- Hide editbox when achievement is deselected + hooksecurefunc("AchievementFrameAchievements_ClearSelection", function(self) aEB:Hide() end) + hooksecurefunc("AchievementCategoryButton_OnClick", function(self) aEB:Hide() end) + + end + + -- Run function when achievement UI is loaded + if IsAddOnLoaded("Blizzard_AchievementUI") then + DoWowheadAchievementFunc() + else + local waitAchievementsFrame = CreateFrame("FRAME") + waitAchievementsFrame:RegisterEvent("ADDON_LOADED") + waitAchievementsFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_AchievementUI" then + DoWowheadAchievementFunc() + waitAchievementsFrame:UnregisterAllEvents() + end + end) + end + + ---------------------------------------------------------------------- + -- World map frame + ---------------------------------------------------------------------- + + -- Create editbox + local mEB = CreateFrame("EditBox", nil, QuestLogFrame) + mEB:ClearAllPoints() + mEB:SetPoint("TOPLEFT", 70, 4) + mEB:SetHeight(16) + mEB:SetFontObject("GameFontNormal") + mEB:SetBlinkSpeed(0) + mEB:SetAutoFocus(false) + mEB:EnableKeyboard(false) + mEB:SetHitRectInsets(0, 90, 0, 0) + mEB:SetScript("OnKeyDown", function() end) + mEB:SetScript("OnMouseUp", function() + if mEB:IsMouseOver() then + mEB:HighlightText() + else + mEB:HighlightText(0, 0) + end + end) + + -- Set the background color + mEB.t = mEB:CreateTexture(nil, "BACKGROUND") + mEB.t:SetPoint(mEB:GetPoint()) + mEB.t:SetSize(mEB:GetSize()) + mEB.t:SetVertexColor(0.05, 0.05, 0.05, 1.0) + + -- Create hidden font string (used for setting width of editbox) + mEB.z = mEB:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mEB.z:Hide() + + -- Function to set editbox value + local function SetQuestInBox(questListID) + + local questTitle, void, void, isHeader, void, void, void, questID = GetQuestLogTitle(questListID) + if questID and not isHeader then + + -- Hide editbox if quest ID is invalid + if questID == 0 then mEB:Hide() else mEB:Show() end + + -- Set editbox text + if LeaPlusLC["WowheadLinkComments"] == "On" then + mEB:SetText("https://" .. wowheadLoc .. "/quest=" .. questID .. "#comments") + else + mEB:SetText("https://" .. wowheadLoc .. "/quest=" .. questID) + end + + -- Set hidden fontstring then resize editbox to match + mEB.z:SetText(mEB:GetText()) + mEB:SetWidth(mEB.z:GetStringWidth() + 90) + mEB.t:SetWidth(mEB.z:GetStringWidth()) + + -- Get quest title for tooltip + if questTitle then + mEB.tiptext = questTitle .. "|n" .. L["Press CTRL/C to copy."] + else + mEB.tiptext = "" + if mEB:IsMouseOver() and GameTooltip:IsShown() then GameTooltip:Hide() end + end + + end + end + + -- Set URL when quest is selected (this works with Questie, old method used QuestLog_SetSelection) + hooksecurefunc("SelectQuestLogEntry", function(questListID) + SetQuestInBox(questListID) + end) + + -- Create tooltip + mEB:HookScript("OnEnter", function() + mEB:HighlightText() + mEB:SetFocus() + GameTooltip:SetOwner(mEB, "ANCHOR_BOTTOM", 0, -10) + GameTooltip:SetText(mEB.tiptext, nil, nil, nil, nil, true) + GameTooltip:Show() + end) + + mEB:HookScript("OnLeave", function() + mEB:HighlightText(0, 0) + mEB:ClearFocus() + GameTooltip:Hide() + end) + + -- ElvUI fix to move Wowhead link inside the quest log frame + if LeaPlusLC.ElvUI then + LibCompat.After(0.1, function() + QuestLogTitleText:ClearAllPoints() + QuestLogTitleText:SetPoint("TOPLEFT", QuestLogFrame, "TOPLEFT", 32, -18) + if QuestLogTitleText:GetStringWidth() > 200 then + QuestLogTitleText:SetWidth(200) + else + QuestLogTitleText:SetWidth(QuestLogTitleText:GetStringWidth()) + end + mEB:ClearAllPoints() + mEB:SetPoint("LEFT", QuestLogTitleText, "RIGHT", 10, 0) + mEB.t:Hide() + end) + end + + end + + ---------------------------------------------------------------------- + -- Automate gossip (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to skip gossip + local function SkipGossip(skipAltKeyRequirement) + if not skipAltKeyRequirement and not IsAltKeyDown() then return end + local gossipInfoTable = C_GossipInfo.GetOptions() + if gossipInfoTable and #gossipInfoTable == 1 and C_GossipInfo.GetNumAvailableQuests() == 0 and C_GossipInfo.GetNumActiveQuests() == 0 and gossipInfoTable[1] and gossipInfoTable[1].gossipOptionID then + C_GossipInfo.SelectOption(gossipInfoTable[1].gossipOptionID) + end + end + + -- Create gossip event frame + local gossipFrame = CreateFrame("FRAME") + + -- Function to setup events + local function SetupEvents() + if LeaPlusLC["AutomateGossip"] == "On" then + gossipFrame:RegisterEvent("GOSSIP_SHOW") + else + gossipFrame:UnregisterEvent("GOSSIP_SHOW") + end + end + + -- Setup events when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutomateGossip"]:HookScript("OnClick", SetupEvents) + if LeaPlusLC["AutomateGossip"] == "On" then SetupEvents() end + + -- Create tables for specific NPC IDs (these are automatically selected with no alt key requirement) + local npcTable = { + + -- Stable masters (https://www.wowhead.com/wotlk/npcs?filter=27;1;0) + 9988, 21518, 15131, 10055, 21517, 11069, 9985, 22469, 19476, 21336, 10060, 16586, 16094, 18250, 16824, 23392, 15722, 9977, 19018, 9987, 19368, 6749, 10058, 22468, 11104, 9986, 13617, 10046, 10048, 10051, 10053, 10054, 17485, 18244, 10045, 24974, 16665, 25037, 16656, 10057, 18984, 9984, 11105, 10056, 16185, 10059, 16764, 11119, 14741, 10085, 10061, 19019, 10052, 10047, 10063, 9979, 17666, 11117, 10049, 17896, 9983, 24905, 9989, 9982, 10050, 9980, 9981, 10062, 9976, 9978, 13616, + + -- Dalaran: Brassbolt Mechawrench (Alliance) and Reginald Arcfire (Horde) (engineer auctioneers) + 35594, 35607, + + -- Banker + 2625, 2455, 2458, 31420, 19318, 3309, 21733, 21732, 29282, 30606, 28676, 30607, 38919, 2461, 18350, 30608, 5060, 2460, 19246, 29530, 17631, 8356, 16617, 17632, 36284, 3496, 4209, 17633, 2457, 16710, 3318, 31421, 4208, 28343, 19034, 2459, 16615, 4550, 17773, 29283, 16616, 8124, 8123, 5099, 31422, 3320, 28680, 28679, 30605, 28678, 28677, 28675, 2996, 36352, 4549, 8119, 38920, 38921, 8357, 7799, 4155, 13917, 19338, 2456, 36351, 30604, 21734, + + -- Flightmaster + 23859, 32571, 28574, 28674, 24795, 28615, 3310, 931, 29480, 1387, 25288, 26851, 18789, 10583, 26878, 11901, 12578, 11900, 20234, 26852, 26881, 27046, 2859, 26602, 10897, 6726, 4312, 26880, 18930, 6706, 16587, 16227, 6026, 4267, 2432, 8610, 28624, 18940, 26847, 1571, 27344, 7823, 28618, 1573, 18938, 8020, 22455, 22935, 4407, 1572, 13177, 8609, 18931, 4321, 2299, 16822, 20762, 12577, 26845, 12617, 17554, 26560, 23736, 4319, 21766, 18937, 19558, 12596, 18939, 7824, 3841, 2835, 28196, 15177, 19317, 18791, 2409, 22216, 8019, 22931, 19583, 2858, 3305, 28623, 18808, 22485, 20515, 18942, 18807, 18785, 2941, 19581, 11138, 4551, 26566, 4317, 10378, 21107, 11899, 26879, 18953, 2851, 3615, 352, 23612, 12740, 12636, 2861, 8018, 2226, 24851, 18788, 24366, 15178, 16189, 16192, 17555, 2995, 3838, 12616, 11139, 2389, 18809, 4314, 28197, 523, + 37888, -- Added manually + + -- Trainer + 31238, 28701, 31247, 28697, 28699, 29631, 28746, 28705, 18988, 26989, 28703, 26953, 8126, 19186, 18987, 35093, 35135, 35133, 26992, 18911, 5482, 28693, 29156, 25277, 25099, 26986, 33676, 26905, 35100, 29233, 26972, 29513, 3494, 18773, 16583, 18753, 19778, 24868, 4752, 26990, 26991, 4732, 26982, 28742, 26975, 28698, 18774, 28694, 33682, 28706, 26956, 27001, 3399, 18993, 26976, 18990, 28700, 33680, 18751, 26964, 19775, 26974, 26997, 3026, 26955, 5159, 4552, 23734, 26999, 26969, 26994, 26980, 4586, 16253, 16588, 26912, 31084, 26907, 18991, 16280, 26960, 26915, 26987, 1430, 26962, 26954, 26910, 19252, 26914, 3028, 7406, 32474, 26963, 18802, 19052, 20914, 18775, 12042, 26988, 30721, 28702, 27000, 7954, 3690, 26998, 26981, 33614, 18779, 26993, 17637, 17634, 26906, 28958, 4772, 5493, 20500, 33613, 4773, 26951, 5518, 16823, 26958, 20511, 5938, 4210, 11869, 11868, 18749, 11865, 18777, 26903, 5174, 8736, 11557, 33638, 18747, 3067, 33610, 29505, 26977, 18772, 28696, 33617, 30722, 6251, 18752, 29194, 30713, 17110, 11867, 5491, 18771, 20791, 26952, 4218, 4753, 17246, 6297, 7944, 1651, 7953, 11870, 15501, 6707, 3332, 17204, 29514, 19185, 23128, 33679, 11017, 27703, 30706, 26995, 18755, 5885, 33611, 7866, 16676, 6286, 4568, 19540, 3064, 29195, 19187, 18776, 18748, 3355, 7867, 3032, 5161, 3412, 3352, 4217, 18018, 4606, 23127, 33615, 5513, 19180, 5511, 8306, 908, 11866, 4573, 925, 5127, 3324, 28472, 18754, 837, 2704, 19184, 28474, 3373, 26959, 28704, 30717, 928, 8146, 10993, 28956, 16681, 20407, 19063, 1218, 3036, 543, 375, 16646, 4156, 3136, 16773, 11074, 16621, 9584, 19539, 3347, 223, 11097, 3345, 6288, 987, 3401, 912, 5958, 7311, 8738, 26564, 1681, 7869, 7870, 461, 915, 985, 8128, 916, 3033, 16771, 16663, 957, 1346, 19341, 3365, 16499, 911, 13283, 29509, 2327, 3030, 5566, 17222, 3001, 5172, 33683, 33621, 3327, 895, 15400, 4258, 17215, 4211, 2367, 4165, 13417, 7871, 5564, 22477, 914, 2836, 16266, 2399, 7312, 1231, 14740, 1382, 11025, 11401, 5502, 2818, 5392, 3326, 3606, 5173, 13084, 17101, 30715, 4219, 4254, 11098, 17513, 11406, 376, 16653, 17509, 11072, 29196, 19340, 16633, 5880, 3967, 33608, 16662, 4215, 3047, 6291, 7946, 5515, 3181, 17520, 7231, 5113, 20124, 8144, 16755, 5506, 2798, 16277, 17481, 4212, 11073, 4588, 16669, 5144, 5149, 1701, 19251, 11031, 17482, 5165, 4576, 1473, 1317, 3137, 2329, 16721, 17219, 1458, 16684, 3607, 5957, 5690, 1355, 3963, 16667, 1229, 986, 3039, 5497, 27034, 3344, 3013, 3063, 28471, 2492, 27705, 913, 3357, 16719, 5166, 16679, 3034, 3354, 3706, 3041, 3007, 19576, 16728, 16658, 3009, 5114, 7232, 4598, 927, 20406, 5115, 5164, 6306, 16680, 2837, 3555, 3175, 8153, 30709, 5943, 514, 16647, 5505, 3171, 2857, 11052, 11029, 17483, 5495, 17844, 3406, 16651, 1632, 2390, 5148, 10090, 16367, 4593, 2129, 4609, 17488, 5498, 16774, 4214, 1470, 11037, 5492, 1404, 5499, 1292, 4591, 4583, 2834, 11397, 11096, 5137, 1386, 5496, 33618, 3173, 4163, 5171, 7088, 17212, 3040, 6295, 20125, 4160, 16660, 17484, 19369, 4611, 1676, 3353, 1234, 27704, 1411, 4138, 3170, 3038, 16640, 12961, 5941, 12032, 3045, 1226, 2489, 7089, 17442, 16752, 16726, 11177, 29506, 918, 5882, 15513, 10276, 5504, 4089, 5177, 3169, 6018, 5479, 4090, 23534, 1385, 5484, 2128, 4582, 23103, 4205, 16749, 17487, 5167, 16269, 5157, 17441, 16655, 11146, 11028, 3154, 3602, 2998, 17121, 3707, 3964, 3600, 16659, 16688, 3363, 1228, 12030, 12025, 16725, 16686, 16275, 16731, 1700, 377, 6287, 16366, 15283, 5939, 7949, 3065, 4900, 812, 16161, 4087, 1232, 17514, 11068, 17245, 16644, 16756, 8141, 16736, 3545, 2119, 7315, 3290, 16738, 3172, 16780, 3174, 16685, 5883, 17089, 5612, 9465, 4584, 4193, 3179, 10086, 5480, 4596, 3404, 5153, 4578, 5145, 4563, 4566, 16272, 17504, 16503, 7948, 3061, 331, 16160, 3604, 29507, 3597, 15284, 3044, 3605, 16654, 3066, 5150, 5146, 3328, 15285, 4567, 16729, 3155, 5567, 2391, 3407, 1383, 11026, 3004, 5516, 16500, 1246, 10088, 328, 16502, 30710, 5994, 1215, 8308, 17214, 2856, 16501, 2131, 4595, 17120, 3698, 11178, 1702, 5489, 4320, 16642, 3069, 3603, 10930, 11044, 6387, 459, 17005, 11081, 17511, 2114, 3046, 4204, 3594, 3153, 16712, 3060, 2627, 1699, 1466, 3622, 10277, 3557, 16675, 3059, 17983, 17519, 2124, 17510, 11066, 15279, 5501, 1901, 3043, 198, 17505, 7087, 33681, 11047, 3598, 11070, 4092, 2485, 4616, 1300, 16723, 5884, 3008, 11067, 2130, 4614, 2126, 3062, 3184, 11041, 3325, 17434, 11071, 3156, 5759, 5116, 2878, 18804, 16652, 3688, 16763, 17480, 2127, 7868, 3042, 16278, 3549, 3157, 10089, 2855, 4213, 16279, 11084, 5500, 5141, 10278, 3049, 5143, 16692, 10266, 1703, 5147, 11051, 11048, 1683, 11046, 16674, 3624, 3593, 17424, 4594, 3596, 16761, 4605, 3523, 4898, 6094, 2132, 3087, 3965, 11083, 2123, 2122, 3601, 6292, 1103, 4607, 4608, 3620, 4091, 15280, 4146, 5811, 2879, 988, 3306, 3484, 3703, 4564, 3704, 16273, 1680, 4159, 16724, 3185, 16276, 6289, 5117, 11049, 4565, 3595, 7230, 3403, 11042, 16672, 3011, 16271, 2326, 11065, 5517, 3031, 1241, 3478, 11050, 3048, 5695, 17122, 5784, 6014, 6290, 16648, 3408, 5142, 926, 8140, 6299, 19478, 21087, 16270, 3599, 8142, 917, 944, 16673, 460, 906, + + -- Vendor + 30431, 32538, 32287, 32540, 32533, 31238, 29529, 28997, 32172, 31580, 27730, 28995, 28701, 32763, 32565, 28992, 29636, 8137, 31579, 29523, 32514, 31582, 18960, 32216, 28721, 35507, 32564, 28718, 7947, 18484, 29537, 12781, 20096, 18988, 32515, 340, 19186, 18987, 31863, 19296, 29535, 31581, 31031, 18911, 4561, 2664, 8139, 28722, 16585, 35508, 20097, 25206, 8145, 19663, 35498, 31910, 32773, 19373, 32380, 20028, 12022, 2810, 18011, 28715, 12793, 2821, 29547, 21655, 4229, 18015, 31032, 32385, 18773, 2803, 2806, 16583, 18753, 19004, 31916, 5494, 8125, 32509, 29493, 19213, 28742, 66, 29744, 32774, 18756, 18774, 16786, 12919, 15174, 33026, 18993, 29532, 20916, 1448, 18990, 30472, 16826, 29527, 3556, 19383, 18751, 34252, 28951, 28714, 29587, 25977, 5940, 19038, 31911, 1465, 29478, 18382, 3027, 14846, 2685, 31865, 31864, 21113, 28776, 12944, 16253, 19662, 3482, 16588, 16657, 3323, 14753, 5594, 19837, 24539, 30885, 12783, 18005, 18991, 4877, 19074, 12246, 10618, 7564, 12245, 26484, 12788, 28040, 1275, 18957, 32834, 12778, 19575, 14754, 20980, 21432, 17904, 18525, 13219, 35496, 23489, 32594, 19042, 12796, 18802, 8678, 16782, 29528, 16624, 3489, 4574, 5162, 32832, 18775, 5817, 6548, 11189, 29628, 26941, 17512, 28687, 2393, 1286, 20080, 14847, 32383, 35497, 9499, 19227, 20240, 3954, 8666, 12043, 1148, 19661, 11185, 28692, 27037, 25046, 19617, 29715, 29491, 11187, 16823, 28589, 3348, 13217, 3313, 30006, 18749, 6367, 3497, 21643, 22212, 5483, 16860, 28038, 30825, 7775, 15419, 4305, 11557, 33638, 29049, 3546, 22208, 4879, 3333, 32631, 27012, 4897, 1257, 19331, 15127, 26977, 25314, 18772, 2663, 6779, 13218, 23732, 28990, 14860, 26110, 14624, 1285, 1263, 14322, 33027, 15126, 18897, 35099, 3335, 2381, 23007, 14921, 18752, 16262, 5519, 1684, 3029, 21019, 32356, 35500, 29495, 18771, 29497, 32337, 17657, 12033, 27011, 32381, 3881, 26938, 27668, 2480, 734, 13216, 5188, 17585, 23381, 17246, 233, 4307, 32382, 20377, 21474, 20241, 8665, 19772, 4453, 3346, 35132, 13476, 9179, 20242, 27722, 22213, 8401, 28685, 19196, 24780, 1301, 5193, 33679, 12795, 6746, 27039, 16635, 277, 4731, 5942, 24291, 29716, 19694, 15179, 26995, 3960, 19521, 20981, 16602, 19232, 3550, 23802, 25032, 1303, 35101, 30723, 29548, 19540, 27721, 3362, 989, 24341, 1460, 28991, 12943, 28993, 1347, 31781, 2848, 23367, 29496, 13433, 1318, 8679, 4200, 4217, 18672, 18018, 23604, 11056, 21485, 16631, 26352, 5101, 5151, 2832, 16528, 4553, 19182, 5611, 483, 29688, 18427, 7854, 21906, 5049, 24357, 167, 3614, 12794, 25976, 12384, 29499, 2805, 32641, 32334, 16015, 1307, 10667, 19538, 35131, 3495, 32639, 8161, 12942, 27142, 8681, 3413, 30730, 27063, 29203, 11057, 19197, 3133, 32413, 4226, 20278, 3400, 14637, 15351, 18754, 5514, 152, 29702, 15006, 5160, 31776, 5175, 15350, 789, 5815, 28723, 11278, 3334, 3366, 1261, 3081, 2670, 1302, 12957, 26600, 19053, 843, 1325, 5565, 25195, 21183, 27267, 28691, 8361, 3342, 27134, 829, 19539, 384, 1299, 222, 945, 29703, 12096, 3562, 4981, 836, 981, 3490, 22491, 9636, 2383, 227, 5753, 19857, 226, 2626, 12785, 3023, 6777, 26596, 2118, 20510, 17553, 16376, 16638, 24396, 29291, 980, 3685, 15165, 1311, 19015, 10118, 13420, 19321, 16264, 23521, 844, 8158, 2838, 1304, 28726, 956, 25178, 8176, 11555, 6740, 258, 793, 1237, 74, 23748, 4730, 791, 3351, 4577, 28725, 24188, 5178, 984, 982, 31557, 16442, 28994, 15293, 17222, 11038, 2672, 15197, 958, 20092, 28727, 1328, 16268, 19678, 3358, 4575, 29538, 9501, 372, 19342, 32354, 15471, 12784, 1313, 7955, 959, 27144, 4265, 4225, 19773, 4221, 17584, 26898, 896, 8404, 15400, 25196, 2481, 3364, 4165, 2687, 1213, 29905, 18907, 5111, 6929, 15291, 29510, 3135, 28716, 29908, 16224, 30438, 21905, 18266, 2482, 26945, 1321, 27138, 32355, 27030, 19536, 1298, 14437, 23437, 14740, 30735, 12792, 5848, 32412, 2380, 31804, 12799, 27195, 3488, 1146, 12956, 5173, 9087, 4602, 5128, 21112, 32477, 1669, 17101, 1250, 1314, 27935, 14337, 10216, 29962, 6741, 8150, 1305, 4590, 1287, 33019, 4878, 17930, 13018, 23159, 1308, 3955, 23208, 27711, 14522, 27146, 15011, 26599, 27031, 3481, 1291, 20986, 16708, 28728, 11188, 3369, 3493, 960, 1289, 23484, 19879, 11116, 1471, 12941, 4083, 1454, 3536, 3015, 4173, 8157, 16829, 12024, 32642, 27052, 18954, 16191, 20808, 16649, 1149, 4228, 25278, 16611, 3537, 28989, 29512, 1294, 24054, 27071, 5163, 27148, 16709, 16722, 3168, 4184, 3018, 23731, 17630, 6807, 8403, 23428, 6574, 3359, 8178, 4085, 24468, 7852, 11536, 23145, 7945, 10367, 27019, 2622, 1690, 5158, 29907, 7952, 2135, 4604, 7683, 4610, 14480, 19932, 1312, 25274, 11183, 24033, 23263, 26936, 2697, 3578, 20494, 12019, 29288, 26934, 18898, 4585, 3367, 12097, 3085, 29014, 4885, 16444, 2265, 16766, 3410, 19574, 16641, 19011, 26868, 1645, 27489, 22225, 20807, 1407, 3935, 2819, 16636, 3409, 23896, 1316, 16705, 3350, 20616, 228, 21488, 5110, 21084, 27817, 16553, 18906, 4894, 6374, 12021, 3577, 2668, 3180, 29277, 30434, 6300, 4170, 5100, 4556, 8508, 3962, 6731, 1247, 33018, 4892, 12023, 28046, 3134, 3958, 4558, 5758, 27140, 3658, 12959, 27186, 3551, 19718, 16678, 29122, 18017, 27055, 32478, 32416, 3178, 18019, 15864, 16612, 6568, 18542, 26569, 28707, 27667, 28796, 24333, 18267, 20081, 16367, 1351, 16739, 29922, 54, 29205, 4220, 19371, 2397, 26968, 15292, 23862, 21110, 2682, 32638, 3316, 28760, 3956, 2264, 7733, 6747, 19495, 2388, 7736, 6730, 5512, 3322, 19474, 3937, 1691, 27185, 27053, 28812, 27478, 19330, 19047, 26707, 1694, 11874, 19836, 2134, 8878, 12026, 4241, 12029, 2364, 1323, 3539, 19450, 16677, 19473, 8177, 14581, 14371, 30439, 1326, 5189, 4259, 27938, 19013, 19245, 3534, 2679, 8117, 16443, 18664, 26474, 27137, 27149, 8131, 6576, 31024, 12777, 12782, 20378, 20249, 7940, 24148, 19533, 19534, 27950, 24510, 4891, 23064, 4555, 19518, 4223, 6567, 12958, 4256, 23511, 24408, 5112, 16748, 26908, 18564, 2352, 5688, 6790, 6791, 3610, 19195, 13435, 30241, 17489, 19560, 13434, 24975, 32421, 19020, 30724, 3533, 3076, 4183, 2814, 16767, 8160, 30572, 19479, 16632, 18810, 16263, 16718, 18009, 3528, 3532, 27181, 491, 31115, 7879, 2699, 2684, 2688, 27057, 28871, 15199, 14737, 5520, 23606, 7976, 4562, 24342, 5169, 4899, 15176, 2842, 22099, 20082, 26568, 16664, 25248, 3952, 23244, 8359, 18581, 28807, 2816, 20463, 18255, 2113, 10856, 23522, 16713, 4893, 5620, 3097, 7978, 5570, 3096, 28827, 4182, 4266, 16683, 26398, 2137, 4587, 16670, 2845, 3091, 3298, 4600, 2698, 5820, 4232, 1692, 16716, 19561, 2839, 2844, 30731, 18905, 1464, 6930, 28682, 3491, 25245, 2483, 15012, 2401, 1697, 3589, 3588, 4231, 5748, 8305, 5411, 5870, 8362, 29511, 19520, 27147, 27143, 1297, 5129, 19239, 18010, 2394, 4888, 28791, 16620, 2357, + + -- Battlemaster and Arenamaster + 12197, 29318, 15006, 26007, 857, 907, 35007, 19859, 3890, 7029, 35023, 15008, 34999, 15972, 34955, 7885, 34991, 19905, 14981, 14982, 19907, 347, 7427, 7410, 20271, 19855, 29568, 19858, 2302, 14942, 17506, 15007, 34983, 5238, 29234, 32332, 1037, 10360, 2804, 30578, 20388, 30171, 5118, 18439, 32333, 20120, 19908, 30581, 20118, 14879, 16711, 20381, 35024, 22516, 25991, 20200, 7314, 20269, 34895, 35027, 30583, 18895, 20272, 30584, 35017, 19811, 20386, 34971, 20273, 34972, 19915, 20274, 30587, 20390, 19923, 20497, 34976, 12198, 19925, 16695, 20362, 35022, 20499, 14623, 16696, 20374, 21235, 19909, 40413, 20382, 32330, 20119, 30579, 35000, 34985, 30580, 35001, 35025, 35002, 17507, 20383, 34437, 35026, 20384, 19910, 35008, 20385, 19912, 29533, 30586, 35019, 34993, 35020, 16694, 30231, 19906, 34986, 34987, 19911, 34989, 30590, 35021, 30610, 30582, 34988, 20276, 34978, 34973, 34997, 34998 + + } + + -- Event handler + gossipFrame:SetScript("OnEvent", function() + -- Special treatment for specific NPCs + local npcGuid = UnitGUID("target") or nil + if npcGuid and not IsShiftKeyDown() then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + -- Open rogue doors in Dalaran (Broken Isles) automatically + if npcID == "96782" -- Lucian Trias + or npcID == "93188" -- Mongar + or npcID == "97004" -- "Red" Jack Findle + then + SkipGossip() + return + end + -- Skip gossip with no alt key requirement + if npcID == "132969" -- Katy Stampwhistle (toy) + or npcID == "104201" -- Katy Stampwhistle (npc) + or tContains(npcTable, tonumber(npcID)) + then + SkipGossip(true) -- true means skip alt key requirement + return + end + end + end + -- Process gossip + SkipGossip() + end) + + end + + ---------------------------------------------------------------------- + -- Faster looting + ---------------------------------------------------------------------- + + if LeaPlusLC["FasterLooting"] == "On" then + + -- Time delay + local tDelay = 0 + + -- Fast loot function + local function FastLoot() + if GetTime() - tDelay >= 0.3 then + tDelay = GetTime() + if GetCVarBool("autoLootDefault") ~= IsModifiedClick("AUTOLOOTTOGGLE") then + if TSMDestroyBtn and TSMDestroyBtn:IsShown() and TSMDestroyBtn:GetButtonState() == "DISABLED" then tDelay = GetTime() return end + local lootMethod = GetLootMethod() + if lootMethod == "master" then + -- Master loot is enabled so fast loot if item should be auto looted + local lootThreshold = GetLootThreshold() + for i = GetNumLootItems(), 1, -1 do + local lootIcon, lootName, lootQuantity, currencyID, lootQuality = GetLootSlotInfo(i) + if lootQuality and lootThreshold and lootQuality < lootThreshold then + LootSlot(i) + end + end + else + -- Master loot is disabled so fast loot regardless + local grouped = IsInGroup() + for i = GetNumLootItems(), 1, -1 do + local lootIcon, lootName, lootQuantity, currencyID, lootQuality, locked = GetLootSlotInfo(i) + local slotType = GetLootSlotType(i) + if lootName and not locked then + if not grouped then + LootSlot(i) + else + if lootMethod == "freeforall" then + if slotType == LOOT_SLOT_ITEM then + LootSlot(i) + end + else + LootSlot(i) + end + end + end + end + end + tDelay = GetTime() + end + end + end + + -- Event frame + local faster = CreateFrame("Frame") + faster:RegisterEvent("LOOT_READY") + faster:SetScript("OnEvent", FastLoot) + + end + + ---------------------------------------------------------------------- + -- Disable bag automation + ---------------------------------------------------------------------- + + if LeaPlusLC["NoBagAutomation"] == "On" and not LeaLockList["NoBagAutomation"] then + RunScript("hooksecurefunc('OpenAllBags', CloseAllBags)") + end + + ---------------------------------------------------------------------- + -- Automate quests (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local QuestPanel = LeaPlusLC:CreatePanel("Automate quests", "QuestPanel") + + LeaPlusLC:MakeTx(QuestPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(QuestPanel, "AutoQuestAvailable", "Accept available quests automatically", 16, -92, false, "If checked, available quests will be accepted automatically.") + LeaPlusLC:MakeCB(QuestPanel, "AutoQuestCompleted", "Turn-in completed quests automatically", 16, -112, false, "If checked, completed quests will be turned-in automatically.") + LeaPlusLC:MakeCB(QuestPanel, "AutoQuestShift", "Require override key for quest automation", 16, -132, false, "If checked, you will need to hold the override key down for quests to be automated.|n|nIf unchecked, holding the override key will prevent quests from being automated.") + + LeaPlusLC:CreateDropDown("AutoQuestKeyMenu", "Override key", QuestPanel, 146, "TOPLEFT", 356, -115, {L["SHIFT"], L["ALT"], L["CONTROL"], L["CMD (MAC)"]}, "") + + -- Help button hidden + QuestPanel.h:Hide() + + -- Back button handler + QuestPanel.b:SetScript("OnClick", function() + QuestPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + QuestPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoQuestShift"] = "Off" + LeaPlusLC["AutoQuestAvailable"] = "On" + LeaPlusLC["AutoQuestCompleted"] = "On" + LeaPlusLC["AutoQuestKeyMenu"] = 1 + + -- Refresh panel + QuestPanel:Hide(); QuestPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutomateQuestsBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoQuestShift"] = "Off" + LeaPlusLC["AutoQuestAvailable"] = "On" + LeaPlusLC["AutoQuestCompleted"] = "On" + LeaPlusLC["AutoQuestKeyMenu"] = 1 + else + QuestPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to determine if override key is being held + local function IsOverrideKeyDown() + if LeaPlusLC["AutoQuestKeyMenu"] == 1 and IsShiftKeyDown() + or LeaPlusLC["AutoQuestKeyMenu"] == 2 and IsAltKeyDown() + or LeaPlusLC["AutoQuestKeyMenu"] == 3 and IsControlKeyDown() + or LeaPlusLC["AutoQuestKeyMenu"] == 4 and IsMetaKeyDown() + then + return true + end + end + + -- Funcion to ignore specific NPCs + local function isNpcBlocked(actionType) + local npcGuid = UnitGUID("target") or nil + if npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + -- Ignore specific NPCs for selecting, accepting and turning-in quests (required if automation has consequences) + if npcID == "15192" -- Anachronos (Caverns of Time) + or npcID == "19935" -- Soridormi (The Scale of Sands, Caverns of Time) + or npcID == "19936" -- Arazmodu (The Scale of Sands, Caverns of Time) + or npcID == "3430" -- Mangletooth (Blood Shard quests, Barrens) + or npcID == "14828" -- Gelvas Grimegate (Darkmoon Faire Ticket Redemption, Elwynn Forest and Mulgore) + or npcID == "14921" -- Rin'wosho the Trader (Zul'Gurub Isle, Stranglethorn Vale) + or npcID == "18166" -- Khadgar (Allegiance to Aldor/Scryer, Shattrath) + or npcID == "18253" -- Archmage Leryda (Violet Signet, Karazhan) + then + return true + end + -- Same but for specific NPCs with special requirements + if npcID == "32540" then -- Lillehoff (The Sons of Hodir Quartermaster, The Storm Peaks) + local name, description, standingID = GetFactionInfoByID(1119) + if standingID and standingID >= 8 then -- Dont automate quests if exalted + return true + end + end + -- Ignore specific NPCs for accepting quests only + if actionType == "Accept" then + -- Classic escort quests + if npcID == "467" -- The Defias Traitor (The Defias Brotherhood) + or npcID == "349" -- Corporal Keeshan (Missing In Action) + or npcID == "1379" -- Miran (Protecting the Shipment) + or npcID == "7766" -- Tyrion (The Attack!) + or npcID == "1978" -- Deathstalker Erland (Escorting Erland) + or npcID == "7784" -- Homing Robot OOX-17/TN (Rescue OOX-17/TN!) + or npcID == "2713" -- Kinelory (Hints of a New Plague?) + or npcID == "2768" -- Professor Phizzlethorpe (Sunken Treasure) + or npcID == "2610" -- Shakes O'Breen (Death From Below) + or npcID == "2917" -- Prospector Remtravel (The Absent Minded Prospector) + or npcID == "7806" -- Homing Robot OOX-09/HL (Rescue OOX-09/HL!) + or npcID == "3439" -- Wizzlecrank's Shredder (The Escape) + or npcID == "3465" -- Gilthares Firebough (Free From the Hold) + or npcID == "3568" -- Mist (Mist) + or npcID == "3584" -- Therylune (Therylune's Escape) + or npcID == "4484" -- Feero Ironhand (Supplies to Auberdine) + or npcID == "3692" -- Volcor (Escape Through Force) + or npcID == "4508" -- Willix the Importer (Willix the Importer) + or npcID == "4880" -- "Stinky" Ignatz (Stinky's Escape) + or npcID == "4983" -- Ogron (Questioning Reethe) + or npcID == "5391" -- Galen Goodward (Galen's Escape) + or npcID == "5644" -- Dalinda Malem (Return to Vahlarriel) + or npcID == "5955" -- Tooga (Tooga's Quest) + or npcID == "7780" -- Rin'ji (Rin'ji is Trapped!) + or npcID == "7807" -- Homing Robot OOX-22/FE (Rescue OOX-22/FE!) + or npcID == "7774" -- Shay Leafrunner (Wandering Shay) + or npcID == "7850" -- Kernobee (A Fine Mess) + or npcID == "8284" -- Dorius Stonetender (Suntara Stones) + or npcID == "8380" -- Captain Vanessa Beltis (A Crew Under Fire) + or npcID == "8516" -- Belnistrasz (Extinguishing the Idol) + or npcID == "9020" -- Commander Gor'shak (What Is Going On?) + or npcID == "9520" -- Grark Lorkrub (Precarious Predicament) + or npcID == "9623" -- A-Me 01 (Chasing A-Me 01) + or npcID == "9598" -- Arei (Ancient Spirit) + or npcID == "9023" -- Marshal Windsor (Jail Break!) + or npcID == "9999" -- Ringo (A Little Help From My Friends) + or npcID == "10427" -- Pao'ka Swiftmountain (Homeward Bound) + or npcID == "10300" -- Ranshalla (Guardians of the Altar) + or npcID == "10646" -- Lakota Windsong (Free at Last) + or npcID == "10638" -- Kanati Greycloud (Protect Kanati Greycloud) + or npcID == "11016" -- Captured Arko'narin (Rescue From Jaedenar) + or npcID == "11218" -- Kerlonian Evershade (The Sleeper Has Awakened) + or npcID == "11711" -- Sentinel Aynasha (One Shot. One Kill.) + or npcID == "11625" -- Cork Gizelton (Bodyguard for Hire) + or npcID == "11626" -- Rigger Gizelton (Gizelton Caravan) + or npcID == "1842" -- Highlord Taelan Fordring (In Dreams) + or npcID == "12277" -- Melizza Brimbuzzle (Get Me Out of Here!) + or npcID == "12580" -- Reginald Windsor (The Great Masquerade) + or npcID == "12818" -- Ruul Snowhoof (Freedom to Ruul) + or npcID == "11856" -- Kaya Flathoof (Protect Kaya) + or npcID == "12858" -- Torek (Torek's Assault) + or npcID == "12717" -- Muglash (Vorsha the Lasher) + or npcID == "13716" -- Celebras the Redeemed (The Scepter of Celebras) + or npcID == "19401" -- Wing Commander Brack (Return to the Abyssal Shelf) (Horde) + or npcID == "20235" -- Gryphoneer Windbellow (Return to the Abyssal Shelf) (Alliance) + -- BCC escort quests + or npcID == "16295" -- Ranger Lilatha (Escape from the Catacombs) + or npcID == "17238" -- Anchorite Truuen (Tomb of the Lightbringer) + or npcID == "17312" -- Magwin (A Cry For Help) + or npcID == "17877" -- Fhwoor (Fhwoor Smash!) + or npcID == "17969" -- Kayra Longmane (Escape from Umbrafen) + or npcID == "18210" -- Mag'har Captive (The Totem of Kar'dash, Horde) + or npcID == "18209" -- Kurenai Captive (The Totem of Kar'dash, Alliance) + or npcID == "18760" -- Isla Starmane (Escape from Firewing Point!) + or npcID == "19589" -- Maxx A. Million Mk. V (Mark V is Alive!) + or npcID == "19671" -- Cryo-Engineer Sha'heen (Someone Else's Hard Work Pays Off) + or npcID == "20281" -- Drijya (Sabotage the Warp-Gate!) + or npcID == "20415" -- Bessy (When the Cows Come Home) + or npcID == "20482" -- Image of Commander Ameer (Delivering the Message) + or npcID == "20763" -- Captured Protectorate Vanguard (Escape from the Staging Grounds) + or npcID == "21027" -- Earthmender Wilda (Escape from Coilskar Cistern) + or npcID == "22424" -- Skywing (Skywing) + or npcID == "22458" -- Chief Archaeologist Letoll (Digging Through Bones) + or npcID == "23383" -- Skyguard Prisoner (Escape from Skettis) + then + return true + end + end + -- Ignore specific NPCs for selecting quests only (only used for items that have no other purpose) + if actionType == "Select" then + if npcID == "12944" -- Lokhtos Darkbargainer (Thorium Brotherhood, Blackrock Depths) + or npcID == "19401" -- Wing Commander Brack (Return to the Abyssal Shelf) (Horde) + or npcID == "20235" -- Gryphoneer Windbellow (Return to the Abyssal Shelf) (Alliance) + or npcID == "10307" -- Witch Doctor Mau'ari (E'Ko quests, Winterspring) + -- Ahn'Qiraj War Effort (Alliance, Ironforge) + or npcID == "15446" -- Bonnie Stoneflayer (Light Leather Collector) + or npcID == "15458" -- Commander Stronghammer (Alliance Ambassador) + or npcID == "15431" -- Corporal Carnes (Iron Bar Collector) + or npcID == "15432" -- Dame Twinbraid (Thorium Bar Collector) + or npcID == "15453" -- Keeper Moonshade (Runecloth Bandage Collector) + or npcID == "15457" -- Huntress Swiftriver (Spotted Yellowtail Collector) + or npcID == "15450" -- Marta Finespindle (Thick Leather Collector) + or npcID == "15437" -- Master Nightsong (Purple Lotus Collector) + or npcID == "15452" -- Nurse Stonefield (Silk Bandage Collector) + or npcID == "15434" -- Private Draxlegauge (Stranglekelp Collector) + or npcID == "15448" -- Private Porter (Medium Leather Collector) + or npcID == "15456" -- Sarah Sadwhistle (Roast Raptor Collector) + or npcID == "15451" -- Sentinel Silversky (Linen Bandage Collector) + or npcID == "15445" -- Sergeant Major Germaine (Arthas' Tears Collector) + or npcID == "15383" -- Sergeant Stonebrow (Copper Bar Collector) + or npcID == "15455" -- Slicky Gastronome (Rainbow Fin Albacore Collector) + -- Ahn'Qiraj War Effort (Horde, Orgrimmar) + or npcID == "15512" -- Apothecary Jezel (Purple Lotus Collector) + or npcID == "15508" -- Batrider Pele'keiki (Firebloom Collector) + or npcID == "15533" -- Bloodguard Rawtar (Lean Wolf Steak Collector) + or npcID == "15535" -- Chief Sharpclaw (Baked Salmon Collector) + or npcID == "15525" -- Doctor Serratus (Rugged Leather Collector) + or npcID == "15534" -- Fisherman Lin'do (Spotted Yellowtail Collector) + or npcID == "15539" -- General Zog (Horde Ambassador) + or npcID == "15460" -- Grunt Maug (Tin Bar Collector) + or npcID == "15528" -- Healer Longrunner (Wool Bandage Collector) + or npcID == "15477" -- Herbalist Proudfeather (Peacebloom Collector) + or npcID == "15529" -- Lady Callow (Mageweave Bandage Collector) + or npcID == "15459" -- Miner Cromwell (Copper Bar Collector) + or npcID == "15469" -- Senior Sergeant T'kelah (Mithril Bar Collector) + or npcID == "15522" -- Sergeant Umala (Thick Leather Collector) + or npcID == "15515" -- Skinner Jamani (Heavy Leather Collector) + or npcID == "15532" -- Stoneguard Clayhoof (Runecloth Bandage Collector) + -- Alliance Commendations + or npcID == "15764" -- Officer Ironbeard (Ironforge Commendations) + or npcID == "15762" -- Officer Lunalight (Darnassus Commendations) + or npcID == "15766" -- Officer Maloof (Stormwind Commendations) + or npcID == "15763" -- Officer Porterhouse (Gnomeregan Commendations) + -- Horde Commendations + or npcID == "15768" -- Officer Gothena (Undercity Commendations) + or npcID == "15765" -- Officer Redblade (Orgrimmar Commendations) + or npcID == "15767" -- Officer Thunderstrider (Thunder Bluff Commendations) + or npcID == "15761" -- Officer Vu'Shalay (Darkspear Commendations) + -- Battlegrounds (Alliance) + or npcID == "13442" -- Arch Druid Renferal (Storm Crystal, Alterac Valley) + -- Battlegrounds (Horde) + or npcID == "13236" -- Primalist Thurloga (Stormpike Soldier's Blood, Alterac Valley) + -- Scourgestones + or npcID == "11039" -- Duke Nicholas Zverenhoff (Eastern Plaguelands) + -- Un'Goro crystals + or npcID == "9117" -- J. D. Collie (Un'Goro Crater) + then + return true + end + end + end + end + end + + -- Function to check if quest requires a blocked item + local function QuestRequiresBlockedItem() + for i = 1, 6 do + local progItem = _G["QuestProgressItem" ..i] or nil + if progItem and progItem:IsShown() and progItem.type == "required" then + if progItem.objectType == "item" then + local name, texture, numItems = GetQuestItemInfo("required", i) + if name then + local itemID = GetItemInfoInstant(name) + if itemID then + if itemID == 9999999999 then -- Reserved for future use + return true + end + end + end + end + end + end + end + + -- Function to check if quest requires gold + local function QuestRequiresGold() + local goldRequiredAmount = GetQuestMoneyToGet() + if goldRequiredAmount and goldRequiredAmount > 0 then + return true + end + end + + -- Function to check if quest title has requirements met + local function DoesQuestHaveRequirementsMet(title) + if title and title ~= "" then + + if not title then + + -- Battlemasters + elseif title == L["Concerted Efforts"] or title == L["For Great Honor"] then + -- Requires 3 Alterac Valley Mark of Honor, 3 Arathi Basin Mark of Honor, 3 Warsong Gulch Mark of Honor (must be before other Mark of Honor quests) + if GetItemCount(20560) >= 3 and GetItemCount(20559) >= 3 and GetItemCount(20558) >= 3 then return true end + elseif title == L["Remember Alterac Valley!"] or title == L["Invaders of Alterac Valley"] then + -- Requires 3 Alterac Valley Mark of Honor + if GetItemCount(20560) >= 3 then return true end + elseif title == L["Claiming Arathi Basin"] or title == L["Conquering Arathi Basin"] then + -- Requires 3 Arathi Basin Mark of Honor + if GetItemCount(20559) >= 3 then return true end + elseif title == L["Fight for Warsong Gulch"] or title == L["Battle of Warsong Gulch"] then + -- Requires 3 Warsong Gulch Mark of Honor + if GetItemCount(20558) >= 3 then return true end + + -- Cloth quartermasters + elseif title == L["A Donation of Wool"] then + -- Requires 60 Wool Cloth + if GetItemCount(2592) >= 60 then return true end + elseif title == L["A Donation of Silk"] then + -- Requires 60 Silk Cloth + if GetItemCount(4306) >= 60 then return true end + elseif title == L["A Donation of Mageweave"] then + -- Requires 60 Mageweave + if GetItemCount(4338) >= 60 then return true end + elseif title == L["A Donation of Runecloth"] then + -- Requires 60 Runecloth + if GetItemCount(14047) >= 60 then return true end + elseif title == L["Additional Runecloth"] then + -- Requires 20 Runecloth + if GetItemCount(14047) >= 20 then return true end + elseif title == L["Gurubashi, Vilebranch, and Witherbark Coins"] then + -- Requires 1 Gurubashi Coin, 1 Vilebranch Coin, 1 Witherbark Coin + if GetItemCount(19701) >= 1 and GetItemCount(19702) >= 1 and GetItemCount(19703) >= 1 then return true end + elseif title == L["Sandfury, Skullsplitter, and Bloodscalp Coins"] then + -- Requires 1 Sandfury Coin, 1 Skullsplitter Coin, 1 Bloodscalp Coin + if GetItemCount(19704) >= 1 and GetItemCount(19705) >= 1 and GetItemCount(19706) >= 1 then return true end + elseif title == L["Zulian, Razzashi, and Hakkari Coins"] then + -- Requires 1 Zulian Coin, 1 Razzashi Coin, 1 Hakkari Coin + if GetItemCount(19698) >= 1 and GetItemCount(19699) >= 1 and GetItemCount(19700) >= 1 then return true end + elseif title == L["Frostsaber E'ko"] then + -- Requires 3 Frostsaber E'ko + if GetItemCount(12430) >= 3 then return true end + elseif title == L["Winterfall E'ko"] then + -- Requires 3 Winterfall E'ko + if GetItemCount(12431) >= 3 then return true end + elseif title == L["Shardtooth E'ko"] then + -- Requires 3 Shardtooth E'ko + if GetItemCount(12432) >= 3 then return true end + elseif title == L["Wildkin E'ko"] then + -- Requires 3 Wildkin E'ko + if GetItemCount(12433) >= 3 then return true end + elseif title == L["Chillwind E'ko"] then + -- Requires 3 Chillwind E'ko + if GetItemCount(12434) >= 3 then return true end + elseif title == L["Ice Thistle E'ko"] then + -- Requires 3 Ice Thistle E'ko + if GetItemCount(12435) >= 3 then return true end + elseif title == L["Frostmaul E'ko"] then + -- Requires 3 Ice Thistle E'ko + if GetItemCount(12436) >= 3 then return true end + elseif title == L["Marks of Kil'jaeden"] or title == L["More Marks of Kil'jaeden"] then + -- Requires 10 More Marks of Kil'jaeden + if GetItemCount(29425) >= 10 then return true end + elseif title == L["Single Mark of Sargeras"] then + -- Requires 1 Marks of Sargeras (if more than 10, leave for More Marks of Sargeras) + if GetItemCount(30809) >= 1 and GetItemCount(30809) < 10 then return true end + elseif title == L["More Marks of Sargeras"] then + -- Requires 10 Marks of Sargeras + if GetItemCount(30809) >= 10 then return true end + elseif title == L["Firewing Signets"] or title == L["More Firewing Signets"] then + -- Requires 10 Firewing Signets + if GetItemCount(29426) >= 10 then return true end + elseif title == L["Single Sunfury Signet"] then + -- Requires 1 Sunfury Signet (if more than 10, leave for More Sunfury Signets) + if GetItemCount(30810) >= 1 and GetItemCount(30810) < 10 then return true end + elseif title == L["More Sunfury Signets"] then + -- Requires 10 Sunfury Signets + if GetItemCount(30810) >= 10 then return true end + + -- Darkmoon Faire (Rinling) + elseif title == L["Copper Modulator"] then + if GetItemCount(4363) >= 5 then return true end + elseif title == L["Whirring Bronze Gizmo"] then + if GetItemCount(4375) >= 7 then return true end + elseif title == L["Green Fireworks"] then + if GetItemCount(9313) >= 36 then return true end + elseif title == L["Mechanical Repair Kits"] then + if GetItemCount(11590) >= 6 then return true end + elseif title == L["Thorium Widget"] then + if GetItemCount(15994) >= 6 then return true end + elseif title == L["More Thorium Widgets"] then + if GetItemCount(15994) >= 6 then return true end + + -- Darkmoon Faire (Yebb Neblegear) + elseif title == L["Small Furry Paws"] then + if GetItemCount(5134) >= 5 then return true end + elseif title == L["Evil Bat Eyes"] then + if GetItemCount(11404) >= 10 then return true end + elseif title == L["Glowing Scorpid Blood"] then + if GetItemCount(19933) >= 10 then return true end + elseif title == L["More Bat Eyes"] then + if GetItemCount(11404) >= 10 then return true end + elseif title == L["More Glowing Scorpid Blood"] then + if GetItemCount(19933) >= 10 then return true end + elseif title == L["Soft Bushy Tails"] then + if GetItemCount(4582) >= 5 then return true end + elseif title == L["Torn Bear Pelts"] then + if GetItemCount(11407) >= 5 then return true end + elseif title == L["Vibrant Plumes"] then + if GetItemCount(5117) >= 5 then return true end + + -- Darkmoon Faire (Chronos) + elseif title == L["Armor Kits"] then + if GetItemCount(15564) >= 8 then return true end + elseif title == L["Carnival Boots"] then + if GetItemCount(2309) >= 3 then return true end + elseif title == L["Carnival Jerkins"] then + if GetItemCount(2314) >= 3 then return true end + elseif title == L["Crocolisk Boy and the Bearded Murloc"] then + if GetItemCount(8185) >= 1 then return true end + elseif title == L["More Armor Kits"] then + if GetItemCount(15564) >= 8 then return true end + elseif title == L["The World's Largest Gnome!"] then + if GetItemCount(5739) >= 3 then return true end + + -- Darkmoon Faire (Kerri Hicks) + elseif title == L["Big Black Mace"] then + if GetItemCount(7945) >= 1 then return true end + elseif title == L["Coarse Weightstone"] then + if GetItemCount(3240) >= 10 then return true end + elseif title == L["Green Iron Bracers"] then + if GetItemCount(3835) >= 3 then return true end + elseif title == L["Heavy Grinding Stone"] then + if GetItemCount(3486) >= 7 then return true end + elseif title == L["More Dense Grinding Stones"] then + if GetItemCount(12644) >= 8 then return true end + elseif title == L["Rituals of Strength"] then + if GetItemCount(12644) >= 8 then return true end + + else return true + end + end + end + + -- Create event frame + local qFrame = CreateFrame("FRAME") + + -- Function to setup events + local function SetupEvents() + if LeaPlusLC["AutomateQuests"] == "On" then + qFrame:RegisterEvent("QUEST_DETAIL") + qFrame:RegisterEvent("QUEST_ACCEPT_CONFIRM") + qFrame:RegisterEvent("QUEST_PROGRESS") + qFrame:RegisterEvent("QUEST_COMPLETE") + qFrame:RegisterEvent("QUEST_GREETING") + qFrame:RegisterEvent("QUEST_AUTOCOMPLETE") + qFrame:RegisterEvent("GOSSIP_SHOW") + qFrame:RegisterEvent("QUEST_FINISHED") + else + qFrame:UnregisterAllEvents() + end + end + + -- Setup events when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutomateQuests"]:HookScript("OnClick", SetupEvents) + if LeaPlusLC["AutomateQuests"] == "On" then SetupEvents() end + + -- Event handler + qFrame:SetScript("OnEvent", function(self, event, arg1) + + -- Block shared quests if option is enabled + if event == "QUEST_DETAIL" then + LeaPlusLC:CheckIfQuestIsSharedAndShouldBeDeclined() + end + + -- Clear progress items when quest interaction has ceased + if event == "QUEST_FINISHED" then + for i = 1, 6 do + local progItem = _G["QuestProgressItem" ..i] or nil + if progItem and progItem:IsShown() then + progItem:Hide() + end + end + return + end + + -- Check for SHIFT key modifier + if LeaPlusLC["AutoQuestShift"] == "On" and not IsOverrideKeyDown() then return + elseif LeaPlusLC["AutoQuestShift"] == "Off" and IsOverrideKeyDown() then return + end + + ---------------------------------------------------------------------- + -- Accept quests automatically + ---------------------------------------------------------------------- + + -- Accept quests with a quest detail window + if event == "QUEST_DETAIL" then + if LeaPlusLC["AutoQuestAvailable"] == "On" then + -- Don't accept blocked quests + if isNpcBlocked("Accept") then return end + -- Accept quest + AcceptQuest() + HideUIPanel(QuestFrame) + end + end + + -- Accept quests which require confirmation (such as sharing escort quests) + if event == "QUEST_ACCEPT_CONFIRM" then + if LeaPlusLC["AutoQuestAvailable"] == "On" then + ConfirmAcceptQuest() + StaticPopup_Hide("QUEST_ACCEPT") + end + end + + ---------------------------------------------------------------------- + -- Turn-in quests automatically + ---------------------------------------------------------------------- + + -- Turn-in progression quests + if event == "QUEST_PROGRESS" and IsQuestCompletable() then + if LeaPlusLC["AutoQuestCompleted"] == "On" then + -- Don't continue quests for blocked NPCs + if isNpcBlocked("Complete") then return end + -- Don't continue if quest requires blocked item + if QuestRequiresBlockedItem() then return end + -- Don't continue if quest requires gold + if QuestRequiresGold() then return end + -- Continue quest + CompleteQuest() + end + end + + -- Turn in completed quests if only one reward item is being offered + if event == "QUEST_COMPLETE" then + if LeaPlusLC["AutoQuestCompleted"] == "On" then + -- Don't complete quests for blocked NPCs + if isNpcBlocked("Complete") then return end + -- Don't complete if quest requires blocked item + if QuestRequiresBlockedItem() then return end + -- Don't complete if quest requires gold + if QuestRequiresGold() then return end + -- Complete quest + if GetNumQuestChoices() <= 1 then + GetQuestReward(GetNumQuestChoices()) + end + end + end + + -- Show quest dialog for quests that use the objective tracker (it will be completed automatically) + if event == "QUEST_AUTOCOMPLETE" then + if LeaPlusLC["AutoQuestCompleted"] == "On" then + local index = GetQuestLogIndexByID(arg1) + if GetQuestLogIsAutoComplete(index) then + ShowQuestComplete(index) + end + end + end + + ---------------------------------------------------------------------- + -- Select quests automatically + ---------------------------------------------------------------------- + + if event == "GOSSIP_SHOW" or event == "QUEST_GREETING" then + + -- Select quests + if UnitExists("npc") or QuestFrameGreetingPanel:IsShown() or GossipFrame.GreetingPanel:IsShown() then + + -- Don't select quests for blocked NPCs + if isNpcBlocked("Select") then return end + + if event == "QUEST_GREETING" then + -- Select quest greeting completed quests + if LeaPlusLC["AutoQuestCompleted"] == "On" then + for i = 1, GetNumActiveQuests() do + local title, isComplete = GetActiveTitle(i) + if title and isComplete then + return SelectActiveQuest(i) + end + end + end + -- Select quest greeting available quests + if LeaPlusLC["AutoQuestAvailable"] == "On" then + for i = 1, GetNumAvailableQuests() do + local title, isComplete = GetAvailableTitle(i) + if title and not isComplete then + return SelectAvailableQuest(i) + end + end + end + else + -- Select gossip completed quests + if LeaPlusLC["AutoQuestCompleted"] == "On" then + local gossipQuests = C_GossipInfo.GetActiveQuests() + for titleIndex, questInfo in ipairs(gossipQuests) do + if questInfo.title and questInfo.isComplete then + if questInfo.questID then + return C_GossipInfo.SelectActiveQuest(questInfo.questID) + end + end + end + end + -- Select gossip available quests + if LeaPlusLC["AutoQuestAvailable"] == "On" then + local GossipQuests = C_GossipInfo.GetAvailableQuests() + for titleIndex, questInfo in ipairs(GossipQuests) do + if questInfo.questID and DoesQuestHaveRequirementsMet(questInfo.questID) then + return C_GossipInfo.SelectAvailableQuest(questInfo.questID) + end + end + end + end + end + end + + end) + + end + + ---------------------------------------------------------------------- + -- Sort game options addon list + ---------------------------------------------------------------------- + + if LeaPlusLC["CharAddonList"] == "On" then + -- Set the addon list to character by default + if AddonCharacterDropDown and AddonCharacterDropDown.selectedValue then + AddonCharacterDropDown.selectedValue = UnitName("player"); + AddonCharacterDropDownText:SetText(UnitName("player")) + end + end + + ---------------------------------------------------------------------- + -- Sell junk automatically (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create sell junk banner + local StartMsg = CreateFrame("FRAME", nil, MerchantFrame) + StartMsg:ClearAllPoints() + StartMsg:SetPoint("BOTTOMLEFT", 4, 4) + StartMsg:SetSize(160, 22) + StartMsg:SetToplevel(true) + StartMsg:Hide() + + StartMsg.s = StartMsg:CreateTexture(nil, "BACKGROUND") + StartMsg.s:SetAllPoints() + StartMsg.s:SetVertexColor(0.1, 0.1, 0.1, 1.0) + + StartMsg.f = StartMsg:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + StartMsg.f:SetAllPoints(); + StartMsg.f:SetText(L["SELLING JUNK"]) + + -- Declarations + local IterationCount, totalPrice = 500, 0 + local SellJunkTicker + + -- Create custom NewTicker function (from Wrath) + local function LeaPlusNewTicker(duration, callback, iterations) + local ticker = setmetatable({}, TickerMetatable) + ticker._remainingIterations = iterations + ticker._callback = function() + if (not ticker._cancelled) then + callback(ticker) + --Make sure we weren't cancelled during the callback + if (not ticker._cancelled) then + if (ticker._remainingIterations) then + ticker._remainingIterations = ticker._remainingIterations - 1 + end + if (not ticker._remainingIterations or ticker._remainingIterations > 0) then + LibCompat.After(duration, ticker._callback) + end + end + end + end + LibCompat.After(duration, ticker._callback) + return ticker + end + + + + -- Create configuration panel + local SellJunkFrame = LeaPlusLC:CreatePanel("Sell junk automatically", "SellJunkFrame") + LeaPlusLC:MakeTx(SellJunkFrame, "Settings", 16, -72) + LeaPlusLC:MakeCB(SellJunkFrame, "AutoSellShowSummary", "Show vendor summary in chat", 16, -92, false, "If checked, a vendor summary will be shown in chat when junk is automatically sold.") + + -- Help button hidden + SellJunkFrame.h:Hide() + + -- Back button handler + SellJunkFrame.b:SetScript("OnClick", function() + SellJunkFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + SellJunkFrame.r.tiptext = SellJunkFrame.r.tiptext .. "|n|n" .. L["Note that this will not reset your exclusions list."] + SellJunkFrame.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoSellShowSummary"] = "On" + + -- Refresh panel + SellJunkFrame:Hide(); SellJunkFrame:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoSellJunkBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoSellShowSummary"] = "On" + else + SellJunkFrame:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to stop selling + local function StopSelling() + if SellJunkTicker then SellJunkTicker._cancelled = true; end + StartMsg:Hide() + SellJunkFrame:UnregisterEvent("ITEM_LOCKED") + SellJunkFrame:UnregisterEvent("UI_ERROR_MESSAGE") + end + + -- Create excluded box + local titleTX = LeaPlusLC:MakeTx(SellJunkFrame, "Exclusions", 356, -72) + titleTX:SetWidth(200) + titleTX:SetWordWrap(false) + titleTX:SetJustifyH("LEFT") + + -- Show help button for exclusions + LeaPlusLC:CreateHelpButton("SellJunkExcludeHelpButton", SellJunkFrame, titleTX, "Enter item IDs separated by commas. Item IDs can be found in item tooltips while this panel is showing.|n|nJunk items entered here will not be sold automatically.|n|nWhite items entered here will be sold automatically.|n|nThe editbox tooltip will show you more information about the items you have entered.") + + local eb = CreateFrame("Frame", nil, SellJunkFrame) + eb:SetSize(200, 180) + eb:SetPoint("TOPLEFT", 350, -92) + eb:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight", + edgeSize = 16, + insets = {left = 8, right = 6, top = 8, bottom = 8}, + }) + eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5) + + eb.scroll = CreateFrame("ScrollFrame", nil, eb) + eb.scroll:SetPoint("TOPLEFT", eb, 12, -10) + eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10) + + eb.Text = CreateFrame("EditBox", nil, eb) + eb.Text:SetMultiLine(true) + eb.Text:SetWidth(150) + eb.Text:SetPoint("TOPLEFT", eb.scroll) + eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll) + eb.Text:SetMaxLetters(600) + eb.Text:SetFontObject(GameFontNormalLarge) + eb.Text:SetAutoFocus(false) + eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) + eb.scroll:SetScrollChild(eb.Text) + + -- Set focus on the editbox text when clicking the editbox + eb:SetScript("OnMouseDown", function() + eb.Text:SetFocus() + eb.Text:SetCursorPosition(eb.Text:GetMaxLetters()) + end) + + -- Function to create whitelist + local whiteList = {} + local function UpdateWhiteList() + wipe(whiteList) + + local whiteString = eb.Text:GetText() + if whiteString and whiteString ~= "" then + whiteString = whiteString:gsub("[^,%d]", "") + local tList = {strsplit(",", whiteString)} + for i = 1, #tList do + if tList[i] then + tList[i] = tonumber(tList[i]) + if tList[i] then + whiteList[tList[i]] = true + end + end + end + end + + LeaPlusLC["AutoSellExcludeList"] = whiteString + eb.Text:SetText(LeaPlusLC["AutoSellExcludeList"]) + + end + + -- Save the excluded list when it changes and at startup + eb.Text:SetScript("OnTextChanged", UpdateWhiteList) + eb.Text:SetText(LeaPlusLC["AutoSellExcludeList"]) + UpdateWhiteList() + + -- Create whitelist on startup and option or preset is clicked + UpdateWhiteList() + LeaPlusCB["AutoSellJunkBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + UpdateWhiteList() + end + end) + + -- Function to make tooltip string + local function MakeTooltipString() + + local keepMsg = "" + local sellMsg = "" + local dupMsg = "" + local novalueMsg = "" + local incompatMsg = "" + + local tipString = eb.Text:GetText() + if tipString and tipString ~= "" then + tipString = tipString:gsub("[^,%d]", "") + local tipList = {strsplit(",", tipString)} + for i = 1, #tipList do + if tipList[i] then + tipList[i] = tonumber(tipList[i]) + if tipList[i] and tipList[i] > 0 and tipList[i] < 999999999 then + local void, tLink, Rarity, void, void, void, void, void, void, void, ItemPrice = GetItemInfo(tipList[i]) + if tLink and tLink ~= "" then + local linkCol = string.sub(tLink, 1, 10) + if linkCol then + local linkName = tLink:match("%[(.-)%]") + if linkName and ItemPrice then + if ItemPrice > 0 then + if Rarity == 0 then + -- Junk item + if string.find(keepMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add junk item to keep list + keepMsg = keepMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + elseif Rarity == 1 then + -- White item + if string.find(sellMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add non-junk item to sell list + sellMsg = sellMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + else + -- Incompatible item (not junk or white) + if string.find(incompatMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add item to incompatible list + incompatMsg = incompatMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + end + else + -- Item has no sell price so cannot be sold + if string.find(novalueMsg, "%(" .. tipList[i] .. "%)") then + -- Duplicate (ID appears more than once in list) + dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + else + -- Add item to cannot be sold list + novalueMsg = novalueMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n" + end + end + end + end + end + end + end + end + end + + if keepMsg ~= "" then keepMsg = "|n" .. L["Keep"] .. "|n" .. keepMsg end + if sellMsg ~= "" then sellMsg = "|n" .. L["Sell"] .. "|n" .. sellMsg end + if dupMsg ~= "" then dupMsg = "|n" .. L["Duplicates"] .. "|n" .. dupMsg end + if novalueMsg ~= "" then novalueMsg = "|n" .. L["Cannot be sold"] .. "|n" .. novalueMsg end + if incompatMsg ~= "" then incompatMsg = "|n" .. L["Incompatible"] .. "|n" .. incompatMsg end + + eb.tiptext = L["Exclusions"] .. "|n" .. keepMsg .. sellMsg .. dupMsg .. novalueMsg .. incompatMsg + eb.Text.tiptext = L["Exclusions"] .. "|n" .. keepMsg .. sellMsg .. dupMsg .. novalueMsg .. incompatMsg + if eb.tiptext == L["Exclusions"] .. "|n" then eb.tiptext = eb.tiptext .. "|n" .. L["Nothing to see here."] end + if eb.Text.tiptext == L["Exclusions"] .. "|n" then eb.Text.tiptext = "-" end + + if GameTooltip:IsShown() then + if MouseIsOver(eb) or MouseIsOver(eb.Text) then + GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) + end + end + + end + + eb.Text:HookScript("OnTextChanged", MakeTooltipString) + eb.Text:HookScript("OnTextChanged", function() + LibCompat.After(0.1, function() + MakeTooltipString() + end) + end) + + -- Show the button tooltip for the editbox + eb:SetScript("OnEnter", MakeTooltipString) + eb:HookScript("OnEnter", LeaPlusLC.TipSee) + eb:HookScript("OnEnter", function() GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) end) + eb:SetScript("OnLeave", GameTooltip_Hide) + eb.Text:SetScript("OnEnter", MakeTooltipString) + eb.Text:HookScript("OnEnter", LeaPlusLC.ShowDropTip) + eb.Text:HookScript("OnEnter", function() GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) end) + eb.Text:SetScript("OnLeave", GameTooltip_Hide) + + -- Show item ID in item tooltips while configuration panel is showing + GameTooltip:HookScript("OnTooltipSetItem", function(self) + if SellJunkFrame:IsShown() then + local void, itemLink = self:GetItem() + if itemLink then + local itemID = GetItemInfoFromHyperlink(itemLink) + if itemID then self:AddLine(L["Item ID"] .. ": " .. itemID) end + end + end + end) + + -- Vendor function + local function SellJunkFunc() + + -- Variables + local SoldCount, Rarity, ItemPrice = 0, 0, 0 + local CurrentItemLink, void + + -- Traverse bags and sell grey items + for BagID = 0, 4 do + for BagSlot = 1, C_Container.GetContainerNumSlots(BagID) do + CurrentItemLink = C_Container.GetContainerItemLink(BagID, BagSlot) + if CurrentItemLink then + void, void, Rarity, void, void, void, void, void, void, void, ItemPrice = GetItemInfo(CurrentItemLink) + -- Don't sell whitelisted items + local itemID = GetItemInfoFromHyperlink(CurrentItemLink) + if itemID and whiteList[itemID] then + if Rarity == 0 then + -- Junk item to keep + Rarity = 3 + ItemPrice = 0 + elseif Rarity == 1 then + -- White item to sell + Rarity = 0 + end + end + -- Continue + local cInfo = C_Container.GetContainerItemInfo(BagID, BagSlot) + local itemCount = cInfo.stackCount + if Rarity == 0 and ItemPrice ~= 0 then + SoldCount = SoldCount + 1 + if MerchantFrame:IsShown() then + -- If merchant frame is open, vendor the item + C_Container.UseContainerItem(BagID, BagSlot) + -- Perform actions on first iteration + if SellJunkTicker._remainingIterations == IterationCount then + -- Calculate total price + totalPrice = totalPrice + (ItemPrice * itemCount) + end + else + -- If merchant frame is not open, stop selling + StopSelling() + return + end + end + end + end + + end + + -- Stop selling if no items were sold for this iteration or iteration limit was reached + if SoldCount == 0 or SellJunkTicker and SellJunkTicker._remainingIterations == 1 then + StopSelling() + if totalPrice > 0 and LeaPlusLC["AutoSellShowSummary"] == "On" then + LeaPlusLC:Print(L["Sold junk for"] .. " " .. GetCoinText(totalPrice) .. ".") + end + end + + end + + -- Function to setup events + local function SetupEvents() + if LeaPlusLC["AutoSellJunk"] == "On" then + SellJunkFrame:RegisterEvent("MERCHANT_SHOW"); + SellJunkFrame:RegisterEvent("MERCHANT_CLOSED"); + else + SellJunkFrame:UnregisterEvent("MERCHANT_SHOW") + SellJunkFrame:UnregisterEvent("MERCHANT_CLOSED") + end + end + + -- Setup events when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutoSellJunk"]:HookScript("OnClick", SetupEvents) + if LeaPlusLC["AutoSellJunk"] == "On" then SetupEvents() end + + -- Event handler + SellJunkFrame:SetScript("OnEvent", function(self, event) + if event == "MERCHANT_SHOW" then + -- Check for vendors that refuse to buy items + SellJunkFrame:RegisterEvent("UI_ERROR_MESSAGE") + -- Reset variable + totalPrice = 0 + -- Do nothing if shift key is held down + if IsShiftKeyDown() then return end + -- Cancel existing ticker if present + if SellJunkTicker then SellJunkTicker._cancelled = true; end + -- Sell grey items using ticker (ends when all grey items are sold or iteration count reached) + SellJunkTicker = LeaPlusNewTicker(0.2, SellJunkFunc, IterationCount) + SellJunkFrame:RegisterEvent("ITEM_LOCKED") + elseif event == "ITEM_LOCKED" then + StartMsg:Show() + SellJunkFrame:UnregisterEvent("ITEM_LOCKED") + elseif event == "MERCHANT_CLOSED" then + -- If merchant frame is closed, stop selling + StopSelling() + elseif event == "UI_ERROR_MESSAGE" then + if arg1 == 46 then + StopSelling() -- Vendor refuses to buy items + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Repair automatically (no reload required) + ---------------------------------------------------------------------- + + do + + -- Repair when suitable merchant frame is shown + local function RepairFunc() + if IsShiftKeyDown() then return end + if CanMerchantRepair() then -- If merchant is capable of repair + -- Process repair + local RepairCost, CanRepair = GetRepairAllCost() + if CanRepair then -- If merchant is offering repair + if LeaPlusLC["AutoRepairGuildFunds"] == "On" and IsInGuild() then + -- Guilded character and guild repair option is enabled + if CanGuildBankRepair() then + -- Character has permission to repair so try guild funds but fallback on character funds (if daily gold limit is reached) + RepairAllItems(1) + RepairAllItems() + else + -- Character does not have permission to repair so use character funds + RepairAllItems() + end + else + -- Unguilded character or guild repair option is disabled + RepairAllItems() + end + -- Show cost summary + if LeaPlusLC["AutoRepairShowSummary"] == "On" then + LeaPlusLC:Print(L["Repaired for"] .. " " .. GetCoinText(RepairCost) .. ".") + end + end + end + end + + -- Create event frame + local RepairFrame = CreateFrame("FRAME") + + -- Function to setup event + local function SetupEvent() + if LeaPlusLC["AutoRepairGear"] == "On" then + RepairFrame:RegisterEvent("MERCHANT_SHOW") + else + RepairFrame:UnregisterEvent("MERCHANT_SHOW") + end + end + + -- Setup event when option is clicked and on startup (if option is enabled) + LeaPlusCB["AutoRepairGear"]:HookScript("OnClick", SetupEvent) + if LeaPlusLC["AutoRepairGear"] == "On" then SetupEvent() end + + -- Event handler + RepairFrame:SetScript("OnEvent", RepairFunc) + + -- Create configuration panel + local RepairPanel = LeaPlusLC:CreatePanel("Repair automatically", "RepairPanel") + + LeaPlusLC:MakeTx(RepairPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(RepairPanel, "AutoRepairGuildFunds", "Repair using guild funds if available", 16, -92, false, "If checked, repair costs will be taken from guild funds for characters that are guilded and have permission to repair.") + LeaPlusLC:MakeCB(RepairPanel, "AutoRepairShowSummary", "Show repair summary in chat", 16, -112, false, "If checked, a repair summary will be shown in chat when your gear is automatically repaired.") + + -- Help button hidden + RepairPanel.h:Hide() + + -- Back button handler + RepairPanel.b:SetScript("OnClick", function() + RepairPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + RepairPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoRepairGuildFunds"] = "On" + LeaPlusLC["AutoRepairShowSummary"] = "On" + + -- Refresh panel + RepairPanel:Hide(); RepairPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoRepairBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoRepairGuildFunds"] = "On" + LeaPlusLC["AutoRepairShowSummary"] = "On" + else + RepairPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Hide the combat log + ---------------------------------------------------------------------- + + if LeaPlusLC["NoCombatLogTab"] == "On" and not LeaLockList["NoCombatLogTab"] then + + -- Ensure combat log is docked + if ChatFrame2.isDocked then + -- Set combat log attributes when chat windows are updated + LpEvt:RegisterEvent("UPDATE_CHAT_WINDOWS") + -- Set combat log tab placement when tabs are assigned by the client + hooksecurefunc("FCF_SetTabPosition", function() + ChatFrame2Tab:SetPoint("BOTTOMLEFT", ChatFrame1Tab, "BOTTOMRIGHT", 0, 0) + end) + else + -- If combat log is undocked, do nothing but show warning + LibCompat.After(1, function() + LeaPlusLC:Print("Combat log cannot be hidden while undocked.") + end) + end + + end + + ---------------------------------------------------------------------- + -- Show player chain + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowPlayerChain"] == "On" and not LeaLockList["ShowPlayerChain"] then + + -- Ensure chain doesnt clip through pet portrait + PetPortrait:GetParent():SetFrameLevel(4) + + -- Create configuration panel + local ChainPanel = LeaPlusLC:CreatePanel("Show player chain", "ChainPanel") + + -- Add dropdown menu + LeaPlusLC:CreateDropDown("PlayerChainMenu", "Chain style", ChainPanel, 146, "TOPLEFT", 16, -112, {L["RARE"], L["ELITE"], L["RARE ELITE"]}, "") + + -- Set chain style + local function SetChainStyle() + -- Get dropdown menu value + local chain = LeaPlusLC["PlayerChainMenu"] -- Numeric value + -- Set chain style according to value + if chain == 1 then -- Rare + PlayerFrameTexture:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Rare.blp") + PlayerFrameTexture:SetTexCoord(1, .09375, 0, .78125) + elseif chain == 2 then -- Elite + PlayerFrameTexture:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Elite.blp") + PlayerFrameTexture:SetTexCoord(1, .09375, 0, .78125) + elseif chain == 3 then -- Rare Elite + PlayerFrameTexture:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp") + PlayerFrameTexture:SetTexCoord(0.25, 0.0234375, 0, 0.1953125) + end + end + + -- Set style on startup + SetChainStyle() + + -- Set style when a drop menu is selected (procs when the list is hidden) + LeaPlusCB["ListFramePlayerChainMenu"]:HookScript("OnHide", SetChainStyle) + + -- Help button hidden + ChainPanel.h:Hide() + + -- Back button handler + ChainPanel.b:SetScript("OnClick", function() + LeaPlusCB["ListFramePlayerChainMenu"]:Hide(); -- Hide the dropdown list + ChainPanel:Hide(); + LeaPlusLC["PageF"]:Show(); + LeaPlusLC["Page5"]:Show(); + return + end) + + -- Reset button handler + ChainPanel.r:SetScript("OnClick", function() + LeaPlusCB["ListFramePlayerChainMenu"]:Hide(); -- Hide the dropdown list + LeaPlusLC["PlayerChainMenu"] = 2 + ChainPanel:Hide(); ChainPanel:Show(); + SetChainStyle() + end) + + -- Show the panel when the configuration button is clicked + LeaPlusCB["ModPlayerChain"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + LeaPlusLC["PlayerChainMenu"] = 3; + SetChainStyle(); + else + LeaPlusLC:HideFrames(); + ChainPanel:Show(); + end + end) + + end + + ---------------------------------------------------------------------- + -- Show raid frame toggle button + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowRaidToggle"] == "On" and not LeaLockList["ShowRaidToggle"] then + + -- Check to make sure raid toggle button exists + if CompactRaidFrameManagerDisplayFrameHiddenModeToggle then + + -- Create a border for the button + local cBackdrop = CreateFrame("Frame", nil, CompactRaidFrameManagerDisplayFrameHiddenModeToggle) + cBackdrop:SetAllPoints() + cBackdrop.backdropInfo = {edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}} + cBackdrop:ApplyBackdrop() + + -- Move the button (function runs after PLAYER_ENTERING_WORLD and PARTY_LEADER_CHANGED) + hooksecurefunc("CompactRaidFrameManager_UpdateOptionsFlowContainer", function() + if CompactRaidFrameManager and CompactRaidFrameManagerDisplayFrameHiddenModeToggle then + local void, void, void, void, y = CompactRaidFrameManager:GetPoint() + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetWidth(40) + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:ClearAllPoints() + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, y + 22) + CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetParent(UIParent) + end + end) + + end + + end + + ---------------------------------------------------------------------- + -- Hide hit indicators (portrait text) + ---------------------------------------------------------------------- + + if LeaPlusLC["NoHitIndicators"] == "On" and not LeaLockList["NoHitIndicators"] then + hooksecurefunc(PlayerHitIndicator, "Show", PlayerHitIndicator.Hide) + hooksecurefunc(PetHitIndicator, "Show", PetHitIndicator.Hide) + end + + ---------------------------------------------------------------------- + -- Class colored frames + ---------------------------------------------------------------------- + + if LeaPlusLC["ClassColFrames"] == "On" and not LeaLockList["ClassColFrames"] then + + -- Create background frame for player frame + local PlayFN = CreateFrame("FRAME", nil, PlayerFrame) + PlayFN:Hide() + + PlayFN:SetWidth(TargetFrameNameBackground:GetWidth()) + PlayFN:SetHeight(TargetFrameNameBackground:GetHeight()) + + local void, void, void, x, y = TargetFrameNameBackground:GetPoint() + PlayFN:SetPoint("TOPLEFT", PlayerFrame, "TOPLEFT", -x, y) + + PlayFN.t = PlayFN:CreateTexture(nil, "BORDER") + PlayFN.t:SetAllPoints() + PlayFN.t:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-LevelBackground") + + local c = LeaPlusLC["RaidColors"][select(2, UnitClass("player"))] + if c then PlayFN.t:SetVertexColor(c.r, c.g, c.b) end + + -- Create color function for target and focus frames + local function TargetFrameCol() + if UnitIsPlayer("target") then + local c = LeaPlusLC["RaidColors"][select(2, UnitClass("target"))] + if c then TargetFrameNameBackground:SetVertexColor(c.r, c.g, c.b) end + end + if UnitIsPlayer("focus") then + local c = LeaPlusLC["RaidColors"][select(2, UnitClass("focus"))] + if c then FocusFrameNameBackground:SetVertexColor(c.r, c.g, c.b) end + end + end + + local ColTar = CreateFrame("FRAME") + ColTar:SetScript("OnEvent", TargetFrameCol) -- Events are registered if target option is enabled + + -- Refresh color if focus frame size changes + hooksecurefunc(FocusFrame, "SetSmallSize", function() + if LeaPlusLC["ClassColTarget"] == "On" then + TargetFrameCol() + end + end) + + -- Create configuration panel + local ClassFrame = LeaPlusLC:CreatePanel("Class colored frames", "ClassFrame") + + LeaPlusLC:MakeTx(ClassFrame, "Settings", 16, -72) + LeaPlusLC:MakeCB(ClassFrame, "ClassColPlayer", "Show player frame in class color", 16, -92, false, "If checked, the player frame background will be shown in class color.") + LeaPlusLC:MakeCB(ClassFrame, "ClassColTarget", "Show target frame and focus frame in class color", 16, -112, false, "If checked, the target frame background and focus frame background will be shown in class color.") + + -- Help button hidden + ClassFrame.h:Hide() + + -- Back button handler + ClassFrame.b:SetScript("OnClick", function() + ClassFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Function to set class colored frames + local function SetClassColFrames() + -- Player frame + if LeaPlusLC["ClassColPlayer"] == "On" then + PlayFN:Show() + else + PlayFN:Hide() + end + -- Target and focus frames + if LeaPlusLC["ClassColTarget"] == "On" then + ColTar:RegisterEvent("GROUP_ROSTER_UPDATE") + ColTar:RegisterEvent("PLAYER_TARGET_CHANGED") + ColTar:RegisterEvent("PLAYER_FOCUS_CHANGED") + ColTar:RegisterEvent("UNIT_FACTION") + TargetFrameCol() + else + ColTar:UnregisterAllEvents() + TargetFrame_CheckFaction(TargetFrame) -- Reset target frame colors + TargetFrame_CheckFaction(FocusFrame) -- Reset focus frame colors + end + end + + -- Run function when options are clicked and on startup + LeaPlusCB["ClassColPlayer"]:HookScript("OnClick", SetClassColFrames) + LeaPlusCB["ClassColTarget"]:HookScript("OnClick", SetClassColFrames) + SetClassColFrames() + + -- Reset button handler + ClassFrame.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["ClassColPlayer"] = "On" + LeaPlusLC["ClassColTarget"] = "On" + + -- Update colors and refresh configuration panel + SetClassColFrames() + ClassFrame:Hide(); ClassFrame:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["ClassColFramesBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ClassColPlayer"] = "On" + LeaPlusLC["ClassColTarget"] = "On" + SetClassColFrames() + else + ClassFrame:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Quest text size + ---------------------------------------------------------------------- + + if LeaPlusLC["QuestFontChange"] == "On" and not LeaLockList["QuestFontChange"] then + + -- Set gossip frame scroll box layout (fix for game patch 3.4.1) + GossipFrame.GreetingPanel.ScrollBox:SetHeight(320) + GossipFrame.GreetingPanel.ScrollBar:ClearAllPoints() + GossipFrame.GreetingPanel.ScrollBar:SetPoint("TOPLEFT", GossipFrame.GreetingPanel.ScrollBox, "TOPRIGHT", 4, 9) + GossipFrame.GreetingPanel.ScrollBar:SetPoint("BOTTOMLEFT", GossipFrame.GreetingPanel.ScrollBox, "BOTTOMRIGHT", 4, -14) + + -- Create configuration panel + local QuestTextPanel = LeaPlusLC:CreatePanel("Resize quest text", "QuestTextPanel") + + LeaPlusLC:MakeTx(QuestTextPanel, "Text size", 16, -72) + LeaPlusLC:MakeSL(QuestTextPanel, "LeaPlusQuestFontSize", "Drag to set the font size of quest text.", 10, 36, 1, 16, -92, "%.0f") + + -- Function to update the font size + local function QuestSizeUpdate() + local a, b, c = QuestFont:GetFont() + QuestTitleFont:SetFont(a, LeaPlusLC["LeaPlusQuestFontSize"] + 3, c) + QuestFont:SetFont(a, LeaPlusLC["LeaPlusQuestFontSize"] + 1, c) + local d, e, f = QuestFontNormalSmall:GetFont() + QuestFontNormalSmall:SetFont(d, LeaPlusLC["LeaPlusQuestFontSize"], f) + end + + -- Set text size when slider changes and on startup + LeaPlusCB["LeaPlusQuestFontSize"]:HookScript("OnValueChanged", QuestSizeUpdate) + QuestSizeUpdate() + + -- Help button hidden + QuestTextPanel.h:Hide() + + -- Back button handler + QuestTextPanel.b:SetScript("OnClick", function() + QuestTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show() + return + end) + + -- Reset button handler + QuestTextPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["LeaPlusQuestFontSize"] = 12 + QuestSizeUpdate() + + -- Refresh side panel + QuestTextPanel:Hide(); QuestTextPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["QuestTextBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["LeaPlusQuestFontSize"] = 18 + QuestSizeUpdate() + else + QuestTextPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Resize mail text + ---------------------------------------------------------------------- + + if LeaPlusLC["MailFontChange"] == "On" then + + -- Create configuration panel + local MailTextPanel = LeaPlusLC:CreatePanel("Resize mail text", "MailTextPanel") + + LeaPlusLC:MakeTx(MailTextPanel, "Text size", 16, -72) + LeaPlusLC:MakeSL(MailTextPanel, "LeaPlusMailFontSize", "Drag to set the font size of mail text.", 10, 36, 1, 16, -92, "%.0f") + + -- Function to set the text size + local function MailSizeUpdate() + local MailFont, void, flags = QuestFont:GetFont() + OpenMailBodyText:SetFont("h1", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + OpenMailBodyText:SetFont("h2", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + OpenMailBodyText:SetFont("h3", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + OpenMailBodyText:SetFont("p", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) + MailEditBox:GetEditBox():SetFont(MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags) -- in DF, this is replaced with SendMailBodyEditBox + end + + -- Set text size after changing slider and on startup + LeaPlusCB["LeaPlusMailFontSize"]:HookScript("OnValueChanged", MailSizeUpdate) + MailSizeUpdate() + + -- Help button hidden + MailTextPanel.h:Hide() + + -- Back button handler + MailTextPanel.b:SetScript("OnClick", function() + MailTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show() + return + end) + + -- Reset button handler + MailTextPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["LeaPlusMailFontSize"] = 15 + + -- Refresh side panel + MailTextPanel:Hide(); MailTextPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["MailTextBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["LeaPlusMailFontSize"] = 22 + MailSizeUpdate() + else + MailTextPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Resize book text + ---------------------------------------------------------------------- + + if LeaPlusLC["BookFontChange"] == "On" then + + -- Create configuration panel + local BookTextPanel = LeaPlusLC:CreatePanel("Resize book text", "BookTextPanel") + + LeaPlusLC:MakeTx(BookTextPanel, "Text size", 16, -72) + LeaPlusLC:MakeSL(BookTextPanel, "LeaPlusBookFontSize", "Drag to set the font size of book text.", 10, 36, 1, 16, -92, "%.0f") + + -- Function to set the text size + local function BookSizeUpdate() + local BookFont, void, flags = QuestFont:GetFont() + ItemTextFontNormal:SetFont(BookFont, LeaPlusLC["LeaPlusBookFontSize"], flags) + end + + -- Set text size after changing slider and on startup + LeaPlusCB["LeaPlusBookFontSize"]:HookScript("OnValueChanged", BookSizeUpdate) + BookSizeUpdate() + + -- Help button hidden + BookTextPanel.h:Hide() + + -- Back button handler + BookTextPanel.b:SetScript("OnClick", function() + BookTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show() + return + end) + + -- Reset button handler + BookTextPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["LeaPlusBookFontSize"] = 15 + + -- Refresh side panel + BookTextPanel:Hide(); BookTextPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["BookTextBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["LeaPlusBookFontSize"] = 22 + BookSizeUpdate() + else + BookTextPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Show durability status + ---------------------------------------------------------------------- + + if LeaPlusLC["DurabilityStatus"] == "On" then + + -- Create durability button + local cButton = CreateFrame("BUTTON", nil, PaperDollFrame) + cButton:ClearAllPoints() + cButton:SetPoint("BOTTOMRIGHT", CharacterFrame, "BOTTOMRIGHT", -40, 80) + cButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up") + cButton:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight") + cButton:SetSize(32, 32) + + -- Create durability tables + local Slots = {"HeadSlot", "ShoulderSlot", "ChestSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "MainHandSlot", "SecondaryHandSlot", "RangedSlot"} + local SlotsFriendly = {INVTYPE_HEAD, INVTYPE_SHOULDER, INVTYPE_CHEST, INVTYPE_WRIST, INVTYPE_HAND, INVTYPE_WAIST, INVTYPE_LEGS, INVTYPE_FEET, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, INVTYPE_RANGED} + + -- Show durability status in tooltip or status line (tip or status) + local function ShowDuraStats(where) + + local duravaltotal, duramaxtotal, durapercent = 0, 0, 0 + local valcol, id, duraval, duramax + + if where == "tip" then + -- Creare layout + GameTooltip:AddLine("|cffffffff") + GameTooltip:AddLine("|cffffffff") + GameTooltip:AddLine("|cffffffff") + _G["GameTooltipTextLeft1"]:SetText("|cffffffff"); _G["GameTooltipTextRight1"]:SetText("|cffffffff") + _G["GameTooltipTextLeft2"]:SetText("|cffffffff"); _G["GameTooltipTextRight2"]:SetText("|cffffffff") + _G["GameTooltipTextLeft3"]:SetText("|cffffffff"); _G["GameTooltipTextRight3"]:SetText("|cffffffff") + end + + local validItems = false + + -- Traverse equipment slots + for k, slotName in ipairs(Slots) do + if GetInventorySlotInfo(slotName) then + id = GetInventorySlotInfo(slotName) + duraval, duramax = GetInventoryItemDurability(id) + if duraval ~= nil then + + -- At least one item has durability stat + validItems = true + + -- Add to tooltip + if where == "tip" then + durapercent = tonumber(format("%.0f", duraval / duramax * 100)) + valcol = (durapercent >= 80 and "|cff00FF00") or (durapercent >= 60 and "|cff99FF00") or (durapercent >= 40 and "|cffFFFF00") or (durapercent >= 20 and "|cffFF9900") or (durapercent >= 0 and "|cffFF2000") or ("|cffFFFFFF") + _G["GameTooltipTextLeft1"]:SetText(L["Durability"]) + _G["GameTooltipTextLeft2"]:SetText(_G["GameTooltipTextLeft2"]:GetText() .. SlotsFriendly[k] .. "|n") + _G["GameTooltipTextRight2"]:SetText(_G["GameTooltipTextRight2"]:GetText() .. valcol .. durapercent .. "%" .. "|n") + end + + duravaltotal = duravaltotal + duraval + duramaxtotal = duramaxtotal + duramax + end + end + end + if duravaltotal > 0 and duramaxtotal > 0 then + durapercent = duravaltotal / duramaxtotal * 100 + else + durapercent = 0 + end + + if where == "tip" then + + if validItems == true then + -- Show overall durability in the tooltip + if durapercent >= 80 then valcol = "|cff00FF00" elseif durapercent >= 60 then valcol = "|cff99FF00" elseif durapercent >= 40 then valcol = "|cffFFFF00" elseif durapercent >= 20 then valcol = "|cffFF9900" elseif durapercent >= 0 then valcol = "|cffFF2000" else return end + _G["GameTooltipTextLeft3"]:SetText(L["Overall"] .. " " .. valcol) + _G["GameTooltipTextRight3"]:SetText(valcol .. string.format("%.0f", durapercent) .. "%") + + -- Show lines of the tooltip + GameTooltipTextLeft1:Show(); GameTooltipTextRight1:Show() + GameTooltipTextLeft2:Show(); GameTooltipTextRight2:Show() + GameTooltipTextLeft3:Show(); GameTooltipTextRight3:Show() + GameTooltipTextRight2:SetJustifyH"RIGHT"; + GameTooltipTextRight3:SetJustifyH"RIGHT"; + GameTooltip:Show() + else + -- No items have durability stat + GameTooltip:ClearLines() + GameTooltip:AddLine("" .. L["Durability"],1.0, 0.85, 0.0) + GameTooltip:AddLine("" .. L["No items with durability equipped."], 1, 1, 1) + GameTooltip:Show() + end + + elseif where == "status" then + if validItems == true then + -- Show simple status line instead + if tonumber(durapercent) >= 0 then -- Ensure character has some durability items equipped + LeaPlusLC:Print(L["You have"] .. " " .. string.format("%.0f", durapercent) .. "%" .. " " .. L["durability"] .. ".") + end + end + + end + end + + -- Hover over the durability button to show the durability tooltip + cButton:SetScript("OnEnter", function() + GameTooltip:SetOwner(cButton, "ANCHOR_RIGHT"); + ShowDuraStats("tip"); + end) + cButton:SetScript("OnLeave", GameTooltip_Hide) + + -- Create frame to watch events + local DeathDura = CreateFrame("FRAME") + DeathDura:RegisterEvent("PLAYER_DEAD") + DeathDura:SetScript("OnEvent", function(self, event) + ShowDuraStats("status") + DeathDura:UnregisterEvent("PLAYER_DEAD") + LibCompat.After(2, function() + DeathDura:RegisterEvent("PLAYER_DEAD") + end) + end) + + hooksecurefunc("AcceptResurrect", function() + -- Player has ressed without releasing + ShowDuraStats("status") + end) + + end + + ---------------------------------------------------------------------- + -- Hide zone text + ---------------------------------------------------------------------- + + if LeaPlusLC["HideZoneText"] == "On" then + ZoneTextFrame:SetScript("OnShow", ZoneTextFrame.Hide); + SubZoneTextFrame:SetScript("OnShow", SubZoneTextFrame.Hide); + end + + ---------------------------------------------------------------------- + -- Disable sticky chat + ---------------------------------------------------------------------- + + if LeaPlusLC["NoStickyChat"] == "On" and not LeaLockList["NoStickyChat"] then + -- These taint if set to anything other than nil + ChatTypeInfo.WHISPER.sticky = nil + ChatTypeInfo.BN_WHISPER.sticky = nil + ChatTypeInfo.CHANNEL.sticky = nil + end + + ---------------------------------------------------------------------- + -- Hide stance bar + ---------------------------------------------------------------------- + + if LeaPlusLC["NoClassBar"] == "On" and not LeaLockList["NoClassBar"] then + local stancebar = CreateFrame("FRAME", nil, UIParent) + stancebar:Hide() + StanceBarFrame:UnregisterAllEvents() + StanceBarFrame:SetParent(stancebar) + end + + ---------------------------------------------------------------------- + -- Hide gryphons + ---------------------------------------------------------------------- + + if LeaPlusLC["NoGryphons"] == "On" and not LeaLockList["NoGryphons"] then + MainMenuBarLeftEndCap:Hide(); + MainMenuBarRightEndCap:Hide(); + end + + ---------------------------------------------------------------------- + -- Disable chat fade + ---------------------------------------------------------------------- + + if LeaPlusLC["NoChatFade"] == "On" and not LeaLockList["NoChatFade"] then + -- Process normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i]:SetFading(false) + end + end + -- Process temporary frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf]:SetFading(false) + end + end) + end + + ---------------------------------------------------------------------- + -- Use easy chat frame resizing + ---------------------------------------------------------------------- + + if LeaPlusLC["UseEasyChatResizing"] == "On" and not LeaLockList["UseEasyChatResizing"] then + ChatFrame1Tab:HookScript("OnMouseDown", function(self,arg1) + if arg1 == "LeftButton" then + if select(8, GetChatWindowInfo(1)) then + ChatFrame1:StartSizing("TOP") + end + end + end) + ChatFrame1Tab:SetScript("OnMouseUp", function(self,arg1) + if arg1 == "LeftButton" then + ChatFrame1:StopMovingOrSizing() + FCF_SavePositionAndDimensions(ChatFrame1) + end + end) + end + + ---------------------------------------------------------------------- + -- Increase chat history + ---------------------------------------------------------------------- + + if LeaPlusLC["MaxChatHstory"] == "On" and not LeaLockList["MaxChatHstory"] then + -- Process normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] and _G["ChatFrame" .. i]:GetMaxLines() ~= 4096 then + _G["ChatFrame" .. i]:SetMaxLines(4096); + end + end + -- Process temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + if (_G[cf]:GetMaxLines() ~= 4096) then + _G[cf]:SetMaxLines(4096); + end + end + end) + end + + ---------------------------------------------------------------------- + -- Hide error messages + ---------------------------------------------------------------------- + + if LeaPlusLC["HideErrorMessages"] == "On" then + + -- Error message events + local OrigErrHandler = UIErrorsFrame:GetScript('OnEvent') + UIErrorsFrame:SetScript('OnEvent', function (self, event, id, err, ...) + if event == "UI_ERROR_MESSAGE" then + -- Hide error messages + if LeaPlusLC["ShowErrorsFlag"] == 1 then + if err == ERR_INV_FULL or + err == ERR_QUEST_LOG_FULL or + err == ERR_RAID_GROUP_ONLY or + err == ERR_PET_SPELL_DEAD or + err == ERR_PLAYER_DEAD or + err == ERR_FEIGN_DEATH_RESISTED or + err == SPELL_FAILED_TARGET_NO_POCKETS or + err == ERR_ALREADY_PICKPOCKETED then + return OrigErrHandler(self, event, id, err, ...) + end + else + return OrigErrHandler(self, event, id, err, ...) + end + elseif event == 'UI_INFO_MESSAGE' then + -- Show information messages + return OrigErrHandler(self, event, id, err, ...) + end + end) + + end + + -- Release memory + LeaPlusLC.Isolated = nil + + end + +---------------------------------------------------------------------- +-- L40: Player +---------------------------------------------------------------------- + + function LeaPlusLC:Player() + + ---------------------------------------------------------------------- + -- Mute custom sounds (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local MuteCustomPanel = LeaPlusLC:CreatePanel("Mute custom sounds", "MuteCustomPanel") + + local titleTX = LeaPlusLC:MakeTx(MuteCustomPanel, "Editor", 16, -72) + titleTX:SetWidth(534) + titleTX:SetWordWrap(false) + titleTX:SetJustifyH("LEFT") + + -- Show help button for title + LeaPlusLC:CreateHelpButton("MuteGameSoundsCustomHelpButton", MuteCustomPanel, titleTX, "Enter sound file IDs separated by comma then click the Mute button.|n|nIf you wish, you can enter a brief note for each file ID but do not include numbers in your notes.|n|nFor example, you can enter 'DevAura 569679, RetAura 568744' to mute the Devotion Aura and Retribution Aura spells.|n|nUse Leatrix Sounds to find, test and play sound file IDs.") + + -- Add large editbox + local eb = CreateFrame("Frame", nil, MuteCustomPanel) + eb:SetSize(548, 180) + eb:SetPoint("TOPLEFT", 10, -92) + eb:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight", + edgeSize = 16, + insets = { left = 8, right = 6, top = 8, bottom = 8 }, + }) + eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5) + + eb.scroll = CreateFrame("ScrollFrame", nil, eb) + eb.scroll:SetPoint("TOPLEFT", eb, 12, -10) + eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10) + + eb.Text = CreateFrame("EditBox", nil, eb) + eb.Text:SetMultiLine(true) + eb.Text:SetWidth(494) + eb.Text:SetHeight(230) + eb.Text:SetPoint("TOPLEFT", eb.scroll) + eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll) + eb.Text:SetMaxLetters(2000) + eb.Text:SetFontObject(GameFontNormalLarge) + eb.Text:SetAutoFocus(false) + eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) + eb.scroll:SetScrollChild(eb.Text) + + -- Set focus on the editbox text when clicking the editbox + eb:SetScript("OnMouseDown", function() + eb.Text:SetFocus() + eb.Text:SetCursorPosition(eb.Text:GetMaxLetters()) + end) + + -- Function to save the custom sound list + local function SaveString(self, userInput) + local keytext = eb.Text:GetText() + if keytext and keytext ~= "" then + LeaPlusLC["MuteCustomList"] = strtrim(eb.Text:GetText()) + else + LeaPlusLC["MuteCustomList"] = "" + end + end + + -- Save the custom sound list when it changes and at startup + eb.Text:SetScript("OnTextChanged", SaveString) + eb.Text:SetText(LeaPlusLC["MuteCustomList"]) + SaveString() + + -- Help button hidden + MuteCustomPanel.h:Hide() + + -- Back button handler + MuteCustomPanel.b:SetScript("OnClick", function() + MuteCustomPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button hidden + MuteCustomPanel.r:Hide() + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["MuteCustomSoundsBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["MuteCustomList"] = "Devotion Aura 569679, Retribution Aura 568744" + eb.Text:SetText(LeaPlusLC["MuteCustomList"]) + else + MuteCustomPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to mute custom sound list + local function MuteCustomListFunc(unmute, userInput) + -- local mutedebug = true -- Debug + local counter = 0 + local muteString = LeaPlusLC["MuteCustomList"] + if muteString and muteString ~= "" then + muteString = muteString:gsub("%s", ",") + muteString = muteString:gsub("[\n]", ",") + muteString = muteString:gsub("[^,%d]", "") + if mutedebug then print(muteString) end + local tList = {strsplit(",", muteString)} + if mutedebug then ChatFrame1:Clear() end + for i = 1, #tList do + if tList[i] then + tList[i] = tonumber(tList[i]) + if tList[i] and tList[i] < 20000000 then + if mutedebug then print(tList[i]) end + if unmute then + UnmuteSoundFile(tList[i]) + else + MuteSoundFile(tList[i]) + end + counter = counter + 1 + end + end + end + if userInput then + if unmute then + if counter == 1 then + LeaPlusLC:Print(L["Unmuted"] .. " " .. counter .. " " .. L["sound"] .. ".") + else + LeaPlusLC:Print(L["Unmuted"] .. " " .. counter .. " " .. L["sounds"] .. ".") + end + else + if counter == 1 then + LeaPlusLC:Print(L["Muted"] .. " " .. counter .. " " .. L["sound"] .. ".") + else + LeaPlusLC:Print(L["Muted"] .. " " .. counter .. " " .. L["sounds"] .. ".") + end + end + end + end + end + + -- Mute custom list on startup if option is enabled + if LeaPlusLC["MuteCustomSounds"] == "On" then + MuteCustomListFunc() + end + + -- Mute or unmute when option is clicked + LeaPlusCB["MuteCustomSounds"]:HookScript("OnClick", function() + if LeaPlusLC["MuteCustomSounds"] == "On" then + MuteCustomListFunc(false, false) + else + MuteCustomListFunc(true, false) + end + end) + + -- Add mute button + local MuteCustomNowButton = LeaPlusLC:CreateButton("MuteCustomNowButton", MuteCustomPanel, "Mute", "TOPLEFT", 16, -292, 0, 25, true, "Click to mute sounds in the list.") + LeaPlusCB["MuteCustomNowButton"]:SetScript("OnClick", function() MuteCustomListFunc(false, true) end) + + -- Add unmute button + local UnmuteCustomNowButton = LeaPlusLC:CreateButton("UnmuteCustomNowButton", MuteCustomPanel, "Unmute", "TOPLEFT", 16, -72, 0, 25, true, "Click to unmute sounds in the list.") + LeaPlusCB["UnmuteCustomNowButton"]:ClearAllPoints() + LeaPlusCB["UnmuteCustomNowButton"]:SetPoint("LEFT", MuteCustomNowButton, "RIGHT", 10, 0) + LeaPlusCB["UnmuteCustomNowButton"]:SetScript("OnClick", function() MuteCustomListFunc(true, true) end) + + -- Add play sound file editbox + local willPlay, musicHandle + local MuteCustomSoundsStopButton = LeaPlusLC:CreateButton("MuteCustomSoundsStopButton", MuteCustomPanel, "Stop", "TOPRIGHT", -18, -66, 0, 25, true, "") + MuteCustomSoundsStopButton:SetScript("OnClick", function() + if musicHandle then StopSound(musicHandle) end + end) + + local MuteCustomSoundsPlayButton = LeaPlusLC:CreateButton("MuteCustomSoundsPlayButton", MuteCustomPanel, "Play", "TOPRIGHT", -18, -66, 0, 25, true, "") + MuteCustomSoundsPlayButton:ClearAllPoints() + MuteCustomSoundsPlayButton:SetPoint("RIGHT", MuteCustomSoundsStopButton, "LEFT", -10, 0) + + local MuteCustomSoundsSoundBox = LeaPlusLC:CreateEditBox("MuteCustomSoundsSoundBox", eb, 80, 8, "TOPRIGHT", -10, 20, "PlaySoundBox", "PlaySoundBox") + MuteCustomSoundsSoundBox:SetNumeric(true) + MuteCustomSoundsSoundBox:ClearAllPoints() + MuteCustomSoundsSoundBox:SetPoint("RIGHT", MuteCustomSoundsPlayButton, "LEFT", -10, 0) + MuteCustomSoundsPlayButton:SetScript("OnClick", function() + MuteCustomSoundsSoundBox:GetText() + if musicHandle then StopSound(musicHandle) end + willPlay, musicHandle = PlaySoundFile(MuteCustomSoundsSoundBox:GetText(), "Master") + end) + + -- Add mousewheel support to the editbox + MuteCustomSoundsSoundBox:SetScript("OnMouseWheel", function(self, delta) + local endSound = tonumber(MuteCustomSoundsSoundBox:GetText()) + if endSound then + if delta == 1 then endSound = endSound + 1 else endSound = endSound - 1 end + if endSound < 1 then endSound = 1 elseif endSound >= 10000000 then endSound = 10000000 end + MuteCustomSoundsSoundBox:SetText(endSound) + MuteCustomSoundsPlayButton:Click() + end + end) + + local titlePlayer = LeaPlusLC:MakeTx(MuteCustomPanel, "Player", 16, -72) + titlePlayer:ClearAllPoints() + titlePlayer:SetPoint("TOPLEFT", MuteCustomSoundsSoundBox, "TOPLEFT", -4, 16) + LeaPlusLC:CreateHelpButton("MuteGameSoundsCustomPlayHelpButton", MuteCustomPanel, titlePlayer, "If you want to listen to a sound file, enter the sound file ID into the editbox and click the play button.|n|nYou can scroll the mousewheel over the editbox to play neighbouring sound files.") + end + + ---------------------------------------------------------------------- + -- Manage vehicle + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageVehicle"] == "On" and not LeaLockList["ManageVehicle"] then + + -- Create and manage container for VehicleSeatIndicator + local vehicleHolder = CreateFrame("Frame", nil, UIParent) + vehicleHolder:SetPoint("TOP", UIParent, "TOP", 0, -15) + vehicleHolder:SetSize(128, 128) + + local vehicleContainer = _G.VehicleSeatIndicator + vehicleContainer:ClearAllPoints() + vehicleContainer:SetPoint('CENTER', vehicleHolder) + vehicleContainer:SetIgnoreParentScale(true) -- Needed to keep drag frame position when scaled + + hooksecurefunc(vehicleContainer, 'SetPoint', function(self, void, b) + if b and (b ~= vehicleHolder) then + -- Reset parent if it changes from vehicleHolder + self:ClearAllPoints() + self:SetPoint('TOPRIGHT', vehicleHolder) -- Has to be TOPRIGHT (drag frame while moving between subzones) + self:SetParent(vehicleHolder) + end + end) + + -- Allow vehicle frame to be moved + vehicleHolder:SetMovable(true) + vehicleHolder:SetUserPlaced(true) + vehicleHolder:SetDontSavePosition(true) + vehicleHolder:SetClampedToScreen(false) + + -- Set vehicle frame position at startup + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + vehicleHolder:SetScale(LeaPlusLC["VehicleScale"]) + VehicleSeatIndicator:SetScale(LeaPlusLC["VehicleScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("CENTER", vehicleHolder, "CENTER", 0, 1) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["VehicleScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + dragframe.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Vehicle"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + vehicleHolder:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame position + vehicleHolder:StopMovingOrSizing() + LeaPlusLC["VehicleA"], void, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"] = vehicleHolder:GetPoint() + vehicleHolder:SetMovable(true) + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 120, 128 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local VehiclePanel = LeaPlusLC:CreatePanel("Manage vehicle", "VehiclePanel") + + LeaPlusLC:MakeTx(VehiclePanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(VehiclePanel, "VehicleScale", "Drag to set the vehicle seat indicator frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["VehicleScale"]:HookScript("OnValueChanged", function() + vehicleHolder:SetScale(LeaPlusLC["VehicleScale"]) + VehicleSeatIndicator:SetScale(LeaPlusLC["VehicleScale"]) + dragframe:SetScale(LeaPlusLC["VehicleScale"]) + -- Show formatted slider value + LeaPlusCB["VehicleScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["VehicleScale"] * 100) + end) + + -- Hide frame alignment grid with panel + VehiclePanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local VehicleToggleGridButton = LeaPlusLC:CreateButton("VehicleToggleGridButton", VehiclePanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["VehicleToggleGridButton"]:ClearAllPoints() + LeaPlusCB["VehicleToggleGridButton"]:SetPoint("LEFT", VehiclePanel.h, "RIGHT", 10, 0) + LeaPlusCB["VehicleToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + VehiclePanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + VehiclePanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + VehiclePanel.b:SetScript("OnClick", function() + VehiclePanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + VehiclePanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["VehicleA"] = "TOPRIGHT" + LeaPlusLC["VehicleR"] = "TOPRIGHT" + LeaPlusLC["VehicleX"] = -100 + LeaPlusLC["VehicleY"] = -192 + LeaPlusLC["VehicleScale"] = 1 + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + + -- Refresh configuration panel + VehiclePanel:Hide(); VehiclePanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageVehicleButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["VehicleA"] = "TOPRIGHT" + LeaPlusLC["VehicleR"] = "TOPRIGHT" + LeaPlusLC["VehicleX"] = -100 + LeaPlusLC["VehicleY"] = -192 + LeaPlusLC["VehicleScale"] = 1 + vehicleHolder:ClearAllPoints() + vehicleHolder:SetPoint(LeaPlusLC["VehicleA"], UIParent, LeaPlusLC["VehicleR"], LeaPlusLC["VehicleX"], LeaPlusLC["VehicleY"]) + vehicleHolder:SetScale(LeaPlusLC["VehicleScale"]) + VehicleSeatIndicator:SetScale(LeaPlusLC["VehicleScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(128 * LeaPlusLC["gscale"]) + dragframe:SetHeight(128 * LeaPlusLC["gscale"]) + + -- Show configuration panel + VehiclePanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + VehiclePanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Block shared quests (no reload needed) + ---------------------------------------------------------------------- + + do + + local eFrame = CreateFrame("FRAME") + eFrame:SetScript("OnEvent", LeaPlusLC.CheckIfQuestIsSharedAndShouldBeDeclined) + + -- Function to set event + local function SetSharedQuestsFunc() + if LeaPlusLC["NoSharedQuests"] == "On" then + eFrame:RegisterEvent("QUEST_DETAIL") + else + eFrame:UnregisterEvent("QUEST_DETAIL") + end + end + + -- Set event when option is clicked and on startup + LeaPlusCB["NoSharedQuests"]:HookScript("OnClick", SetSharedQuestsFunc) + SetSharedQuestsFunc() + + end + + ---------------------------------------------------------------------- + -- Restore chat messages + ---------------------------------------------------------------------- + + if LeaPlusLC["RestoreChatMessages"] == "On" and not LeaLockList["RestoreChatMessages"] then + + local historyFrame = CreateFrame("FRAME") + historyFrame:RegisterEvent("PLAYER_LOGIN") + historyFrame:RegisterEvent("PLAYER_LOGOUT") + + local FCF_IsChatWindowIndexActive = FCF_IsChatWindowIndexActive + local GetMessageInfo = GetMessageInfo + local GetNumMessages = GetNumMessages + + -- Use function from Dragonflight + local function FCF_IsChatWindowIndexActive(chatWindowIndex) + local shown = select(7, FCF_GetChatWindowInfo(chatWindowIndex)) + if shown then + return true + end + local chatFrame = _G["ChatFrame" .. chatWindowIndex] + return (chatFrame and chatFrame.isDocked) + end + + -- Save chat messages on logout + historyFrame:SetScript("OnEvent", function(self, event) + if event == "PLAYER_LOGOUT" then + local name, realm = UnitFullName("player") + if not realm then realm = GetNormalizedRealmName() end + if name and realm then + LeaPlusDB["ChatHistoryName"] = name .. "-" .. realm + LeaPlusDB["ChatHistoryTime"] = GetServerTime() + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] then + if FCF_IsChatWindowIndexActive(i) then + LeaPlusDB["ChatHistory" .. i] = {} + local chtfrm = _G["ChatFrame" .. i] + local NumMsg = chtfrm:GetNumMessages() + local StartMsg = 1 + if NumMsg > 128 then StartMsg = NumMsg - 127 end + for iMsg = StartMsg, NumMsg do + local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg) + if chatMessage then + if r and g and b then + local colorCode = RGBToColorCode(r, g, b) + chatMessage = colorCode .. chatMessage + end + tinsert(LeaPlusDB["ChatHistory" .. i], chatMessage) + end + end + end + end + end + end + end + end) + + -- Restore chat messages on login + local name, realm = UnitFullName("player") + if not realm then realm = GetNormalizedRealmName() end + if name and realm then + if LeaPlusDB["ChatHistoryName"] and LeaPlusDB["ChatHistoryTime"] then + local timeDiff = GetServerTime() - LeaPlusDB["ChatHistoryTime"] + if LeaPlusDB["ChatHistoryName"] == name .. "-" .. realm and timeDiff and timeDiff < 10 then -- reload must be done within 15 seconds + + -- Store chat messages from current session and clear chat + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] and FCF_IsChatWindowIndexActive(i) then + LeaPlusDB["ChatTemp" .. i] = {} + local chtfrm = _G["ChatFrame" .. i] + local NumMsg = chtfrm:GetNumMessages() + for iMsg = 1, NumMsg do + local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg) + if chatMessage then + if r and g and b then + local colorCode = RGBToColorCode(r, g, b) + chatMessage = colorCode .. chatMessage + end + tinsert(LeaPlusDB["ChatTemp" .. i], chatMessage) + end + end + chtfrm:Clear() + end + end + + -- Restore chat messages from previous session + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatHistory" .. i] and FCF_IsChatWindowIndexActive(i) then + LeaPlusDB["ChatHistory" .. i .. "Count"] = 0 + -- Add previous session messages to chat + for k = 1, #LeaPlusDB["ChatHistory" .. i] do + if LeaPlusDB["ChatHistory" .. i][k] ~= string.match(LeaPlusDB["ChatHistory" .. i][k], "|cffffd800" .. L["Restored"] .. " " .. ".*" .. " " .. L["message"] .. ".*.|r") then + _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatHistory" .. i][k]) + LeaPlusDB["ChatHistory" .. i .. "Count"] = LeaPlusDB["ChatHistory" .. i .. "Count"] + 1 + end + end + -- Show how many messages were restored + if LeaPlusDB["ChatHistory" .. i .. "Count"] == 1 then + _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["message from previous session"] .. ".|r") + else + _G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["messages from previous session"] .. ".|r") + end + else + -- No messages to restore + LeaPlusDB["ChatHistory" .. i] = nil + end + end + + -- Restore chat messages from this session + for i = 1, 50 do + if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatTemp" .. i] and FCF_IsChatWindowIndexActive(i) then + for k = 1, #LeaPlusDB["ChatTemp" .. i] do + _G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatTemp" .. i][k]) + end + end + end + + end + end + end + + else + + -- Option is disabled so clear any messages from saved variables + LeaPlusDB["ChatHistoryName"] = nil + LeaPlusDB["ChatHistoryTime"] = nil + for i = 1, 50 do + LeaPlusDB["ChatHistory" .. i] = nil + LeaPlusDB["ChatTemp" .. i] = nil + LeaPlusDB["ChatHistory" .. i .. "Count"] = nil + end + + end + + ---------------------------------------------------------------------- + -- Enhance minimap + ---------------------------------------------------------------------- + + if LeaPlusLC["MinimapModder"] == "On" and not LeaLockList["MinimapModder"] then + + local miniFrame = CreateFrame("FRAME") + local LibDBIconStub = LibStub("LibDBIcon-1.0") + + -- Function to set button radius + local function SetButtonRad() + if LeaPlusLC["SquareMinimap"] == "On" then + LibDBIconStub:SetButtonRadius(26 + ((LeaPlusLC["MinimapSize"] - 140) * 0.165)) + else + LibDBIconStub:SetButtonRadius(1) + end + end + + ---------------------------------------------------------------------- + -- Configuration panel + ---------------------------------------------------------------------- + + -- Create configuration panel + local SideMinimap = LeaPlusLC:CreatePanel("Enhance minimap", "SideMinimap") + + -- Hide panel during combat + SideMinimap:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + SideMinimap:Hide() + end + end) + + -- Add checkboxes + LeaPlusLC:MakeTx(SideMinimap, "Settings", 16, -72) + LeaPlusLC:MakeCB(SideMinimap, "HideMiniZoomBtns", "Hide the zoom buttons", 16, -92, false, "If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniZoneText", "Hide the zone text bar", 16, -112, false, "If checked, the zone text bar will be hidden.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniMapButton", "Hide the world map button", 16, -132, false, "If checked, the world map button will be hidden.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniTracking", "Hide the tracking button", 16, -152, true, "If checked, the tracking button will be hidden while the pointer is not over the minimap.") + LeaPlusLC:MakeCB(SideMinimap, "HideMiniAddonButtons", "Hide addon buttons", 16, -172, false, "If checked, addon buttons will be hidden while the pointer is not over the minimap.") + LeaPlusLC:MakeCB(SideMinimap, "CombineAddonButtons", "Combine addon buttons", 16, -192, true, "If checked, addon buttons will be combined into a single button frame which you can toggle by right-clicking the minimap.|n|nNote that enabling this option will lock out the 'Hide addon buttons' setting.") + LeaPlusLC:MakeCB(SideMinimap, "SquareMinimap", "Square minimap", 16, -212, true, "If checked, the minimap shape will be square.") + LeaPlusLC:MakeCB(SideMinimap, "ShowWhoPinged", "Show who pinged", 16, -232, false, "If checked, when someone pings the minimap, their name will be shown. This does not apply to your pings.") + + -- Add excluded button + local MiniExcludedButton = LeaPlusLC:CreateButton("MiniExcludedButton", SideMinimap, "Buttons", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the addon buttons editor.") + LeaPlusCB["MiniExcludedButton"]:ClearAllPoints() + LeaPlusCB["MiniExcludedButton"]:SetPoint("LEFT", SideMinimap.h, "RIGHT", 10, 0) + + -- Set exclude button visibility + local function SetExcludeButtonsFunc() + if LeaPlusLC["HideMiniAddonButtons"] == "On" or LeaPlusLC["CombineAddonButtons"] == "On" then + LeaPlusLC:LockItem(LeaPlusCB["MiniExcludedButton"], false) + else + LeaPlusLC:LockItem(LeaPlusCB["MiniExcludedButton"], true) + end + end + LeaPlusCB["HideMiniAddonButtons"]:HookScript("OnClick", SetExcludeButtonsFunc) + SetExcludeButtonsFunc() + + -- Add slider controls + LeaPlusLC:MakeTx(SideMinimap, "Scale", 356, -72) + LeaPlusLC:MakeSL(SideMinimap, "MinimapScale", "Drag to set the minimap scale.|n|nAdjusting this slider makes the minimap and all the elements bigger.", 1, 4, 0.1, 356, -92, "%.2f") + + LeaPlusLC:MakeTx(SideMinimap, "Square size", 356, -132) + LeaPlusLC:MakeSL(SideMinimap, "MinimapSize", "Drag to set the square minimap size.|n|nAdjusting this slider makes the minimap bigger but keeps the elements the same size.", 140, 560, 1, 356, -152, "%.0f") + + LeaPlusLC:MakeTx(SideMinimap, "Cluster scale", 356, -192) + LeaPlusLC:MakeSL(SideMinimap, "MiniClusterScale", "Drag to set the cluster scale.|n|nNote: Adjusting the cluster scale affects the entire cluster including frames attached to it such as the quest watch frame.|n|nIt will also cause the default UI right-side action bars to scale when you login. If you use the default UI right-side action bars, you may want to leave this at 100%.", 1, 2, 0.1, 356, -212, "%.2f") + + LeaPlusLC:MakeCB(SideMinimap, "MinimapNoScale", "Not minimap", 356, -242, false, "If checked, adjusting the cluster scale will not affect the minimap scale.") + + ---------------------------------------------------------------------- + -- Addon buttons editor + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local ExcludedButtonsPanel = LeaPlusLC:CreatePanel("Enhance minimap", "ExcludedButtonsPanel") + + local titleTX = LeaPlusLC:MakeTx(ExcludedButtonsPanel, "Buttons for the addons listed below will remain visible.", 16, -72) + titleTX:SetWidth(534) + titleTX:SetWordWrap(false) + titleTX:SetJustifyH("LEFT") + + -- Add second excluded button + local MiniExcludedButton2 = LeaPlusLC:CreateButton("MiniExcludedButton2", ExcludedButtonsPanel, "Buttons", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the addon buttons editor.") + LeaPlusCB["MiniExcludedButton2"]:ClearAllPoints() + LeaPlusCB["MiniExcludedButton2"]:SetPoint("LEFT", ExcludedButtonsPanel.h, "RIGHT", 10, 0) + LeaPlusCB["MiniExcludedButton2"]:SetScript("OnClick", function() + ExcludedButtonsPanel:Hide(); SideMinimap:Show() + return + end) + + -- Add large editbox + local eb = CreateFrame("Frame", nil, ExcludedButtonsPanel) + eb:SetSize(548, 180) + eb:SetPoint("TOPLEFT", 10, -92) + eb:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight", + edgeSize = 16, + insets = { left = 8, right = 6, top = 8, bottom = 8 }, + }) + eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5) + + eb.scroll = CreateFrame("ScrollFrame", nil, eb) + eb.scroll:SetPoint("TOPLEFT", eb, 12, -10) + eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10) + + eb.Text = CreateFrame("EditBox", nil, eb) + eb.Text:SetMultiLine(true) + eb.Text:SetWidth(494) + eb.Text:SetHeight(230) + eb.Text:SetPoint("TOPLEFT", eb.scroll) + eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll) + eb.Text:SetMaxLetters(1200) + eb.Text:SetFontObject(GameFontNormalLarge) + eb.Text:SetAutoFocus(false) + eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) + eb.scroll:SetScrollChild(eb.Text) + + -- Set focus on the editbox text when clicking the editbox + eb:SetScript("OnMouseDown", function() + eb.Text:SetFocus() + eb.Text:SetCursorPosition(eb.Text:GetMaxLetters()) + end) + + -- Debug + -- eb.Text:SetText("Leatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack") + + -- Function to save the excluded list + local function SaveString(self, userInput) + local keytext = eb.Text:GetText() + if keytext and keytext ~= "" then + LeaPlusLC["MiniExcludeList"] = strtrim(eb.Text:GetText()) + else + LeaPlusLC["MiniExcludeList"] = "" + end + if userInput then + LeaPlusLC:ReloadCheck() + end + end + + -- Save the excluded list when it changes and at startup + eb.Text:SetScript("OnTextChanged", SaveString) + eb.Text:SetText(LeaPlusLC["MiniExcludeList"]) + SaveString() + + -- Help button tooltip + ExcludedButtonsPanel.h.tiptext = L["If you use the 'Hide addon buttons' or 'Combine addon buttons' settings but you want some addon buttons to remain visible around the minimap, enter the addon names into the editbox separated by a comma.|n|nThe editbox tooltip shows the addon names that you can enter. The names must match exactly with the names shown in the editbox tooltip though case does not matter.|n|nChanges to the list will require a UI reload to take effect."] + + -- Back button handler + ExcludedButtonsPanel.b:SetScript("OnClick", function() + ExcludedButtonsPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + ExcludedButtonsPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["MiniExcludeList"] = "" + eb.Text:SetText(LeaPlusLC["MiniExcludeList"]) + + -- Refresh configuration panel + ExcludedButtonsPanel:Hide(); ExcludedButtonsPanel:Show() + LeaPlusLC:ReloadCheck() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["MiniExcludedButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["MiniExcludeList"] = "BugSack, Leatrix_Plus" + LeaPlusLC:ReloadCheck() + else + ExcludedButtonsPanel:Show() + LeaPlusGlobalPanel_SideMinimap:Hide() + end + end) + + -- Function to make tooltip string with list of addons + local function MakeAddonString() + local msg = "" + local numAddons = GetNumAddOns() + for i = 1, numAddons do + if IsAddOnLoaded(i) then + local name = GetAddOnInfo(i) + if name and _G["LibDBIcon10_" .. name] then -- Only list LibDBIcon buttons + msg = msg .. name .. ", " + end + end + end + if msg ~= "" then + msg = L["Supported Addons"] .. "|n|n" .. msg:sub(1, (strlen(msg) - 2)) .. "." + else + msg = L["No supported addons."] + end + eb.tiptext = msg + eb.Text.tiptext = msg + end + + -- Show the help button tooltip for the editbox too + eb:SetScript("OnEnter", MakeAddonString) + eb:HookScript("OnEnter", LeaPlusLC.TipSee) + eb:SetScript("OnLeave", GameTooltip_Hide) + eb.Text:SetScript("OnEnter", MakeAddonString) + eb.Text:HookScript("OnEnter", LeaPlusLC.ShowDropTip) + eb.Text:SetScript("OnLeave", GameTooltip_Hide) + + end + + ---------------------------------------------------------------------- + -- Show who pinged + ---------------------------------------------------------------------- + + do + + -- Create frame + local pFrame = CreateFrame("FRAME", nil, Minimap) + pFrame:SetSize(100, 20) + + -- Set position + if LeaPlusLC["SquareMinimap"] == "On" then + pFrame:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMRIGHT", 0, -3) + else + pFrame:SetPoint("BOTTOM", Minimap, "BOTTOM", 0, 2) + end + + -- Set backdrop + pFrame.bg = { + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + insets = {left = 4, top = 4, right = 4, bottom = 4}, + edgeSize = 16, + tile = true, + } + + pFrame:SetBackdrop(pFrame.bg) + pFrame:SetBackdropColor(0, 0, 0, 0.7) + pFrame:SetBackdropBorderColor(0, 0, 0, 0) + + -- Create fontstring + pFrame.f = pFrame:CreateFontString(nil, nil, "GameFontNormalSmall") + pFrame.f:SetAllPoints() + pFrame:Hide() + + -- Set variables + local pingTime + local lastUnit, lastX, lastY = "player", 0, 0 + + -- Show who pinged + pFrame:SetScript("OnEvent", function(void, void, unit, x, y) + + -- Do nothing if unit has not changed + if UnitIsUnit(unit, "player") or UnitIsUnit(unit, lastUnit) and x == lastX and y == lastY then return end + lastUnit, lastX, lastY = unit, x, y + + -- Show name in class color + local void, class = UnitClass(unit) + if class then + local color = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class] + if color then + + -- Set frame details + pFrame.f:SetFormattedText("|cff%02x%02x%02x%s|r", color.r * 255, color.g * 255, color.b * 255, UnitName(unit)) + pFrame:SetSize(pFrame.f:GetUnboundedStringWidth() + 12, 20) + + -- Hide frame after 5 seconds + pFrame:Show() + pingTime = GetTime() + LibCompat.After(5, function() + if GetTime() - pingTime >= 5 then + pFrame:Hide() + end + end) + + end + end + + end) + + -- Set event when option is clicked and on startup + local function SetPingFunc() + if LeaPlusLC["ShowWhoPinged"] == "On" then + pFrame:RegisterEvent("MINIMAP_PING") + else + pFrame:UnregisterEvent("MINIMAP_PING") + if pFrame:IsShown() then pFrame:Hide() end + end + end + + LeaPlusCB["ShowWhoPinged"]:HookScript("OnClick", SetPingFunc) + SetPingFunc() + + end + + ---------------------------------------------------------------------- + -- Minimap scale + ---------------------------------------------------------------------- + + -- Function to set the minimap cluster scale + local function SetClusterScale() + MinimapCluster:SetScale(LeaPlusLC["MiniClusterScale"]) + -- Set slider formatted text + LeaPlusCB["MiniClusterScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["MiniClusterScale"] * 100) + end + + -- Set minimap scale when slider is changed and on startup + LeaPlusCB["MiniClusterScale"]:HookScript("OnValueChanged", SetClusterScale) + SetClusterScale() + + ---------------------------------------------------------------------- + -- Minimap size + ---------------------------------------------------------------------- + + if LeaPlusLC["SquareMinimap"] == "On" then + + -- Function to set minimap size + local function SetMinimapSize() + -- Set minimap size + Minimap:SetSize(LeaPlusLC["MinimapSize"], LeaPlusLC["MinimapSize"]) + -- Refresh minimap + if Minimap:GetZoom() ~= 5 then + Minimap:SetZoom(Minimap:GetZoom() + 1) + Minimap:SetZoom(Minimap:GetZoom() - 1) + else + Minimap:SetZoom(Minimap:GetZoom() - 1) + Minimap:SetZoom(Minimap:GetZoom() + 1) + end + -- Refresh addon button radius + SetButtonRad() + -- Update slider text + LeaPlusCB["MinimapSize"].f:SetFormattedText("%.0f%%", (LeaPlusLC["MinimapSize"] / 140) * 100) + end + + -- Set minimap size when slider is changed and on startup + LeaPlusCB["MinimapSize"]:HookScript("OnValueChanged", SetMinimapSize) + SetMinimapSize() + + -- Assign file level scope (for reset and preset) + LeaPlusLC.SetMinimapSize = SetMinimapSize + + else + + -- Square minimap is disabled so lock the size slider + LeaPlusLC:LockItem(LeaPlusCB["MinimapSize"], true) + LeaPlusCB["MinimapSize"].tiptext = LeaPlusCB["MinimapSize"].tiptext .. "|cff00AAFF|n|n" .. L["This slider requires 'Square minimap' to be enabled."] .. "|r" + + end + + ---------------------------------------------------------------------- + -- Combine addon buttons + ---------------------------------------------------------------------- + + if LeaPlusLC["CombineAddonButtons"] == "On" then + + -- Lock out hide minimap buttons + LeaPlusLC:LockItem(LeaPlusCB["HideMiniAddonButtons"], true) + LeaPlusCB["HideMiniAddonButtons"].tiptext = LeaPlusCB["HideMiniAddonButtons"].tiptext .. "|n|n|cff00AAFF" .. L["Cannot be used with Combine addon buttons."] + + -- Create button frame (parenting to cluster ensures bFrame scales correctly) + local bFrame = CreateFrame("FRAME", nil, MinimapCluster) + bFrame:ClearAllPoints() + bFrame:SetPoint("TOPLEFT", Minimap, "TOPRIGHT", 4, 4) + bFrame:Hide() + bFrame:SetFrameLevel(8) + + LeaPlusLC.bFrame = bFrame -- Used in LibDBIcon callback + _G["LeaPlusGlobalMinimapCombinedButtonFrame"] = bFrame -- For third party addons + + -- Hide button frame automatically + local ButtonFrameTicker + bFrame:HookScript("OnShow", function() + if ButtonFrameTicker then ButtonFrameTicker:Cancel() end + ButtonFrameTicker = LibCompat.NewTicker(2, function() + if ItemRackMenuFrame and ItemRackMenuFrame:IsShown() and ItemRackMenuFrame:IsMouseOver() then return end + if not bFrame:IsMouseOver() and not Minimap:IsMouseOver() then + bFrame:Hide() + if ButtonFrameTicker then ButtonFrameTicker:Cancel() end + end + end, 15) + end) + + -- Match scale with minimap + if LeaPlusLC["SquareMinimap"] == "On" then + bFrame:SetScale(LeaPlusLC["MinimapScale"] * 0.75) + else + bFrame:SetScale(LeaPlusLC["MinimapScale"]) + end + LeaPlusCB["MinimapScale"]:HookScript("OnValueChanged", function() + if LeaPlusLC["SquareMinimap"] == "On" then + bFrame:SetScale(LeaPlusLC["MinimapScale"] * 0.75) + else + bFrame:SetScale(LeaPlusLC["MinimapScale"]) + end + end) + + -- Position LibDBIcon tooltips when shown + LibDBIconTooltip:HookScript("OnShow", function() + GameTooltip:Hide() + LibDBIconTooltip:ClearAllPoints() + if bFrame:GetPoint() == "BOTTOMLEFT" then + LibDBIconTooltip:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", 0, -6) + else + LibDBIconTooltip:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 0, -6) + end + end) + + -- Function to position GameTooltip below the minimap + local function SetButtonTooltip() + GameTooltip:ClearAllPoints() + if bFrame:GetPoint() == "BOTTOMLEFT" then + GameTooltip:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", 0, -6) + else + GameTooltip:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 0, -6) + end + end + + LeaPlusLC.SetButtonTooltip = SetButtonTooltip -- Used in LibDBIcon callback + + -- Hide existing LibDBIcon icons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + button:Hide() + button:SetScript("OnShow", function() if not bFrame:IsShown() then button:Hide() end end) + -- Create background texture + local bFrameBg = button:CreateTexture(nil, "BACKGROUND") + bFrameBg:SetTexture("Interface\\ChatFrame\\ChatFrameBackground") + bFrameBg:SetPoint("CENTER") + bFrameBg:SetSize(30, 30) + bFrameBg:SetVertexColor(0, 0, 0, 0.5) + elseif strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) and LeaPlusLC["SquareMinimap"] == "On" then + button:SetScale(0.75) + end + -- Move GameTooltip to below the minimap in case the button uses it + button:HookScript("OnEnter", SetButtonTooltip) + end + + -- Hide new LibDBIcon icons + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + + -- Toggle button frame + Minimap:SetScript("OnMouseUp", function(frame, button) + if button == "RightButton" then + if bFrame:IsShown() then + bFrame:Hide() + else bFrame:Show() + -- Position button frame + local side + local m = Minimap:GetCenter() + local b = Minimap:GetEffectiveScale() + local w = GetScreenWidth() + local s = UIParent:GetEffectiveScale() + bFrame:ClearAllPoints() + if m * b > (w * s / 2) then + side = "Right" + bFrame:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMLEFT", -10, -0) + else + side = "Left" + bFrame:SetPoint("BOTTOMLEFT", Minimap, "BOTTOMRIGHT", 10, 0) + end + -- Show button frame + local x, y, row, col = 0, 0, 0, 0 + local buttons = LibDBIconStub:GetButtonList() + -- Calculate buttons per row + local buttonsPerRow + local totalButtons = #buttons + if totalButtons > 36 then buttonsPerRow = 10 + elseif totalButtons > 32 then buttonsPerRow = 9 + elseif totalButtons > 28 then buttonsPerRow = 8 + elseif totalButtons > 24 then buttonsPerRow = 7 + elseif totalButtons > 20 then buttonsPerRow = 6 + elseif totalButtons > 16 then buttonsPerRow = 5 + elseif totalButtons > 12 then buttonsPerRow = 4 + elseif totalButtons > 8 then buttonsPerRow = 3 + elseif totalButtons > 4 then buttonsPerRow = 2 + else + buttonsPerRow = 1 + end + -- Build button grid + for i = 1, totalButtons do + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + if button.db then + if buttonName == "armory" then button.db.hide = false end -- Armory addon sets hidden to true + if not button.db.hide then + button:SetParent(bFrame) + button:ClearAllPoints() + if side == "Left" then + -- Minimap is on left side of screen + button:SetPoint("TOPLEFT", bFrame, "TOPLEFT", x, y) + col = col + 1; if col >= buttonsPerRow then col = 0; row = row + 1; x = 0; y = y - 30 else x = x + 30 end + else + -- Minimap is on right side of screen + button:SetPoint("TOPRIGHT", bFrame, "TOPRIGHT", x, y) + col = col + 1; if col >= buttonsPerRow then col = 0; row = row + 1; x = 0; y = y - 30 else x = x - 30 end + end + if totalButtons <= buttonsPerRow then + bFrame:SetWidth(totalButtons * 30) + else + bFrame:SetWidth(buttonsPerRow * 30) + end + local void, void, void, void, e = button:GetPoint() + bFrame:SetHeight(0 - e + 30) + LibDBIconStub:Show(buttons[i]) + end + end + end + end + end + else + Minimap_OnClick(frame, button) + end + end) + + end + + ---------------------------------------------------------------------- + -- Square minimap + ---------------------------------------------------------------------- + + if LeaPlusLC["SquareMinimap"] == "On" then + + -- Set minimap shape + _G.GetMinimapShape = function() return "SQUARE" end + + -- Create black border around map + local miniBorder = CreateFrame("Frame", nil, Minimap) + miniBorder:SetPoint("TOPLEFT", -3, 3) + miniBorder:SetPoint("BOTTOMRIGHT", 3, -3) + miniBorder:SetAlpha(0.8) + miniBorder:SetBackdrop({ + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Background-Dark", + edgeSize = 3, + }) + + -- Hide the default border + MinimapBorder:Hide() + + -- Mask texture + Minimap:SetMaskTexture('Interface\\ChatFrame\\ChatFrameBackground') + + -- Hide the North tag + hooksecurefunc(MinimapNorthTag, "Show", function() + MinimapNorthTag:Hide() + end) + + -- Tracking button + MiniMapTracking:SetScale(0.75) + miniFrame.ClearAllPoints(MiniMapTracking) + MiniMapTracking:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -20, -40) + + -- Mail button + MiniMapMailFrame:SetScale(0.75) + miniFrame.ClearAllPoints(MiniMapMailFrame) + MiniMapMailFrame:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -19, -75) + + -- Battleground queue button + MiniMapBattlefieldFrame:SetScale(0.75) + miniFrame.ClearAllPoints(MiniMapBattlefieldFrame) + MiniMapBattlefieldFrame:SetPoint("TOP", MiniMapMailFrame, "BOTTOM", 0, 0) + + -- Looking For Group button + MiniMapLFGFrame:SetScale(0.75) + MiniMapLFGFrame:ClearAllPoints() + MiniMapLFGFrame:SetPoint("TOP", MiniMapBattlefieldFrame, "BOTTOM", 0, 0) + + -- World map button + MiniMapWorldMapButton:SetScale(0.75) + MiniMapWorldMapButton:ClearAllPoints() + MiniMapWorldMapButton:SetPoint("BOTTOM", MinimapZoomIn, "TOP", 0, 0) + + -- Zoom in button + MinimapZoomIn:SetScale(0.75) + miniFrame.ClearAllPoints(MinimapZoomIn) + MinimapZoomIn:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT", 19, -120) + + -- Zoom out button + MinimapZoomOut:SetScale(0.75) + miniFrame.ClearAllPoints(MinimapZoomOut) + MinimapZoomOut:SetPoint("TOP", MinimapZoomIn, "BOTTOM", 0, 0) + + -- Calendar button + miniFrame.ClearAllPoints(GameTimeFrame) + GameTimeFrame:SetPoint("BOTTOM", MiniMapWorldMapButton, "TOP", 0, 2) + GameTimeFrame:SetParent(MinimapBackdrop) + GameTimeFrame:SetScale(0.75) + GameTimeFrame:SetSize(32, 32) + + -- Debug buttons + local LeaPlusMiniMapDebug = nil + if LeaPlusMiniMapDebug then + LibCompat.After(2, function() + MiniMapMailFrame:Show() + MiniMapBattlefieldFrame:Show() + MiniMapWorldMapButton:Show() + -- GameTimeFrame:Show() + MiniMapLFGFrame:Show() + end) + end + + -- Rescale addon buttons if combine addon buttons is disabled + if LeaPlusLC["CombineAddonButtons"] == "Off" then + -- Scale existing buttons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + button:SetScale(0.75) + end + -- Scale new buttons + -- LibDBIcon_IconCreated: Done in LiBDBIcon callback function + end + + -- Refresh buttons + LibCompat.After(0.1, SetButtonRad) + + else + + -- Square minimap is disabled so use round shape + _G.GetMinimapShape = function() return "ROUND" end + Minimap:SetMaskTexture([[Interface\CharacterFrame\TempPortraitAlphaMask]]) + + -- Calendar button + miniFrame.ClearAllPoints(GameTimeFrame) + GameTimeFrame:SetPoint("TOPRIGHT", MinimapBackdrop, "TOPRIGHT", -11, 4) + GameTimeFrame:SetParent(MinimapBackdrop) + + -- World map button + miniFrame.ClearAllPoints(MiniMapWorldMapButton) + LibDBIconStub:SetButtonToPosition(MiniMapWorldMapButton, 20) + + end + + ---------------------------------------------------------------------- + -- Replace non-standard buttons + ---------------------------------------------------------------------- + + -- Replace non-standard buttons for addons that don't use the standard LibDBIcon library + do + + -- Make custom LibDBIcon buttons for addons that don't use LibDBIcon + local CustomAddonTable = {} + LeaPlusDB["CustomAddonButtons"] = LeaPlusDB["CustomAddonButtons"] or {} + + -- Function to create a LibDBIcon button + local function CreateBadButton(name) + + -- Get non-standard button texture + local finalTex = "Interface\\HELPFRAME\\HelpIcon-KnowledgeBase" + + if _G[name .. "Icon"] then + if _G[name .. "Icon"]:GetObjectType() == "Texture" then + local gTex = _G[name .. "Icon"]:GetTexture() + if gTex then + finalTex = gTex + end + end + else + for i = 1, select('#', _G[name]:GetRegions()) do + local region = select(i, _G[name]:GetRegions()) + if region.GetTexture then + local x, y = region:GetSize() + if x and x < 30 then + finalTex = region:GetTexture() + end + end + end + end + + if not finalTex then finalTex = "Interface\\HELPFRAME\\HelpIcon-KnowledgeBase" end + + local zeroButton = LibStub("LibDataBroker-1.1"):NewDataObject("LeaPlusCustomIcon_" .. name, { + type = "data source", + text = name, + icon = finalTex, + OnClick = function(self, btn) + if _G[name] then + if string.find(name, "LibDBIcon") then + -- It's a fake LibDBIcon + local mouseUp = _G[name]:GetScript("OnMouseUp") + if mouseUp then + mouseUp(self, btn) + end + else + -- It's a genuine LibDBIcon + local clickUp = _G[name]:GetScript("OnClick") + if clickUp then + _G[name]:Click(btn) + end + end + end + end, + OnTooltipShow = function(tooltip) + if not tooltip or not tooltip.AddLine then return end + tooltip:AddLine(name) + tooltip:AddLine(L["This is a custom button."], 1, 1, 1) + tooltip:AddLine(L["Please ask the addon author to use LibDBIcon."], 1, 1, 1) + tooltip:AddLine(L["There is a helpful guide on leatrix.com."], 1, 1, 1) + end, + }) + LeaPlusDB["CustomAddonButtons"][name] = LeaPlusDB["CustomAddonButtons"][name] or {} + LeaPlusDB["CustomAddonButtons"][name].hide = false + CustomAddonTable[name] = name + local icon = LibStub("LibDBIcon-1.0", true) + icon:Register("LeaPlusCustomIcon_" .. name, zeroButton, LeaPlusDB["CustomAddonButtons"][name]) + + end + + -- Function to loop through minimap children to find custom addon buttons + local function MakeButtons() + local temp = {Minimap:GetChildren()} + for i = 1, #temp do + if temp[i] then + local btn = temp[i] + local name = btn:GetName() + local btype = btn:GetObjectType() + if name and btype == "Button" and not CustomAddonTable[name] and btn:GetNumRegions() >= 3 and not issecurevariable(name) and btn:IsShown() then + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), strlower("##" .. name)) then + if not string.find(name, "LibDBIcon") or name == "LibDBIcon10_MethodRaidTools" then + CreateBadButton(name) + btn:Hide() + btn:SetScript("OnShow", function() btn:Hide() end) + end + end + end + end + end + end + + -- Run the function a few times on startup + LibCompat.NewTicker(2, MakeButtons, 3) + LibCompat.After(0.1, MakeButtons) + + end + + ---------------------------------------------------------------------- + -- Hide addon buttons + ---------------------------------------------------------------------- + + if LeaPlusLC["CombineAddonButtons"] == "Off" then + + -- Function to set button state + local function SetHideButtons() + if LeaPlusLC["HideMiniAddonButtons"] == "On" then + -- Hide existing buttons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(buttons[i], true) + end + end + -- Hide new buttons + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + else + -- Show existing buttons + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local buttonName = strlower(buttons[i]) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(buttons[i], false) + end + end + -- Show new buttons + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + end + end + + -- Assign file level scope (it's used in reset and preset) + LeaPlusLC.SetHideButtons = SetHideButtons + + -- Set buttons when option is clicked and on startup + LeaPlusCB["HideMiniAddonButtons"]:HookScript("OnClick", SetHideButtons) + SetHideButtons() + + end + + ---------------------------------------------------------------------- + -- Hide the world map button + ---------------------------------------------------------------------- + + -- Function to set world map button + local function SetWorldMapButton() + if LeaPlusLC["HideMiniMapButton"] == "On" then + MiniMapWorldMapButton:Hide() + else + MiniMapWorldMapButton:Show() + end + end + + -- Set map button when option is clicked and on startup + LeaPlusCB["HideMiniMapButton"]:HookScript("OnClick", SetWorldMapButton) + SetWorldMapButton() + + -- Hide world map button when it's shown + hooksecurefunc(MiniMapWorldMapButton, "Show", function() + if LeaPlusLC["HideMiniMapButton"] == "On" then + MiniMapWorldMapButton:Hide() + end + end) + + ---------------------------------------------------------------------- + -- Unlock the minimap + ---------------------------------------------------------------------- + + -- Raise the frame in case it's hidden + Minimap:Raise() + + -- Enable minimap movement + Minimap:SetMovable(true) + Minimap:SetUserPlaced(true) + Minimap:SetDontSavePosition(true) + Minimap:SetClampedToScreen(true) + if LeaPlusLC["SquareMinimap"] == "On" then + Minimap:SetClampRectInsets(-3, 3, 3, -3) + else + Minimap:SetClampRectInsets(-2, 0, 2, -2) + end + MinimapBackdrop:ClearAllPoints() + MinimapBackdrop:SetPoint("TOP", Minimap, "TOP", -9, 2) + Minimap:RegisterForDrag("LeftButton") + + -- Set minimap position on startup + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + + -- Drag functions + Minimap:SetScript("OnDragStart", function(self, btn) + -- Start dragging if left clicked + if IsAltKeyDown() and btn == "LeftButton" then + Minimap:StartMoving() + end + end) + + Minimap:SetScript("OnDragStop", function(self, btn) + -- Save minimap position + Minimap:StopMovingOrSizing() + LeaPlusLC["MinimapA"], void, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"] = Minimap:GetPoint() + Minimap:SetMovable(true) + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + end) + + ---------------------------------------------------------------------- + -- Hide the zone text bar, time of day button and toggle button + ---------------------------------------------------------------------- + + -- Reparent MinimapCluster elements + MinimapBorderTop:SetParent(Minimap) + MinimapZoneTextButton:SetParent(MinimapBackdrop) + + -- Instance difficulty + miniFrame.SetParent(MiniMapInstanceDifficulty, Minimap) + miniFrame.ClearAllPoints(MiniMapInstanceDifficulty) + if LeaPlusLC["SquareMinimap"] == "On" then + MiniMapInstanceDifficulty:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -21, 10) + MiniMapInstanceDifficulty:SetScale(0.75) + else + MiniMapInstanceDifficulty:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -13, 5) + end + MiniMapInstanceDifficulty:SetFrameLevel(4) + + -- Anchor border top to MinimapBackdrop + MinimapBorderTop:ClearAllPoints() + MinimapBorderTop:SetPoint("TOP", MinimapBackdrop, "TOP", 0, 20) + + -- Refresh buttons + LibCompat.After(0.1, SetButtonRad) + + -- Function to set zone text bar + local function SetZoneTextBar() + if LeaPlusLC["HideMiniZoneText"] == "On" then + MinimapBorderTop:Hide() + MinimapZoneTextButton:Hide() + else + MinimapZoneTextButton:ClearAllPoints() + MinimapZoneTextButton:SetPoint("CENTER", MinimapBorderTop, "CENTER", -1, 3) + MinimapBorderTop:Show() + MinimapZoneTextButton:Show() + if LeaPlusDB["SquareMinimap"] == "On" then + MinimapBorderTop:Hide() + MinimapZoneTextButton:ClearAllPoints() + MinimapZoneTextButton:SetPoint("TOP", Minimap, "TOP", 0, 0) + MinimapZoneTextButton:SetFrameLevel(100) + end + end + end + + -- Set the zone text bar when option is clicked and on startup + LeaPlusCB["HideMiniZoneText"]:HookScript("OnClick", SetZoneTextBar) + SetZoneTextBar() + + ---------------------------------------------------------------------- + -- Hide the zoom buttons + ---------------------------------------------------------------------- + + -- Function to toggle the zoom buttons + local function ToggleZoomButtons() + if LeaPlusLC["HideMiniZoomBtns"] == "On" then + MinimapZoomIn:Hide() + MinimapZoomOut:Hide() + else + MinimapZoomIn:Show() + MinimapZoomOut:Show() + end + end + + -- Set the zoom buttons when the option is clicked and on startup + LeaPlusCB["HideMiniZoomBtns"]:HookScript("OnClick", ToggleZoomButtons) + ToggleZoomButtons() + + ---------------------------------------------------------------------- + -- Style and position the clock + ---------------------------------------------------------------------- + + -- Function to style and position the clock + local function SetMiniClock(firstRun) + if IsAddOnLoaded("Blizzard_TimeManager") then + if LeaPlusLC["SquareMinimap"] == "On" and firstRun == true then + local regions = {TimeManagerClockButton:GetRegions()} + regions[1]:Hide() + TimeManagerClockButton:ClearAllPoints() + TimeManagerClockButton:SetPoint("BOTTOMLEFT", Minimap, "BOTTOMLEFT", -15, -8) + TimeManagerClockButton:SetHitRectInsets(15, 10, 5, 8) + TimeManagerClockButton:SetFrameLevel(100) + local timeBG = TimeManagerClockButton:CreateTexture(nil, "BACKGROUND") + timeBG:SetTexture("Interface\\ChatFrame\\ChatFrameBackground") + timeBG:SetPoint("TOPLEFT", 15, -5) + timeBG:SetPoint("BOTTOMRIGHT", -10, 8) + timeBG:SetVertexColor(0, 0, 0, 0.6) + end + end + end + + -- Run function when Blizzard addon is loaded + if IsAddOnLoaded("Blizzard_TimeManager") then + SetMiniClock(true) + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_TimeManager" then + SetMiniClock(true) + waitFrame:UnregisterAllEvents() + end + end) + end + + ---------------------------------------------------------------------- + -- Enable mousewheel zoom + ---------------------------------------------------------------------- + + -- Function to control mousewheel zoom + local function MiniZoom(self, arg1) + if arg1 > 0 and self:GetZoom() < 5 then + -- Zoom in + MinimapZoomOut:Enable() + self:SetZoom(self:GetZoom() + 1) + if(Minimap:GetZoom() == (Minimap:GetZoomLevels() - 1)) then + MinimapZoomIn:Disable() + end + elseif arg1 < 0 and self:GetZoom() > 0 then + -- Zoom out + MinimapZoomIn:Enable() + self:SetZoom(self:GetZoom() - 1) + if(Minimap:GetZoom() == 0) then + MinimapZoomOut:Disable() + end + end + end + + -- Enable mousewheel zoom + Minimap:EnableMouseWheel(true) + Minimap:SetScript("OnMouseWheel", MiniZoom) + + ---------------------------------------------------------------------- + -- Minimap scale + ---------------------------------------------------------------------- + + -- Function to set the minimap scale and not minimap checkbox + local function SetMiniScale() + Minimap:SetScale(LeaPlusLC["MinimapScale"]) + -- Set slider formatted text + LeaPlusCB["MinimapScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["MinimapScale"] * 100) + -- Set Not minimap + if LeaPlusLC["MinimapNoScale"] == "On" then + Minimap:SetIgnoreParentScale(true) + else + Minimap:SetIgnoreParentScale(false) + end + end + + -- Set minimap scale when slider is changed and on startup + LeaPlusCB["MinimapScale"]:HookScript("OnValueChanged", SetMiniScale) + LeaPlusCB["MinimapNoScale"]:HookScript("OnClick", SetMiniScale) + SetMiniScale() + + ---------------------------------------------------------------------- + -- Buttons + ---------------------------------------------------------------------- + + -- Help button tooltip + SideMinimap.h.tiptext = L["To move the minimap, hold down the alt key and drag it.|n|nIf you toggle an addon minimap button, you may need to reload your UI for the change to take effect. This only affects a few addons that use custom buttons.|n|nThis panel will close automatically if you enter combat."] + + -- Back button handler + SideMinimap.b:SetScript("OnClick", function() + SideMinimap:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + SideMinimap.r.tiptext = SideMinimap.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."] + SideMinimap.r:HookScript("OnClick", function() + LeaPlusLC["HideMiniZoomBtns"] = "Off"; ToggleZoomButtons() + LeaPlusLC["HideMiniZoneText"] = "Off"; SetZoneTextBar() + LeaPlusLC["HideMiniAddonButtons"] = "On"; if LeaPlusLC.SetHideButtons then LeaPlusLC.SetHideButtons() end + LeaPlusLC["MinimapScale"] = 1 + LeaPlusLC["MinimapSize"] = 140; if LeaPlusLC.SetMinimapSize then LeaPlusLC:SetMinimapSize() end + LeaPlusLC["MiniClusterScale"] = 1; LeaPlusLC["MinimapNoScale"] = "Off"; SetClusterScale() + Minimap:SetScale(1) + SetMiniScale() + -- Reset map position + LeaPlusLC["MinimapA"], LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"] = "TOPRIGHT", "TOPRIGHT", -17, -22 + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + -- Hide world map button + LeaPlusLC["HideMiniMapButton"] = "On"; SetWorldMapButton() + -- Refresh panel + SideMinimap:Hide(); SideMinimap:Show() + end) + + -- Configuration button handler + LeaPlusCB["ModMinimapBtn"]:HookScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["HideMiniZoomBtns"] = "Off"; ToggleZoomButtons() + LeaPlusLC["HideMiniZoneText"] = "On"; SetZoneTextBar() + LeaPlusLC["HideMiniAddonButtons"] = "On"; if LeaPlusLC.SetHideButtons then LeaPlusLC.SetHideButtons() end + LeaPlusLC["MinimapScale"] = 1.40 + LeaPlusLC["MinimapSize"] = 180; if LeaPlusLC.SetMinimapSize then LeaPlusLC:SetMinimapSize() end + LeaPlusLC["MiniClusterScale"] = 1; LeaPlusLC["MinimapNoScale"] = "Off"; SetClusterScale() + Minimap:SetScale(1) + SetMiniScale() + -- Hide world map button + LeaPlusLC["HideMiniMapButton"] = "On"; SetWorldMapButton() + -- Map position + LeaPlusLC["MinimapA"], LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"] = "TOPRIGHT", "TOPRIGHT", 0, 0 + Minimap:SetMovable(true) + Minimap:ClearAllPoints() + Minimap:SetPoint(LeaPlusLC["MinimapA"], UIParent, LeaPlusLC["MinimapR"], LeaPlusLC["MinimapX"], LeaPlusLC["MinimapY"]) + LeaPlusLC:ReloadCheck() -- Special reload check + else + -- Show configuration panel + SideMinimap:Show() + LeaPlusLC:HideFrames() + end + end + end) + + -- Hide tracking button + if LeaPlusLC["HideMiniTracking"] == "On" then + + -- Hide tracking button initially + MiniMapTracking:SetAlpha(0) + MiniMapTracking:Hide() + + -- Create tracking button fade out animation + MiniMapTracking.fadeOut = MiniMapTracking:CreateAnimationGroup() + local animOut = MiniMapTracking.fadeOut:CreateAnimation("Alpha") + animOut:SetOrder(1) + animOut:SetDuration(0.2) + animOut:SetFromAlpha(1) + animOut:SetToAlpha(0) + animOut:SetStartDelay(1) + MiniMapTracking.fadeOut:SetToFinalAlpha(true) + + -- Show tracking button when entering minimap + Minimap:HookScript("OnEnter", function() + MiniMapTracking.fadeOut:Stop() + MiniMapTracking:SetAlpha(1) + end) + + -- Hide tracking button when leaving minimap if pointer is not over tracking button + Minimap:HookScript("OnLeave", function() + if not MouseIsOver(MiniMapTracking) then + MiniMapTracking.fadeOut:Play() + end + end) + + -- Hide tracking button when leaving tracking button + MiniMapTracking:HookScript("OnLeave", function() + MiniMapTracking.fadeOut:Play() + end) + + -- Hook existing LibDBIcon buttons to include tracking button + local buttons = LibDBIconStub:GetButtonList() + for i = 1, #buttons do + local button = LibDBIconStub:GetMinimapButton(buttons[i]) + if button then + button:HookScript("OnEnter", function() + MiniMapTracking.fadeOut:Stop() + MiniMapTracking:SetAlpha(1) + end) + button:HookScript("OnLeave", function() + MiniMapTracking.fadeOut:Play() + end) + end + end + + -- Hook new LibDBIcon buttons to include tracking button + -- LibDBIcon_IconCreated: Done in LibDBIcon callback function + + -- Show tracking button when button alpha is set to 1 + hooksecurefunc(MiniMapTracking, "SetAlpha", function(self, alphavalue) + if alphavalue and alphavalue == 1 then + MiniMapTracking:Show() + end + end) + + -- Hide tracking button when fadeout animation has finished + MiniMapTracking.fadeOut:HookScript("OnFinished", function() + MiniMapTracking:Hide() + end) + + end + + -- LibDBIcon callback (search LibDBIcon_IconCreated to find calls to this) + LibDBIconStub.RegisterCallback(miniFrame, "LibDBIcon_IconCreated", function(self, button, name) + + -- Combine addon buttons: Hide new LibDBIcon icons + if LeaPlusLC["CombineAddonButtons"] == "On" then + --LibCompat.After(0.1, function() -- Removed for now + local buttonName = strlower(name) + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + if button.db and not button.db.hide then + button:Hide() + button:SetScript("OnShow", function() if not LeaPlusLC.bFrame:IsShown() then button:Hide() end end) + end + -- Create background texture + local bFrameBg = button:CreateTexture(nil, "BACKGROUND") + bFrameBg:SetTexture("Interface\\ChatFrame\\ChatFrameBackground") + bFrameBg:SetPoint("CENTER") + bFrameBg:SetSize(30, 30) + bFrameBg:SetVertexColor(0, 0, 0, 0.5) + elseif strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) and LeaPlusLC["SquareMinimap"] == "On" then + button:SetScale(0.75) + end + -- Move GameTooltip to below the minimap in case the button uses it + button:HookScript("OnEnter", LeaPlusLC.SetButtonTooltip) + --end) + end + + -- Square minimap: Set scale of new LibDBIcon icons + if LeaPlusLC["SquareMinimap"] == "On" and LeaPlusLC["CombineAddonButtons"] == "Off" then + button:SetScale(0.75) + end + + -- Hide addon buttons: Hide new LibDBIcon icons + if LeaPlusLC["CombineAddonButtons"] == "Off" then + local buttonName = strlower(name) + if LeaPlusLC["HideMiniAddonButtons"] == "On" then + -- Hide addon buttons is enabled + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(name, true) + end + else + -- Hide addon buttons is disabled + if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then + LibDBIconStub:ShowOnEnter(name, false) + end + end + end + + -- Hide tracking button + if LeaPlusLC["HideMiniTracking"] == "On" then + button:HookScript("OnEnter", function() + -- Show tracking button when entering LibDBIcon button + MiniMapTracking.fadeOut:Stop() + MiniMapTracking:SetAlpha(1) + end) + button:HookScript("OnLeave", function() + -- Hide tracking button when leaving LibDBIcon button + MiniMapTracking.fadeOut:Play() + end) + end + + end) + + end + + ---------------------------------------------------------------------- + -- Manage durability + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageDurability"] == "On" and not LeaLockList["ManageDurability"] then + + -- Create and manage container for DurabilityFrame + local durabilityHolder = CreateFrame("Frame", nil, UIParent) + durabilityHolder:SetPoint("TOP", UIParent, "TOP", 0, -15) + durabilityHolder:SetSize(92, 75) + + local durabilityContainer = _G.DurabilityFrame + durabilityContainer:ClearAllPoints() + durabilityContainer:SetPoint('CENTER', durabilityHolder) + durabilityContainer:SetIgnoreParentScale(true) -- Needed to keep drag frame position when scaled + + hooksecurefunc(durabilityContainer, 'SetPoint', function(self, void, b) + if b and (b ~= durabilityHolder) then + -- Reset parent if it changes from durabilityHolder + self:ClearAllPoints() + self:SetPoint('TOPRIGHT', durabilityHolder) -- Has to be TOPRIGHT (drag frame while moving between subzones) + self:SetParent(durabilityHolder) + end + end) + + -- Allow durability frame to be moved + durabilityHolder:SetMovable(true) + durabilityHolder:SetUserPlaced(true) + durabilityHolder:SetDontSavePosition(true) + durabilityHolder:SetClampedToScreen(false) + + -- Set durability frame position at startup + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + durabilityHolder:SetScale(LeaPlusLC["DurabilityScale"]) + DurabilityFrame:SetScale(LeaPlusLC["DurabilityScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("CENTER", durabilityHolder, "CENTER", 0, 1) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["DurabilityScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + dragframe.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Durability"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + durabilityHolder:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame position + durabilityHolder:StopMovingOrSizing() + LeaPlusLC["DurabilityA"], void, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"] = durabilityHolder:GetPoint() + durabilityHolder:SetMovable(true) + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 65, 75 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local DurabilityPanel = LeaPlusLC:CreatePanel("Manage durability", "DurabilityPanel") + + LeaPlusLC:MakeTx(DurabilityPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(DurabilityPanel, "DurabilityScale", "Drag to set the durability frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["DurabilityScale"]:HookScript("OnValueChanged", function() + durabilityHolder:SetScale(LeaPlusLC["DurabilityScale"]) + DurabilityFrame:SetScale(LeaPlusLC["DurabilityScale"]) + dragframe:SetScale(LeaPlusLC["DurabilityScale"]) + -- Show formatted slider value + LeaPlusCB["DurabilityScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["DurabilityScale"] * 100) + end) + + -- Hide frame alignment grid with panel + DurabilityPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local DurabilityToggleGridButton = LeaPlusLC:CreateButton("DurabilityToggleGridButton", DurabilityPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["DurabilityToggleGridButton"]:ClearAllPoints() + LeaPlusCB["DurabilityToggleGridButton"]:SetPoint("LEFT", DurabilityPanel.h, "RIGHT", 10, 0) + LeaPlusCB["DurabilityToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + DurabilityPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + DurabilityPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + DurabilityPanel.b:SetScript("OnClick", function() + DurabilityPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + DurabilityPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["DurabilityA"] = "TOPRIGHT" + LeaPlusLC["DurabilityR"] = "TOPRIGHT" + LeaPlusLC["DurabilityX"] = 0 + LeaPlusLC["DurabilityY"] = -192 + LeaPlusLC["DurabilityScale"] = 1 + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + + -- Refresh configuration panel + DurabilityPanel:Hide(); DurabilityPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageDurabilityButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["DurabilityA"] = "TOPRIGHT" + LeaPlusLC["DurabilityR"] = "TOPRIGHT" + LeaPlusLC["DurabilityX"] = 0 + LeaPlusLC["DurabilityY"] = -192 + LeaPlusLC["DurabilityScale"] = 1 + durabilityHolder:ClearAllPoints() + durabilityHolder:SetPoint(LeaPlusLC["DurabilityA"], UIParent, LeaPlusLC["DurabilityR"], LeaPlusLC["DurabilityX"], LeaPlusLC["DurabilityY"]) + durabilityHolder:SetScale(LeaPlusLC["DurabilityScale"]) + DurabilityFrame:SetScale(LeaPlusLC["DurabilityScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(92 * LeaPlusLC["gscale"]) + dragframe:SetHeight(75 * LeaPlusLC["gscale"]) + + -- Show configuration panel + DurabilityPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + DurabilityPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Manage timer + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageTimer"] == "On" and not LeaLockList["ManageTimer"] then + + -- Allow timer frame to be moved + MirrorTimer1:SetMovable(true) + MirrorTimer1:SetUserPlaced(true) + MirrorTimer1:SetDontSavePosition(true) + MirrorTimer1:SetClampedToScreen(true) + + -- Set timer frame position at startup + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + MirrorTimer1:SetScale(LeaPlusLC["TimerScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("TOPRIGHT", MirrorTimer1, "TOPRIGHT", 0, 2.5) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0 }}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["TimerScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + dragframe.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Timer"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + MirrorTimer1:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + MirrorTimer1:StopMovingOrSizing() + LeaPlusLC["TimerA"], void, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"] = MirrorTimer1:GetPoint() + MirrorTimer1:SetMovable(true) + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 180, 20 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local TimerPanel = LeaPlusLC:CreatePanel("Manage timer", "TimerPanel") + + LeaPlusLC:MakeTx(TimerPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(TimerPanel, "TimerScale", "Drag to set the timer bar scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["TimerScale"]:HookScript("OnValueChanged", function() + MirrorTimer1:SetScale(LeaPlusLC["TimerScale"]) + dragframe:SetScale(LeaPlusLC["TimerScale"]) + -- Show formatted slider value + LeaPlusCB["TimerScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["TimerScale"] * 100) + end) + + -- Hide frame alignment grid with panel + TimerPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local TimerToggleGridButton = LeaPlusLC:CreateButton("TimerToggleGridButton", TimerPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["TimerToggleGridButton"]:ClearAllPoints() + LeaPlusCB["TimerToggleGridButton"]:SetPoint("LEFT", TimerPanel.h, "RIGHT", 10, 0) + LeaPlusCB["TimerToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + TimerPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + TimerPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + TimerPanel.b:SetScript("OnClick", function() + TimerPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + TimerPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["TimerA"] = "TOP" + LeaPlusLC["TimerR"] = "TOP" + LeaPlusLC["TimerX"] = -5 + LeaPlusLC["TimerY"] = -96 + LeaPlusLC["TimerScale"] = 1 + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + + -- Refresh configuration panel + TimerPanel:Hide(); TimerPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageTimerButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["TimerA"] = "TOP" + LeaPlusLC["TimerR"] = "TOP" + LeaPlusLC["TimerX"] = 0 + LeaPlusLC["TimerY"] = -120 + LeaPlusLC["TimerScale"] = 1 + MirrorTimer1:ClearAllPoints() + MirrorTimer1:SetPoint(LeaPlusLC["TimerA"], UIParent, LeaPlusLC["TimerR"], LeaPlusLC["TimerX"], LeaPlusLC["TimerY"]) + MirrorTimer1:SetScale(LeaPlusLC["TimerScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(206 * LeaPlusLC["gscale"]) + dragframe:SetHeight(20 * LeaPlusLC["gscale"]) + dragframe:SetFrameStrata("HIGH") -- MirrorTimer is medium + + -- Show configuration panel + TimerPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + TimerPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Hide alerts + ---------------------------------------------------------------------- + + if LeaPlusLC["NoAlerts"] == "On" then + + -- Unregister alert events + hooksecurefunc(AlertFrame, "RegisterEvent", function(self, event) + AlertFrame:UnregisterEvent(event) + end) + AlertFrame:UnregisterAllEvents() + + -- Show chat message and play sound for achievement alerts + local frame = CreateFrame("FRAME") + frame:RegisterEvent("ACHIEVEMENT_EARNED") + frame:SetScript("OnEvent", function(self, event, arg1) + if arg1 then + local alink = GetAchievementLink(arg1) + if alink then + LeaPlusLC:Print(string.format(NEW_ACHIEVEMENT_EARNED:gsub("'", ""), alink)) + PlaySoundFile(569143) + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Show ready timer + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowReadyTimer"] == "On" then + + -- Player vs Player + do + + -- Declare variables + local t, barTime = -1, -1 + + -- Create status bar below dungeon ready popup + local bar = CreateFrame("StatusBar", nil, PVPReadyDialog) + bar:SetPoint("TOPLEFT", PVPReadyDialog, "BOTTOMLEFT", 0, -5) + bar:SetPoint("TOPRIGHT", PVPReadyDialog, "BOTTOMRIGHT", 0, -5) + bar:SetHeight(5) + bar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar") + bar:SetStatusBarColor(1.0, 0.85, 0.0) + + -- Create status bar text + local text = bar:CreateFontString(nil, "ARTWORK") + text:SetFontObject("GameFontNormalLarge") + text:SetTextColor(1.0, 0.85, 0.0) + text:SetPoint("TOP", 0, -10) + + -- Update bar as timer counts down + bar:SetScript("OnUpdate", function(self, elapsed) + t = t - elapsed + if barTime >= 1 or barTime == -1 then + self:SetValue(t) + text:SetText(SecondsToTime(floor(t + 0.5))) + barTime = 0 + end + barTime = barTime + elapsed + end) + + -- Show frame when PvP ready frame shows + hooksecurefunc("PVPReadyDialog_Display", function(self, id) + t = GetBattlefieldPortExpiration(id) + 1 + -- t = 89; -- debug + if t and t > 1 then + bar:SetMinMaxValues(0, t) + barTime = -1 + bar:Show() + else + bar:Hide() + end + end) + + PVPReadyDialog:HookScript("OnHide", function() + bar:Hide() + end) + + -- Debug + -- LibCompat.After(2, function() PVPReadyDialog_Display(self, 1, "Warsong Gulch", 0, "BATTLEGROUND", "", "DAMAGER"); bar:Show() end) + + end + + end + + ---------------------------------------------------------------------- + -- Show flight times + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowFlightTimes"] == "On" then + + -- Load flight data + Leatrix_Plus["FlightData"] = {} + Leatrix_Plus:LoadFlightDataAlliance() + Leatrix_Plus:LoadFlightDataHorde() + + -- Minimum time difference (in seconds) to flight data entry before flight report window is shown + local timeBuffer = 15 + + -- Create editbox + local editFrame = CreateFrame("ScrollFrame", nil, UIParent, "InputScrollFrameTemplate") + + -- Set frame parameters + editFrame:ClearAllPoints() + editFrame:SetPoint("BOTTOM", 0, 130) + editFrame:SetSize(600, 200) + editFrame:SetFrameStrata("MEDIUM") + editFrame:SetToplevel(true) + editFrame:Hide() + editFrame.CharCount:Hide() + + -- Add background color + editFrame.t = editFrame:CreateTexture(nil, "BACKGROUND") + editFrame.t:SetAllPoints() + editFrame.t:SetVertexColor(0.00, 0.00, 0.0, 0.6) + + -- Set textures + editFrame.LeftTex:SetTexture(editFrame.RightTex:GetTexture()); editFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + editFrame.BottomTex:SetTexture(editFrame.TopTex:GetTexture()); editFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomRightTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + editFrame.TopLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Create title bar + local titleFrame = CreateFrame("ScrollFrame", nil, editFrame, "InputScrollFrameTemplate") + titleFrame:ClearAllPoints() + titleFrame:SetPoint("TOP", 0, 32) + titleFrame:SetSize(600, 24) + titleFrame:SetFrameStrata("MEDIUM") + titleFrame:SetToplevel(true) + titleFrame:SetHitRectInsets(-6, -6, -6, -6) + titleFrame.CharCount:Hide() + titleFrame.t = titleFrame:CreateTexture(nil, "BACKGROUND") + titleFrame.t:SetAllPoints() + titleFrame.t:SetVertexColor(0.00, 0.00, 0.0, 0.6) + titleFrame.LeftTex:SetTexture(titleFrame.RightTex:GetTexture()); titleFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + titleFrame.BottomTex:SetTexture(titleFrame.TopTex:GetTexture()); titleFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomRightTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + titleFrame.TopLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Add title + titleFrame.m = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.m:SetPoint("LEFT", 4, 0) + titleFrame.m:SetText(L["Leatrix Plus"]) + titleFrame.m:SetFont(titleFrame.m:GetFont(), 16, nil) + + -- Add right-click to close message + titleFrame.x = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.x:SetPoint("RIGHT", -4, 0) + titleFrame.x:SetText(L["Right-click to close"]) + titleFrame.x:SetFont(titleFrame.x:GetFont(), 16, nil) + titleFrame.x:SetWidth(600 - titleFrame.m:GetStringWidth() - 30) + titleFrame.x:SetWordWrap(false) + titleFrame.x:SetJustifyH("RIGHT") + + local titleBox = titleFrame.EditBox + titleBox:Hide() + titleBox:SetEnabled(false) + titleBox:SetMaxLetters(0) + + -- Create editbox + local editBox = editFrame.EditBox + editBox:SetAltArrowKeyMode(false) + editBox:SetTextInsets(4, 4, 4, 4) + editBox:SetWidth(editFrame:GetWidth() - 30) + editBox:SetSecurityDisablePaste() + editBox:SetFont(_G["ChatFrame1"]:GetFont()) + editBox:SetMaxLetters(0) + + local introMsg = L["Leatrix Plus needs to be updated with the flight details. Press CTRL/C to copy the flight details below then paste them into an email to flight@leatrix.com. When your report is received, Leatrix Plus will be updated and you will never see this window again for this flight."] .. "|n|n" + local startHighlight = string.len(introMsg) + + local function DoHighlight() + editBox:HighlightText(startHighlight) + end + + editBox:SetScript("OnEscapePressed", DoHighlight) + editBox:SetScript("OnEnterPressed", DoHighlight) + editBox:SetScript("OnMouseUp", DoHighlight) + editBox:HookScript("OnShow", function() + editBox:SetFocus(); DoHighlight() + end) + + -- Close frame with right-click of editframe or editbox + local function CloseRecentChatWindow(self, btn) + if btn and btn == "RightButton" then + editBox:SetText("") + editBox:ClearFocus() + editFrame:Hide() + end + end + + editFrame:SetScript("OnMouseDown", CloseRecentChatWindow) + editBox:SetScript("OnMouseDown", CloseRecentChatWindow) + titleFrame:HookScript("OnMouseDown", CloseRecentChatWindow) + + -- Disable text changes while still allowing editing controls to work + editBox:EnableKeyboard(false) + editBox:SetScript("OnKeyDown", function() end) + + -- Load LibCandyBar + Leatrix_Plus:LeaPlusCandyBar() + + -- Variables + local data = Leatrix_Plus["FlightData"] + local faction = UnitFactionGroup("player") + local candy = LibStub("LibCandyBar-3.0") + local texture = "Interface\\TargetingFrame\\UI-StatusBar" + local flightFrame = CreateFrame("FRAME") + LeaPlusLC.flightFrame = flightFrame + + -- Function to get continent + local function getContinent() + local mapID = C_Map.GetBestMapForUnit("player") + if(mapID) then + local info = C_Map.GetMapInfo(mapID) + if(info) then + while(info['mapType'] and info['mapType'] > 2) do + info = C_Map.GetMapInfo(info['parentMapID']) + end + if(info['mapType'] == 2) then + return info['mapID'] + end + end + end + end + + -- Function to get node name + local function GetNodeName(i) + return strmatch(TaxiNodeName(i), "[^,]+") + end + + -- Show progress bar when flight is taken + hooksecurefunc("TakeTaxiNode", function(node) + if UnitAffectingCombat("player") then return end + if editFrame:IsShown() then editFrame:Hide() end + for i = 1, NumTaxiNodes() do + local nodeType = TaxiNodeGetType(i) + local nodeName = GetNodeName(i) + if nodeType == "CURRENT" then + + -- Get current node + local continent = getContinent() + local startX, startY = TaxiNodePosition(i) + local currentNode = string.format("%0.2f", startX) .. ":" .. string.format("%0.2f", startY) + + -- Get flight duration and start the progress timer + local endX, endY = TaxiNodePosition(node) + local destination = string.format("%0.2f", endX) .. ":" .. string.format("%0.2f", endY) + local barName = GetNodeName(node) + + -- Assign file level scope to destination (it's used for removing bar name) + LeaPlusLC.FlightDestination = barName + + -- Build route string and debug string + local numHops = GetNumRoutes(node) + local debugString = '["' .. currentNode + local routeString = currentNode + for i = 2, numHops + 1 do + local hopPosX, hopPosY = TaxiNodePosition(TaxiGetNodeSlot(node, i, true)) + local hopPos = string.format("%0.2f", hopPosX) .. ":" .. string.format("%0.2f", hopPosY) + local fpName = string.split(", ", TaxiNodeName(TaxiGetNodeSlot(node, i, true))) + debugString = debugString .. ":" .. hopPos + routeString = routeString .. ":" .. hopPos + end + + -- If route string does not contain destination, add it to the end (such as Altar of Sha'tar) + if not string.find(routeString, destination) then + debugString = debugString .. ":" .. destination + routeString = routeString .. ":" .. destination + end + + debugString = debugString .. '"] = TimeTakenPlaceHolder,' + debugString = debugString .. " -- " .. nodeName + for i = 2, numHops + 1 do + local fpName = string.split(",", TaxiNodeName(TaxiGetNodeSlot(node, i, true))) + debugString = debugString .. ", " .. fpName + end + + -- If debug string does not contain destination, add it to the end + if not string.find(debugString, barName) then + debugString = debugString .. ", " .. barName + end + + -- Handle flight time not correct or flight does not exist in database + local timeStart = GetTime() + LibCompat.After(1, function() + if UnitOnTaxi("player") then + -- Player is on a taxi so register when taxi lands + flightFrame:RegisterEvent("PLAYER_CONTROL_GAINED") + else + -- Player is not on a taxi so delete the flight progress bar + flightFrame:UnregisterEvent("PLAYER_CONTROL_GAINED") + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end + end) + flightFrame:SetScript("OnEvent", function() + local timeEnd = GetTime() + local timeTaken = timeEnd - timeStart + debugString = gsub(debugString, "TimeTakenPlaceHolder", string.format("%0.0f", timeTaken)) + local flightMsg = L["Flight details"] .. " (" .. L["WRATH"].. "): " .. nodeName .. " (" .. currentNode .. ") " .. L["to"] .. " " .. barName .. " (" .. destination .. ") (" .. faction .. ") " .. L["took"] .. " " .. string.format("%0.0f", timeTaken) .. " " .. L["seconds"] .. " (" .. numHops .. " " .. L["hop"] ..").|n|n" .. debugString .. "|n|n" + if destination and data[faction] and data[faction][continent] and data[faction][continent][routeString] then + local savedDuration = data[faction][continent][routeString] + if savedDuration then + if timeTaken > (savedDuration + timeBuffer) or timeTaken < (savedDuration - timeBuffer) then + local editMsg = introMsg .. flightMsg .. L["This flight's actual time of"] .. " " .. string.format("%0.0f", timeTaken) .. " " .. L["seconds does not match the saved flight time of"] .. " " .. savedDuration .. " " .. L["seconds"] .. "." + editBox:SetText(editMsg); if LeaPlusLC["FlightBarContribute"] == "On" then editFrame:Show() end + end + else + local editMsg = introMsg .. flightMsg .. L["This flight does not have a saved duration in the database."] + editBox:SetText(editMsg); if LeaPlusLC["FlightBarContribute"] == "On" then editFrame:Show() end + end + else + local editMsg = introMsg .. flightMsg .. L["This flight does not exist in the database."] + editBox:SetText(editMsg); if LeaPlusLC["FlightBarContribute"] == "On" then editFrame:Show() end + end + flightFrame:UnregisterEvent("PLAYER_CONTROL_GAINED") + + -- Delete the progress bar since we have landed + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end) + + -- Show flight progress bar if flight exists in database + if data[faction] and data[faction][continent] and data[faction][continent][routeString] then + + local duration = data[faction][continent][routeString] + if duration then + + -- Delete an existing progress bar if one exists + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + + -- Create progress bar + local mybar = candy:New(texture, 230, 16) + mybar:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + mybar:SetScale(LeaPlusLC["FlightBarScale"]) + mybar:SetWidth(LeaPlusLC["FlightBarWidth"]) + + -- Setup sound files + local mt + local Seconds600, Seconds540, Seconds480, Seconds420, Seconds360 + local Seconds300, Seconds240, Seconds180, Seconds120, Seconds060 + local Seconds030, Seconds020, Seconds010 + + local destination = Enum.VoiceTtsDestination.LocalPlayback + local speed = -2 + + if LeaPlusLC["FlightBarSpeech"] == "On" then + LibCompat.After(1, function() + C_VoiceChat.SpeakText(0, L["Flight commenced."], destination, speed, GetCVar("Sound_MasterVolume") * 100) + end) + mybar:AddUpdateFunction(function(bar) + mt = bar.remaining + if mt > 600 and mt < 601 and not Seconds600 then Seconds600 = true; C_VoiceChat.SpeakText(0, L["Ten minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 540 and mt < 541 and not Seconds540 then Seconds540 = true; C_VoiceChat.SpeakText(0, L["Nine minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 480 and mt < 481 and not Seconds480 then Seconds480 = true; C_VoiceChat.SpeakText(0, L["Eight minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 420 and mt < 421 and not Seconds420 then Seconds420 = true; C_VoiceChat.SpeakText(0, L["Seven minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 360 and mt < 361 and not Seconds360 then Seconds360 = true; C_VoiceChat.SpeakText(0, L["Six minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 300 and mt < 301 and not Seconds300 then Seconds300 = true; C_VoiceChat.SpeakText(0, L["Five minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 240 and mt < 241 and not Seconds240 then Seconds240 = true; C_VoiceChat.SpeakText(0, L["Four minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 180 and mt < 181 and not Seconds180 then Seconds180 = true; C_VoiceChat.SpeakText(0, L["Three minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 120 and mt < 121 and not Seconds120 then Seconds120 = true; C_VoiceChat.SpeakText(0, L["Two minutes"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 060 and mt < 061 and not Seconds060 then Seconds060 = true; C_VoiceChat.SpeakText(0, L["One minute"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 030 and mt < 031 and not Seconds030 then Seconds030 = true; C_VoiceChat.SpeakText(0, L["Thirty seconds"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 020 and mt < 021 and not Seconds020 then Seconds020 = true; C_VoiceChat.SpeakText(0, L["Twenty seconds"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + elseif mt > 010 and mt < 011 and not Seconds010 then Seconds010 = true; C_VoiceChat.SpeakText(0, L["Ten seconds"], destination, speed, GetCVar("Sound_MasterVolume") * 100) + end + end) + end + + if faction == "Alliance" then + mybar:SetColor(0, 0.5, 1, 0.5) + else + mybar:SetColor(1, 0.0, 0, 0.5) + end + mybar:SetShadowColor(0, 0, 0, 0.5) + + mybar:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + mybar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end) + + -- Set bar label width + -- barName = "SupercalifragilisticexpialidociousDociousaliexpisticfragicalirupus" -- Debug + mybar.candyBarLabel:ClearAllPoints() + mybar.candyBarLabel:SetPoint("TOPLEFT", mybar.candyBarBackground, "TOPLEFT", 2, 0) + mybar.candyBarLabel:SetPoint("BOTTOMRIGHT", mybar.candyBarBackground, "BOTTOMRIGHT", -40, 0) + + -- Set flight bar background + if LeaPlusLC["FlightBarBackground"] == "On" then + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalFlightBar = mybar.candyBarBar + if faction == "Alliance" then + LeaPlusLC.ElvUI:GetModule("Skins"):HandleStatusBar(_G.LeaPlusGlobalFlightBar, {0, 0.5, 1, 0.5}) + else + LeaPlusLC.ElvUI:GetModule("Skins"):HandleStatusBar(_G.LeaPlusGlobalFlightBar, {1, 0.0, 0, 0.5}) + end + else + mybar:SetTexture(texture) + end + else + mybar:SetTexture("") + end + + -- Set flight bar destination + if LeaPlusLC["FlightBarDestination"] == "On" then + mybar:SetLabel(barName) + end + + -- Set flight bar fill mode + if LeaPlusLC["FlightBarFillBar"] == "On" then + mybar:SetFill(true) + else + mybar:SetFill(false) + end + + mybar:EnableMouse(false) + mybar:SetDuration(duration) + mybar:Start() + + -- Unlock close bar button + if LeaPlusCB["CloseFlightBarButton"] then + LeaPlusLC:LockItem(LeaPlusCB["CloseFlightBarButton"], false) + end + + -- Assign file level scope to the bar so it can be cancelled later + LeaPlusLC.FlightProgressBar = mybar + + end + + end + + end + end + end) + + -- Function to stop the progress bar + local function CeaseProgress() + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end + + -- Stop the progress bar under various circumstances + hooksecurefunc("TaxiRequestEarlyLanding", CeaseProgress) + hooksecurefunc("AcceptBattlefieldPort", CeaseProgress) + hooksecurefunc(C_SummonInfo, "ConfirmSummon", CeaseProgress) + + -- Show flight time in node tooltips + hooksecurefunc("TaxiNodeOnButtonEnter", function(button) + local index = button:GetID() + for i = 1, NumTaxiNodes() do + local nodeType = TaxiNodeGetType(i) + local nodeName = GetNodeName(i) + if nodeType == "CURRENT" then + + -- Get current node + local continent = getContinent() + local startX, startY = TaxiNodePosition(i) + local currentNode = string.format("%0.2f", startX) .. ":" .. string.format("%0.2f", startY) + + -- Get destination + local endX, endY = TaxiNodePosition(index) + local destination = string.format("%0.2f", endX) .. ":" .. string.format("%0.2f", endY) + local barName = GetNodeName(index) + + -- Build route string and debug string + local numEnterHops = GetNumRoutes(index) + local debugString = '["' .. currentNode + local routeString = currentNode + for i = 2, numEnterHops + 1 do + local hopPosX, hopPosY = TaxiNodePosition(TaxiGetNodeSlot(index, i, true)) -- TaxiNodeName + local hopPos = string.format("%0.2f", hopPosX) .. ":" .. string.format("%0.2f", hopPosY) + local fpName = string.split(", ", TaxiNodeName(TaxiGetNodeSlot(index, i, true))) + debugString = debugString .. ":" .. hopPos + routeString = routeString .. ":" .. hopPos + end + + -- If route string does not contain destination, add it to the end (such as Altar of Sha'tar) + if not string.find(routeString, destination) then + debugString = debugString .. ":" .. destination + routeString = routeString .. ":" .. destination + end + debugString = debugString .. '"] = ' + + -- Show flight time in tooltip if it exists + if data[faction] and data[faction][continent] and data[faction][continent][routeString] then + local duration = data[faction][continent][routeString] + if duration and type(duration) == "number" then + duration = date("%M:%S", duration):gsub("^0","") + GameTooltip:AddLine(L["Duration"] .. ": " .. duration, 0.9, 0.9, 0.9, true) + GameTooltip:Show() + end + elseif currentNode ~= destination then + GameTooltip:AddLine(L["Duration"] .. ": -:--", 0.9, 0.9, 0.9, true) + GameTooltip:Show() + end + + -- Add node names to debug string + debugString = debugString .. " -- " .. nodeName + for i = 2, numEnterHops + 1 do + local fpName = string.split(",", TaxiNodeName(TaxiGetNodeSlot(index, i, true))) + debugString = debugString .. ", " .. fpName + end + + -- If debug string does not contain destination, add it to the end + if not string.find(debugString, barName) then + debugString = debugString .. ", " .. barName + end + + -- Print debug string (used for showing full routes for nodes) + -- print(debugString) + + end + end + end) + + -- Unregister landing event for various reasons that stop taxi early + local function StopLandingEvent() + LeaPlusLC.flightFrame:UnregisterEvent("PLAYER_CONTROL_GAINED") + end + + hooksecurefunc("TaxiNodeOnButtonEnter", StopLandingEvent) + hooksecurefunc("TaxiRequestEarlyLanding", StopLandingEvent) + hooksecurefunc("AcceptBattlefieldPort", StopLandingEvent) + hooksecurefunc(C_SummonInfo, "ConfirmSummon", StopLandingEvent) + + ---------------------------------------------------------------------- + -- Drag frame + ---------------------------------------------------------------------- + + -- Create drag frame + local tempFrame = CreateFrame("FRAME", nil, UIParent) + tempFrame:SetWidth(230) + tempFrame:SetHeight(16) + tempFrame:SetScale(2) + tempFrame:ClearAllPoints() + tempFrame:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + tempFrame:Hide() + tempFrame:SetFrameStrata("FULLSCREEN_DIALOG") + tempFrame:SetFrameLevel(5000) + tempFrame:SetClampedToScreen(false) + + -- Create texture + tempFrame.t = tempFrame:CreateTexture(nil, "BORDER") + tempFrame.t:SetAllPoints() + tempFrame.t:SetTexture("Interface\\TargetingFrame\\UI-StatusBar") + tempFrame.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + + -- Enable movement + tempFrame:EnableMouse(true) + tempFrame:SetMovable(true) + tempFrame:SetScript("OnMouseDown", function() + tempFrame:StartMoving() + end) + tempFrame:SetScript("OnMouseUp", function() + tempFrame:StopMovingOrSizing() + LeaPlusLC["FlightBarA"], void, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"] = tempFrame:GetPoint() + -- Position actual flight progress bar if one exists + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:ClearAllPoints() + LeaPlusLC.FlightProgressBar:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + end + end) + + ---------------------------------------------------------------------- + -- Configuration panel + ---------------------------------------------------------------------- + + -- Create configuration panel + local FlightPanel = LeaPlusLC:CreatePanel("Show flight times", "FlightPanel") + + LeaPlusLC:MakeTx(FlightPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(FlightPanel, "FlightBarBackground", "Show background", 16, -92, false, "If checked, the flight progress bar background texture will be shown.") + LeaPlusLC:MakeCB(FlightPanel, "FlightBarDestination", "Show destination", 16, -112, false, "If checked, the flight progress bar destination will be shown.") + LeaPlusLC:MakeCB(FlightPanel, "FlightBarFillBar", "Fill instead of drain", 16, -132, false, "If checked, the flight progress bar background will fill instead of drain.") + LeaPlusLC:MakeCB(FlightPanel, "FlightBarSpeech", "Speak the remaining time", 16, -152, false, "If checked, the remaining flight time will be spoken using text to speech.|n|nChanges to this setting will take effect on the next flight you take.") + + LeaPlusLC:MakeTx(FlightPanel, "Contribute", 16, -192) + LeaPlusLC:MakeCB(FlightPanel, "FlightBarContribute", "Help contribute flight times", 16, -212, false, "If checked, you will be prompted to submit missing flight times.") + + LeaPlusLC:MakeTx(FlightPanel, "Scale", 356, -72) + LeaPlusLC:MakeSL(FlightPanel, "FlightBarScale", "Drag to set the flight progress bar scale.", 1, 5, 0.1, 356, -92, "%.2f") + + LeaPlusLC:MakeTx(FlightPanel, "Width", 356, -132) + LeaPlusLC:MakeSL(FlightPanel, "FlightBarWidth", "Drag to set the flight progress bar width.", 40, 460, 10, 356, -152, "%.0f") + + -- Add close bar button + local CloseFlightBarButton = LeaPlusLC:CreateButton("CloseFlightBarButton", FlightPanel, "Close Bar", "TOPLEFT", 16, -72, 0, 25, true, "Click to close the currently active flight progress bar.") + LeaPlusCB["CloseFlightBarButton"]:ClearAllPoints() + LeaPlusCB["CloseFlightBarButton"]:SetPoint("LEFT", FlightPanel.h, "RIGHT", 10, 0) + LeaPlusCB["CloseFlightBarButton"]:SetScript("OnClick", function() + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:Stop() + LeaPlusLC.FlightProgressBar = nil + end + end) + + -- Lock close bar button at startup and when flight progress bar stops + LeaPlusLC:LockItem(LeaPlusCB["CloseFlightBarButton"], true) + candy.RegisterCallback(LeaPlusLC, "LibCandyBar_Stop", function() + if LeaPlusCB["CloseFlightBarButton"] then + LeaPlusLC:LockItem(LeaPlusCB["CloseFlightBarButton"], true) + end + end) + + -- Set progress bar background + if LeaPlusLC.ElvUI then + + -- Progress bar background is always enabled and cannot be disabled with ElvUI + LeaPlusLC:LockItem(LeaPlusCB["FlightBarBackground"], true) + LeaPlusLC["FlightBarBackground"] = "On" + LeaPlusCB["FlightBarBackground"].tiptext = LeaPlusCB["FlightBarBackground"].tiptext .. "|n|n|cff00AAFF" .. L["The background is always shown with ElvUI."] + + else + + -- Set progress bar background + local function SetProgressBarBackground() + if LeaPlusLC.FlightProgressBar then + if LeaPlusLC["FlightBarBackground"] == "On" then + LeaPlusLC.FlightProgressBar:SetTexture(texture) + else + LeaPlusLC.FlightProgressBar:SetTexture("") + end + end + end + + -- Set progress bar background when option is clicked and on startup + LeaPlusCB["FlightBarBackground"]:HookScript("OnClick", SetProgressBarBackground) + SetProgressBarBackground() + + end + + -- Set progress bar fill mode + local function SetProgressBarFillMode() + if LeaPlusLC.FlightProgressBar then + if LeaPlusLC["FlightBarFillBar"] == "On" then + LeaPlusLC.FlightProgressBar:SetFill(true) + else + LeaPlusLC.FlightProgressBar:SetFill(false) + end + end + end + + -- Set progress bar fill mode when option is clicked and on startup + LeaPlusCB["FlightBarFillBar"]:HookScript("OnClick", SetProgressBarFillMode) + SetProgressBarFillMode() + + -- Set progress bar destination + local function SetProgressBarDestination() + if LeaPlusLC.FlightProgressBar then + if LeaPlusLC["FlightBarDestination"] == "On" then + if LeaPlusLC.FlightDestination then + LeaPlusLC.FlightProgressBar:SetLabel(LeaPlusLC.FlightDestination) + end + else + LeaPlusLC.FlightProgressBar:SetLabel("") + end + end + end + + -- Set flight bar destination when option is clicked and on startup + LeaPlusCB["FlightBarDestination"]:HookScript("OnClick", SetProgressBarDestination) + SetProgressBarDestination() + + -- Flight progress bar scale + local function SetFlightBarScale() + tempFrame:SetScale(LeaPlusLC["FlightBarScale"]) + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:SetScale(LeaPlusLC["FlightBarScale"]) + end + -- Set slider formatted text + LeaPlusCB["FlightBarScale"].f:SetFormattedText("%.0f%%", (LeaPlusLC["FlightBarScale"] / 2) * 100) + end + + -- Set flight bar scale when slider is changed and on startup + LeaPlusCB["FlightBarScale"]:HookScript("OnValueChanged", SetFlightBarScale) + SetFlightBarScale() + + -- Flight progress bar width + local function SetFlightBarWidth() + tempFrame:SetWidth(LeaPlusLC["FlightBarWidth"]) + if LeaPlusLC.FlightProgressBar then + LeaPlusLC.FlightProgressBar:SetWidth(LeaPlusLC["FlightBarWidth"]) + end + -- Set slider formatted text + LeaPlusCB["FlightBarWidth"].f:SetFormattedText("%.0f%%", (LeaPlusLC["FlightBarWidth"] / 230) * 100) + end + + -- Set flight bar width when slider is changed and on startup + LeaPlusCB["FlightBarWidth"]:HookScript("OnValueChanged", SetFlightBarWidth) + SetFlightBarWidth() + + -- Help button tooltip + FlightPanel.h.tiptext = L["Drag the frame overlay to position the frame."] + + -- Back button handler + FlightPanel.b:SetScript("OnClick", function() + FlightPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + FlightPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["FlightBarA"], LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"] = "TOP", "TOP", 0, -66 + tempFrame:ClearAllPoints() + tempFrame:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + -- Reset scale + LeaPlusLC["FlightBarScale"] = 2 + tempFrame:SetScale(LeaPlusLC["FlightBarScale"]) + -- Reset width + LeaPlusLC["FlightBarWidth"] = 230 + tempFrame:SetWidth(LeaPlusLC["FlightBarWidth"]) + -- Reset checkboxes + LeaPlusLC["FlightBarBackground"] = "On" + LeaPlusLC["FlightBarDestination"] = "On" + LeaPlusLC["FlightBarFillBar"] = "Off"; SetProgressBarFillMode() + LeaPlusLC["FlightBarSpeech"] = "Off" + LeaPlusLC["FlightBarContribute"] = "On" + -- Reset live progress bar + if LeaPlusLC.FlightProgressBar then + -- Reset position + LeaPlusLC.FlightProgressBar:ClearAllPoints() + LeaPlusLC.FlightProgressBar:SetPoint(LeaPlusLC["FlightBarA"], UIParent, LeaPlusLC["FlightBarR"], LeaPlusLC["FlightBarX"], LeaPlusLC["FlightBarY"]) + LeaPlusLC.FlightProgressBar:SetScale(LeaPlusLC["FlightBarScale"]) + -- Reset width + LeaPlusLC.FlightProgressBar:SetWidth(LeaPlusLC["FlightBarWidth"]) + -- Reset background + LeaPlusLC.FlightProgressBar:SetTexture(texture) + -- Reset destination + if LeaPlusLC.FlightDestination then + LeaPlusLC.FlightProgressBar:SetLabel(LeaPlusLC.FlightDestination) + end + end + + -- Refresh configuration panel + FlightPanel:Hide(); FlightPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["ShowFlightTimesBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["FlightBarContribute"] = "On" + else + FlightPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Toggle drag frame with configuration panel + FlightPanel:HookScript("OnShow", function() + tempFrame:Show() + end) + + FlightPanel:HookScript("OnHide", function() + tempFrame:Hide() + end) + + end + + ---------------------------------------------------------------------- + -- Filter chat messages + ---------------------------------------------------------------------- + + if LeaPlusLC["FilterChatMessages"] == "On" then + + -- Load LibChatAnims + Leatrix_Plus:LeaPlusLCA() + + -- Create configuration panel + local ChatFilterPanel = LeaPlusLC:CreatePanel("Filter chat messages", "ChatFilterPanel") + + LeaPlusLC:MakeTx(ChatFilterPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(ChatFilterPanel, "BlockSpellLinks", "Block spell links during combat", 16, -92, false, "If checked, messages containing spell links will be blocked while you are in combat.|n|nThis is useful for blocking spell interrupt spam.|n|nThis applies to the say, party, raid, emote and yell channels.") + LeaPlusLC:MakeCB(ChatFilterPanel, "BlockDrunkenSpam", "Block drunken spam", 16, -112, false, "If checked, drunken messages will be blocked unless they apply to your character.|n|nThis applies to the system channel.") + LeaPlusLC:MakeCB(ChatFilterPanel, "BlockDuelSpam", "Block duel spam", 16, -132, false, "If checked, duel victory and retreat messages will be blocked unless your character took part in the duel.|n|nThis applies to the system channel.") + + -- Lock block drunken spam option for zhTW + if GameLocale == "zhTW" then + LeaPlusLC:LockItem(LeaPlusCB["BlockDrunkenSpam"], true) + LeaPlusLC["BlockDrunkenSpam"] = "Off" + LeaPlusDB["BlockDrunkenSpam"] = "Off" + LeaPlusCB["BlockDrunkenSpam"].tiptext = LeaPlusCB["BlockDrunkenSpam"].tiptext .. "|n|n|cff00AAFF" .. L["Cannot use this with your locale."] + end + + -- Help button hidden + ChatFilterPanel.h:Hide() + + -- Back button handler + ChatFilterPanel.b:SetScript("OnClick", function() + ChatFilterPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page3"]:Show() + return + end) + + local charName = GetUnitName("player") + local charRealm = GetNormalizedRealmName() + local nameRealm = charName .. "%%-" .. charRealm + + -- Chat filter + local function ChatFilterFunc(self, event, msg) + -- Block duel spam + if LeaPlusLC["BlockDuelSpam"] == "On" then + -- Block duel messages unless you are part of the duel + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", "%.+")) or msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", "%.+")) then + -- Player has defeated player in a duel. + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", charName):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", nameRealm):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", charName)) then return false end + if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", nameRealm)) then return false end + -- Player has fled from player in a duel. + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", charName):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", nameRealm):gsub("%%2$s", "%.+")) then return false end + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", charName)) then return false end + if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", nameRealm)) then return false end + -- Block all duel messages not involving player + return true + end + end + -- Block spell links + if LeaPlusLC["BlockSpellLinks"] == "On" and UnitAffectingCombat("player") then + if msg:find("|Hspell") then return true end + end + -- Block drunken spam + if LeaPlusLC["BlockDrunkenSpam"] == "On" then + for i = 1, 4 do + local drunk1 = _G["DRUNK_MESSAGE_ITEM_OTHER"..i]:gsub("%%s", "%s-") + local drunk2 = _G["DRUNK_MESSAGE_OTHER"..i]:gsub("%%s", "%s-") + if msg:match(drunk1) or msg:match(drunk2) then + return true + end + end + end + end + + -- Enable or disable chat filter settings + local function SetChatFilter() + if LeaPlusLC["BlockSpellLinks"] == "On" then + ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY_LEADER", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID_LEADER", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_EMOTE", ChatFilterFunc) + ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL", ChatFilterFunc) + else + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SAY", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_PARTY", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_PARTY_LEADER", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_RAID", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_RAID_LEADER", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_EMOTE", ChatFilterFunc) + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_YELL", ChatFilterFunc) + end + if LeaPlusLC["BlockDrunkenSpam"] == "On" or LeaPlusLC["BlockDuelSpam"] == "On" then + ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", ChatFilterFunc) + else + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", ChatFilterFunc) + end + end + + -- Set chat filter when settings are clicked and on startup + LeaPlusCB["BlockSpellLinks"]:HookScript("OnClick", SetChatFilter) + LeaPlusCB["BlockDrunkenSpam"]:HookScript("OnClick", SetChatFilter) + LeaPlusCB["BlockDuelSpam"]:HookScript("OnClick", SetChatFilter) + SetChatFilter() + + -- Reset button handler + ChatFilterPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["BlockSpellLinks"] = "Off" + LeaPlusLC["BlockDrunkenSpam"] = "Off" + LeaPlusLC["BlockDuelSpam"] = "Off" + SetChatFilter() + + -- Refresh configuration panel + ChatFilterPanel:Hide(); ChatFilterPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["FilterChatMessagesBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["BlockSpellLinks"] = "On" + LeaPlusLC["BlockDrunkenSpam"] = "On" + LeaPlusLC["BlockDuelSpam"] = "On" + SetChatFilter() + else + ChatFilterPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Automatically accept resurrection requests (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local AcceptResPanel = LeaPlusLC:CreatePanel("Accept resurrection", "AcceptResPanel") + + LeaPlusLC:MakeTx(AcceptResPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(AcceptResPanel, "AutoResNoCombat", "Exclude combat resurrection", 16, -92, false, "If checked, resurrection requests will not be automatically accepted if the player resurrecting you is in combat.") + + -- Help button hidden + AcceptResPanel.h:Hide() + + -- Back button handler + AcceptResPanel.b:SetScript("OnClick", function() + AcceptResPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + AcceptResPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoResNoCombat"] = "On" + + -- Refresh panel + AcceptResPanel:Hide(); AcceptResPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoAcceptResBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoResNoCombat"] = "On" + else + AcceptResPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Function to set resurrect event + local function SetResEvent() + if LeaPlusLC["AutoAcceptRes"] == "On" then + AcceptResPanel:RegisterEvent("RESURRECT_REQUEST") + else + AcceptResPanel:UnregisterEvent("RESURRECT_REQUEST") + end + end + + -- Run function when option is clicked and on startup if option is enabled + LeaPlusCB["AutoAcceptRes"]:HookScript("OnClick", SetResEvent) + if LeaPlusLC["AutoAcceptRes"] == "On" then SetResEvent() end + + -- Function to not accept resurrection based on certain conditions + local function DoNotAcceptResurrect() + local mapID = C_Map.GetBestMapForUnit("player") or nil + if mapID and mapID == 162 then -- Naxxramas Construct Quarter + -- Check party or raid for debuffs + local group = IsInRaid() and "raid" or "party" + for i = 1, GetNumGroupMembers() do + local unit = group .. i + if unit and UnitExists(unit) then + for j = 1, 40 do + local void, void, void, void, void, void, void, void, void, spellID = UnitDebuff(unit, j) + if spellID then + if spellID == 28059 or spellID == 28084 then + -- Thaddius positive and negative charge debuffs + LeaPlusLC:Print("Resurrection not accepted. Someone in your group has a charge debuff.") + return true + end + end + end + end + end + end + end + + -- Handle event + AcceptResPanel:SetScript("OnEvent", function(self, event, arg1) + if event == "RESURRECT_REQUEST" then + + -- Exclude Chained Spirit (Zul'Gurub) + local chainLoc + + -- Exclude Chained Spirit (Zul'Gurub) + chainLoc = "Chained Spirit" + if GameLocale == "zhCN" then chainLoc = "被禁锢的灵魂" + elseif GameLocale == "zhTW" then chainLoc = "禁錮之魂" + elseif GameLocale == "ruRU" then chainLoc = "Скованный дух" + elseif GameLocale == "koKR" then chainLoc = "구속된 영혼" + elseif GameLocale == "esMX" then chainLoc = "Espíritu encadenado" + elseif GameLocale == "ptBR" then chainLoc = "Espírito Acorrentado" + elseif GameLocale == "deDE" then chainLoc = "Angeketteter Geist" + elseif GameLocale == "esES" then chainLoc = "Espíritu encadenado" + elseif GameLocale == "frFR" then chainLoc = "Esprit enchaîné" + elseif GameLocale == "itIT" then chainLoc = "Spirito Incatenato" + end + if arg1 == chainLoc then return end + + -- Resurrect + local resTimer = GetCorpseRecoveryDelay() + if resTimer and resTimer > 0 then + -- Resurrect has a delay so wait before resurrecting + LibCompat.After(resTimer + 1, function() + if not UnitAffectingCombat(arg1) or LeaPlusLC["AutoResNoCombat"] == "Off" then + if LeaPlusLC["AutoAcceptRes"] == "On" then + if not DoNotAcceptResurrect() then + AcceptResurrect() + StaticPopup_Hide("RESURRECT_NO_TIMER") + end + end + end + end) + else + -- Resurrect has no delay so resurrect now + if not UnitAffectingCombat(arg1) or LeaPlusLC["AutoResNoCombat"] == "Off" then + if not DoNotAcceptResurrect() then + AcceptResurrect() + StaticPopup_Hide("RESURRECT_NO_TIMER") + end + end + end + + return + + end + end) + + end + + ---------------------------------------------------------------------- + -- Hide keybind text + ---------------------------------------------------------------------- + + if LeaPlusLC["HideKeybindText"] == "On" and not LeaLockList["HideKeybindText"] then + + -- Hide keybind text + for i = 1, 12 do + _G["ActionButton"..i.."HotKey"]:SetAlpha(0) -- Main bar + _G["MultiBarBottomRightButton"..i.."HotKey"]:SetAlpha(0) -- Bottom right bar + _G["MultiBarBottomLeftButton"..i.."HotKey"]:SetAlpha(0) -- Bottom left bar + _G["MultiBarRightButton"..i.."HotKey"]:SetAlpha(0) -- Right bar + _G["MultiBarLeftButton"..i.."HotKey"]:SetAlpha(0) -- Left bar + end + + end + + ---------------------------------------------------------------------- + -- Hide macro text + ---------------------------------------------------------------------- + + if LeaPlusLC["HideMacroText"] == "On" and not LeaLockList["HideMacroText"] then + + -- Hide marco text + for i = 1, 12 do + _G["ActionButton"..i.."Name"]:SetAlpha(0) -- Main bar + _G["MultiBarBottomRightButton"..i.."Name"]:SetAlpha(0) -- Bottom right bar + _G["MultiBarBottomLeftButton"..i.."Name"]:SetAlpha(0) -- Bottom left bar + _G["MultiBarRightButton"..i.."Name"]:SetAlpha(0) -- Right bar + _G["MultiBarLeftButton"..i.."Name"]:SetAlpha(0) -- Left bar + end + + end + + ---------------------------------------------------------------------- + -- More font sizes + ---------------------------------------------------------------------- + + if LeaPlusLC["MoreFontSizes"] == "On" and not LeaLockList["MoreFontSizes"] then + RunScript('CHAT_FONT_HEIGHTS = {[1] = 10, [2] = 12, [3] = 14, [4] = 16, [5] = 18, [6] = 20, [7] = 22, [8] = 24, [9] = 26, [10] = 28}') + end + + ---------------------------------------------------------------------- + -- Show vanity controls (must be before Enhance dressup) + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowVanityControls"] == "On" then + + -- Create checkboxes + LeaPlusLC:MakeCB(PaperDollFrame, "ShowHelm", L["Helm"], 2, -192, false, "") + LeaPlusLC:MakeCB(PaperDollFrame, "ShowCloak", L["Cloak"], 281, -192, false, "") + LeaPlusCB["ShowHelm"]:SetFrameStrata("HIGH") + LeaPlusCB["ShowCloak"]:SetFrameStrata("HIGH") + + -- Function to set vanity controls layout + local function SetVanityControlsLayout() + + -- ElvUI_WrathArmory: Position helm and cloak checkboxes + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI:GetModule("ElvUI_WrathArmory", true) + if E then + LeaPlusCB["ShowHelm"].f:SetText(L["H"]) + LeaPlusCB["ShowHelm"].f:ClearAllPoints() + LeaPlusCB["ShowHelm"].f:SetPoint("RIGHT", LeaPlusCB["ShowHelm"], "LEFT", 4, 0) + LeaPlusCB["ShowHelm"]:ClearAllPoints() + LeaPlusCB["ShowHelm"]:SetPoint("BOTTOMLEFT", CharacterFrame, "BOTTOMLEFT", 80, 110) + LeaPlusCB["ShowHelm"]:SetHitRectInsets(-LeaPlusCB["ShowHelm"].f:GetStringWidth() + 4, 3, 0, 0) + LeaPlusCB["ShowCloak"].f:SetText(L["C"]) + LeaPlusCB["ShowCloak"].f:ClearAllPoints() + LeaPlusCB["ShowCloak"].f:SetPoint("RIGHT", LeaPlusCB["ShowCloak"], "LEFT", 4, 0) + LeaPlusCB["ShowCloak"]:ClearAllPoints() + LeaPlusCB["ShowCloak"]:SetPoint("LEFT", LeaPlusCB["ShowHelm"], "RIGHT", 4, 0) + LeaPlusCB["ShowCloak"]:SetHitRectInsets(-LeaPlusCB["ShowCloak"].f:GetStringWidth() + 4, 3, 0, 0) + return + end + end + + -- Position helm and cloak checkboxes + if LeaPlusLC["VanityAltLayout"] == "On" then + -- Alternative layout + LeaPlusCB["ShowHelm"].f:SetText(L["H"]) + LeaPlusCB["ShowHelm"]:ClearAllPoints() + LeaPlusCB["ShowHelm"]:SetPoint("TOPLEFT", 275, -224) + LeaPlusCB["ShowHelm"]:SetHitRectInsets(-LeaPlusCB["ShowHelm"].f:GetStringWidth() + 4, 3, 0, 0) + LeaPlusCB["ShowHelm"].f:ClearAllPoints() + LeaPlusCB["ShowHelm"].f:SetPoint("RIGHT", LeaPlusCB["ShowHelm"], "LEFT", 4, 0) + + LeaPlusCB["ShowCloak"].f:SetText(L["C"]) + LeaPlusCB["ShowCloak"]:ClearAllPoints() + LeaPlusCB["ShowCloak"]:SetPoint("TOP", LeaPlusCB["ShowHelm"], "BOTTOM", 0, 6) + LeaPlusCB["ShowCloak"].f:ClearAllPoints() + LeaPlusCB["ShowCloak"].f:SetPoint("RIGHT", LeaPlusCB["ShowCloak"], "LEFT", 4, 0) + LeaPlusCB["ShowCloak"]:SetHitRectInsets(-LeaPlusCB["ShowCloak"].f:GetStringWidth() + 4, 3, 0, 0) + else + -- Default layout + LeaPlusCB["ShowHelm"].f:SetText(L["Helm"]) + LeaPlusCB["ShowHelm"]:ClearAllPoints() + LeaPlusCB["ShowHelm"]:SetPoint("TOPLEFT", 65, -246) + LeaPlusCB["ShowHelm"]:SetHitRectInsets(3, -LeaPlusCB["ShowHelm"].f:GetStringWidth(), 0, 0) + LeaPlusCB["ShowHelm"].f:ClearAllPoints() + LeaPlusCB["ShowHelm"].f:SetPoint("LEFT", LeaPlusCB["ShowHelm"], "RIGHT", 0, 0) + + LeaPlusCB["ShowCloak"].f:SetText(L["Cloak"]) + LeaPlusCB["ShowCloak"]:ClearAllPoints() + LeaPlusCB["ShowCloak"]:SetPoint("TOPLEFT", 275, -246) + LeaPlusCB["ShowCloak"]:SetHitRectInsets(-LeaPlusCB["ShowCloak"].f:GetStringWidth(), 3, 0, 0) + LeaPlusCB["ShowCloak"].f:ClearAllPoints() + LeaPlusCB["ShowCloak"].f:SetPoint("RIGHT", LeaPlusCB["ShowCloak"], "LEFT", 0, 0) + end + end + + -- Set position when controls are shift/right-clicked + LeaPlusCB["ShowHelm"]:SetScript('OnMouseDown', function(self, btn) + if btn == "RightButton" and IsShiftKeyDown() then + if LeaPlusLC["VanityAltLayout"] == "On" then LeaPlusLC["VanityAltLayout"] = "Off" else LeaPlusLC["VanityAltLayout"] = "On" end + SetVanityControlsLayout() + end + end) + + LeaPlusCB["ShowCloak"]:SetScript('OnMouseDown', function(self, btn) + if btn == "RightButton" and IsShiftKeyDown() then + if LeaPlusLC["VanityAltLayout"] == "On" then LeaPlusLC["VanityAltLayout"] = "Off" else LeaPlusLC["VanityAltLayout"] = "On" end + SetVanityControlsLayout() + end + end) + + -- Set controls on startup + SetVanityControlsLayout() + + -- Manage alpha + LeaPlusCB["ShowHelm"]:SetAlpha(0.3) + LeaPlusCB["ShowCloak"]:SetAlpha(0.3) + LeaPlusCB["ShowHelm"]:HookScript("OnEnter", function() LeaPlusCB["ShowHelm"]:SetAlpha(1.0) end) + LeaPlusCB["ShowHelm"]:HookScript("OnLeave", function() LeaPlusCB["ShowHelm"]:SetAlpha(0.3) end) + LeaPlusCB["ShowCloak"]:HookScript("OnEnter", function() LeaPlusCB["ShowCloak"]:SetAlpha(1.0) end) + LeaPlusCB["ShowCloak"]:HookScript("OnLeave", function() LeaPlusCB["ShowCloak"]:SetAlpha(0.3) end) + + -- Toggle helm with click + LeaPlusCB["ShowHelm"]:HookScript("OnClick", function() + LeaPlusCB["ShowHelm"]:Disable() + LeaPlusCB["ShowHelm"]:SetAlpha(1.0) + LibCompat.After(0.5, function() + if ShowingHelm() then + ShowHelm(false) + else + ShowHelm(true) + end + LeaPlusCB["ShowHelm"]:Enable() + if not LeaPlusCB["ShowHelm"]:IsMouseOver() then + LeaPlusCB["ShowHelm"]:SetAlpha(0.3) + end + end) + end) + + -- Toggle cloak with click + LeaPlusCB["ShowCloak"]:HookScript("OnClick", function() + LeaPlusCB["ShowCloak"]:Disable() + LeaPlusCB["ShowCloak"]:SetAlpha(1.0) + LibCompat.After(0.5, function() + if ShowingCloak() then + ShowCloak(false) + else + ShowCloak(true) + end + LeaPlusCB["ShowCloak"]:Enable() + if not LeaPlusCB["ShowCloak"]:IsMouseOver() then + LeaPlusCB["ShowCloak"]:SetAlpha(0.3) + end + end) + end) + + -- Set checkbox state when checkboxes are shown + LeaPlusCB["ShowCloak"]:HookScript("OnShow", function() + if ShowingHelm() then + LeaPlusCB["ShowHelm"]:SetChecked(true) + else + LeaPlusCB["ShowHelm"]:SetChecked(false) + end + if ShowingCloak() then + LeaPlusCB["ShowCloak"]:SetChecked(true) + else + LeaPlusCB["ShowCloak"]:SetChecked(false) + end + end) + + end + + ---------------------------------------------------------------------- + -- Enhance dressup + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceDressup"] == "On" then + + -- Create configuration panel + local DressupPanel = LeaPlusLC:CreatePanel("Enhance dressup", "DressupPanel") + + LeaPlusLC:MakeTx(DressupPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(DressupPanel, "DressupItemButtons", "Show item buttons", 16, -92, false, "If checked, item buttons will be shown in the dressing room. You can click the item buttons to remove individual items from the model.") + LeaPlusLC:MakeCB(DressupPanel, "DressupAnimControl", "Show animation slider", 16, -112, false, "If checked, an animation slider will be shown in the dressing room.") + + -- Help button hidden + DressupPanel.h:Hide() + + -- Back button handler + DressupPanel.b:SetScript("OnClick", function() + DressupPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + DressupPanel.r:SetScript("OnClick", function() + + -- Refresh configuration panel + DressupPanel:Hide(); DressupPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["EnhanceDressupBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + else + DressupPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + ---------------------------------------------------------------------- + -- Item buttons + ---------------------------------------------------------------------- + + do + + local buttons = {} + local slotTable = {"HeadSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot", "TabardSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "MainHandSlot", "SecondaryHandSlot"} + local texTable = {"INV_Misc_Desecrated_ClothHelm", "INV_Misc_Desecrated_ClothShoulder", "INV_Misc_Cape_01", "INV_Misc_Desecrated_ClothChest", "INV_Shirt_01", "INV_Shirt_GuildTabard_01", "INV_Misc_Desecrated_ClothBracer", "INV_Misc_Desecrated_ClothGlove", "INV_Misc_Desecrated_ClothBelt", "INV_Misc_Desecrated_ClothPants", "INV_Misc_Desecrated_ClothBoots", "INV_Sword_01", "INV_Shield_01"} + + local function MakeSlotButton(number, slot, anchor, x, y) + + -- Create slot button + local slotBtn = CreateFrame("Button", nil, DressUpFrame) + slotBtn:SetFrameStrata("HIGH") + slotBtn:SetSize(30, 30) + slotBtn.slot = slot + slotBtn:ClearAllPoints() + slotBtn:SetPoint(anchor, x, y) + slotBtn:RegisterForClicks("LeftButtonUp") + slotBtn:SetMotionScriptsWhileDisabled(true) + + -- Slot button click + slotBtn:SetScript("OnClick", function(self, btn) + if btn == "LeftButton" then + local slotID = GetInventorySlotInfo(self.slot) + DressUpFrame.DressUpModel:UndressSlot(slotID) + end + end) + + -- Slot button tooltip + slotBtn:SetScript("OnEnter", function(self) + GameTooltip:SetOwner(self, "ANCHOR_RIGHT") + if self.item then + GameTooltip:SetHyperlink(self.item) + else + if self.slot then + GameTooltip:SetText(_G[string.upper(self.slot)]) + end + end + end) + slotBtn:SetScript("OnLeave", GameTooltip_Hide) + + -- Slot button textures + slotBtn.t = slotBtn:CreateTexture(nil, "BACKGROUND") + slotBtn.t:SetSize(30, 30) + slotBtn.t:SetPoint("CENTER") + slotBtn.t:SetDesaturated(true) + slotBtn.t:SetTexture("interface\\icons\\" .. texTable[number]) + + slotBtn.h = slotBtn:CreateTexture() + slotBtn.h:SetSize(30, 30) + slotBtn.h:SetPoint("CENTER") + slotBtn.h:SetAtlas("bags-glow-white") + slotBtn.h:SetBlendMode("ADD") + slotBtn:SetHighlightTexture(slotBtn.h) + + -- Add slot button to table + tinsert(buttons, slotBtn) + + end + + -- Show left column slot buttons + for i = 1, 7 do + MakeSlotButton(i, slotTable[i], "TOPLEFT", 22, -80 + -35 * (i - 1)) + end + + -- Show right column slot buttons + for i = 8, 13 do + MakeSlotButton(i, slotTable[i], "TOPRIGHT", -46, -80 + -35 * (i - 8)) + end + + -- Function to set item buttons + local function ToggleItemButtons() + if LeaPlusLC["DressupItemButtons"] == "On" then + for i = 1, #buttons do buttons[i]:Show() end + else + for i = 1, #buttons do buttons[i]:Hide() end + end + end + LeaPlusLC.ToggleItemButtons = ToggleItemButtons + + -- Set item buttons for option click, startup, reset click and preset click + LeaPlusCB["DressupItemButtons"]:HookScript("OnClick", ToggleItemButtons) + ToggleItemButtons() + DressupPanel.r:HookScript("OnClick", function() + LeaPlusLC["DressupItemButtons"] = "On" + ToggleItemButtons() + DressupPanel:Hide(); DressupPanel:Show() + end) + LeaPlusCB["EnhanceDressupBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + LeaPlusLC["DressupItemButtons"] = "On" + ToggleItemButtons() + end + end) + + end + + ---------------------------------------------------------------------- + -- Animation slider (must be before bottom row buttons) + ---------------------------------------------------------------------- + + local animTable = {0, 4, 5, 143, 119, 26, 25, 27, 28, 108, 120, 51, 124, 52, 125, 126, 62, 63, 41, 42, 43, 44, 132, 38, 14, 115, 193, 48, 110, 109, 134, 197, 0} + local lastSetting + + LeaPlusLC["DressupAnim"] = 0 -- Defined here since the setting is not saved + LeaPlusLC:MakeSL(DressUpFrame, "DressupAnim", "", 1, #animTable - 1, 1, 356, -92, "%.0f") + LeaPlusCB["DressupAnim"]:ClearAllPoints() + LeaPlusCB["DressupAnim"]:SetPoint("BOTTOM", -12, 112) + LeaPlusCB["DressupAnim"]:SetWidth(226) + LeaPlusCB["DressupAnim"]:SetFrameLevel(5) + LeaPlusCB["DressupAnim"]:HookScript("OnValueChanged", function(self, setting) + local playerActor = DressUpFrame.DressUpModel + setting = math.floor(setting + 0.5) + if playerActor and setting ~= lastSetting then + lastSetting = setting + DressUpFrame.DressUpModel:SetAnimation(animTable[setting], 0, 1, 1) + -- print(animTable[setting]) -- Debug + end + end) + + -- Function to show animation control + local function SetAnimationSlider() + if LeaPlusLC["DressupAnimControl"] == "On" then + LeaPlusCB["DressupAnim"]:Show() + else + LeaPlusCB["DressupAnim"]:Hide() + end + LeaPlusCB["DressupAnim"]:SetValue(1) + end + + -- Set animation control with option, startup, preset and reset + LeaPlusCB["DressupAnimControl"]:HookScript("OnClick", SetAnimationSlider) + SetAnimationSlider() + LeaPlusCB["EnhanceDressupBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + LeaPlusLC["DressupAnimControl"] = "On" + SetAnimationSlider() + end + end) + DressupPanel.r:HookScript("OnClick", function() + LeaPlusLC["DressupAnimControl"] = "On" + SetAnimationSlider() + DressupPanel:Hide(); DressupPanel:Show() + end) + + -- Reset animation when dressup frame is shown and model is reset + hooksecurefunc(DressUpFrame, "Show", SetAnimationSlider) + DressUpFrameResetButton:HookScript("OnClick", SetAnimationSlider) + + -- Skin slider for ElvUI + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalDressupAnim = LeaPlusCB["DressupAnim"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleSliderFrame(_G.LeaPlusGlobalDressupAnim, false) + end + + ---------------------------------------------------------------------- + -- Buttons + ---------------------------------------------------------------------- + + -- Function to modify a button + local function SetButton(where, text, tip) + if text ~= "" then + where:SetText(L[text]) + where:SetWidth(where:GetFontString():GetStringWidth() + 20) + end + where:HookScript("OnEnter", function() + GameTooltip:SetOwner(where, "ANCHOR_NONE") + GameTooltip:SetPoint("BOTTOM", where, "TOP", 0, 10) + GameTooltip:SetText(L[tip], nil, nil, nil, nil, true) + end) + where:HookScript("OnLeave", GameTooltip_Hide) + end + + -- Close + SetButton(DressUpFrameCancelButton, "", "Close") + DressUpFrameCancelButton:ClearAllPoints() + DressUpFrameCancelButton:SetPoint("BOTTOMRIGHT", DressUpFrame, "BOTTOMRIGHT", -40, 80) + + -- Reset + SetButton(DressUpFrameResetButton, "R", "Reset") + + -- Nude + LeaPlusLC:CreateButton("DressUpNudeBtn", DressUpFrameResetButton, "N", "BOTTOMLEFT", 106, 79, 80, 22, false, "") + LeaPlusCB["DressUpNudeBtn"]:SetFrameLevel(3) + LeaPlusCB["DressUpNudeBtn"]:ClearAllPoints() + LeaPlusCB["DressUpNudeBtn"]:SetPoint("RIGHT", DressUpFrameResetButton, "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpNudeBtn"], "N", "Remove all items") + LeaPlusCB["DressUpNudeBtn"]:SetScript("OnClick", function() + DressUpFrame.DressUpModel:Undress() + end) + + -- Show me + LeaPlusLC:CreateButton("DressUpShowMeBtn", DressUpFrameResetButton, "M", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpShowMeBtn"]:ClearAllPoints() + LeaPlusCB["DressUpShowMeBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpNudeBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpShowMeBtn"], "M", "Show me") + LeaPlusCB["DressUpShowMeBtn"]:SetScript("OnClick", function() + local playerActor = DressUpFrame.DressUpModel + playerActor:SetUnit("player") + -- Set animation + playerActor:SetAnimation(0) + LibCompat.After(0.1,function() + playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1) + end) + end) + + -- Show my outfit on target + --[[LeaPlusLC:CreateButton("DressUpOutfitOnTargetBtn", DressUpFrameResetButton, "O", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpOutfitOnTargetBtn"]:ClearAllPoints() + LeaPlusCB["DressUpOutfitOnTargetBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpNudeBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpOutfitOnTargetBtn"], "O", "Show my outfit on target") + LeaPlusCB["DressUpOutfitOnTargetBtn"]:SetScript("OnClick", function() + if UnitIsPlayer("target") then + DressUpFrame.DressUpModel:SetUnit("target") + DressUpFrame.DressUpModel:Undress() + LibCompat.After(0.01, function() + for i = 1, 19 do + local itemName = GetInventoryItemID("player", i) + if itemName then + DressUpFrame.DressUpModel:TryOn("item:" .. itemName) + end + end + end) + end + end)]] + + -- Target + LeaPlusLC:CreateButton("DressUpTargetBtn", DressUpFrameResetButton, "T", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpTargetBtn"]:ClearAllPoints() + LeaPlusCB["DressUpTargetBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpShowMeBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpTargetBtn"], "T", "Show target model") + LeaPlusCB["DressUpTargetBtn"]:SetScript("OnClick", function() + if UnitIsPlayer("target") then + local playerActor = DressUpFrame.DressUpModel + if playerActor then + playerActor:SetUnit("target") + -- Set animation + playerActor:SetAnimation(0) + LibCompat.After(0.1,function() + playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1) + end) + end + end + end) + + -- Toggle buttons + LeaPlusLC:CreateButton("DressUpButonsBtn", DressUpFrameResetButton, "B", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpButonsBtn"]:ClearAllPoints() + LeaPlusCB["DressUpButonsBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpTargetBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpButonsBtn"], "B", "Toggle buttons") + LeaPlusCB["DressUpButonsBtn"]:SetScript("OnClick", function() + if LeaPlusLC["DressupItemButtons"] == "On" then LeaPlusLC["DressupItemButtons"] = "Off" else LeaPlusLC["DressupItemButtons"] = "On" end + LeaPlusLC:ToggleItemButtons() + if DressupPanel:IsShown() then DressupPanel:Hide(); DressupPanel:Show() end + end) + + -- Show nearby target outfit on me button + --[[LeaPlusLC:CreateButton("DressUpTargetSelfBtn", DressUpFrameResetButton, "S", "BOTTOMLEFT", 26, 79, 80, 22, false, "") + LeaPlusCB["DressUpTargetSelfBtn"]:ClearAllPoints() + LeaPlusCB["DressUpTargetSelfBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpTargetBtn"], "LEFT", 0, 0) + SetButton(LeaPlusCB["DressUpTargetSelfBtn"], "S", "Show nearby target outfit on me") + LeaPlusCB["DressUpTargetSelfBtn"]:SetScript("OnClick", function() + if UnitIsPlayer("target") then + if not CanInspect("target") then + ActionStatus_DisplayMessage(L["Target out of range."], true) + return + end + NotifyInspect("target") + LeaPlusCB["DressUpTargetSelfBtn"]:RegisterEvent("INSPECT_READY") + LeaPlusCB["DressUpTargetSelfBtn"]:SetScript("OnEvent", function() + DressUpFrame.DressUpModel:SetUnit("player") + DressUpFrame.DressUpModel:Undress() + LibCompat.After(0.01, function() + for i = 1, 19 do + local itemName = GetInventoryItemID("target", i) + LibCompat.After(0.01, function() + if itemName then + DressUpFrame.DressUpModel:TryOn("item:" .. itemName) + end + end) + end + end) + LeaPlusCB["DressUpTargetSelfBtn"]:UnregisterEvent("INSPECT_READY") + end) + end + end)]] + + -- Change player actor to player when reset button is clicked (needed because target button changes it) + DressUpFrameResetButton:HookScript("OnClick", function() + DressUpFrame.DressUpModel:SetUnit("player") + end) + + -- Auction house + local BtnStrata, BtnLevel = SideDressUpModelResetButton:GetFrameStrata(), SideDressUpModelResetButton:GetFrameLevel() + + -- Add buttons to auction house dressup frame + LeaPlusLC:CreateButton("DressUpSideBtn", SideDressUpModelResetButton, "Tabard", "BOTTOMLEFT", -36, -31, 60, 22, false, "") + LeaPlusCB["DressUpSideBtn"]:SetFrameStrata(BtnStrata) + LeaPlusCB["DressUpSideBtn"]:SetFrameLevel(BtnLevel) + LeaPlusCB["DressUpSideBtn"]:SetScript("OnClick", function() + SideDressUpModel:UndressSlot(19) + end) + + LeaPlusLC:CreateButton("DressUpSideNudeBtn", SideDressUpModelResetButton, "Nude", "BOTTOMRIGHT", 39, -31, 60, 22, false, "") + LeaPlusCB["DressUpSideNudeBtn"]:SetFrameStrata(BtnStrata) + LeaPlusCB["DressUpSideNudeBtn"]:SetFrameLevel(BtnLevel) + LeaPlusCB["DressUpSideNudeBtn"]:SetScript("OnClick", function() + SideDressUpModel:Undress() + end) + + -- Skin buttons for ElvUI + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalDressUpButtonsButton = LeaPlusCB["DressUpButonsBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpButtonsButton) + + _G.LeaPlusGlobalDressUpShowMeButton = LeaPlusCB["DressUpShowMeBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpShowMeButton) + + _G.LeaPlusGlobalDressUpTargetButton = LeaPlusCB["DressUpTargetBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpTargetButton) + + _G.LeaPlusGlobalDressUpNudeButton = LeaPlusCB["DressUpNudeBtn"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpNudeButton) + end + + ---------------------------------------------------------------------- + -- Controls + ---------------------------------------------------------------------- + + -- Hide model rotation controls + CharacterModelFrameRotateLeftButton:HookScript("OnShow", CharacterModelFrameRotateLeftButton.Hide) + CharacterModelFrameRotateRightButton:HookScript("OnShow", CharacterModelFrameRotateRightButton.Hide) + DressUpModelFrameRotateLeftButton:HookScript("OnShow", DressUpModelFrameRotateLeftButton.Hide) + DressUpModelFrameRotateRightButton:HookScript("OnShow", DressUpModelFrameRotateRightButton.Hide) + SideDressUpModelControlFrame:HookScript("OnShow", SideDressUpModelControlFrame.Hide) + + ---------------------------------------------------------------------- + -- Hide dressup stats button + ---------------------------------------------------------------------- + + local function ToggleStats(startup) + + -- ElvUI_WrathArmory: Make character model full size + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI:GetModule("ElvUI_WrathArmory", true) + if E then + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 134) + return + end + end + + -- Toggle dressup stats + if LeaPlusLC["HideDressupStats"] == "On" then + CharacterResistanceFrame:Hide() + if CSC_HideStatsPanel then + -- CharacterStatsTBC is installed + RunScript('CSC_HideStatsPanel()') + if startup then + LibCompat.After(0.1, function() + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 134) + end) + end + else + -- CharacterStatsTBC is not installed + CharacterAttributesFrame:Hide() + end + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 134) + if LeaPlusLC["ShowVanityControls"] == "On" then + LeaPlusCB["ShowHelm"]:Hide() + LeaPlusCB["ShowCloak"]:Hide() + end + + else + + CharacterResistanceFrame:Show() + if CSC_ShowStatsPanel then + -- CharacterStatsTBC is installed + RunScript('CSC_ShowStatsPanel()') + if startup then + LibCompat.After(0.1, function() + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 243) + end) + end + else + -- CharacterStatsTBC is not installed + CharacterAttributesFrame:Show() + end + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 243) + if LeaPlusLC["ShowVanityControls"] == "On" then + LeaPlusCB["ShowHelm"]:Show() + LeaPlusCB["ShowCloak"]:Show() + end + end + + end + + -- Toggle stats with middle mouse button + CharacterModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "MiddleButton" then + if LeaPlusLC["HideDressupStats"] == "On" then LeaPlusLC["HideDressupStats"] = "Off" else LeaPlusLC["HideDressupStats"] = "On" end + ToggleStats() + end + end) + ToggleStats(true) + + -- Create toggle stats button + local toggleButton = CreateFrame("Button", nil, PaperDollFrame) + toggleButton:SetSize(36, 36) + toggleButton:SetPoint("TOPLEFT", PaperDollFrame, "TOPLEFT", 64, -45) + toggleButton:SetNormalTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-RotationRight-Big-Up") + toggleButton:SetHighlightTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-RotationRight-Big-Up") + toggleButton:SetPushedTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-RotationRight-Big-Up") + toggleButton:SetScript("OnEnter", function() + GameTooltip:SetOwner(toggleButton, "ANCHOR_NONE") + GameTooltip:SetPoint("BOTTOMLEFT", toggleButton, "BOTTOMRIGHT", 0, 0) + GameTooltip:SetText(L["Toggle character stats"], nil, nil, nil, nil, true) + GameTooltip:Show() + end) + toggleButton:SetScript("OnLeave", GameTooltip_Hide) + toggleButton:SetScript("OnClick", function() + if LeaPlusLC["HideDressupStats"] == "On" then LeaPlusLC["HideDressupStats"] = "Off" else LeaPlusLC["HideDressupStats"] = "On" end + ToggleStats() + end) + + -- Delay setting stats if CharacterStatsTBC is installed but hasn't loaded yet + if not CSC_HideStatsPanel and select(2, GetAddOnInfo("CharacterStatsTBC")) then + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "CharacterStatsTBC" then + ToggleStats(true) + waitFrame:UnregisterAllEvents() + end + end) + end + + ---------------------------------------------------------------------- + -- Enable zooming and panning + ---------------------------------------------------------------------- + + -- Enable zooming for character frame and dressup frame + CharacterModelFrame:HookScript("OnMouseWheel", Model_OnMouseWheel) + DressUpModelFrame:HookScript("OnMouseWheel", Model_OnMouseWheel) + + -- Slightly shorter character model frame for CharacterStatsTBC + if IsAddOnLoaded("CharacterStatsTBC") then + CharacterModelFrame:ClearAllPoints() + CharacterModelFrame:SetPoint("TOPLEFT", PaperDollFrame, 66, -76) + CharacterModelFrame:SetPoint("BOTTOMRIGHT", PaperDollFrame, -86, 220) + end + + -- Enable panning for character frame + CharacterModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + Model_StartPanning(self) + end + end) + + CharacterModelFrame:HookScript("OnMouseUp", function(self, btn) + Model_StopPanning(self) + end) + + -- Enable panning for dressup frame + DressUpModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + Model_StartPanning(self) + end + end) + + DressUpModelFrame:HookScript("OnMouseUp", function(self, btn) + Model_StopPanning(self) + end) + + DressUpModelFrame:ClearAllPoints() + DressUpModelFrame:SetPoint("TOPLEFT", DressUpFrame, 22, -76) + DressUpModelFrame:SetPoint("BOTTOMRIGHT", DressUpFrame, -46, 106) + + -- Reset dressup frame when reset button clicked + DressUpFrameResetButton:HookScript("OnClick", function() + DressUpModelFrame.rotation = 0 + DressUpModelFrame:SetRotation(0) + DressUpModelFrame:SetPosition(0, 0, 0) + DressUpModelFrame.zoomLevel = 0 + DressUpModelFrame:SetPortraitZoom(0) + DressUpModelFrame:RefreshCamera() + end) + + -- Reset side dressup when reset button clicked + SideDressUpModelResetButton:HookScript("OnClick", function() + SideDressUpModel.rotation = 0 + SideDressUpModel:SetRotation(0) + SideDressUpModel:SetPosition(0, 0, -0.1) + SideDressUpModel.zoomLevel = 0 + SideDressUpModel:SetPortraitZoom(0) + SideDressUpModel:RefreshCamera() + end) + + ---------------------------------------------------------------------- + -- Inspect system + ---------------------------------------------------------------------- + + -- Inspect System + local function DoInspectSystemFunc() + + -- Hide model rotation controls + InspectModelFrameRotateLeftButton:Hide() + InspectModelFrameRotateRightButton:Hide() + + -- Enable zooming + InspectModelFrame:HookScript("OnMouseWheel", Model_OnMouseWheel) + + -- Enable panning + InspectModelFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then + Model_StartPanning(self) + end + end) + + InspectModelFrame:HookScript("OnMouseUp", function(self, btn) + Model_StopPanning(self) + end) + + end + + if IsAddOnLoaded("Blizzard_InspectUI") then + DoInspectSystemFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_InspectUI" then + DoInspectSystemFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Automatically release in battlegrounds + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local ReleasePanel = LeaPlusLC:CreatePanel("Release in PvP", "ReleasePanel") + + LeaPlusLC:MakeTx(ReleasePanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(ReleasePanel, "AutoReleaseNoAlterac", "Exclude Alterac Valley", 16, -92, false, "If checked, you will not release automatically in Alterac Valley.") + + LeaPlusLC:MakeTx(ReleasePanel, "Delay", 356, -72) + LeaPlusLC:MakeSL(ReleasePanel, "AutoReleaseDelay", "Drag to set the number of milliseconds before you are automatically released.|n|nYou can hold down shift as the timer is ending to cancel the automatic release.", 200, 3000, 100, 356, -92, "%.0f") + + -- Help button hidden + ReleasePanel.h:Hide() + + -- Back button handler + ReleasePanel.b:SetScript("OnClick", function() + ReleasePanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show(); + return + end) + + -- Reset button handler + ReleasePanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["AutoReleaseNoAlterac"] = "Off" + LeaPlusLC["AutoReleaseDelay"] = 200 + + -- Refresh panel + ReleasePanel:Hide(); ReleasePanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["AutoReleasePvPBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["AutoReleaseNoAlterac"] = "Off" + LeaPlusLC["AutoReleaseDelay"] = 200 + else + ReleasePanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Release in battlegrounds + hooksecurefunc("StaticPopup_Show", function(sType) + if sType and sType == "DEATH" and LeaPlusLC["AutoReleasePvP"] == "On" then + if C_DeathInfo.GetSelfResurrectOptions() and #C_DeathInfo.GetSelfResurrectOptions() > 0 then return end + local InstStat, InstType = IsInInstance() + if InstStat and InstType == "pvp" then + -- Exclude specific maps + local mapID = C_Map.GetBestMapForUnit("player") or nil + if mapID then + if mapID == 1459 and LeaPlusLC["AutoReleaseNoAlterac"] == "On" then return end -- Alterac Valley + end + -- Release automatically + local delay = LeaPlusLC["AutoReleaseDelay"] / 1000 + LibCompat.After(delay, function() + local dialog = StaticPopup_Visible("DEATH") + if dialog then + if IsShiftKeyDown() then + ActionStatus_DisplayMessage(L["Automatic Release Cancelled"], true) + else + StaticPopup_OnClick(_G[dialog], 1) + end + end + end) + end + end + end) + + end + + ---------------------------------------------------------------------- + -- Enhance trainers + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceTrainers"] == "On" then + + -- Create configuration panel + local TrainerPanel = LeaPlusLC:CreatePanel("Enhance trainers", "TrainerPanel") + + LeaPlusLC:MakeTx(TrainerPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(TrainerPanel, "ShowTrainAllBtn", "Show train all skills button", 16, -92, false, "If checked, a train all skills button will be shown in the skill trainer frame allowing you to train all available skills instantly.") + + -- Help button hidden + TrainerPanel.h:Hide() + + -- Back button handler + TrainerPanel.b:SetScript("OnClick", function() + TrainerPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + TrainerPanel.r:SetScript("OnClick", function() + + -- Reset controls + LeaPlusLC["ShowTrainAllBtn"] = "On" + + -- Refresh configuration panel + TrainerPanel:Hide(); TrainerPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["EnhanceTrainersBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ShowTrainAllBtn"] = "On" + else + TrainerPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Set increased height of skill trainer frame and maximum number of skills listed + local tall, numTallTrainers = 73, 17 + + ---------------------------------------------------------------------- + -- Trainers Frame + ---------------------------------------------------------------------- + + local function TrainerFunc(frame) + + -- Make the frame double-wide + UIPanelWindows["ClassTrainerFrame"] = {area = "override", pushable = 0, xoffset = -16, yoffset = 12, bottomClampOverride = 140 + 12, width = 714, height = 487, whileDead = 1} + + -- Size the frame + _G["ClassTrainerFrame"]:SetSize(714, 487 + tall) + + -- Lower title text slightly + _G["ClassTrainerNameText"]:ClearAllPoints() + _G["ClassTrainerNameText"]:SetPoint("TOP", _G["ClassTrainerFrame"], "TOP", 0, -18) + + -- Expand the skill list to full height + _G["ClassTrainerListScrollFrame"]:ClearAllPoints() + _G["ClassTrainerListScrollFrame"]:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 25, -75) + _G["ClassTrainerListScrollFrame"]:SetSize(295, 336 + tall) + + -- Create additional list rows + do + + local oldSkillsDisplayed = CLASS_TRAINER_SKILLS_DISPLAYED + + -- Position existing buttons + for i = 1 + 1, CLASS_TRAINER_SKILLS_DISPLAYED do + _G["ClassTrainerSkill" .. i]:ClearAllPoints() + _G["ClassTrainerSkill" .. i]:SetPoint("TOPLEFT", _G["ClassTrainerSkill" .. (i - 1)], "BOTTOMLEFT", 0, 1) + end + + -- Create and position new buttons + _G.CLASS_TRAINER_SKILLS_DISPLAYED = _G.CLASS_TRAINER_SKILLS_DISPLAYED + numTallTrainers + for i = oldSkillsDisplayed + 1, CLASS_TRAINER_SKILLS_DISPLAYED do + local button = CreateFrame("Button", "ClassTrainerSkill" .. i, ClassTrainerFrame, "ClassTrainerSkillButtonTemplate") + button:SetID(i) + button:Hide() + button:ClearAllPoints() + button:SetPoint("TOPLEFT", _G["ClassTrainerSkill" .. (i - 1)], "BOTTOMLEFT", 0, 1) + end + + hooksecurefunc("ClassTrainer_SetToTradeSkillTrainer", function() + _G.CLASS_TRAINER_SKILLS_DISPLAYED = _G.CLASS_TRAINER_SKILLS_DISPLAYED + numTallTrainers + ClassTrainerListScrollFrame:SetHeight(336 + tall) + ClassTrainerDetailScrollFrame:SetHeight(336 + tall) + end) + + hooksecurefunc("ClassTrainer_SetToClassTrainer", function() + _G.CLASS_TRAINER_SKILLS_DISPLAYED = _G.CLASS_TRAINER_SKILLS_DISPLAYED + numTallTrainers - 1 + ClassTrainerListScrollFrame:SetHeight(336 + tall) + ClassTrainerDetailScrollFrame:SetHeight(336 + tall) + end) + + end + + -- Set highlight bar width when shown + hooksecurefunc(_G["ClassTrainerSkillHighlightFrame"], "Show", function() + ClassTrainerSkillHighlightFrame:SetWidth(290) + end) + + -- Move the detail frame to the right and stretch it to full height + _G["ClassTrainerDetailScrollFrame"]:ClearAllPoints() + _G["ClassTrainerDetailScrollFrame"]:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 352, -74) + _G["ClassTrainerDetailScrollFrame"]:SetSize(296, 336 + tall) + -- _G["ClassTrainerSkillIcon"]:SetHeight(500) -- Debug + + -- Hide detail scroll frame textures + _G["ClassTrainerDetailScrollFrameTop"]:SetAlpha(0) + _G["ClassTrainerDetailScrollFrameBottom"]:SetAlpha(0) + + -- Hide expand tab (left of All button) + _G["ClassTrainerExpandTabLeft"]:Hide() + + -- Get frame textures + local regions = {_G["ClassTrainerFrame"]:GetRegions()} + + -- Set top left texture + regions[2]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[2]:SetTexCoord(0.25, 0.75, 0, 1) + regions[2]:SetSize(512, 512) + + -- Set top right texture + regions[3]:ClearAllPoints() + regions[3]:SetPoint("TOPLEFT", regions[2], "TOPRIGHT", 0, 0) + regions[3]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[3]:SetTexCoord(0.75, 1, 0, 1) + regions[3]:SetSize(256, 512) + + -- Hide bottom left and bottom right textures + regions[4]:Hide() + regions[5]:Hide() + + -- Hide skills list dividing bar + regions[9]:Hide() + ClassTrainerHorizontalBarLeft:Hide() + + -- Set skills list backdrop + local RecipeInset = _G["ClassTrainerFrame"]:CreateTexture(nil, "ARTWORK") + RecipeInset:SetSize(304, 361 + tall) + RecipeInset:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 16, -72) + RecipeInset:SetTexture("Interface\\RAIDFRAME\\UI-RaidFrame-GroupBg") + + -- Set detail frame backdrop + local DetailsInset = _G["ClassTrainerFrame"]:CreateTexture(nil, "ARTWORK") + DetailsInset:SetSize(302, 339 + tall) + DetailsInset:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 348, -72) + DetailsInset:SetTexture("Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated") + + -- Move bottom button row + _G["ClassTrainerTrainButton"]:ClearAllPoints() + _G["ClassTrainerTrainButton"]:SetPoint("RIGHT", _G["ClassTrainerCancelButton"], "LEFT", -1, 0) + + -- Position and size close button + _G["ClassTrainerCancelButton"]:SetSize(80, 22) + _G["ClassTrainerCancelButton"]:SetText(CLOSE) + _G["ClassTrainerCancelButton"]:ClearAllPoints() + _G["ClassTrainerCancelButton"]:SetPoint("BOTTOMRIGHT", _G["ClassTrainerFrame"], "BOTTOMRIGHT", -42, 54) + + -- Position close box + _G["ClassTrainerFrameCloseButton"]:ClearAllPoints() + _G["ClassTrainerFrameCloseButton"]:SetPoint("TOPRIGHT", _G["ClassTrainerFrame"], "TOPRIGHT", -30, -8) + + -- Position dropdown menus + ClassTrainerFrameFilterDropDown:ClearAllPoints() + ClassTrainerFrameFilterDropDown:SetPoint("TOPLEFT", ClassTrainerFrame, "TOPLEFT", 501, -40) + + -- Position money frame + ClassTrainerMoneyFrame:ClearAllPoints() + ClassTrainerMoneyFrame:SetPoint("TOPLEFT", _G["ClassTrainerFrame"], "TOPLEFT", 143, -49) + ClassTrainerGreetingText:Hide() + + ---------------------------------------------------------------------- + -- Train All button + ---------------------------------------------------------------------- + + -- Create train all button + LeaPlusLC:CreateButton("TrainAllButton", ClassTrainerFrame, "Train All", "BOTTOMLEFT", 344, 54, 0, 22, false, "") + + -- Give button global scope (useful for compatibility with other addons and essential for ElvUI) + _G.LeaPlusGlobalTrainAllButton = LeaPlusCB["TrainAllButton"] + + -- Button tooltip + LeaPlusCB["TrainAllButton"]:SetScript("OnEnter", function(self) + -- Get number of available skills and total cost + local count, cost = 0, 0 + for i = 1, GetNumTrainerServices() do + local void, void, isAvail = GetTrainerServiceInfo(i) + if isAvail and isAvail == "available" then + count = count + 1 + cost = cost + GetTrainerServiceCost(i) + end + end + -- Show tooltip + if count > 0 then + GameTooltip:SetOwner(self, "ANCHOR_TOP", 0, 4) + GameTooltip:ClearLines() + if count > 1 then + GameTooltip:AddLine(L["Train"] .. " " .. count .. " " .. L["skills for"] .. " " .. GetCoinTextureString(cost)) + else + GameTooltip:AddLine(L["Train"] .. " " .. count .. " " .. L["skill for"] .. " " .. GetCoinTextureString(cost)) + end + GameTooltip:Show() + end + end) + + -- Button click handler + LeaPlusCB["TrainAllButton"]:SetScript("OnClick",function(self) + for i = 1, GetNumTrainerServices() do + local void, void, isAvail = GetTrainerServiceInfo(i) + if isAvail and isAvail == "available" then + BuyTrainerService(i) + end + end + end) + + -- Enable button only when skills are available + local skillsAvailable + hooksecurefunc("ClassTrainerFrame_Update", function() + skillsAvailable = false + for i = 1, GetNumTrainerServices() do + local void, void, isAvail = GetTrainerServiceInfo(i) + if isAvail and isAvail == "available" then + skillsAvailable = true + end + end + LeaPlusCB["TrainAllButton"]:SetEnabled(skillsAvailable) + -- Refresh tooltip + if LeaPlusCB["TrainAllButton"]:IsMouseOver() and skillsAvailable then + LeaPlusCB["TrainAllButton"]:GetScript("OnEnter")(LeaPlusCB["TrainAllButton"]) + end + end) + + -- Function to set train all button + local function SetTrainAllFunc() + if LeaPlusLC["ShowTrainAllBtn"] == "On" then + LeaPlusCB["TrainAllButton"]:Show() + else + LeaPlusCB["TrainAllButton"]:Hide() + end + end + + -- Run function when option is clicked, reset or preset button is clicked and on startup + LeaPlusCB["ShowTrainAllBtn"]:HookScript("OnClick", SetTrainAllFunc) + TrainerPanel.r:HookScript("OnClick", SetTrainAllFunc) + LeaPlusCB["EnhanceTrainersBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ShowTrainAllBtn"] = "On" + SetTrainAllFunc() + end + end) + SetTrainAllFunc() + + ---------------------------------------------------------------------- + -- ElvUI fixes + ---------------------------------------------------------------------- + + -- ElvUI fixes + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI + if E.private.skins.blizzard.enable and E.private.skins.blizzard.trainer then + regions[2]:Hide() + regions[3]:Hide() + RecipeInset:Hide() + DetailsInset:Hide() + _G["ClassTrainerFrame"]:SetHeight(512 + tall) + _G["ClassTrainerTrainButton"]:ClearAllPoints() + _G["ClassTrainerTrainButton"]:SetPoint("BOTTOMRIGHT", _G["ClassTrainerFrame"], "BOTTOMRIGHT", -42, 78) + LeaPlusCB["TrainAllButton"]:ClearAllPoints() + LeaPlusCB["TrainAllButton"]:SetPoint("BOTTOMLEFT", _G["ClassTrainerFrame"], "BOTTOMLEFT", 344, 78) + E:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalTrainAllButton) + end + end + + end + + -- Run function when Trainer UI has loaded + if IsAddOnLoaded("Blizzard_TrainerUI") then + TrainerFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_TrainerUI" then + TrainerFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Set weather density (no reload required) + ---------------------------------------------------------------------- + + do + + -- Create configuration panel + local weatherPanel = LeaPlusLC:CreatePanel("Set weather density", "weatherPanel") + LeaPlusLC:MakeTx(weatherPanel, "Settings", 16, -72) + LeaPlusLC:MakeSL(weatherPanel, "WeatherLevel", "Drag to set the density of weather effects.", 0, 3, 1, 16, -92, "%.0f") + + local weatherSliderTable = {L["Very Low"], L["Low"], L["Medium"], L["High"]} + + -- Function to set the weather density + local function SetWeatherFunc() + LeaPlusCB["WeatherLevel"].f:SetText(LeaPlusLC["WeatherLevel"] .. " (" .. weatherSliderTable[LeaPlusLC["WeatherLevel"] + 1] .. ")") + if LeaPlusLC["SetWeatherDensity"] == "On" then + SetCVar("WeatherDensity", LeaPlusLC["WeatherLevel"]) + SetCVar("RAIDweatherDensity", LeaPlusLC["WeatherLevel"]) + else + SetCVar("WeatherDensity", "3") + SetCVar("RAIDweatherDensity", "3") + end + end + + -- Set weather density when options are clicked and on startup if option is enabled + LeaPlusCB["SetWeatherDensity"]:HookScript("OnClick", SetWeatherFunc) + LeaPlusCB["WeatherLevel"]:HookScript("OnValueChanged", SetWeatherFunc) + if LeaPlusLC["SetWeatherDensity"] == "On" then SetWeatherFunc() end + + -- Prevent weather density from being changed when particle density is changed + hooksecurefunc("SetCVar", function(setting, value) + if setting and LeaPlusLC["SetWeatherDensity"] == "On" then + if setting == "graphicsParticleDensity" then + if GetCVar("WeatherDensity") ~= LeaPlusLC["WeatherLevel"] then + LibCompat.After(0.1, function() + SetCVar("WeatherDensity", LeaPlusLC["WeatherLevel"]) + end) + end + elseif setting == "raidGraphicsParticleDensity" then + if GetCVar("RAIDweatherDensity") ~= LeaPlusLC["WeatherLevel"] then + LibCompat.After(0.1, function() + SetCVar("RAIDweatherDensity", LeaPlusLC["WeatherLevel"]) + end) + end + end + end + end) + + -- Help button hidden + weatherPanel.h:Hide() + + -- Back button handler + weatherPanel.b:SetScript("OnClick", function() + weatherPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button handler + weatherPanel.r:SetScript("OnClick", function() + + -- Reset slider + LeaPlusLC["WeatherLevel"] = 3 + + -- Refresh side panel + weatherPanel:Hide(); weatherPanel:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["SetWeatherDensityBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["WeatherLevel"] = 0 + SetWeatherFunc() + else + weatherPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Enhance professions + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceProfessions"] == "On" then + + -- Set increased height of professions frame and maximum number of recipes listed + local tall, numTallProfs = 73, 19 + + ---------------------------------------------------------------------- + -- TradeSkill Frame + ---------------------------------------------------------------------- + + local function TradeSkillFunc(frame) + + -- Make the tradeskill frame double-wide + UIPanelWindows["TradeSkillFrame"] = {area = "override", pushable = 3, xoffset = -16, yoffset = 12, bottomClampOverride = 140 + 12, width = 714, height = 487, whileDead = 1} + + -- Size the tradeskill frame + _G["TradeSkillFrame"]:SetWidth(714) + _G["TradeSkillFrame"]:SetHeight(487 + tall) + + -- Adjust title text + _G["TradeSkillFrameTitleText"]:ClearAllPoints() + _G["TradeSkillFrameTitleText"]:SetPoint("TOP", _G["TradeSkillFrame"], "TOP", 0, -18) + + -- Expand the tradeskill list to full height + _G["TradeSkillListScrollFrame"]:ClearAllPoints() + _G["TradeSkillListScrollFrame"]:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 25, -75) + _G["TradeSkillListScrollFrame"]:SetSize(295, 336 + tall) + + -- Create additional list rows + local oldTradeSkillsDisplayed = TRADE_SKILLS_DISPLAYED + + -- Position existing buttons + for i = 1 + 1, TRADE_SKILLS_DISPLAYED do + _G["TradeSkillSkill" .. i]:ClearAllPoints() + _G["TradeSkillSkill" .. i]:SetPoint("TOPLEFT", _G["TradeSkillSkill" .. (i-1)], "BOTTOMLEFT", 0, 1) + end + + -- Create and position new buttons + _G.TRADE_SKILLS_DISPLAYED = _G.TRADE_SKILLS_DISPLAYED + numTallProfs + for i = oldTradeSkillsDisplayed + 1, TRADE_SKILLS_DISPLAYED do + local button = CreateFrame("Button", "TradeSkillSkill" .. i, TradeSkillFrame, "TradeSkillSkillButtonTemplate") + button:SetID(i) + button:Hide() + button:ClearAllPoints() + button:SetPoint("TOPLEFT", _G["TradeSkillSkill" .. (i-1)], "BOTTOMLEFT", 0, 1) + end + + -- Set highlight bar width when shown + hooksecurefunc(_G["TradeSkillHighlightFrame"], "Show", function() + _G["TradeSkillHighlightFrame"]:SetWidth(290) + end) + + -- Move the tradeskill detail frame to the right and stretch it to full height + _G["TradeSkillDetailScrollFrame"]:ClearAllPoints() + _G["TradeSkillDetailScrollFrame"]:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 352, -74) + _G["TradeSkillDetailScrollFrame"]:SetSize(298, 336 + tall) + -- _G["TradeSkillReagent1"]:SetHeight(500) -- Debug + + -- Hide detail scroll frame textures + _G["TradeSkillDetailScrollFrameTop"]:SetAlpha(0) + _G["TradeSkillDetailScrollFrameBottom"]:SetAlpha(0) + + -- Create texture for skills list + local RecipeInset = _G["TradeSkillFrame"]:CreateTexture(nil, "ARTWORK") + RecipeInset:SetSize(304, 361+ tall) + RecipeInset:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 16, -72) + RecipeInset:SetTexture("Interface\\RAIDFRAME\\UI-RaidFrame-GroupBg") + + -- Set detail frame backdrop + local DetailsInset = _G["TradeSkillFrame"]:CreateTexture(nil, "ARTWORK") + DetailsInset:SetSize(302, 339+ tall) + DetailsInset:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 348, -72) + DetailsInset:SetTexture("Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated") + + -- Hide expand tab (left of All button) + _G["TradeSkillExpandTabLeft"]:Hide() + + -- Hide skills list horizontal dividing bar (this hides it behind RecipeInset) + TradeSkillHorizontalBarLeft:SetSize(1, 1) + TradeSkillHorizontalBarLeft:Hide() + + -- Get tradeskill frame textures + local regions = {_G["TradeSkillFrame"]:GetRegions()} + + -- Set top left texture + regions[3]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[3]:SetTexCoord(0.25, 0.75, 0, 1) + regions[3]:SetSize(512, 512) + + -- Set top right texture + regions[4]:ClearAllPoints() + regions[4]:SetPoint("TOPLEFT", regions[3], "TOPRIGHT", 0, 0) + regions[4]:SetTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus") + regions[4]:SetTexCoord(0.75, 1, 0, 1) + regions[4]:SetSize(256, 512) + + -- Hide bottom left and bottom right textures + TradeSkillFrameBottomLeftTexture:Hide() + TradeSkillFrameBottomRightTexture:Hide() + + -- Hide horizonal bar in recipe list + regions[8]:Hide() + regions[9]:Hide() -- The shorter pesky horizontal bar that only shows sometimes (texture is 130968) + + -- Move skill rank text + TradeSkillRankFrameSkillRank:ClearAllPoints() + TradeSkillRankFrameSkillRank:SetPoint("TOP", TradeSkillRankFrame, "TOP", 0, -1) + + -- Move create button row + _G["TradeSkillCreateButton"]:ClearAllPoints() + _G["TradeSkillCreateButton"]:SetPoint("RIGHT", _G["TradeSkillCancelButton"], "LEFT", -1, 0) + + -- Position and size close button + _G["TradeSkillCancelButton"]:SetSize(80, 22) + _G["TradeSkillCancelButton"]:SetText(CLOSE) + _G["TradeSkillCancelButton"]:ClearAllPoints() + _G["TradeSkillCancelButton"]:SetPoint("BOTTOMRIGHT", _G["TradeSkillFrame"], "BOTTOMRIGHT", -42, 54) + + -- Position close box + _G["TradeSkillFrameCloseButton"]:ClearAllPoints() + _G["TradeSkillFrameCloseButton"]:SetPoint("TOPRIGHT", _G["TradeSkillFrame"], "TOPRIGHT", -30, -8) + + -- Position dropdown menus + TradeSkillInvSlotDropDown:ClearAllPoints() + TradeSkillInvSlotDropDown:SetPoint("TOPLEFT", TradeSkillFrame, "TOPLEFT", 510, -40) + TradeSkillSubClassDropDown:ClearAllPoints() + TradeSkillSubClassDropDown:SetPoint("RIGHT", TradeSkillInvSlotDropDown, "LEFT", 0, 0) + + -- Move search box below rank frame + TradeSkillFrameEditBox:ClearAllPoints() + TradeSkillFrameEditBox:SetPoint("TOPRIGHT", TradeSkillRankFrame, "BOTTOMRIGHT", 0, 1) + TradeSkillFrameEditBox:SetFrameLevel(3) + + -- Move have materials checkbox down slightly + TradeSkillFrameAvailableFilterCheckButton:ClearAllPoints() + TradeSkillFrameAvailableFilterCheckButton:SetPoint("TOPLEFT", TradeSkillFrame, "TOPLEFT", 70, -53) + + -- Ensure have materials checkbox doesn't overlap search box + TradeSkillFrameAvailableFilterCheckButtonText:SetWidth(110) + TradeSkillFrameAvailableFilterCheckButtonText:SetWordWrap(false) + TradeSkillFrameAvailableFilterCheckButtonText:SetJustifyH("LEFT") + + -- ElvUI fixes + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI + if E.private.skins.blizzard.enable and E.private.skins.blizzard.tradeskill then + regions[3]:Hide() + regions[4]:Hide() + RecipeInset:Hide() + DetailsInset:Hide() + _G["TradeSkillFrame"]:SetHeight(512 + tall) + _G["TradeSkillCancelButton"]:ClearAllPoints() + _G["TradeSkillCancelButton"]:SetPoint("BOTTOMRIGHT", _G["TradeSkillFrame"], "BOTTOMRIGHT", -42, 78) + _G["TradeSkillRankFrame"]:ClearAllPoints() + _G["TradeSkillRankFrame"]:SetPoint("TOPLEFT", _G["TradeSkillFrame"], "TOPLEFT", 24, -44) + _G["TradeSkillFrameEditBox"]:ClearAllPoints() + _G["TradeSkillFrameEditBox"]:SetPoint("TOPRIGHT", TradeSkillFrame, "TOPRIGHT", -392, -60) + _G["TradeSkillFrameAvailableFilterCheckButton"]:ClearAllPoints() + _G["TradeSkillFrameAvailableFilterCheckButton"]:SetPoint("TOPLEFT", TradeSkillFrame, "TOPLEFT", 20, -58) + end + end + + -- Classic Profession Filter addon fixes + if IsAddOnLoaded("ClassicProfessionFilter") and TradeSkillFrame.SearchBox and TradeSkillFrame.HaveMats and TradeSkillFrame.HaveMats.text and TradeSkillFrame.SearchMats and TradeSkillFrame.SearchMats.text then + TradeSkillFrame.SearchBox:ClearAllPoints() + TradeSkillFrame.SearchBox:SetPoint("LEFT", TradeSkillRankFrame, "RIGHT", 20, -10) + + TradeSkillFrame.HaveMats:ClearAllPoints() + TradeSkillFrame.HaveMats:SetPoint("LEFT", TradeSkillFrame.SearchBox, "RIGHT", 10, 8) + TradeSkillFrame.HaveMats.text:SetText(L["Have mats?"]) + TradeSkillFrame.HaveMats:SetHitRectInsets(0, -TradeSkillFrame.HaveMats.text:GetStringWidth() + 4, 0, 0) + TradeSkillFrame.HaveMats.text:SetJustifyH("LEFT") + TradeSkillFrame.HaveMats.text:SetWordWrap(false) + if TradeSkillFrame.HaveMats.text:GetWidth() > 80 then + TradeSkillFrame.HaveMats.text:SetWidth(80) + TradeSkillFrame.HaveMats:SetHitRectInsets(0, -80 + 4, 0, 0) + end + + TradeSkillFrame.SearchMats:ClearAllPoints() + TradeSkillFrame.SearchMats:SetPoint("BOTTOMLEFT", TradeSkillFrame.HaveMats, "BOTTOMLEFT", 0, -16) + TradeSkillFrame.SearchMats.text:SetText(L["Search mats?"]) + TradeSkillFrame.SearchMats:SetHitRectInsets(0, -TradeSkillFrame.SearchMats.text:GetStringWidth() + 2, 0, 0) + TradeSkillFrame.SearchMats.text:SetJustifyH("LEFT") + TradeSkillFrame.SearchMats.text:SetWordWrap(false) + if TradeSkillFrame.SearchMats.text:GetWidth() > 80 then + TradeSkillFrame.SearchMats.text:SetWidth(80) + TradeSkillFrame.SearchMats:SetHitRectInsets(0, -80 + 4, 0, 0) + end + end + + end + + -- Run function when TradeSkill UI has loaded + if IsAddOnLoaded("Blizzard_TradeSkillUI") then + TradeSkillFunc("TradeSkill") + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_TradeSkillUI" then + TradeSkillFunc("TradeSkill") + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Enhance quest log + ---------------------------------------------------------------------- + + if LeaPlusLC["EnhanceQuestLog"] == "On" then + + -- Button to toggle quest headers + LeaPlusLC:CreateButton("ToggleQuestHeaders", QuestLogFrame, "Collapse", "BOTTOMLEFT", 344, 54, 0, 22, true, "", false) + LeaPlusCB["ToggleQuestHeaders"]:ClearAllPoints() + LeaPlusCB["ToggleQuestHeaders"]:SetPoint("TOPRIGHT", QuestLogFrame, "TOPRIGHT", -360, -44) + LeaPlusCB["ToggleQuestHeaders"]:GetFontString():SetWordWrap(false) + + local function SetHeadersButton() + if LeaPlusCB["ToggleQuestHeaders"].collapsed then + LeaPlusCB["ToggleQuestHeaders"]:SetText(L["Expand"]) + else + LeaPlusCB["ToggleQuestHeaders"]:SetText(L["Collapse"]) + end + local headerButtonWidth = LeaPlusCB["ToggleQuestHeaders"]:GetFontString():GetStringWidth() + 13.6 + if headerButtonWidth > 120 then headerButtonWidth = 120 end + LeaPlusCB["ToggleQuestHeaders"]:GetFontString():SetWidth(headerButtonWidth) + LeaPlusCB["ToggleQuestHeaders"]:SetWidth(headerButtonWidth) + end + + LeaPlusCB["ToggleQuestHeaders"]:HookScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + if self.collapsed then + self.collapsed = nil + ExpandQuestHeader(0) + SetHeadersButton() + else + self.collapsed = 1 + QuestLogListScrollFrameScrollBar:SetValue(0) + CollapseQuestHeader(0) + SetHeadersButton() + end + end + end) + + -- Show quest level in quest log detail frame (but not when turning in quest) + hooksecurefunc("QuestLog_UpdateQuestDetails", function() + if LeaPlusLC["EnhanceQuestLevels"] == "On" then + local quest = GetQuestLogSelection() + if quest then + local title, level, suggestedGroup = GetQuestLogTitle(quest) + if title and level then + if suggestedGroup then + if suggestedGroup == LFG_TYPE_DUNGEON then level = level .. "D" + elseif suggestedGroup == RAID then level = level .. "R" + elseif suggestedGroup == ELITE then level = level .. "+" + elseif suggestedGroup == GROUP then level = level .. "+" + elseif suggestedGroup == PVP then level = level .. "P" + end + end + QuestInfoTitleHeader:SetText("[" .. level .. "] " .. title) + end + end + end + end) + + -- Show quest levels in quest log + hooksecurefunc("QuestLogTitleButton_Resize", function(questLogTitle) + if LeaPlusLC["EnhanceQuestLevels"] == "On" and not questLogTitle.isHeader then + local questIndex = questLogTitle:GetID() + local title, level, suggestedGroup = GetQuestLogTitle(questIndex) + local questTitleTag = questLogTitle.tag + local questNormalText = questLogTitle.normalText + local questCheck = questLogTitle.check + + if level and level > 0 and level < 10 then level = "0" .. level end + + if suggestedGroup and LeaPlusLC["EnhanceQuestDifficulty"] == "On" then + if suggestedGroup == LFG_TYPE_DUNGEON then level = level .. "D" + elseif suggestedGroup == RAID then level = level .. "R" + elseif suggestedGroup == ELITE then level = level .. "+" + elseif suggestedGroup == GROUP then level = level .. "+" + elseif suggestedGroup == PVP then level = level .. "P" + end + end + + questNormalText:SetWidth(0) + questNormalText:SetText(" [" .. level .. "] " .. title) + + -- Debug + -- questLogTitle.normalText:SetText(" [80] Learning to Leave and Return The") + + -- From QuestLogTitleButton_Resize + local rightEdge + if questTitleTag:IsShown() then + if questCheck:IsShown() then + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() - questTitleTag:GetWidth() - 4 - questCheck:GetWidth() - 2 + else + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() - questTitleTag:GetWidth() - 4 + end + else + if questCheck:IsShown() then + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() - questCheck:GetWidth() - 2 + else + rightEdge = questLogTitle:GetLeft() + questLogTitle:GetWidth() + end + end + -- subtract from the text width the number of pixels that overrun the right edge + local questNormalTextWidth = questNormalText:GetWidth() - max(questNormalText:GetRight() - rightEdge, 0) + questNormalText:SetWidth(questNormalTextWidth) + end + end) + + -- Create configuration panel + local EnhanceQuestPanel = LeaPlusLC:CreatePanel("Enhance quest log", "EnhanceQuestPanel") + + LeaPlusLC:MakeTx(EnhanceQuestPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(EnhanceQuestPanel, "EnhanceQuestHeaders", "Show toggle headers button", 16, -92, false, "If checked, the toggle headers button will be shown.") + + LeaPlusLC:MakeTx(EnhanceQuestPanel, "Levels", 16, -132) + LeaPlusLC:MakeCB(EnhanceQuestPanel, "EnhanceQuestLevels", "Show quest levels", 16, -152, false, "If checked, quest levels will be shown.") + LeaPlusLC:MakeCB(EnhanceQuestPanel, "EnhanceQuestDifficulty", "Show quest difficulty in quest log list", 16, -172, false, "If checked, the quest difficulty will be shown next to the quest level in the quest log list.|n|nThis will indicate whether the quest requires a group (+), dungeon (D), raid (R) or PvP (P).|n|nThe quest difficulty will always be shown in the quest log detail pane regardless of this setting.") + + -- Disable Show quest difficulty option if Show quest levels is disabled + LeaPlusCB["EnhanceQuestLevels"]:HookScript("OnClick", function() + LeaPlusLC:LockOption("EnhanceQuestLevels", "EnhanceQuestDifficulty", false) + end) + LeaPlusLC:LockOption("EnhanceQuestLevels", "EnhanceQuestDifficulty", false) + + -- Help button hidden + EnhanceQuestPanel.h:Hide() + + -- Back button handler + EnhanceQuestPanel.b:SetScript("OnClick", function() + EnhanceQuestPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show(); + return + end) + + -- Function to set toggle headers button + local function SetQuestHeaderFunc() + if LeaPlusLC["EnhanceQuestHeaders"] == "On" then + LeaPlusCB["ToggleQuestHeaders"]:Show() + else + LeaPlusCB["ToggleQuestHeaders"]:Hide() + end + end + + -- Set toggle headers button when setting is clicked and on startup + LeaPlusCB["EnhanceQuestHeaders"]:HookScript("OnClick", SetQuestHeaderFunc) + SetQuestHeaderFunc() + + -- Reset button handler + EnhanceQuestPanel.r.tiptext = EnhanceQuestPanel.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."] + EnhanceQuestPanel.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["EnhanceQuestHeaders"] = "On"; SetQuestHeaderFunc() + LeaPlusLC["EnhanceQuestLevels"] = "On" + LeaPlusLC["EnhanceQuestDifficulty"] = "On" + + -- Refresh panel + EnhanceQuestPanel:Hide(); EnhanceQuestPanel:Show() + + end) + + -- Show panal when options panel button is clicked + LeaPlusCB["EnhanceQuestLogBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["EnhanceQuestHeaders"] = "On"; SetQuestHeaderFunc() + LeaPlusLC["EnhanceQuestLevels"] = "On" + LeaPlusLC["EnhanceQuestDifficulty"] = "On" + else + EnhanceQuestPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + end + + ---------------------------------------------------------------------- + -- Show bag search box + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowBagSearchBox"] == "On" and not LeaLockList["ShowBagSearchBox"] then + + -- Function to unregister search event for guild bank since it isn't used + local function SetGuildBankFunc() + for i = 1, 6 do + _G["GuildBankTab" .. i].Button:UnregisterEvent("INVENTORY_SEARCH_UPDATE") + end + end + + -- Run search event function when Blizzard addon is loaded + if IsAddOnLoaded("Blizzard_GuildBankUI") then + SetGuildBankFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_GuildBankUI" then + SetGuildBankFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + -- Create bag item search box + local BagItemSearchBox = CreateFrame("EditBox", "BagItemSearchBox", ContainerFrame1, "BagSearchBoxTemplate") + BagItemSearchBox:SetSize(110, 18) + BagItemSearchBox:SetMaxLetters(15) + + -- Create bank item search box + local BankItemSearchBox = CreateFrame("EditBox", "BankItemSearchBox", BankFrame, "BagSearchBoxTemplate") + BankItemSearchBox:SetSize(120, 14) + BankItemSearchBox:SetMaxLetters(15) + BankItemSearchBox:SetPoint("TOPRIGHT", -60, -40) + + -- Attach bag search box first bag only + hooksecurefunc("ContainerFrame_Update", function(self) + if self:GetID() == 0 then + BagItemSearchBox:SetParent(self) + BagItemSearchBox:SetPoint("TOPLEFT", self, "TOPLEFT", 54, -29) + BagItemSearchBox.anchorBag = self + BagItemSearchBox:Show() + elseif BagItemSearchBox.anchorBag == self then + BagItemSearchBox:ClearAllPoints() + BagItemSearchBox:Hide() + BagItemSearchBox.anchorBag = nil + end + end) + + end + + ---------------------------------------------------------------------- + -- Show vendor price + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowVendorPrice"] == "On" then + + -- Function to show vendor price + local function ShowSellPrice(tooltip, tooltipObject) + if tooltip.shownMoneyFrames then return end + tooltipObject = tooltipObject or GameTooltip + -- Get container + local container = GetMouseFocus() + if not container then return end + -- Get item + local itemName, itemlink = tooltipObject:GetItem() + if not itemlink then return end + local void, void, void, void, void, void, void, void, void, void, sellPrice, classID = GetItemInfo(itemlink) + if sellPrice and sellPrice > 0 then + local count = container and type(container.count) == "number" and container.count or 1 + if sellPrice and count > 0 then + if classID and classID == 11 then count = 1 end -- Fix for quiver/ammo pouch so ammo is not included + SetTooltipMoney(tooltip, sellPrice * count, "STATIC", SELL_PRICE .. ":") + end + end + -- Refresh chat tooltips + if tooltipObject == ItemRefTooltip then ItemRefTooltip:Show() end + end + + -- Show vendor price when tooltips are shown + GameTooltip:HookScript("OnTooltipSetItem", ShowSellPrice) + hooksecurefunc(GameTooltip, "SetHyperlink", function(tip) ShowSellPrice(tip, GameTooltip) end) + hooksecurefunc(ItemRefTooltip, "SetHyperlink", function(tip) ShowSellPrice(tip, ItemRefTooltip) end) + + end + + ---------------------------------------------------------------------- + -- Dismount me + ---------------------------------------------------------------------- + + if LeaPlusLC["StandAndDismount"] == "On" then + + local eFrame = CreateFrame("FRAME") + eFrame:RegisterEvent("UI_ERROR_MESSAGE") + eFrame:SetScript("OnEvent", function(self, event, messageType, msg) + -- Auto dismount + if msg == ERR_OUT_OF_RAGE and LeaPlusLC["DismountNoResource"] == "On" + or msg == ERR_OUT_OF_MANA and LeaPlusLC["DismountNoResource"] == "On" + or msg == ERR_OUT_OF_ENERGY and LeaPlusLC["DismountNoResource"] == "On" + or msg == SPELL_FAILED_MOVING and LeaPlusLC["DismountNoMoving"] == "On" + or msg == ERR_TAXIPLAYERSHAPESHIFTED + then + local void, class = UnitClass("player") + if class == "SHAMAN" and GetShapeshiftFormID() then + -- Cancel Ghost Wolf + RunScript('CancelShapeshiftForm()') + end + if IsMounted() then + Dismount() + UIErrorsFrame:Clear() + end + end + end) + + -- Dismount when flight point map is opened + local taxiFrame = CreateFrame("FRAME") + taxiFrame:RegisterEvent("TAXIMAP_OPENED") + taxiFrame:SetScript("OnEvent", function() + local void, class = UnitClass("player") + if class == "SHAMAN" and GetShapeshiftFormID() then + -- Cancel Ghost Wolf + RunScript('CancelShapeshiftForm()') + end + if IsMounted() then Dismount() end + end) + + -- Create configuration panel + local DismountFrame = LeaPlusLC:CreatePanel("Dismount me", "DismountFrame") + + LeaPlusLC:MakeTx(DismountFrame, "Settings", 16, -72) + LeaPlusLC:MakeCB(DismountFrame, "DismountNoResource", "Dismount when not enough rage, mana or energy", 16, -92, false, "If checked, you will be dismounted when you attempt to cast a spell but don't have the rage, mana or energy to cast it.") + LeaPlusLC:MakeCB(DismountFrame, "DismountNoMoving", "Dismount when casting a spell while moving", 16, -112, false, "If checked, you will be dismounted when you attempt to cast a non-instant cast spell while moving.") + LeaPlusLC:MakeCB(DismountFrame, "DismountNoTaxi", "Dismount when the flight map opens", 16, -132, false, "If checked, you will be dismounted when you instruct a flight master to open the flight map.") + LeaPlusLC:MakeCB(DismountFrame, "DismountShowFormBtn", "Show cancel form button on flight map", 16, -152, false, "If checked, a cancel form button will be shown on the flight map while you are playing as a shapeshifted druid or shaman.") + + -- Help button hidden + DismountFrame.h.tiptext = L["The game will dismount you if you successfully cast a spell without addons. These settings let you set some additional dismount rules."] + + -- Back button handler + DismountFrame.b:SetScript("OnClick", function() + DismountFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show() + return + end) + + -- Function to set dismount options + local function SetDismount() + if LeaPlusLC["DismountNoTaxi"] == "On" then + taxiFrame:RegisterEvent("TAXIMAP_OPENED") + else + taxiFrame:UnregisterEvent("TAXIMAP_OPENED") + end + end + + -- Run function when certain options are clicked and on startup + LeaPlusCB["DismountNoTaxi"]:HookScript("OnClick", SetDismount) + SetDismount() + + -- Reset button handler + DismountFrame.r:SetScript("OnClick", function() + + -- Reset checkboxes + LeaPlusLC["DismountNoResource"] = "On" + LeaPlusLC["DismountNoMoving"] = "On" + LeaPlusLC["DismountNoTaxi"] = "On" + LeaPlusLC["DismountShowFormBtn"] = "On" + + -- Update settings and configuration panel + SetDismount() + DismountFrame:Hide(); DismountFrame:Show() + + end) + + -- Show configuration panal when options panel button is clicked + LeaPlusCB["DismountBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["DismountNoResource"] = "On" + LeaPlusLC["DismountNoMoving"] = "On" + LeaPlusLC["DismountNoTaxi"] = "On" + LeaPlusLC["DismountShowFormBtn"] = "On" + SetDismount() + else + DismountFrame:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Druid cancel form button + local void, class = UnitClass("player") + if class == "DRUID" or class == "SHAMAN" then + + -- Create button + local cancelFormBtn = CreateFrame("Button", nil, TaxiFrame, "InsecureActionButtonTemplate") + cancelFormBtn:SetAttribute("type", "macro") + cancelFormBtn:SetAttribute("macrotext", "/cancelform") + cancelFormBtn:ClearAllPoints() + cancelFormBtn:SetSize(24, 24) + cancelFormBtn:SetPoint("TOPRIGHT", TaxiFrame, "TOPRIGHT", -46, -46) + cancelFormBtn:SetNormalTexture("Interface\\ICONS\\Achievement_Character_Nightelf_Female") + cancelFormBtn:SetPushedTexture("Interface\\ICONS\\Achievement_Character_Nightelf_Female") + cancelFormBtn:SetHighlightTexture("Interface\\ICONS\\Achievement_Character_Nightelf_Female") + + -- Button message + cancelFormBtn.f = cancelFormBtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + cancelFormBtn.f:SetHeight(32) + cancelFormBtn.f:SetPoint('RIGHT', cancelFormBtn, 'LEFT', -10, 0) + cancelFormBtn.f:SetText(L["Click to unshift"]) + + -- Toggle button when form changes + cancelFormBtn:SetScript("OnEvent", function() + local form = GetShapeshiftForm() or 0 + if form ~= 0 then + if not cancelFormBtn:IsShown() then cancelFormBtn:Show() end + else + cancelFormBtn:Hide() + end + end) + + -- Function to set event and button status + local function SetShiftEvent() + if LeaPlusLC["DismountShowFormBtn"] == "On" then + cancelFormBtn:RegisterEvent("UPDATE_SHAPESHIFT_FORM") + local form = GetShapeshiftForm() or 0 + if form ~= 0 then cancelFormBtn:Show() else cancelFormBtn:Hide() end + else + cancelFormBtn:UnregisterEvent("UPDATE_SHAPESHIFT_FORM") + cancelFormBtn:Hide() + end + end + + -- Set button when option is clicked, when reset button is clicked, preset profile and on startup + LeaPlusCB["DismountShowFormBtn"]:HookScript("OnClick", SetShiftEvent) + DismountFrame.r:HookScript("OnClick", SetShiftEvent) + LeaPlusCB["DismountBtn"]:HookScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then SetShiftEvent() end + end) + SetShiftEvent() + + end + + end + + ---------------------------------------------------------------------- + -- Use class colors in chat + ---------------------------------------------------------------------- + + if LeaPlusLC["ClassColorsInChat"] == "On" and not LeaLockList["ClassColorsInChat"] then + + SetCVar("chatClassColorOverride", "0") + + LibCompat.After(0.1, function() + + -- Set local channel colors and lock checkboxes + for i = 1, 18 do + if _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"] then + ToggleChatColorNamesByClassGroup(true, _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"]:GetParent().type) + if _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "ColorClasses"] then + LeaPlusLC:LockItem(_G["ChatConfigChatSettingsLeftCheckBox" .. i .. "ColorClasses"], true) + end + end + end + + -- Set global channel colors + for i = 1, 50 do + ToggleChatColorNamesByClassGroup(true, "CHANNEL" .. i) + end + + -- Lock global channel checkboxes on startup + hooksecurefunc("ChatConfig_CreateCheckboxes", function(self, checkBoxTable, checkBoxTemplate, title) + if ChatConfigChannelSettingsLeft.checkBoxTable then + for i = 1, 50 do + if _G["ChatConfigChannelSettingsLeftCheckBox" .. i .. "ColorClasses"] then + LeaPlusLC:LockItem(_G["ChatConfigChannelSettingsLeftCheckBox" .. i .. "ColorClasses"], true) + end + end + end + end) + + end) + + end + + ---------------------------------------------------------------------- + -- Disable screen glow (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set screen glow + local function SetGlow() + if LeaPlusLC["NoScreenGlow"] == "On" then + SetCVar("ffxGlow", "0") + else + SetCVar("ffxGlow", "1") + end + end + + -- Set screen glow on startup and when option is clicked (if enabled) + LeaPlusCB["NoScreenGlow"]:HookScript("OnClick", SetGlow) + if LeaPlusLC["NoScreenGlow"] == "On" then SetGlow() end + + end + + ---------------------------------------------------------------------- + -- Disable screen effects (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set screen effects + local function SetEffects() + if LeaPlusLC["NoScreenEffects"] == "On" then + SetCVar("ffxDeath", "0") + SetCVar("ffxNether", "0") + else + SetCVar("ffxDeath", "1") + SetCVar("ffxNether", "1") + end + end + + -- Set screen effects when option is clicked and on startup (if enabled) + LeaPlusCB["NoScreenEffects"]:HookScript("OnClick", SetEffects) + if LeaPlusLC["NoScreenEffects"] == "On" then SetEffects() end + + end + + ---------------------------------------------------------------------- + -- Universal group chat color (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set chat colors + local function SetCol() + if LeaPlusLC["UnivGroupColor"] == "On" then + ChangeChatColor("RAID", 0.67, 0.67, 1) + ChangeChatColor("RAID_LEADER", 0.46, 0.78, 1) + else + ChangeChatColor("RAID", 1, 0.50, 0) + ChangeChatColor("RAID_LEADER", 1, 0.28, 0.04) + end + end + + -- Set chat colors when option is clicked and on startup (if enabled) + LeaPlusCB["UnivGroupColor"]:HookScript("OnClick", SetCol) + if LeaPlusLC["UnivGroupColor"] == "On" then SetCol() end + + end + + ---------------------------------------------------------------------- + -- Minimap button (no reload required) + ---------------------------------------------------------------------- + + do + + -- Minimap button click function + local function MiniBtnClickFunc(arg1) + + if LeaPlusLC["LeaPlusFrameMove"] and LeaPlusLC["LeaPlusFrameMove"]:IsShown() then return end + if LeaPlusCB["TooltipDragFrame"] and LeaPlusCB["TooltipDragFrame"]:IsShown() then return end + if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() then return end + + if arg1 == "LeftButton" then + if LeaPlusLC["PageF"]:IsShown() then + LeaPlusLC:HideFrames(); + else + LeaPlusLC:HideFrames(); + LeaPlusLC["PageF"]:Show(); + end + if LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]] and LeaPlusLC["OpenPlusAtHome"] == "Off" then + LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show() + else + LeaPlusLC["Page0"]:Show(); + end + end + if arg1 == "RightButton" then + ReloadUI(); + end + + end + + -- Create minimap button using LibDBIcon + local miniButton = LibStub("LibDataBroker-1.1"):NewDataObject("Leatrix_Plus", { + type = "data source", + text = "Leatrix Plus", + icon = "Interface\\addons\\Leatrix_Plus\\assets\\minimapicon.tga", + OnClick = function(self, btn) + MiniBtnClickFunc(btn) + end, + OnTooltipShow = function(tooltip) + if not tooltip or not tooltip.AddLine then return end + tooltip:AddLine("Leatrix Plus") + tooltip:AddLine("|cffeda55fClick|r |cff99ff00to open Leatrix Plus options.|r") + tooltip:AddLine("|cffeda55fRight-Click|r |cff99ff00to reload the user interface.|r") + end, + }) + + local icon = LibStub("LibDBIcon-1.0", true) + icon:Register("Leatrix_Plus", miniButton, LeaPlusDB) + + -- Function to toggle LibDBIcon + local function SetLibDBIconFunc() + if LeaPlusLC["ShowMinimapIcon"] == "On" then + LeaPlusDB["hide"] = false + icon:Show("Leatrix_Plus") + else + LeaPlusDB["hide"] = true + icon:Hide("Leatrix_Plus") + end + end + + -- Set LibDBIcon when option is clicked and on startup + LeaPlusCB["ShowMinimapIcon"]:HookScript("OnClick", SetLibDBIconFunc) + SetLibDBIconFunc() + end + + ---------------------------------------------------------------------- + -- Auction House Extras + ---------------------------------------------------------------------- + + if LeaPlusLC["AhExtras"] == "On" then + + local function AuctionFunc() + + -- Set default auction duration value to saved settings or default settings + AuctionFrameAuctions.duration = LeaPlusDB["AHDuration"] or 3 + + -- Update duration radio button + AuctionsShortAuctionButton:SetChecked(false) + AuctionsMediumAuctionButton:SetChecked(false) + AuctionsLongAuctionButton:SetChecked(false) + if AuctionFrameAuctions.duration == 1 then + AuctionsShortAuctionButton:SetChecked(true) + elseif AuctionFrameAuctions.duration == 2 then + AuctionsMediumAuctionButton:SetChecked(true) + elseif AuctionFrameAuctions.duration == 3 then + AuctionsLongAuctionButton:SetChecked(true) + end + + -- Functions + local function CreateAuctionCB(name, anchor, x, y, text) + LeaPlusCB[name] = CreateFrame("CheckButton", nil, AuctionFrameAuctions, "OptionsCheckButtonTemplate") + LeaPlusCB[name]:SetFrameStrata("HIGH") + LeaPlusCB[name]:SetSize(20, 20) + LeaPlusCB[name]:SetPoint(anchor, x, y) + LeaPlusCB[name].f = LeaPlusCB[name]:CreateFontString(nil, 'OVERLAY', "GameFontNormal") + LeaPlusCB[name].f:SetPoint("LEFT", 20, 0) + LeaPlusCB[name].f:SetText(L[text]) + LeaPlusCB[name].f:Show(); + LeaPlusCB[name]:SetScript('OnClick', function() + if LeaPlusCB[name]:GetChecked() then + LeaPlusLC[name] = "On" + else + LeaPlusLC[name] = "Off" + end + end) + LeaPlusCB[name]:SetScript('OnShow', function(self) + if LeaPlusLC[name] == "On" then + self:SetChecked(true) + else + self:SetChecked(false) + end + end) + end + + -- Show the correct fields in the AH frame and match prices + local function SetupAh() + if LeaPlusLC["AhBuyoutOnly"] == "On" then + -- Hide the start price + StartPrice:SetAlpha(0); + -- Set start price to buyout price + StartPriceGold:SetText(BuyoutPriceGold:GetText()); + StartPriceSilver:SetText(BuyoutPriceSilver:GetText()); + StartPriceCopper:SetText(BuyoutPriceCopper:GetText()); + else + -- Show the start price + StartPrice:SetAlpha(1); + end + -- If gold only is on, set copper and silver to 99 + if LeaPlusLC["AhGoldOnly"] == "On" then + StartPriceCopper:SetText("99"); StartPriceCopper:Disable(); + StartPriceSilver:SetText("99"); StartPriceSilver:Disable(); + BuyoutPriceCopper:SetText("99"); BuyoutPriceCopper:Disable(); + BuyoutPriceSilver:SetText("99"); BuyoutPriceSilver:Disable(); + else + StartPriceCopper:Enable(); + StartPriceSilver:Enable(); + BuyoutPriceCopper:Enable(); + BuyoutPriceSilver:Enable(); + end + -- Validate the auction (mainly for the create auction button status) + AuctionsFrameAuctions_ValidateAuction() + end + + -- Create checkboxes + CreateAuctionCB("AhBuyoutOnly", "BOTTOMLEFT", 200, 16, "Buyout Only") + CreateAuctionCB("AhGoldOnly", "BOTTOMLEFT", 320, 16, "Gold Only") + + -- Reposition Gold Only checkbox so it does not overlap Buyout Only checkbox label + LeaPlusCB["AhGoldOnly"]:ClearAllPoints() + LeaPlusCB["AhGoldOnly"]:SetPoint("LEFT", LeaPlusCB["AhBuyoutOnly"].f, "RIGHT", 20, 0) + + -- Set click boundaries + LeaPlusCB["AhBuyoutOnly"]:SetHitRectInsets(0, -LeaPlusCB["AhBuyoutOnly"].f:GetStringWidth() + 6, 0, 0); + LeaPlusCB["AhGoldOnly"]:SetHitRectInsets(0, -LeaPlusCB["AhGoldOnly"].f:GetStringWidth() + 6, 0, 0); + + LeaPlusCB["AhBuyoutOnly"]:HookScript('OnClick', SetupAh); + LeaPlusCB["AhBuyoutOnly"]:HookScript('OnShow', SetupAh); + + AuctionFrameAuctions:HookScript("OnShow", SetupAh) + BuyoutPriceGold:HookScript("OnTextChanged", SetupAh) + BuyoutPriceSilver:HookScript("OnTextChanged", SetupAh) + BuyoutPriceCopper:HookScript("OnTextChanged", SetupAh) + StartPriceGold:HookScript("OnTextChanged", SetupAh) + StartPriceSilver:HookScript("OnTextChanged", SetupAh) + StartPriceCopper:HookScript("OnTextChanged", SetupAh) + + -- Lock the create auction button if buyout gold box is empty (when using buyout only and gold only) + AuctionsCreateAuctionButton:HookScript("OnEnable", function() + -- Do nothing if wow token frame is showing + if AuctionsWowTokenAuctionFrame:IsShown() then return end + -- Lock the create auction button if both checkboxes are enabled and buyout gold price is empty + if LeaPlusLC["AhGoldOnly"] == "On" and LeaPlusLC["AhBuyoutOnly"] == "On" then + if BuyoutPriceGold:GetText() == "" then + AuctionsCreateAuctionButton:Disable() + end + end + end) + + -- Clear copper and silver prices if gold only box is unchecked + LeaPlusCB["AhGoldOnly"]:HookScript('OnClick', function() + if LeaPlusCB["AhGoldOnly"]:GetChecked() == false then + BuyoutPriceCopper:SetText("") + BuyoutPriceSilver:SetText("") + StartPriceCopper:SetText("") + StartPriceSilver:SetText("") + end + SetupAh(); + end) + + -- Create find button + AuctionsItemText:Hide() + LeaPlusLC:CreateButton("FindAuctionButton", AuctionsStackSizeMaxButton, "Find Item", "CENTER", 0, 68, 0, 21, false, "") + LeaPlusCB["FindAuctionButton"]:SetParent(AuctionFrameAuctions) + + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalFindItemButton = LeaPlusCB["FindAuctionButton"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalFindItemButton) + end + + -- Show find button when the auctions tab is shown + AuctionFrameAuctions:HookScript("OnShow", function() + LeaPlusCB["FindAuctionButton"]:SetEnabled(GetAuctionSellItemInfo() and true or false) + end) + + -- Show find button when a new item is added + AuctionsItemButton:HookScript("OnEvent", function(self, event) + if event == "NEW_AUCTION_UPDATE" then + LeaPlusCB["FindAuctionButton"]:SetEnabled(GetAuctionSellItemInfo() and true or false) + end + end) + + LeaPlusCB["FindAuctionButton"]:SetScript("OnClick", function() + if GetAuctionSellItemInfo() then + if BrowseWowTokenResults:IsShown() then + -- Stop if Game Time filter is currently shown + AuctionFrameTab1:Click() + LeaPlusLC:Print("To use the Find Item button, you need to deselect the WoW Token category.") + else + -- Otherwise, search for the required item + local name = GetAuctionSellItemInfo() + BrowseName:SetText('"' .. name .. '"') + AuctionFrameBrowse_Search() -- Workaround for quoted search from QueryAuctionItems(name, 0, 0, 0, false, 0, false, true) + AuctionFrameTab1:Click() + end + end + end) + + -- Clear the cursor and reset editboxes when a new item replaces an existing one + hooksecurefunc("AuctionsFrameAuctions_ValidateAuction", function() + if GetAuctionSellItemInfo() then + -- Return anything you might be holding + ClearCursor(); + -- Set copper and silver prices to 99 if gold mode is on + if LeaPlusLC["AhGoldOnly"] == "On" then + StartPriceCopper:SetText("99") + StartPriceSilver:SetText("99") + BuyoutPriceCopper:SetText("99") + BuyoutPriceSilver:SetText("99") + end + end + end) + + -- Clear gold editbox after an auction has been created (to force user to enter something) + AuctionsCreateAuctionButton:HookScript("OnClick", function() + StartPriceGold:SetText("") + BuyoutPriceGold:SetText("") + end) + + -- Set tab key actions (if different from defaults) + StartPriceGold:HookScript("OnTabPressed", function() + if not IsShiftKeyDown() then + if LeaPlusLC["AhBuyoutOnly"] == "Off" and LeaPlusLC["AhGoldOnly"] == "On" then + BuyoutPriceGold:SetFocus() + end + end + end) + + BuyoutPriceGold:HookScript("OnTabPressed", function() + if IsShiftKeyDown() then + if LeaPlusLC["AhBuyoutOnly"] == "Off" and LeaPlusLC["AhGoldOnly"] == "On" then + StartPriceGold:SetFocus() + end + end + end) + end + + -- Run function when Blizzard addon is loaded + if IsAddOnLoaded("Blizzard_AuctionUI") then + AuctionFunc() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "Blizzard_AuctionUI" then + AuctionFunc() + waitFrame:UnregisterAllEvents() + end + end) + end + + end + + ---------------------------------------------------------------------- + -- Show volume control on character frame + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowVolume"] == "On" then + + -- Function to update master volume + local function MasterVolUpdate() + if LeaPlusLC["ShowVolume"] == "On" then + -- Set the volume + SetCVar("Sound_MasterVolume", LeaPlusLC["LeaPlusMaxVol"]); + -- Format the slider text + LeaPlusCB["LeaPlusMaxVol"].f:SetFormattedText("%.0f", LeaPlusLC["LeaPlusMaxVol"] * 20) + end + end + + -- Create slider control + LeaPlusLC["LeaPlusMaxVol"] = tonumber(GetCVar("Sound_MasterVolume")); + LeaPlusLC:MakeSL(CharacterModelFrame, "LeaPlusMaxVol", "", 0, 1, 0.05, -42, -328, "%.2f") + LeaPlusCB["LeaPlusMaxVol"]:SetWidth(64) + LeaPlusCB["LeaPlusMaxVol"].f:ClearAllPoints() + LeaPlusCB["LeaPlusMaxVol"].f:SetPoint("LEFT", LeaPlusCB["LeaPlusMaxVol"], "RIGHT", 6, 0) + + -- Set slider control value when shown + LeaPlusCB["LeaPlusMaxVol"]:SetScript("OnShow", function() + LeaPlusCB["LeaPlusMaxVol"]:SetValue(GetCVar("Sound_MasterVolume")) + end) + + -- Update volume when slider control is changed + LeaPlusCB["LeaPlusMaxVol"]:HookScript("OnValueChanged", function() + if IsMouseButtonDown("RightButton") and IsShiftKeyDown() then + -- Dual layout is active so don't adjust slider + LeaPlusCB["LeaPlusMaxVol"].f:SetFormattedText("%.0f", LeaPlusLC["LeaPlusMaxVol"] * 20) + LeaPlusCB["LeaPlusMaxVol"]:Hide() + LeaPlusCB["LeaPlusMaxVol"]:Show() + return + else + -- Set sound level and refresh slider + MasterVolUpdate() + end + end) + + -- ElvUI skin for slider control + if LeaPlusLC.ElvUI then + _G.LeaPlusGlobalVolumeButton = LeaPlusCB["LeaPlusMaxVol"] + LeaPlusLC.ElvUI:GetModule("Skins"):HandleSliderFrame(_G.LeaPlusGlobalVolumeButton, false) + end + + end + + ---------------------------------------------------------------------- + -- Use arrow keys in chat + ---------------------------------------------------------------------- + + if LeaPlusLC["UseArrowKeysInChat"] == "On" and not LeaLockList["UseArrowKeysInChat"] then + -- Enable arrow keys for normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i .. "EditBox"]:SetAltArrowKeyMode(false) + end + end + -- Enable arrow keys for temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf .. "EditBox"]:SetAltArrowKeyMode(false) + end + end) + end + + ---------------------------------------------------------------------- + -- L41: Manage buffs + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageBuffs"] == "On" and not LeaLockList["ManageBuffs"] then + + -- Allow buff frame to be moved + BuffFrame:SetMovable(true) + BuffFrame:SetUserPlaced(true) + BuffFrame:SetDontSavePosition(true) + BuffFrame:SetClampedToScreen(true) + + -- Set buff frame position at startup + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + ConsolidatedBuffs:SetScale(LeaPlusLC["BuffFrameScale"]) + + -- Set buff frame position when the game resets it + hooksecurefunc("UIParent_UpdateTopFramePositions", function() + BuffFrame:SetMovable(true) + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + end) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("TOPRIGHT", BuffFrame, "TOPRIGHT", 0, 2.5) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0 }}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["BuffFrameScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + dragframe.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Buffs"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + BuffFrame:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + BuffFrame:StopMovingOrSizing() + LeaPlusLC["BuffFrameA"], void, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"] = BuffFrame:GetPoint() + BuffFrame:SetMovable(true) + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = -190, 225 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local BuffPanel = LeaPlusLC:CreatePanel("Manage buffs", "BuffPanel") + + LeaPlusLC:MakeTx(BuffPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(BuffPanel, "BuffFrameScale", "Drag to set the buffs frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["BuffFrameScale"]:HookScript("OnValueChanged", function() + BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + ConsolidatedBuffs:SetScale(LeaPlusLC["BuffFrameScale"]) + dragframe:SetScale(LeaPlusLC["BuffFrameScale"]) + -- Show formatted slider value + LeaPlusCB["BuffFrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["BuffFrameScale"] * 100) + end) + + -- Hide frame alignment grid with panel + BuffPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local BuffsToggleGridButton = LeaPlusLC:CreateButton("BuffsToggleGridButton", BuffPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["BuffsToggleGridButton"]:ClearAllPoints() + LeaPlusCB["BuffsToggleGridButton"]:SetPoint("LEFT", BuffPanel.h, "RIGHT", 10, 0) + LeaPlusCB["BuffsToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + BuffPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + BuffPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + BuffPanel.b:SetScript("OnClick", function() + BuffPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + BuffPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["BuffFrameA"] = "TOPRIGHT" + LeaPlusLC["BuffFrameR"] = "TOPRIGHT" + LeaPlusLC["BuffFrameX"] = -205 + LeaPlusLC["BuffFrameY"] = -13 + LeaPlusLC["BuffFrameScale"] = 1 + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + + -- Refresh configuration panel + BuffPanel:Hide(); BuffPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageBuffsButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["BuffFrameA"] = "TOPRIGHT" + LeaPlusLC["BuffFrameR"] = "TOPRIGHT" + LeaPlusLC["BuffFrameX"] = -271 + LeaPlusLC["BuffFrameY"] = 0 + LeaPlusLC["BuffFrameScale"] = 0.80 + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"]) + BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"]) + ConsolidatedBuffs:SetScale(LeaPlusLC["BuffFrameScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(280 * LeaPlusLC["gscale"]) + dragframe:SetHeight(225 * LeaPlusLC["gscale"]) + + -- Show configuration panel + BuffPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + BuffPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- L42: Manage frames + ---------------------------------------------------------------------- + + -- Frame Movement + if LeaPlusLC["FrmEnabled"] == "On" and not LeaLockList["FrmEnabled"] then + + -- Lock the player and target frames + PlayerFrame:RegisterForDrag() + TargetFrame:RegisterForDrag() + + -- Remove integrated movement functions to avoid conflicts + _G.PlayerFrame_ResetUserPlacedPosition = function() end + _G.TargetFrame_ResetUserPlacedPosition = function() end + _G.PlayerFrame_SetLocked = function() end + _G.TargetFrame_SetLocked = function() end + + -- Create frame table (used for local traversal) + local FrameTable = {DragPlayerFrame = PlayerFrame, DragTargetFrame = TargetFrame} + + -- Create main table structure in saved variables if it doesn't exist + if (LeaPlusDB["Frames"]) == nil then + LeaPlusDB["Frames"] = {} + end + + -- Create frame based table structure in saved variables if it doesn't exist and set initial scales + for k,v in pairs(FrameTable) do + local vf = v:GetName() + -- Create frame table structure if it doesn't exist + if not LeaPlusDB["Frames"][vf] then + LeaPlusDB["Frames"][vf] = {} + end + -- Set saved scale value to default if it doesn't exist + if not LeaPlusDB["Frames"][vf]["Scale"] then + LeaPlusDB["Frames"][vf]["Scale"] = 1.00 + end + -- Set frame scale to saved value + _G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + -- Don't save frame position + _G[vf]:SetMovable(true) + _G[vf]:SetUserPlaced(true) + _G[vf]:SetDontSavePosition(true) + end + + -- Set frames to manual values + local function LeaFramesSetPos(frame, point, parent, relative, xoff, yoff) + frame:SetMovable(true) + frame:ClearAllPoints() + frame:SetPoint(point, parent, relative, xoff, yoff) + end + + -- Set frames to default values + local function LeaPlusFramesDefaults() + LeaFramesSetPos(PlayerFrame , "TOPLEFT" , UIParent, "TOPLEFT" , -19, -4) + LeaFramesSetPos(TargetFrame , "TOPLEFT" , UIParent, "TOPLEFT" , 250, -4) + end + + -- Create configuration panel + local SideFrames = LeaPlusLC:CreatePanel("Manage frames", "SideFrames") + + -- Variable used to store currently selected frame + local currentframe + + -- Create scale title + LeaPlusLC:MakeTx(SideFrames, "Scale", 16, -72) + + -- Set initial slider value (will be changed when drag frames are selected) + LeaPlusLC["FrameScale"] = 1.00 + + -- Create scale slider + LeaPlusLC:MakeSL(SideFrames, "FrameScale", "Drag to set the scale of the selected frame.", 0.5, 3.0, 0.05, 16, -92, "%.2f") + LeaPlusCB["FrameScale"]:HookScript("OnValueChanged", function(self, value) + if currentframe then -- If a frame is selected + -- Set real and drag frame scale + LeaPlusDB["Frames"][currentframe]["Scale"] = value + _G[currentframe]:SetScale(LeaPlusDB["Frames"][currentframe]["Scale"]) + LeaPlusLC["Drag" .. currentframe]:SetScale(LeaPlusDB["Frames"][currentframe]["Scale"]) + -- If target frame scale is changed, also change combo point frame + if currentframe == "TargetFrame" then + ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + end + -- Set slider formatted text + LeaPlusCB["FrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FrameScale"] * 100) + end + end) + + -- Set initial scale slider state and value + LeaPlusCB["FrameScale"]:HookScript("OnShow", function() + if not currentframe then + -- No frame selected so select the player frame + currentframe = PlayerFrame:GetName() + LeaPlusLC["DragPlayerFrame"].t:SetVertexColor(0.0, 1.0, 0.0,0.5) + end + -- Set the scale slider value to the selected frame + LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]) + -- Set slider formatted text + LeaPlusCB["FrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FrameScale"] * 100) + end) + + -- Hide frame alignment grid with panel + SideFrames:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local FramesToggleGridButton = LeaPlusLC:CreateButton("FramesToggleGridButton", SideFrames, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["FramesToggleGridButton"]:ClearAllPoints() + LeaPlusCB["FramesToggleGridButton"]:SetPoint("LEFT", SideFrames.h, "RIGHT", 10, 0) + LeaPlusCB["FramesToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + SideFrames:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + SideFrames.h.tiptext = L["Drag the frame overlays with the left button to position them freely or with the right button to position them using snap-to-grid.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] + + -- Back button handler + SideFrames.b:SetScript("OnClick", function() + -- Hide outer control frame + SideFrames:Hide() + -- Hide drag frames + for k, void in pairs(FrameTable) do + LeaPlusLC[k]:Hide() + end + -- Show options panel at frame section + LeaPlusLC["PageF"]:Show() + LeaPlusLC["Page6"]:Show() + end) + + -- Reset button handler + SideFrames.r:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + -- If player is in combat, print error and stop + return + else + -- Set frames to default positions (presets) + LeaPlusFramesDefaults() + for k,v in pairs(FrameTable) do + local vf = v:GetName() + -- Store frame locations + LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = _G[vf]:GetPoint() + -- Reset real frame scales and save them + LeaPlusDB["Frames"][vf]["Scale"] = 1.00 + _G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + -- Reset drag frame scales + LeaPlusLC[k]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + end + -- Set combo frame scale to match target frame scale + ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + -- Set the scale slider value to the selected frame scale + LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]) + -- Refresh the panel + SideFrames:Hide(); SideFrames:Show() + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Show drag frames with configuration panel + SideFrames:HookScript("OnShow", function() + for k, void in pairs(FrameTable) do + LeaPlusLC[k]:Show() + end + end) + SideFrames:HookScript("OnHide", function() + for k, void in pairs(FrameTable) do + LeaPlusLC[k]:Hide() + end + end) + + -- Save frame positions + local function SaveAllFrames(DoNotSetPoint) + for k, v in pairs(FrameTable) do + local vf = v:GetName() + -- Stop real frames from moving + v:StopMovingOrSizing() + -- Save frame positions + LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = v:GetPoint() + if not DoNotSetPoint then + v:SetMovable(true) + v:ClearAllPoints() + v:SetPoint(LeaPlusDB["Frames"][vf]["Point"], UIParent, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"]) + end + end + end + + -- Prevent changes during combat + SideFrames:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + -- Hide controls frame + SideFrames:Hide() + -- Hide drag frames + for k,void in pairs(FrameTable) do + LeaPlusLC[k]:Hide() + end + -- Save frame positions without setpoint + SaveAllFrames(true) + end + end) + + -- Create drag frames + local function LeaPlusMakeDrag(dragframe,realframe) + + local dragframe = CreateFrame("Frame", nil, nil) + LeaPlusLC[dragframe] = dragframe + dragframe:SetSize(realframe:GetSize()) + dragframe:SetPoint("TOP", realframe, "TOP", 0, 2.5) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({ + edgeFile = "Interface/Tooltips/UI-Tooltip-Border", + tile = false, tileSize = 0, edgeSize = 16, + insets = { left = 0, right = 0, top = 0, bottom = 0 }}) + dragframe:SetToplevel(true) + dragframe:SetFrameStrata("HIGH") + + -- Set frame clamps + realframe:SetClampedToScreen(false) + + -- Hide the drag frame and make real frame movable + dragframe:Hide() + realframe:SetMovable(true) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + + -- Start dragging if left clicked + if btn == "LeftButton" then + realframe:SetMovable(true) + realframe:StartMoving() + end + + -- Set all drag frames to blue then tint the selected frame to green + for k,v in pairs(FrameTable) do + LeaPlusLC[k].t:SetVertexColor(0.0, 0.5, 1.0, 0.5) + end + dragframe.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + + -- Set currentframe variable to selected frame and set the scale slider value + currentframe = realframe:GetName() + LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]) + + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + SaveAllFrames() + end) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + dragframe.t:SetVertexColor(0.0, 0.5, 1.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + + -- Add titles + if realframe:GetName() == "PlayerFrame" then dragframe.f:SetText(L["Player"]) end + if realframe:GetName() == "TargetFrame" then dragframe.f:SetText(L["Target"]) end + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = frame:GetWidth(), frame:GetHeight() + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + realframe:ClearAllPoints() + realframe:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Return frame + return LeaPlusLC[dragframe] + + end + + for k,v in pairs(FrameTable) do + LeaPlusLC[k] = LeaPlusMakeDrag(k,v) + end + + -- Set frame scales + for k,v in pairs(FrameTable) do + local vf = v:GetName() + _G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + LeaPlusLC[k]:SetScale(LeaPlusDB["Frames"][vf]["Scale"]) + end + ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + + -- Load defaults first then overwrite with saved values if they exist + LeaPlusFramesDefaults() + if LeaPlusDB["Frames"] then + for k,v in pairs(FrameTable) do + local vf = v:GetName() + if LeaPlusDB["Frames"][vf] then + if LeaPlusDB["Frames"][vf]["Point"] and LeaPlusDB["Frames"][vf]["Relative"] and LeaPlusDB["Frames"][vf]["XOffset"] and LeaPlusDB["Frames"][vf]["YOffset"] then + _G[vf]:SetMovable(true) + _G[vf]:ClearAllPoints() + _G[vf]:SetPoint(LeaPlusDB["Frames"][vf]["Point"], UIParent, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"]) + end + end + end + end + + -- Add move button + LeaPlusCB["MoveFramesButton"]:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaFramesSetPos(PlayerFrame , "TOPLEFT" , UIParent, "TOPLEFT" , "-35" , "-14") + LeaFramesSetPos(TargetFrame , "TOPLEFT" , UIParent, "TOPLEFT" , "190" , "-14") + -- Player + LeaPlusDB["Frames"]["PlayerFrame"]["Scale"] = 1.20 + PlayerFrame:SetScale(LeaPlusDB["Frames"]["PlayerFrame"]["Scale"]) + LeaPlusLC["DragPlayerFrame"]:SetScale(LeaPlusDB["Frames"]["PlayerFrame"]["Scale"]) + -- Target + LeaPlusDB["Frames"]["TargetFrame"]["Scale"] = 1.20 + TargetFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + LeaPlusLC["DragTargetFrame"]:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]) + -- Set the slider to the selected frame (if there is one) + if currentframe then LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]); end + -- Save locations + for k,v in pairs(FrameTable) do + local vf = v:GetName() + LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = _G[vf]:GetPoint() + end + else + -- Show mover frame + SideFrames:Show() + LeaPlusLC:HideFrames() + + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set all scaled sizes + for k,v in pairs(FrameTable) do + LeaPlusLC[k]:SetWidth(v:GetWidth() * LeaPlusLC["gscale"]) + LeaPlusLC[k]:SetHeight(v:GetHeight() * LeaPlusLC["gscale"]) + end + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end + end) + + end + + ---------------------------------------------------------------------- + -- L43: Manage widget + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageWidget"] == "On" and not LeaLockList["ManageWidget"] then + + -- Create and manage container for UIWidgetTopCenterContainerFrame + local topCenterHolder = CreateFrame("Frame", nil, UIParent) + topCenterHolder:SetPoint("TOP", UIParent, "TOP", 0, -15) + topCenterHolder:SetSize(10, 58) + + local topCenterContainer = _G.UIWidgetTopCenterContainerFrame + topCenterContainer:ClearAllPoints() + topCenterContainer:SetPoint('CENTER', topCenterHolder) + + hooksecurefunc(topCenterContainer, 'SetPoint', function(self, void, b) + if b and (b ~= topCenterHolder) then + -- Reset parent if it changes from topCenterHolder + self:ClearAllPoints() + self:SetPoint('CENTER', topCenterHolder) + self:SetParent(topCenterHolder) + end + end) + + -- Allow widget frame to be moved + topCenterHolder:SetMovable(true) + topCenterHolder:SetUserPlaced(true) + topCenterHolder:SetDontSavePosition(true) + topCenterHolder:SetClampedToScreen(false) + + -- Set widget frame position at startup + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + topCenterHolder:SetScale(LeaPlusLC["WidgetScale"]) + UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetPoint("CENTER", topCenterHolder, "CENTER", 0, 1) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["WidgetScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + dragframe.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Widget"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + topCenterHolder:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame position + topCenterHolder:StopMovingOrSizing() + LeaPlusLC["WidgetA"], void, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"] = topCenterHolder:GetPoint() + topCenterHolder:SetMovable(true) + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 0, 60 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local WidgetPanel = LeaPlusLC:CreatePanel("Manage widget", "WidgetPanel") + + -- Create Titan Panel screen adjust warning + local titanFrame = CreateFrame("FRAME", nil, WidgetPanel) + titanFrame:SetAllPoints() + titanFrame:Hide() + LeaPlusLC:MakeTx(titanFrame, "Warning", 16, -172) + titanFrame.txt = LeaPlusLC:MakeWD(titanFrame, "Titan Panel screen adjust needs to be disabled for the frame to be saved correctly.", 16, -192, 500) + titanFrame.txt:SetWordWrap(false) + titanFrame.txt:SetWidth(520) + titanFrame.btn = LeaPlusLC:CreateButton("fixTitanBtn", titanFrame, "Okay, disable screen adjust for me", "TOPLEFT", 16, -212, 0, 25, true, "Click to disable Titan Panel screen adjust. Your UI will be reloaded.") + titanFrame.btn:SetScript("OnClick", function() + TitanPanelSetVar("ScreenAdjust", 1) + ReloadUI() + end) + + LeaPlusLC:MakeTx(WidgetPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(WidgetPanel, "WidgetScale", "Drag to set the widget scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Set scale when slider is changed + LeaPlusCB["WidgetScale"]:HookScript("OnValueChanged", function() + topCenterHolder:SetScale(LeaPlusLC["WidgetScale"]) + UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"]) + dragframe:SetScale(LeaPlusLC["WidgetScale"]) + -- Show formatted slider value + LeaPlusCB["WidgetScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["WidgetScale"] * 100) + end) + + -- Hide frame alignment grid with panel + WidgetPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local WidgetToggleGridButton = LeaPlusLC:CreateButton("WidgetToggleGridButton", WidgetPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["WidgetToggleGridButton"]:ClearAllPoints() + LeaPlusCB["WidgetToggleGridButton"]:SetPoint("LEFT", WidgetPanel.h, "RIGHT", 10, 0) + LeaPlusCB["WidgetToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + WidgetPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + WidgetPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] + + -- Back button handler + WidgetPanel.b:SetScript("OnClick", function() + WidgetPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + WidgetPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["WidgetA"] = "TOP" + LeaPlusLC["WidgetR"] = "TOP" + LeaPlusLC["WidgetX"] = 0 + LeaPlusLC["WidgetY"] = -15 + LeaPlusLC["WidgetScale"] = 1 + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + + -- Refresh configuration panel + WidgetPanel:Hide(); WidgetPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageWidgetButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["WidgetA"] = "CENTER" + LeaPlusLC["WidgetR"] = "CENTER" + LeaPlusLC["WidgetX"] = 0 + LeaPlusLC["WidgetY"] = -160 + LeaPlusLC["WidgetScale"] = 1.25 + topCenterHolder:ClearAllPoints() + topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"]) + topCenterHolder:SetScale(LeaPlusLC["WidgetScale"]) + UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"]) + else + -- Show Titan Panel screen adjust warning if Titan Panel is installed with screen adjust enabled + if select(2, GetAddOnInfo("TitanClassic")) then + if IsAddOnLoaded("TitanClassic") then + if TitanPanelSetVar and TitanPanelGetVar then + if not TitanPanelGetVar("ScreenAdjust") then + titanFrame:Show() + end + end + end + end + + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size according to UI scale + dragframe:SetWidth(160 * LeaPlusLC["gscale"]) + dragframe:SetHeight(79 * LeaPlusLC["gscale"]) + + -- Show configuration panel + WidgetPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end) + + -- Hide drag frame when configuration panel is closed + WidgetPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- L44: Manage focus + ---------------------------------------------------------------------- + + if LeaPlusLC["ManageFocus"] == "On" and not LeaLockList["ManageFocus"] then + + -- Remove integrated movement function to avoid conflicts + _G.FocusFrame_SetLock = function() end + _G.FocusFrame.SetSmallSize = function() end + + -- Allow focus frame to be moved + FocusFrame:SetMovable(true) + FocusFrame:SetUserPlaced(true) + FocusFrame:SetDontSavePosition(true) + FocusFrame:SetClampedToScreen(true) + + -- Set focus frame position at startup + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + FocusFrame:SetScale(LeaPlusLC["FocusScale"]) + + -- Create drag frame + local dragframe = CreateFrame("FRAME", nil, nil) + dragframe:SetBackdropColor(0.0, 0.5, 1.0) + dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}}) + dragframe:SetToplevel(true) + dragframe:Hide() + dragframe:SetScale(LeaPlusLC["FocusScale"]) + + dragframe.t = dragframe:CreateTexture() + dragframe.t:SetAllPoints() + dragframe.t:SetVertexColor(0.0, 1.0, 0.0, 0.5) + dragframe.t:SetAlpha(0.5) + + dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + dragframe.f:SetPoint('CENTER', 0, 0) + dragframe.f:SetText(L["Focus"]) + + -- Click handler + dragframe:SetScript("OnMouseDown", function(self, btn) + -- Start dragging if left clicked + if btn == "LeftButton" then + FocusFrame:StartMoving() + end + end) + + dragframe:SetScript("OnMouseUp", function() + -- Save frame positions + FocusFrame:StopMovingOrSizing() + LeaPlusLC["FocusA"], void, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"] = FocusFrame:GetPoint() + FocusFrame:SetMovable(true) + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + end) + + -- Snap-to-grid + do + local frame, grid = dragframe, 10 + local w, h = 196, 86 + local xpos, ypos, scale, uiscale + frame:RegisterForDrag("RightButton") + frame:HookScript("OnDragStart", function() + frame:SetScript("OnUpdate", function() + scale, uiscale = frame:GetScale(), UIParent:GetScale() + xpos, ypos = GetCursorPosition() + xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2 + ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2 + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos) + end) + end) + frame:HookScript("OnDragStop", function() + frame:SetScript("OnUpdate", nil) + frame:GetScript("OnMouseUp")() + end) + end + + -- Create configuration panel + local FocusPanel = LeaPlusLC:CreatePanel("Manage focus", "FocusPanel") + LeaPlusLC:MakeTx(FocusPanel, "Scale", 16, -72) + LeaPlusLC:MakeSL(FocusPanel, "FocusScale", "Drag to set the focus frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f") + + -- Hide panel during combat + FocusPanel:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + FocusFrame:StopMovingOrSizing() + FocusPanel:Hide() + end + end) + + -- Set scale when slider is changed + LeaPlusCB["FocusScale"]:HookScript("OnValueChanged", function() + FocusFrame:SetScale(LeaPlusLC["FocusScale"]) + dragframe:SetScale(LeaPlusLC["FocusScale"]) + -- Show formatted slider value + LeaPlusCB["FocusScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FocusScale"] * 100) + end) + + -- Hide frame alignment grid with panel + FocusPanel:HookScript("OnHide", function() + LeaPlusLC.grid:Hide() + end) + + -- Toggle grid button + local WidgetToggleGridButton = LeaPlusLC:CreateButton("FocusToggleGridButton", FocusPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.") + LeaPlusCB["FocusToggleGridButton"]:ClearAllPoints() + LeaPlusCB["FocusToggleGridButton"]:SetPoint("LEFT", FocusPanel.h, "RIGHT", 10, 0) + LeaPlusCB["FocusToggleGridButton"]:SetScript("OnClick", function() + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + end) + FocusPanel:HookScript("OnHide", function() + if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end + end) + + -- Help button tooltip + FocusPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid.|n|nThis panel will close automatically if you enter combat."] + + -- Back button handler + FocusPanel.b:SetScript("OnClick", function() + FocusPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show() + return + end) + + -- Reset button handler + FocusPanel.r:SetScript("OnClick", function() + + -- Reset position and scale + LeaPlusLC["FocusA"] = "CENTER" + LeaPlusLC["FocusR"] = "CENTER" + LeaPlusLC["FocusX"] = 0 + LeaPlusLC["FocusY"] = 0 + LeaPlusLC["FocusScale"] = 1 + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + + -- Refresh configuration panel + FocusPanel:Hide(); FocusPanel:Show() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + + end) + + -- Show configuration panel when options panel button is clicked + LeaPlusCB["ManageFocusButton"]:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["FocusA"] = "TOPLEFT" + LeaPlusLC["FocusR"] = "TOPLEFT" + LeaPlusLC["FocusX"] = 250 + LeaPlusLC["FocusY"] = -240 + LeaPlusLC["FocusScale"] = 1.00 + FocusFrame:ClearAllPoints() + FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"]) + FocusFrame:SetScale(LeaPlusLC["FocusScale"]) + else + -- Find out if the UI has a non-standard scale + if GetCVar("useuiscale") == "1" then + LeaPlusLC["gscale"] = GetCVar("uiscale") + else + LeaPlusLC["gscale"] = 1 + end + + -- Set drag frame size and position according to UI scale + dragframe:SetWidth(196 * LeaPlusLC["gscale"]) + dragframe:SetHeight(76 * LeaPlusLC["gscale"]) + dragframe:ClearAllPoints() + dragframe:SetPoint("CENTER", FocusFrame, "CENTER", -18 * LeaPlusLC["gscale"], 6 * LeaPlusLC["gscale"]) + + -- Show configuration panel + FocusPanel:Show() + LeaPlusLC:HideFrames() + dragframe:Show() + + -- Show frame alignment grid + LeaPlusLC.grid:Show() + end + end + end) + + -- Hide drag frame when configuration panel is closed + FocusPanel:HookScript("OnHide", function() dragframe:Hide() end) + + end + + ---------------------------------------------------------------------- + -- Hide chat buttons + ---------------------------------------------------------------------- + + if LeaPlusLC["NoChatButtons"] == "On" and not LeaLockList["NoChatButtons"] then + + -- Create hidden frame to store unwanted frames (more efficient than creating functions) + local tframe = CreateFrame("FRAME") + tframe:Hide() + + -- Function to enable mouse scrolling with CTRL and SHIFT key modifiers + local function AddMouseScroll(chtfrm) + if _G[chtfrm] then + _G[chtfrm]:SetScript("OnMouseWheel", function(self, direction) + if direction == 1 then + if IsControlKeyDown() then + self:ScrollToTop() + elseif IsShiftKeyDown() then + self:PageUp() + else + self:ScrollUp() + end + else + if IsControlKeyDown() then + self:ScrollToBottom() + elseif IsShiftKeyDown() then + self:PageDown() + else + self:ScrollDown() + end + end + end) + _G[chtfrm]:EnableMouseWheel(true) + end + end + + -- Function to hide chat buttons + local function HideButtons(chtfrm) + _G[chtfrm .. "ButtonFrameUpButton"]:SetParent(tframe) + _G[chtfrm .. "ButtonFrameDownButton"]:SetParent(tframe) + _G[chtfrm .. "ButtonFrameMinimizeButton"]:SetParent(tframe) + _G[chtfrm .. "ButtonFrameUpButton"]:Hide(); + _G[chtfrm .. "ButtonFrameDownButton"]:Hide(); + _G[chtfrm .. "ButtonFrameMinimizeButton"]:Hide(); + _G[chtfrm .. "ButtonFrame"]:SetSize(0.1,0.1) + end + + -- Function to highlight chat tabs and click to scroll to bottom + local function HighlightTabs(chtfrm) + + -- Hide bottom button + _G[chtfrm .. "ButtonFrameBottomButton"]:SetSize(0.1, 0.1) -- Positions it away + + -- Remove click from the bottom button + _G[chtfrm .. "ButtonFrameBottomButton"]:SetScript("OnClick", nil) + + -- Remove textures + _G[chtfrm .. "ButtonFrameBottomButton"]:SetNormalTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetHighlightTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetPushedTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetDisabledTexture("") + + -- Resize bottom button according to tab size + _G[chtfrm .. "Tab"]:SetScript("OnSizeChanged", function() + for j = 1, 50 do + -- Resize bottom button to tab width + if _G["ChatFrame" .. j .. "ButtonFrameBottomButton"] then + _G["ChatFrame" .. j .. "ButtonFrameBottomButton"]:SetWidth(_G["ChatFrame" .. j .. "Tab"]:GetWidth()-10) + end + end + -- If combat log is hidden, resize it's bottom button + if LeaPlusLC["NoCombatLogTab"] == "On" and not LeaLockList["NoCombatLogTab"] then + if _G["ChatFrame2ButtonFrameBottomButton"] then + -- Resize combat log bottom button + _G["ChatFrame2ButtonFrameBottomButton"]:SetWidth(0.1); + end + end + end) + + -- Remove click from the bottom button + _G[chtfrm .. "ButtonFrameBottomButton"]:SetScript("OnClick", nil) + + -- Remove textures + _G[chtfrm .. "ButtonFrameBottomButton"]:SetNormalTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetHighlightTexture("") + _G[chtfrm .. "ButtonFrameBottomButton"]:SetPushedTexture("") + + -- Always scroll to bottom when clicking a tab + _G[chtfrm .. "Tab"]:HookScript("OnClick", function(self,arg1) + if arg1 == "LeftButton" then + _G[chtfrm]:ScrollToBottom(); + end + end) + + -- Create new bottom button under tab + _G[chtfrm .. "Tab"].newglow = _G[chtfrm .. "Tab"]:CreateTexture(nil, "BACKGROUND") + _G[chtfrm .. "Tab"].newglow:ClearAllPoints() + _G[chtfrm .. "Tab"].newglow:SetPoint("BOTTOMLEFT", _G[chtfrm .. "Tab"], "BOTTOMLEFT", 0, 0) + _G[chtfrm .. "Tab"].newglow:SetTexture("Interface\\ChatFrame\\ChatFrameTab-NewMessage") + _G[chtfrm .. "Tab"].newglow:SetWidth(_G[chtfrm .. "Tab"]:GetWidth()) + _G[chtfrm .. "Tab"].newglow:SetVertexColor(0.6, 0.6, 1, 1) + _G[chtfrm .. "Tab"].newglow:Hide() + + -- Show new bottom button when old one glows + _G[chtfrm .. "ButtonFrameBottomButtonFlash"]:HookScript("OnShow", function(self,arg1) + _G[chtfrm .. "Tab"].newglow:Show() + end) + + _G[chtfrm .. "ButtonFrameBottomButtonFlash"]:HookScript("OnHide", function(self,arg1) + _G[chtfrm .. "Tab"].newglow:Hide() + end) + + -- Match new bottom button size to tab + _G[chtfrm .. "Tab"]:HookScript("OnSizeChanged", function() + _G[chtfrm .. "Tab"].newglow:SetWidth(_G[chtfrm .. "Tab"]:GetWidth()) + end) + + end + + -- Hide chat menu buttons + ChatFrameMenuButton:SetParent(tframe) + ChatFrameChannelButton:SetParent(tframe) + + -- Set options for normal and existing chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + AddMouseScroll("ChatFrame" .. i); + HideButtons("ChatFrame" .. i); + HighlightTabs("ChatFrame" .. i) + end + end + + -- Do the functions above for temporary chat frames + hooksecurefunc("FCF_OpenTemporaryWindow", function(chatType) + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + -- Set options for temporary frame + AddMouseScroll(cf) + HideButtons(cf) + HighlightTabs(cf) + -- Resize flashing alert to match tab width + _G[cf .. "Tab"]:SetScript("OnSizeChanged", function() + _G[cf .. "ButtonFrameBottomButton"]:SetWidth(_G[cf .. "Tab"]:GetWidth()-10) + end) + end + end) + + -- Hide text to speech button + TextToSpeechButton:SetParent(tframe) + + end + + ---------------------------------------------------------------------- + -- Recent chat window + ---------------------------------------------------------------------- + + if LeaPlusLC["RecentChatWindow"] == "On" and not LeaLockList["RecentChatWindow"] then + + -- Create recent chat frame + local editFrame = CreateFrame("ScrollFrame", nil, UIParent, "InputScrollFrameTemplate") + + -- Set frame parameters + editFrame:ClearAllPoints() + editFrame:SetPoint("BOTTOM", 0, 130) + editFrame:SetSize(600, LeaPlusLC["RecentChatSize"]) + editFrame:SetFrameStrata("MEDIUM") + editFrame:SetToplevel(true) + editFrame:Hide() + editFrame.CharCount:Hide() + + -- Add background color + editFrame.t = editFrame:CreateTexture(nil, "BACKGROUND") + editFrame.t:SetAllPoints() + editFrame.t:SetVertexColor(0.00, 0.00, 0.0, 0.6) + + -- Set textures + editFrame.LeftTex:SetTexture(editFrame.RightTex:GetTexture()); editFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + editFrame.BottomTex:SetTexture(editFrame.TopTex:GetTexture()); editFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomRightTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + editFrame.BottomLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + editFrame.TopLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Create title bar + local titleFrame = CreateFrame("ScrollFrame", nil, editFrame, "InputScrollFrameTemplate") + titleFrame:ClearAllPoints() + titleFrame:SetPoint("TOP", 0, 32) + titleFrame:SetSize(600, 24) + titleFrame:SetFrameStrata("MEDIUM") + titleFrame:SetToplevel(true) + titleFrame:SetHitRectInsets(-6, -6, -6, -6) + titleFrame.CharCount:Hide() + titleFrame.t = titleFrame:CreateTexture(nil, "BACKGROUND") + titleFrame.t:SetAllPoints() + titleFrame.t:SetVertexColor(0.00, 0.00, 0.0, 0.6) + titleFrame.LeftTex:SetTexture(titleFrame.RightTex:GetTexture()); titleFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + titleFrame.BottomTex:SetTexture(titleFrame.TopTex:GetTexture()); titleFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomRightTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + titleFrame.BottomLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + titleFrame.TopLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + + -- Add message count + titleFrame.m = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.m:SetPoint("LEFT", 4, 0) + titleFrame.m:SetText(L["Messages"] .. ": 0") + titleFrame.m:SetFont(titleFrame.m:GetFont(), 16, nil) + + -- Add right-click to close message + titleFrame.x = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") + titleFrame.x:SetPoint("RIGHT", -4, 0) + titleFrame.x:SetText(L["Drag to size"] .. " | " .. L["Right-click to close"]) + titleFrame.x:SetFont(titleFrame.x:GetFont(), 16, nil) + titleFrame.x:SetWidth(600 - titleFrame.m:GetStringWidth() - 30) + titleFrame.x:SetWordWrap(false) + titleFrame.x:SetJustifyH("RIGHT") + + local titleBox = titleFrame.EditBox + titleBox:Hide() + titleBox:SetEnabled(false) + + -- Drag to resize + editFrame:SetResizable(true) + editFrame:SetResizeBounds(600, 170, 600, 560) + + titleFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + editFrame:StartSizing("TOP") + end + end) + titleFrame:HookScript("OnMouseUp", function(self, btn) + if btn == "LeftButton" then + editFrame:StopMovingOrSizing() + LeaPlusLC["RecentChatSize"] = editFrame:GetHeight() + elseif btn == "MiddleButton" then + -- Reset frame size + LeaPlusLC["RecentChatSize"] = 170 + editFrame:SetSize(600, LeaPlusLC["RecentChatSize"]) + editFrame:ClearAllPoints() + editFrame:SetPoint("BOTTOM", 0, 130) + end + end) + + -- Create editbox + local editBox = editFrame.EditBox + editBox:SetAltArrowKeyMode(false) + editBox:SetTextInsets(4, 4, 4, 4) + editBox:SetWidth(editFrame:GetWidth() - 30) + editBox:SetSecurityDisablePaste() + editBox:SetMaxLetters(0) + + -- Manage focus + editBox:HookScript("OnEditFocusLost", function() + if MouseIsOver(titleFrame) and IsMouseButtonDown("LeftButton") then + editBox:SetFocus() + end + end) + + -- Close frame with right-click of editframe or editbox + local function CloseRecentChatWindow() + editBox:SetText("") + editBox:ClearFocus() + editFrame:Hide() + end + + editFrame:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then CloseRecentChatWindow() end + end) + + editBox:SetScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then CloseRecentChatWindow() end + end) + + titleFrame:HookScript("OnMouseDown", function(self, btn) + if btn == "RightButton" then CloseRecentChatWindow() end + end) + + -- Disable text changes while still allowing editing controls to work + editBox:EnableKeyboard(false) + editBox:SetScript("OnKeyDown", function() end) + + --- Clear highlighted text if escape key is pressed + editBox:HookScript("OnEscapePressed", function() + editBox:HighlightText(0, 0) + editBox:ClearFocus() + end) + + -- Clear highlighted text and clear focus if enter key is pressed + editBox:SetScript("OnEnterPressed", function() + editBox:HighlightText(0, 0) + editBox:ClearFocus() + end) + + -- Populate recent chat frame with chat messages + local function ShowChatbox(chtfrm) + editBox:SetText("") + local NumMsg = chtfrm:GetNumMessages() + local StartMsg = 1 + if NumMsg > 128 then StartMsg = NumMsg - 127 end + local totalMsgCount = 0 + for iMsg = StartMsg, NumMsg do + local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg) + if chatMessage then + + -- Handle Battle.net messages + if string.match(chatMessage, "k:(%d+):(%d+):BN_WHISPER:") + or string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_ALERT:") + or string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_BROADCAST:") + then + local ctype + if string.match(chatMessage, "k:(%d+):(%d+):BN_WHISPER:") then + ctype = "BN_WHISPER" + elseif string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_ALERT:") then + ctype = "BN_INLINE_TOAST_ALERT" + elseif string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_BROADCAST:") then + ctype = "BN_INLINE_TOAST_BROADCAST" + end + local id = tonumber(string.match(chatMessage, "k:(%d+):%d+:" .. ctype .. ":")) + local totalBNFriends = BNGetNumFriends() + for friendIndex = 1, totalBNFriends do + local bnetAccountID, void, battleTag = BNGetFriendInfo(friendIndex) + if id == bnetAccountID then + battleTag = strsplit("#", battleTag) + chatMessage = chatMessage:gsub("(|HBNplayer%S-|k)(%d-)(:%S-" .. ctype .. "%S-|h)%[(%S-)%](|?h?)(:?)", "[" .. battleTag .. "]:") + end + end + end + + -- Handle colors + if r and g and b then + local colorCode = RGBToColorCode(r, g, b) + chatMessage = colorCode .. chatMessage + end + + chatMessage = gsub(chatMessage, "|T.-|t", "") -- Remove textures + chatMessage = gsub(chatMessage, "|A.-|a", "") -- Remove atlases + editBox:Insert(chatMessage .. "|r|n") + + end + totalMsgCount = totalMsgCount + 1 + end + titleFrame.m:SetText(L["Messages"] .. ": " .. totalMsgCount) + editFrame:SetVerticalScroll(0) + LibCompat.After(0.1, function() editFrame.ScrollBar.ScrollDownButton:Click() end) + editFrame:Show() + editBox:ClearFocus() + end + + -- Hook normal chat frame tab clicks + for i = 1, 50 do + if _G["ChatFrame" .. i] then + _G["ChatFrame" .. i .. "Tab"]:HookScript("OnClick", function() + if IsControlKeyDown() then + editBox:SetFont(_G["ChatFrame" .. i]:GetFont()) + ShowChatbox(_G["ChatFrame" .. i]) + end + end) + end + end + + -- Hook temporary chat frame tab clicks + hooksecurefunc("FCF_OpenTemporaryWindow", function() + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + _G[cf .. "Tab"]:HookScript("OnClick", function() + if IsControlKeyDown() then + editBox:SetFont(_G[cf]:GetFont()) + ShowChatbox(_G[cf]) + end + end) + end + end) + + end + + ---------------------------------------------------------------------- + -- Show cooldowns + ---------------------------------------------------------------------- + + if LeaPlusLC["ShowCooldowns"] == "On" then + + -- Create main table structure in saved variables if it doesn't exist + if LeaPlusDB["Cooldowns"] == nil then + LeaPlusDB["Cooldowns"] = {} + end + + -- Create class tables if they don't exist + local classList = {"WARRIOR", "PALADIN", "HUNTER", "SHAMAN", "ROGUE", "DRUID", "MAGE", "WARLOCK", "PRIEST", "DEATHKNIGHT"} + for index = 1, #classList do + if LeaPlusDB["Cooldowns"][classList[index]] == nil then + LeaPlusDB["Cooldowns"][classList[index]] = {} + end + end + + -- Get current class + local PlayerClass = select(2, UnitClass("player")) + local activeSpec = 1 -- Fixed to 1 for Classic + + -- Create local tables to store cooldown frames and editboxes + local icon = {} -- Used to store cooldown frames + local SpellEB = {} -- Used to store editbox values + local iCount = 5 -- Number of cooldowns + + -- Create cooldown frames + for i = 1, iCount do + + -- Create cooldown frame + icon[i] = CreateFrame("Frame", nil, UIParent) + icon[i]:SetFrameStrata("BACKGROUND") + icon[i]:SetWidth(20) + icon[i]:SetHeight(20) + + -- Create cooldown icon + icon[i].c = CreateFrame("Cooldown", nil, icon[i], "CooldownFrameTemplate") + icon[i].c:SetAllPoints() + icon[i].c:SetReverse(true) + + -- Create blank texture (will be assigned a cooldown texture later) + icon[i].t = icon[i]:CreateTexture(nil,"BACKGROUND") + icon[i].t:SetAllPoints() + + -- Show icon above target frame and set initial scale + icon[i]:ClearAllPoints() + icon[i]:SetPoint("TOPLEFT", TargetFrame, "TOPLEFT", 6 + (22 * (i - 1)), 5) + icon[i]:SetScale(TargetFrame:GetScale()) + + -- Show tooltip + icon[i]:SetScript("OnEnter", function(self) + GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT", 15, -25) + GameTooltip:SetText(GetSpellInfo(LeaPlusCB["Spell" .. i]:GetText())) + end) + + -- Hide tooltip + icon[i]:SetScript("OnLeave", GameTooltip_Hide) + + end + + -- Change cooldown icon scale when player frame scale changes + PlayerFrame:HookScript("OnSizeChanged", function() + if LeaPlusLC["CooldownsOnPlayer"] == "On" then + for i = 1, iCount do + icon[i]:SetScale(PlayerFrame:GetScale()) + end + end + end) + + -- Change cooldown icon scale when target frame scale changes + TargetFrame:HookScript("OnSizeChanged", function() + if LeaPlusLC["CooldownsOnPlayer"] == "Off" then + for i = 1, iCount do + icon[i]:SetScale(TargetFrame:GetScale()) + end + end + end) + + -- Function to show cooldown textures in the cooldown frames (run when icons are loaded or changed) + local function ShowIcon(i, id, owner) + + local void + + -- Get spell information + local spell, void, path = GetSpellInfo(id) + if spell and path then + + -- Set icon texture to the spell texture + icon[i].t:SetTexture(path) + + -- Set top level and raise frame strata (ensures tooltips show properly) + icon[i]:SetToplevel(true) + icon[i]:SetFrameStrata("LOW") + + -- Handle events + icon[i]:RegisterUnitEvent("UNIT_AURA", owner) + icon[i]:RegisterUnitEvent("UNIT_PET", "player") + icon[i]:SetScript("OnEvent", function(self, event, arg1) + + -- If pet was dismissed (or otherwise disappears such as when flying), hide pet cooldowns + if event == "UNIT_PET" then + if not UnitExists("pet") then + if LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] then + icon[i]:Hide() + end + end + + -- Ensure cooldown belongs to the owner we are watching (player or pet) + elseif arg1 == owner then + + -- Hide the cooldown frame (required for cooldowns to disappear after the duration) + icon[i]:Hide() + + -- If buff matches cooldown we want, start the cooldown + for q = 1, 40 do + local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff(owner, q) + if spellID and id == spellID then + icon[i]:Show() + local start = expire - length + CooldownFrame_Set(icon[i].c, start, length, 1) + end + end + + end + end) + + else + + -- Spell does not exist so stop watching it + icon[i]:SetScript("OnEvent", nil) + icon[i]:Hide() + + end + + end + + -- Create configuration panel + local CooldownPanel = LeaPlusLC:CreatePanel("Show cooldowns", "CooldownPanel") + + -- Function to refresh the editbox tooltip with the spell name + local function RefSpellTip(self,elapsed) + local spellinfo, void, icon = GetSpellInfo(self:GetText()) + if spellinfo and spellinfo ~= "" and icon and icon ~= "" then + GameTooltip:SetOwner(self, "ANCHOR_NONE") + GameTooltip:ClearAllPoints() + GameTooltip:SetPoint("RIGHT", self, "LEFT", -10, 0) + GameTooltip:SetText("|T" .. icon .. ":0|t " .. spellinfo, nil, nil, nil, nil, true) + else + GameTooltip:Hide() + end + end + + -- Function to create spell ID editboxes and pet checkboxes + local function MakeSpellEB(num, x, y, tab, shifttab) + + -- Create editbox for spell ID + SpellEB[num] = LeaPlusLC:CreateEditBox("Spell" .. num, CooldownPanel, 70, 6, "TOPLEFT", x, y - 20, "Spell" .. tab, "Spell" .. shifttab) + SpellEB[num]:SetNumeric(true) + + -- Set initial value (for current spec) + SpellEB[num]:SetText(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. num .. "Idn"] or "") + + -- Refresh tooltip when mouse is hovering over the editbox + SpellEB[num]:SetScript("OnEnter", function() + SpellEB[num]:SetScript("OnUpdate", RefSpellTip) + end) + SpellEB[num]:SetScript("OnLeave", function() + SpellEB[num]:SetScript("OnUpdate", nil) + GameTooltip:Hide() + end) + + -- Create checkbox for pet cooldown + LeaPlusLC:MakeCB(CooldownPanel, "Spell" .. num .."Pet", "", 462, y - 20, false, "") + LeaPlusCB["Spell" .. num .."Pet"]:SetHitRectInsets(0, 0, 0, 0) + + end + + -- Add titles + LeaPlusLC:MakeTx(CooldownPanel, "Spell ID", 384, -92) + LeaPlusLC:MakeTx(CooldownPanel, "Pet", 462, -92) + + -- Add editboxes and checkboxes + MakeSpellEB(1, 386, -92, "2", "5") + MakeSpellEB(2, 386, -122, "3", "1") + MakeSpellEB(3, 386, -152, "4", "2") + MakeSpellEB(4, 386, -182, "5", "3") + MakeSpellEB(5, 386, -212, "1", "4") + + -- Add checkboxes + LeaPlusLC:MakeTx(CooldownPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(CooldownPanel, "ShowCooldownID", "Show the spell ID in buff icon tooltips", 16, -92, false, "If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."); + LeaPlusLC:MakeCB(CooldownPanel, "NoCooldownDuration", "Hide cooldown duration numbers (if enabled)", 16, -112, false, "If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu).") + LeaPlusLC:MakeCB(CooldownPanel, "CooldownsOnPlayer", "Show cooldowns above the player frame", 16, -132, false, "If checked, cooldown icons will be shown above the player frame instead of the target frame.|n|nIf unchecked, cooldown icons will be shown above the target frame.") + + -- Function to save the panel control settings and refresh the cooldown icons + local function SavePanelControls() + for i = 1, iCount do + + -- Refresh the cooldown texture + icon[i].c:SetCooldown(0,0) + + -- Show icons above target or player frame + icon[i]:ClearAllPoints() + if LeaPlusLC["CooldownsOnPlayer"] == "On" then + icon[i]:SetPoint("TOPLEFT", PlayerFrame, "TOPLEFT", 116 + (22 * (i - 1)), 5) + icon[i]:SetScale(PlayerFrame:GetScale()) + else + icon[i]:SetPoint("TOPLEFT", TargetFrame, "TOPLEFT", 6 + (22 * (i - 1)), 5) + icon[i]:SetScale(TargetFrame:GetScale()) + end + + -- Save control states to globals + LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Idn"] = SpellEB[i]:GetText() + LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] = LeaPlusCB["Spell" .. i .."Pet"]:GetChecked() + + -- Set cooldowns + if LeaPlusCB["Spell" .. i .."Pet"]:GetChecked() then + ShowIcon(i, tonumber(SpellEB[i]:GetText()), "pet") + else + ShowIcon(i, tonumber(SpellEB[i]:GetText()), "player") + end + + -- Show or hide cooldown duration + if LeaPlusLC["NoCooldownDuration"] == "On" then + icon[i].c:SetHideCountdownNumbers(true) + else + icon[i].c:SetHideCountdownNumbers(false) + end + + -- Show or hide cooldown icons depending on current buffs + local newowner + local newspell = tonumber(SpellEB[i]:GetText()) + + if newspell then + if LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] then + newowner = "pet" + else + newowner = "player" + end + -- Hide cooldown icon + icon[i]:Hide() + + -- If buff matches spell we want, show cooldown icon + for q = 1, 40 do + local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff(newowner, q) + if spellID and newspell == spellID then + icon[i]:Show() + -- Set the cooldown to the buff cooldown + CooldownFrame_Set(icon[i].c, expire - length, length, 1) + end + end + end + + end + + end + + -- Update cooldown icons when checkboxes are clicked + LeaPlusCB["NoCooldownDuration"]:HookScript("OnClick", SavePanelControls) + LeaPlusCB["CooldownsOnPlayer"]:HookScript("OnClick", SavePanelControls) + + -- Help button tooltip + CooldownPanel.h.tiptext = L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] + + -- Back button handler + CooldownPanel.b:SetScript("OnClick", function() + CooldownPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show() + return + end) + + -- Reset button handler + CooldownPanel.r:SetScript("OnClick", function() + -- Reset the checkboxes + LeaPlusLC["ShowCooldownID"] = "On" + LeaPlusLC["NoCooldownDuration"] = "On" + LeaPlusLC["CooldownsOnPlayer"] = "Off" + for i = 1, iCount do + -- Reset the panel controls + SpellEB[i]:SetText(""); + LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] = false + -- Hide cooldowns and clear scripts + icon[i]:Hide() + icon[i]:SetScript("OnEvent", nil) + end + CooldownPanel:Hide(); CooldownPanel:Show() + end) + + -- Save settings when changed + for i = 1, iCount do + -- Set initial checkbox states + LeaPlusCB["Spell" .. i .."Pet"]:SetChecked(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"]) + -- Set checkbox states when shown + LeaPlusCB["Spell" .. i .."Pet"]:SetScript("OnShow", function() + LeaPlusCB["Spell" .. i .."Pet"]:SetChecked(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"]) + end) + -- Set states when changed + SpellEB[i]:SetScript("OnTextChanged", SavePanelControls) + LeaPlusCB["Spell" .. i .."Pet"]:SetScript("OnClick", SavePanelControls) + end + + -- Show cooldowns on startup + SavePanelControls() + + -- Show panel when configuration button is clicked + LeaPlusCB["CooldownsButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- No preset profile + else + -- Show panel + CooldownPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + -- Create class tag banner fontstring + local classTagBanner = CooldownPanel:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + local myClassName = UnitClass("player") + classTagBanner:SetPoint("TOPLEFT", 384, -72) + classTagBanner:SetText(myClassName) + + -- Function to show spell ID in tooltips + local function CooldownIDFunc(unit, target, index, auratype) + if LeaPlusLC["ShowCooldownID"] == "On" and auratype ~= "HARMFUL" then + local spellid = select(10, UnitAura(target, index)) + if spellid then + GameTooltip:AddLine(L["Spell ID"] .. ": " .. spellid) + GameTooltip:Show() + end + end + end + + -- Add spell ID to tooltip when buff frame buffs are hovered + hooksecurefunc(GameTooltip, 'SetUnitAura', CooldownIDFunc) + + -- Add spell ID to tooltip when target frame buffs are hovered + hooksecurefunc(GameTooltip, 'SetUnitBuff', CooldownIDFunc) + + end + + ---------------------------------------------------------------------- + -- Combat plates + ---------------------------------------------------------------------- + + if LeaPlusLC["CombatPlates"] == "On" then + + -- Toggle nameplates with combat + local f = CreateFrame("Frame") + f:RegisterEvent("PLAYER_REGEN_DISABLED") + f:RegisterEvent("PLAYER_REGEN_ENABLED") + f:SetScript("OnEvent", function(self, event) + SetCVar("nameplateShowEnemies", event == "PLAYER_REGEN_DISABLED" and 1 or 0) + end) + + -- Run combat check on startup + SetCVar("nameplateShowEnemies", UnitAffectingCombat("player") and 1 or 0) + + end + + ---------------------------------------------------------------------- + -- Enhance tooltip + ---------------------------------------------------------------------- + + if LeaPlusLC["TipModEnable"] == "On" and not LeaLockList["TipModEnable"] then + + ---------------------------------------------------------------------- + -- Position the tooltip + ---------------------------------------------------------------------- + + hooksecurefunc("GameTooltip_SetDefaultAnchor", function(tooltip, parent) + if LeaPlusLC["TooltipAnchorMenu"] ~= 1 then + if (not tooltip or not parent) then + return + end + if LeaPlusLC["TooltipAnchorMenu"] == 2 or GetMouseFocus() ~= WorldFrame then + local a,b,c,d,e = tooltip:GetPoint() + if a ~= "BOTTOMRIGHT" or c ~= "BOTTOMRIGHT" then + tooltip:ClearAllPoints() + end + tooltip:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]); + return + else + if LeaPlusLC["TooltipAnchorMenu"] == 3 then + tooltip:SetOwner(parent, "ANCHOR_CURSOR") + return + elseif LeaPlusLC["TooltipAnchorMenu"] == 4 then + tooltip:SetOwner(parent, "ANCHOR_CURSOR_LEFT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"]) + return + elseif LeaPlusLC["TooltipAnchorMenu"] == 5 then + tooltip:SetOwner(parent, "ANCHOR_CURSOR_RIGHT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"]) + return + end + end + end + end) + + ---------------------------------------------------------------------- + -- Tooltip Configuration + ---------------------------------------------------------------------- + + local LT = {} + + -- Create locale specific level string + LT["LevelLocale"] = strtrim(strtrim(string.gsub(TOOLTIP_UNIT_LEVEL, "%%s", ""))) + if GameLocale == "ruRU" then + LT["LevelLocale"] = "-ro уровня" + end + + -- Tooltip + LT["ColorBlind"] = GetCVar("colorblindMode") + + -- Create drag frame + local TipDrag = CreateFrame("Frame", nil, UIParent) + TipDrag:SetToplevel(true); + TipDrag:SetClampedToScreen(false); + TipDrag:SetSize(130, 64); + TipDrag:Hide(); + TipDrag:SetFrameStrata("TOOLTIP") + TipDrag:SetMovable(true) + TipDrag:SetBackdropColor(0.0, 0.5, 1.0); + TipDrag:SetBackdrop({ + edgeFile = "Interface/Tooltips/UI-Tooltip-Border", + tile = false, tileSize = 0, edgeSize = 16, + insets = { left = 0, right = 0, top = 0, bottom = 0 }}); + + -- Show text in drag frame + TipDrag.f = TipDrag:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + TipDrag.f:SetPoint("CENTER", 0, 0) + TipDrag.f:SetText(L["Tooltip"]) + + -- Create texture + TipDrag.t = TipDrag:CreateTexture(); + TipDrag.t:SetAllPoints(); + TipDrag.t:SetVertexColor(0.0, 0.5, 1.0, 0.5); + TipDrag.t:SetAlpha(0.5); + + --------------------------------------------------------------------------------------------------------- + -- Tooltip movement settings + --------------------------------------------------------------------------------------------------------- + + -- Create tooltip customisation side panel + local SideTip = LeaPlusLC:CreatePanel("Enhance tooltip", "SideTip") + + -- Add controls + LeaPlusLC:MakeTx(SideTip, "Settings", 16, -72) + LeaPlusLC:MakeCB(SideTip, "TipShowRank", "Show guild ranks for your guild", 16, -92, false, "If checked, guild ranks will be shown for players in your guild.") + LeaPlusLC:MakeCB(SideTip, "TipShowOtherRank", "Show guild ranks for other guilds", 16, -112, false, "If checked, guild ranks will be shown for players who are not in your guild.") + LeaPlusLC:MakeCB(SideTip, "TipShowTarget", "Show unit targets", 16, -132, false, "If checked, unit targets will be shown.") + LeaPlusLC:MakeCB(SideTip, "TipNoHealthBar", "Hide the health bar", 16, -152, true, "If checked, the health bar will not be shown.") + + LeaPlusLC:MakeTx(SideTip, "Hide tooltips", 16, -192) + LeaPlusLC:MakeCB(SideTip, "TipHideInCombat", "Hide tooltips for world units during combat", 16, -212, false, "If checked, tooltips for world units will be hidden during combat.") + LeaPlusLC:MakeCB(SideTip, "TipHideShiftOverride", "Show tooltips with shift key", 16, -232, false, "If checked, you can hold shift while tooltips are hidden to show them temporarily.") + + -- Handle show tooltips with shift key lock + local function SetTipHideShiftOverrideFunc() + if LeaPlusLC["TipHideInCombat"] == "On" then + LeaPlusLC:LockItem(LeaPlusCB["TipHideShiftOverride"], false) + else + LeaPlusLC:LockItem(LeaPlusCB["TipHideShiftOverride"], true) + end + end + + LeaPlusCB["TipHideInCombat"]:HookScript("OnClick", SetTipHideShiftOverrideFunc) + SetTipHideShiftOverrideFunc() + + LeaPlusLC:CreateDropDown("TooltipAnchorMenu", "Anchor", SideTip, 146, "TOPLEFT", 356, -115, {L["None"], L["Overlay"], L["Cursor"], L["Cursor Left"], L["Cursor Right"]}, "") + + local XOffsetHeading = LeaPlusLC:MakeTx(SideTip, "X Offset", 356, -132) + LeaPlusLC:MakeSL(SideTip, "TipCursorX", "Drag to set the cursor X offset.", -128, 128, 1, 356, -152, "%.0f") + + local YOffsetHeading = LeaPlusLC:MakeTx(SideTip, "Y Offset", 356, -182) + LeaPlusLC:MakeSL(SideTip, "TipCursorY", "Drag to set the cursor Y offset.", -128, 128, 1, 356, -202, "%.0f") + + LeaPlusLC:MakeTx(SideTip, "Scale", 356, -232) + LeaPlusLC:MakeSL(SideTip, "LeaPlusTipSize", "Drag to set the tooltip scale.", 0.50, 2.00, 0.05, 356, -252, "%.2f") + + -- Function to enable or disable anchor controls + local function SetAnchorControls() + -- Hide overlay if anchor is set to none + if LeaPlusLC["TooltipAnchorMenu"] == 1 then + TipDrag:Hide() + else + TipDrag:Show() + end + -- Set the X and Y sliders + if LeaPlusLC["TooltipAnchorMenu"] == 1 or LeaPlusLC["TooltipAnchorMenu"] == 2 or LeaPlusLC["TooltipAnchorMenu"] == 3 then + -- Dropdown is set to screen or cursor so disable X and Y offset sliders + LeaPlusLC:LockItem(LeaPlusCB["TipCursorX"], true) + LeaPlusLC:LockItem(LeaPlusCB["TipCursorY"], true) + XOffsetHeading:SetAlpha(0.3) + YOffsetHeading:SetAlpha(0.3) + LeaPlusCB["TipCursorX"]:SetScript("OnEnter", nil) + LeaPlusCB["TipCursorY"]:SetScript("OnEnter", nil) + else + -- Dropdown is set to cursor left or cursor right so enable X and Y offset sliders + LeaPlusLC:LockItem(LeaPlusCB["TipCursorX"], false) + LeaPlusLC:LockItem(LeaPlusCB["TipCursorY"], false) + XOffsetHeading:SetAlpha(1.0) + YOffsetHeading:SetAlpha(1.0) + LeaPlusCB["TipCursorX"]:SetScript("OnEnter", LeaPlusLC.TipSee) + LeaPlusCB["TipCursorY"]:SetScript("OnEnter", LeaPlusLC.TipSee) + end + end + + -- Set controls when anchor dropdown menu is changed and on startup + LeaPlusCB["ListFrameTooltipAnchorMenu"]:HookScript("OnHide", SetAnchorControls) + SetAnchorControls() + + -- Help button hidden + SideTip.h:Hide() + + -- Back button handler + SideTip.b:SetScript("OnClick", function() + SideTip:Hide(); + if TipDrag:IsShown() then + TipDrag:Hide(); + end + LeaPlusLC["PageF"]:Show(); + LeaPlusLC["Page5"]:Show(); + return + end) + + -- Reset button handler + SideTip.r.tiptext = SideTip.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."] + SideTip.r:SetScript("OnClick", function() + LeaPlusLC["TipShowRank"] = "On" + LeaPlusLC["TipShowOtherRank"] = "Off" + LeaPlusLC["TipShowTarget"] = "On" + LeaPlusLC["TipHideInCombat"] = "Off"; SetTipHideShiftOverrideFunc() + LeaPlusLC["TipHideShiftOverride"] = "On" + LeaPlusLC["LeaPlusTipSize"] = 1.00 + LeaPlusLC["TipOffsetX"] = -13 + LeaPlusLC["TipOffsetY"] = 94 + LeaPlusLC["TooltipAnchorMenu"] = 1 + LeaPlusLC["TipCursorX"] = 0 + LeaPlusLC["TipCursorY"] = 0 + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]); + SetAnchorControls() + LeaPlusLC:SetTipScale() + SideTip:Hide(); SideTip:Show(); + end) + + -- Show drag frame with configuration panel if anchor is not set to none + SideTip:HookScript("OnShow", function() + if LeaPlusLC["TooltipAnchorMenu"] == 1 then + TipDrag:Hide() + else + TipDrag:Show() + end + end) + SideTip:HookScript("OnHide", function() TipDrag:Hide() end) + + -- Control movement functions + local void, LTax, LTay, LTbx, LTby, LTcx, LTcy + TipDrag:SetScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + void, void, void, LTax, LTay = TipDrag:GetPoint() + TipDrag:StartMoving() + void, void, void, LTbx, LTby = TipDrag:GetPoint() + end + end) + TipDrag:SetScript("OnMouseUp", function(self, btn) + if btn == "LeftButton" then + void, void, void, LTcx, LTcy = TipDrag:GetPoint() + TipDrag:StopMovingOrSizing(); + LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"] = LTcx - LTbx + LTax, LTcy - LTby + LTay + TipDrag:ClearAllPoints() + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]) + end + end) + + -- Move the tooltip + LeaPlusCB["MoveTooltipButton"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["TipShowRank"] = "On" + LeaPlusLC["TipShowOtherRank"] = "Off" + LeaPlusLC["TipShowTarget"] = "On" + LeaPlusLC["TipHideInCombat"] = "Off"; SetTipHideShiftOverrideFunc() + LeaPlusLC["TipHideShiftOverride"] = "On" + LeaPlusLC["LeaPlusTipSize"] = 1.25 + LeaPlusLC["TipOffsetX"] = -13 + LeaPlusLC["TipOffsetY"] = 94 + LeaPlusLC["TooltipAnchorMenu"] = 2 + LeaPlusLC["TipCursorX"] = 0 + LeaPlusLC["TipCursorY"] = 0 + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]); + SetAnchorControls() + LeaPlusLC:SetTipScale() + LeaPlusLC:SetDim(); + LeaPlusLC:ReloadCheck() + SideTip:Show(); SideTip:Hide(); -- Needed to update tooltip scale + LeaPlusLC["PageF"]:Hide(); LeaPlusLC["PageF"]:Show() + else + -- Show tooltip configuration panel + LeaPlusLC:HideFrames() + SideTip:Show() + + -- Set scale + TipDrag:SetScale(LeaPlusLC["LeaPlusTipSize"]) + + -- Set position of the drag frame + TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]) + end + + end) + + -- Hide health bar + if LeaPlusLC["TipNoHealthBar"] == "On" then + local tipHide = GameTooltip.Hide + GameTooltipStatusBar:HookScript("OnShow", tipHide) + GameTooltipStatusBar:Hide() + end + + --------------------------------------------------------------------------------------------------------- + -- Tooltip scale settings + --------------------------------------------------------------------------------------------------------- + + -- Function to set the tooltip scale + local function SetTipScale() + + -- General tooltip + if GameTooltip then GameTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Friends + if FriendsTooltip then FriendsTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- AutoCompleteBox + if AutoCompleteBox then AutoCompleteBox:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Items (links, comparisons) + if ItemRefTooltip then ItemRefTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ItemRefShoppingTooltip1 then ItemRefShoppingTooltip1:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ItemRefShoppingTooltip2 then ItemRefShoppingTooltip2:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ShoppingTooltip1 then ShoppingTooltip1:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + if ShoppingTooltip2 then ShoppingTooltip2:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Embedded item tooltip (as used in PVP UI) + if EmbeddedItemTooltip then EmbeddedItemTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Nameplate tooltip + if NamePlateTooltip then NamePlateTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end + + -- Leatrix Plus + TipDrag:SetScale(LeaPlusLC["LeaPlusTipSize"]) + + -- Set slider formatted text + LeaPlusCB["LeaPlusTipSize"].f:SetFormattedText("%.0f%%", LeaPlusLC["LeaPlusTipSize"] * 100) + + end + + -- Give function a file level scope + LeaPlusLC.SetTipScale = SetTipScale + + -- Set tooltip scale when slider or checkbox changes and on startup + LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetTipScale) + SetTipScale() + + --------------------------------------------------------------------------------------------------------- + -- Total RP 3 + --------------------------------------------------------------------------------------------------------- + + -- Total RP 3 + local function TotalRP3Func() + if TRP3_MainTooltip and TRP3_CharacterTooltip then + + -- Function to set tooltip scale + local function SetTotalRP3TipScale() + TRP3_MainTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) + TRP3_CharacterTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) + end + + -- Set tooltip scale when slider changes and on startup + LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetTotalRP3TipScale) + SetTotalRP3TipScale() + + end + end + + -- Run function when Total RP 3 addon has loaded + if IsAddOnLoaded("totalRP3") then + TotalRP3Func() + else + local waitFrame = CreateFrame("FRAME") + waitFrame:RegisterEvent("ADDON_LOADED") + waitFrame:SetScript("OnEvent", function(self, event, arg1) + if arg1 == "totalRP3" then + TotalRP3Func() + waitFrame:UnregisterAllEvents() + end + end) + end + + --------------------------------------------------------------------------------------------------------- + -- Other tooltip code + --------------------------------------------------------------------------------------------------------- + + -- Colorblind setting change + TipDrag:RegisterEvent("CVAR_UPDATE"); + TipDrag:SetScript("OnEvent", function(self, event, arg1, arg2) + if (arg1 == "USE_COLORBLIND_MODE") then + LT["ColorBlind"] = arg2; + end + end) + + -- Store locals + local TipMClass = LOCALIZED_CLASS_NAMES_MALE + local TipFClass = LOCALIZED_CLASS_NAMES_FEMALE + + -- Level string + local LevelString, LevelString2 + if GameLocale == "ruRU" then + -- Level string for ruRU + LevelString = "уровня" + LevelString2 = "уровень" + else + -- Level string for all other locales + LevelString = string.lower(TOOLTIP_UNIT_LEVEL:gsub("%%s",".+")) + LevelString2 = "" + end + + -- Tag locale (code construction from tiplang) + local ttYou, ttLevel, ttBoss, ttElite, ttRare, ttRareElite, ttRareBoss, ttTarget + if GameLocale == "zhCN" then ttYou = "您" ; ttLevel = "等级" ; ttBoss = "首领" ; ttElite = "精英" ; ttRare = "精良" ; ttRareElite = "精良 精英" ; ttRareBoss = "精良 首领" ; ttTarget = "目标" + elseif GameLocale == "zhTW" then ttYou = "您" ; ttLevel = "等級" ; ttBoss = "首領" ; ttElite = "精英" ; ttRare = "精良" ; ttRareElite = "精良 精英" ; ttRareBoss = "精良 首領" ; ttTarget = "目標" + elseif GameLocale == "ruRU" then ttYou = "ВЫ" ; ttLevel = "Уровень" ; ttBoss = "босс" ; ttElite = "элита" ; ttRare = "Редкое" ; ttRareElite = "Редкое элита" ; ttRareBoss = "Редкое босс" ; ttTarget = "Цель" + elseif GameLocale == "koKR" then ttYou = "당신" ; ttLevel = "레벨" ; ttBoss = "우두머리" ; ttElite = "정예" ; ttRare = "희귀" ; ttRareElite = "희귀 정예" ; ttRareBoss = "희귀 우두머리" ; ttTarget = "대상" + elseif GameLocale == "esMX" then ttYou = "TÚ" ; ttLevel = "Nivel" ; ttBoss = "Jefe" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Jefe" ; ttTarget = "Objetivo" + elseif GameLocale == "ptBR" then ttYou = "VOCÊ" ; ttLevel = "Nível" ; ttBoss = "Chefe" ; ttElite = "Elite" ; ttRare = "Raro" ; ttRareElite = "Raro Elite" ; ttRareBoss = "Raro Chefe" ; ttTarget = "Alvo" + elseif GameLocale == "deDE" then ttYou = "SIE" ; ttLevel = "Stufe" ; ttBoss = "Boss" ; ttElite = "Elite" ; ttRare = "Selten" ; ttRareElite = "Selten Elite" ; ttRareBoss = "Selten Boss" ; ttTarget = "Ziel" + elseif GameLocale == "esES" then ttYou = "TÚ" ; ttLevel = "Nivel" ; ttBoss = "Jefe" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Jefe" ; ttTarget = "Objetivo" + elseif GameLocale == "frFR" then ttYou = "TOI" ; ttLevel = "Niveau" ; ttBoss = "Boss" ; ttElite = "Élite" ; ttRare = "Rare" ; ttRareElite = "Rare Élite" ; ttRareBoss = "Rare Boss" ; ttTarget = "Cible" + elseif GameLocale == "itIT" then ttYou = "TU" ; ttLevel = "Livello" ; ttBoss = "Boss" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Boss" ; ttTarget = "Bersaglio" + else ttYou = "YOU" ; ttLevel = "Level" ; ttBoss = "Boss" ; ttElite = "Elite" ; ttRare = "Rare" ; ttRareElite = "Rare Elite" ; ttRareBoss = "Rare Boss" ; ttTarget = "Target" + end + + -- Show tooltip + local function ShowTip() + + -- Do nothing if CTRL, SHIFT and ALT are being held + if IsControlKeyDown() and IsAltKeyDown() and IsShiftKeyDown() then + return + end + + -- Get unit information + if GetMouseFocus() == WorldFrame then + LT["Unit"] = "mouseover" + -- Hide and quit if tips should be hidden during combat + if LeaPlusLC["TipHideInCombat"] == "On" and UnitAffectingCombat("player") then + if not IsShiftKeyDown() or LeaPlusLC["TipHideShiftOverride"] == "Off" then + GameTooltip:Hide() + return + end + end + else + LT["Unit"] = select(2, GameTooltip:GetUnit()) + if not (LT["Unit"]) then return end + end + + -- Quit if unit has no reaction to player + LT["Reaction"] = UnitReaction(LT["Unit"], "player") or nil + if not LT["Reaction"] then + return + end + + -- Setup variables + LT["TipUnitName"], LT["TipUnitRealm"] = UnitName(LT["Unit"]) + LT["TipIsPlayer"] = UnitIsPlayer(LT["Unit"]) + LT["UnitLevel"] = UnitLevel(LT["Unit"]) + LT["UnitClass"] = UnitClassBase(LT["Unit"]) + LT["PlayerControl"] = UnitPlayerControlled(LT["Unit"]) + LT["PlayerRace"] = UnitRace(LT["Unit"]) + + -- Get guild information + if LT["TipIsPlayer"] then + local unitGuild, unitRank = GetGuildInfo(LT["Unit"]) + if unitGuild and unitRank then + -- Unit is guilded + if LT["ColorBlind"] == "1" then + LT["GuildLine"], LT["InfoLine"] = 2, 4 + else + LT["GuildLine"], LT["InfoLine"] = 2, 3 + end + LT["GuildName"], LT["GuildRank"] = unitGuild, unitRank + else + -- Unit is not guilded + LT["GuildName"] = nil + if LT["ColorBlind"] == "1" then + LT["GuildLine"], LT["InfoLine"] = 0, 3 + else + LT["GuildLine"], LT["InfoLine"] = 0, 2 + end + end + -- Lower information line if unit is charmed + if UnitIsCharmed(LT["Unit"]) then + LT["InfoLine"] = LT["InfoLine"] + 1 + end + end + + -- Determine class color + if LT["UnitClass"] then + -- Define male or female (for certain locales) + LT["Sex"] = UnitSex(LT["Unit"]) + if LT["Sex"] == 2 then + LT["Class"] = TipMClass[LT["UnitClass"]] + else + LT["Class"] = TipFClass[LT["UnitClass"]] + end + -- Define class color + LT["ClassCol"] = LeaPlusLC["RaidColors"][LT["UnitClass"]] + LT["LpTipClassColor"] = "|cff" .. string.format("%02x%02x%02x", LT["ClassCol"].r * 255, LT["ClassCol"].g * 255, LT["ClassCol"].b * 255) + end + + ---------------------------------------------------------------------- + -- Name line + ---------------------------------------------------------------------- + + if ((LT["TipIsPlayer"]) or (LT["PlayerControl"])) or LT["Reaction"] > 4 then + + -- If it's a player show name in class color + if LT["TipIsPlayer"] then + LT["NameColor"] = LT["LpTipClassColor"] + else + -- If not, set to green or blue depending on PvP status + if UnitIsPVP(LT["Unit"]) then + LT["NameColor"] = "|cff00ff00" + else + LT["NameColor"] = "|cff00aaff" + end + end + + -- Show name + LT["NameText"] = UnitPVPName(LT["Unit"]) or LT["TipUnitName"] + + -- Show realm + if LT["TipUnitRealm"] then + LT["NameText"] = LT["NameText"] .. " - " .. LT["TipUnitRealm"] + end + + -- Show dead units in grey + if UnitIsDeadOrGhost(LT["Unit"]) then + LT["NameColor"] = "|c88888888" + end + + -- Show name line + _G["GameTooltipTextLeft1"]:SetText(LT["NameColor"] .. LT["NameText"] .. "|cffffffff|r") + + elseif UnitIsDeadOrGhost(LT["Unit"]) then + + -- Show grey name for other dead units + _G["GameTooltipTextLeft1"]:SetText("|c88888888" .. (_G["GameTooltipTextLeft1"]:GetText() or "") .. "|cffffffff|r") + return + + end + + ---------------------------------------------------------------------- + -- Guild line + ---------------------------------------------------------------------- + + if LT["TipIsPlayer"] and LT["GuildName"] then + + -- Show guild line + if UnitIsInMyGuild(LT["Unit"]) then + if LeaPlusLC["TipShowRank"] == "On" then + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. " - " .. LT["GuildRank"] .. "|r") + else + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. "|cffffffff|r") + end + else + if LeaPlusLC["TipShowOtherRank"] == "On" then + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. " - " .. LT["GuildRank"] .. "|r") + else + _G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. "|cffffffff|r") + end + end + + end + + ---------------------------------------------------------------------- + -- Information line (level, class, race) + ---------------------------------------------------------------------- + + if LT["TipIsPlayer"] then + + if GameLocale == "ruRU" then + + LT["InfoText"] = "" + + -- Show race + if LT["PlayerRace"] then + LT["InfoText"] = LT["InfoText"] .. LT["PlayerRace"] .. "," + end + + -- Show class + LT["InfoText"] = LT["InfoText"] .. " " .. LT["LpTipClassColor"] .. LT["Class"] .. "|r " or LT["InfoText"] .. "|r " + + -- Show level + if LT["Reaction"] < 5 then + if LT["UnitLevel"] == -1 then + LT["InfoText"] = LT["InfoText"] .. ("|cffff3333" .. "??-ro" .. " " .. ttLevel .. "|cffffffff") + else + LT["LevelColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["LevelColor"] = string.format('%02x%02x%02x', LT["LevelColor"].r * 255, LT["LevelColor"].g * 255, LT["LevelColor"].b * 255) + LT["InfoText"] = LT["InfoText"] .. ("|cff" .. LT["LevelColor"] .. LT["UnitLevel"] .. LT["LevelLocale"] .. "|cffffffff") + end + else + LT["InfoText"] = LT["InfoText"] .. LT["UnitLevel"] .. LT["LevelLocale"] + end + + -- Show information line + _G["GameTooltipTextLeft" .. LT["InfoLine"]]:SetText(LT["InfoText"] .. "|cffffffff|r") + + else + + -- Show level + if LT["Reaction"] < 5 then + if LT["UnitLevel"] == -1 then + LT["InfoText"] = ("|cffff3333" .. ttLevel .. " ??|cffffffff") + else + LT["LevelColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["LevelColor"] = string.format('%02x%02x%02x', LT["LevelColor"].r * 255, LT["LevelColor"].g * 255, LT["LevelColor"].b * 255) + LT["InfoText"] = ("|cff" .. LT["LevelColor"] .. LT["LevelLocale"] .. " " .. LT["UnitLevel"] .. "|cffffffff") + end + else + LT["InfoText"] = LT["LevelLocale"] .. " " .. LT["UnitLevel"] + end + + -- Show race + if LT["PlayerRace"] then + LT["InfoText"] = LT["InfoText"] .. " " .. LT["PlayerRace"] + end + + -- Show class + LT["InfoText"] = LT["InfoText"] .. " " .. LT["LpTipClassColor"] .. LT["Class"] or LT["InfoText"] + + -- Show information line + _G["GameTooltipTextLeft" .. LT["InfoLine"]]:SetText(LT["InfoText"] .. "|cffffffff|r") + + end + + end + + ---------------------------------------------------------------------- + -- Mob name in brighter red (alive) and steel blue (tap denied) + ---------------------------------------------------------------------- + + if not (LT["TipIsPlayer"]) and LT["Reaction"] < 4 and not (LT["PlayerControl"]) then + if UnitIsTapDenied(LT["Unit"]) then + LT["NameText"] = "|c8888bbbb" .. LT["TipUnitName"] .. "|r" + else + LT["NameText"] = "|cffff3333" .. LT["TipUnitName"] .. "|r" + end + _G["GameTooltipTextLeft1"]:SetText(LT["NameText"]) + end + + ---------------------------------------------------------------------- + -- Mob level in color (neutral or lower) + ---------------------------------------------------------------------- + + if UnitCanAttack(LT["Unit"], "player") and not (LT["TipIsPlayer"]) and LT["Reaction"] < 5 and not (LT["PlayerControl"]) then + + -- Find the level line + LT["MobInfoLine"] = 0 + local line2, line3, line4 + if _G["GameTooltipTextLeft2"] then line2 = _G["GameTooltipTextLeft2"]:GetText() end + if _G["GameTooltipTextLeft3"] then line3 = _G["GameTooltipTextLeft3"]:GetText() end + if _G["GameTooltipTextLeft4"] then line4 = _G["GameTooltipTextLeft4"]:GetText() end + if GameLocale == "ruRU" then -- Additional check for ruRU + if line2 and string.lower(line2):find(LevelString2) then LT["MobInfoLine"] = 2 end + if line3 and string.lower(line3):find(LevelString2) then LT["MobInfoLine"] = 3 end + if line4 and string.lower(line4):find(LevelString2) then LT["MobInfoLine"] = 4 end + end + if line2 and string.lower(line2):find(LevelString) then LT["MobInfoLine"] = 2 end + if line3 and string.lower(line3):find(LevelString) then LT["MobInfoLine"] = 3 end + if line4 and string.lower(line4):find(LevelString) then LT["MobInfoLine"] = 4 end + + -- Show level line + if LT["MobInfoLine"] > 1 then + + if GameLocale == "ruRU" then + + LT["InfoText"] = "" + + -- Show creature type and classification + LT["CreatureType"] = UnitCreatureType(LT["Unit"]) + if (LT["CreatureType"]) and not (LT["CreatureType"] == "Not specified") then + LT["InfoText"] = LT["InfoText"] .. "|cffffffff" .. LT["CreatureType"] .. "|cffffffff " + end + + -- Level ?? mob + if LT["UnitLevel"] == -1 then + LT["InfoText"] = LT["InfoText"] .. "|cffff3333" .. "??-ro " .. ttLevel .. "|cffffffff " + + -- Mobs within level range + else + LT["MobColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["MobColor"] = string.format('%02x%02x%02x', LT["MobColor"].r * 255, LT["MobColor"].g * 255, LT["MobColor"].b * 255) + LT["InfoText"] = LT["InfoText"] .. "|cff" .. LT["MobColor"] .. LT["UnitLevel"] .. LT["LevelLocale"] .. "|cffffffff " + end + + else + + -- Level ?? mob + if LT["UnitLevel"] == -1 then + LT["InfoText"] = "|cffff3333" .. ttLevel .. " ??|cffffffff " + + -- Mobs within level range + else + LT["MobColor"] = GetCreatureDifficultyColor(LT["UnitLevel"]) + LT["MobColor"] = string.format('%02x%02x%02x', LT["MobColor"].r * 255, LT["MobColor"].g * 255, LT["MobColor"].b * 255) + LT["InfoText"] = "|cff" .. LT["MobColor"] .. LT["LevelLocale"] .. " " .. LT["UnitLevel"] .. "|cffffffff " + end + + -- Show creature type and classification + LT["CreatureType"] = UnitCreatureType(LT["Unit"]) + if (LT["CreatureType"]) and not (LT["CreatureType"] == "Not specified") then + LT["InfoText"] = LT["InfoText"] .. "|cffffffff" .. LT["CreatureType"] .. "|cffffffff " + end + + end + + -- Rare, elite and boss mobs + LT["Special"] = UnitClassification(LT["Unit"]) + if LT["Special"] then + if LT["Special"] == "elite" then + if strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then + LT["Special"] = "(" .. ttBoss .. ")" + else + LT["Special"] = "(" .. ttElite .. ")" + end + elseif LT["Special"] == "rare" then + LT["Special"] = "|c00e066ff(" .. ttRare .. ")" + elseif LT["Special"] == "rareelite" then + if strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then + LT["Special"] = "|c00e066ff(" .. ttRareBoss .. ")" + else + LT["Special"] = "|c00e066ff(" .. ttRareElite .. ")" + end + elseif LT["Special"] == "worldboss" then + LT["Special"] = "(" .. ttBoss .. ")" + elseif LT["UnitLevel"] == -1 and LT["Special"] == "normal" and strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then + LT["Special"] = "(" .. ttBoss .. ")" + else + LT["Special"] = nil + end + + if (LT["Special"]) then + LT["InfoText"] = LT["InfoText"] .. LT["Special"] + end + end + + -- Show mob info line + _G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:SetText(LT["InfoText"]) + + end + + end + + ---------------------------------------------------------------------- + -- Show target + ---------------------------------------------------------------------- + + if LeaPlusLC["TipShowTarget"] == "On" then + + -- Get target + LT["Target"] = UnitName(LT["Unit"] .. "target"); + + -- If target doesn't exist, quit + if LT["Target"] == nil or LT["Target"] == "" then return end + + -- If target is you, set target to YOU + if (UnitIsUnit(LT["Target"], "player")) then + LT["Target"] = ("|c12ff4400" .. ttYou) + + -- If it's not you, but it's a player, show target in class color + elseif UnitIsPlayer(LT["Unit"] .. "target") then + LT["TargetBase"] = UnitClassBase(LT["Unit"] .. "target") + LT["TargetCol"] = LeaPlusLC["RaidColors"][LT["TargetBase"]] + LT["TargetCol"] = "|cff" .. string.format('%02x%02x%02x', LT["TargetCol"].r * 255, LT["TargetCol"].g * 255, LT["TargetCol"].b * 255) + LT["Target"] = (LT["TargetCol"] .. LT["Target"]) + + end + + -- Add target line + GameTooltip:AddLine(ttTarget .. ": " .. LT["Target"]) + + end + + end + + GameTooltip:HookScript("OnTooltipSetUnit", ShowTip) + + end + + ---------------------------------------------------------------------- + -- Move chat editbox to top + ---------------------------------------------------------------------- + + if LeaPlusLC["MoveChatEditBoxToTop"] == "On" and not LeaLockList["MoveChatEditBoxToTop"] then + + -- Set options for normal chat frames + for i = 1, 50 do + if _G["ChatFrame" .. i] then + -- Position the editbox + _G["ChatFrame" .. i .. "EditBox"]:ClearAllPoints(); + _G["ChatFrame" .. i .. "EditBox"]:SetPoint("TOPLEFT", _G["ChatFrame" .. i], 0, 0); + _G["ChatFrame" .. i .. "EditBox"]:SetWidth(_G["ChatFrame" .. i]:GetWidth()); + -- Ensure editbox width matches chatframe width + _G["ChatFrame" .. i]:HookScript("OnSizeChanged", function() + _G["ChatFrame" .. i .. "EditBox"]:SetWidth(_G["ChatFrame" .. i]:GetWidth()) + end) + end + end + + -- Do the functions above for other chat frames (pet battles, whispers, etc) + hooksecurefunc("FCF_OpenTemporaryWindow", function() + + local cf = FCF_GetCurrentChatFrame():GetName() or nil + if cf then + + -- Position the editbox + _G[cf .. "EditBox"]:ClearAllPoints(); + _G[cf .. "EditBox"]:SetPoint("TOPLEFT", cf, "TOPLEFT", 0, 0); + _G[cf .. "EditBox"]:SetWidth(_G[cf]:GetWidth()); + + -- Ensure editbox width matches chatframe width + _G[cf]:HookScript("OnSizeChanged", function() + _G[cf .. "EditBox"]:SetWidth(_G[cf]:GetWidth()) + end) + + end + end) + + end + + ---------------------------------------------------------------------- + -- Viewport + ---------------------------------------------------------------------- + + if LeaPlusLC["ViewPortEnable"] == "On" then + + -- Create border textures + local BordTop = WorldFrame:CreateTexture(nil, "ARTWORK"); + BordTop:SetVertexColor(0, 0, 0, 1); + BordTop:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0); BordTop:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0) + local BordBot = WorldFrame:CreateTexture(nil, "ARTWORK"); + BordBot:SetVertexColor(0, 0, 0, 1); + BordBot:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 0); BordBot:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 0) + local BordLeft = WorldFrame:CreateTexture(nil, "ARTWORK"); + BordLeft:SetVertexColor(0, 0, 0, 1); + BordLeft:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0); BordLeft:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 0) + local BordRight = WorldFrame:CreateTexture(nil, "ARTWORK"); + BordRight:SetVertexColor(0, 0, 0, 1); + BordRight:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0); BordRight:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 0) + + -- Create viewport configuration panel + local SideViewport = LeaPlusLC:CreatePanel("Enable viewport", "SideViewport") + + -- Create resize screen button + local resizeScreenBtn = LeaPlusLC:CreateButton("resizeScreenBtn", SideViewport, "Resize Screen", "BOTTOMRIGHT", -16, 10, 0, 25, true, "Click to resize the screen to fit between the top and bottom borders.") + resizeScreenBtn:ClearAllPoints() + resizeScreenBtn:SetPoint("LEFT", SideViewport.h, "RIGHT", 10, 0) + resizeScreenBtn:SetScript("OnClick", function() + LeaPlusLC["ViewPortResizeTop"] = LeaPlusLC["ViewPortTop"] + LeaPlusLC["ViewPortResizeBottom"] = LeaPlusLC["ViewPortBottom"] + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + -- Disable lock button if borders match viewport size + if LeaPlusLC["ViewPortTop"] == LeaPlusLC["ViewPortResizeTop"] and LeaPlusLC["ViewPortBottom"] == LeaPlusLC["ViewPortResizeBottom"] then + LeaPlusLC:LockItem(resizeScreenBtn, true) + else + LeaPlusLC:LockItem(resizeScreenBtn, false) + end + end) + + -- Function to set viewport parameters + local function RefreshViewport() + + -- Set border size and transparency + BordTop:SetHeight(LeaPlusLC["ViewPortTop"]); BordTop:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + BordBot:SetHeight(LeaPlusLC["ViewPortBottom"]); BordBot:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + BordLeft:SetWidth(LeaPlusLC["ViewPortLeft"]); BordLeft:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + BordRight:SetWidth(LeaPlusLC["ViewPortRight"]); BordRight:SetAlpha(1 - LeaPlusLC["ViewPortAlpha"]) + + -- Show formatted slider value + LeaPlusCB["ViewPortAlpha"].f:SetFormattedText("%.0f%%", LeaPlusLC["ViewPortAlpha"] * 100) + + -- Disable lock button if borders match viewport size + if LeaPlusLC["ViewPortTop"] == LeaPlusLC["ViewPortResizeTop"] and LeaPlusLC["ViewPortBottom"] == LeaPlusLC["ViewPortResizeBottom"] then + LeaPlusLC:LockItem(resizeScreenBtn, true) + else + LeaPlusLC:LockItem(resizeScreenBtn, false) + end + + end + + -- Create slider controls + LeaPlusLC:MakeTx(SideViewport, "Top", 16, -72) + LeaPlusLC:MakeSL(SideViewport, "ViewPortTop", "Drag to set the size of the top border.", 0, 300, 5, 16, -92, "%.0f") + LeaPlusCB["ViewPortTop"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Bottom", 16, -132) + LeaPlusLC:MakeSL(SideViewport, "ViewPortBottom", "Drag to set the size of the bottom border.", 0, 300, 5, 16, -152, "%.0f") + LeaPlusCB["ViewPortBottom"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Left", 186, -72) + LeaPlusLC:MakeSL(SideViewport, "ViewPortLeft", "Drag to set the size of the left border.", 0, 300, 5, 186, -92, "%.0f") + LeaPlusCB["ViewPortLeft"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Right", 186, -132) + LeaPlusLC:MakeSL(SideViewport, "ViewPortRight", "Drag to set the size of the right border.", 0, 300, 5, 186, -152, "%.0f") + LeaPlusCB["ViewPortRight"]:HookScript("OnValueChanged", RefreshViewport) + + LeaPlusLC:MakeTx(SideViewport, "Transparency", 356, -132) + LeaPlusLC:MakeSL(SideViewport, "ViewPortAlpha", "Drag to set the transparency of the borders.", 0, 0.9, 0.1, 356, -152, "%.1f") + LeaPlusCB["ViewPortAlpha"]:HookScript("OnValueChanged", RefreshViewport) + + -- Help button tooltip + SideViewport.h.tiptext = L["This panel will close automatically if you enter combat."] + + -- Back button handler + SideViewport.b:SetScript("OnClick", function() + SideViewport:Hide() + LeaPlusLC["PageF"]:Show() + LeaPlusLC["Page7"]:Show() + return + end) + + -- Reset button handler + SideViewport.r:SetScript("OnClick", function() + LeaPlusLC["ViewPortTop"] = 0 + LeaPlusLC["ViewPortBottom"] = 0 + LeaPlusLC["ViewPortLeft"] = 0 + LeaPlusLC["ViewPortRight"] = 0 + LeaPlusLC["ViewPortResizeTop"] = 0 + LeaPlusLC["ViewPortResizeBottom"] = 0 + LeaPlusLC["ViewPortAlpha"] = 0 + SideViewport:Hide(); SideViewport:Show() + RefreshViewport() + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + end) + + -- Configuration button handler + LeaPlusCB["ModViewportBtn"]:SetScript("OnClick", function() + if LeaPlusLC:PlayerInCombat() then + return + else + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["ViewPortTop"] = 0 + LeaPlusLC["ViewPortBottom"] = 0 + LeaPlusLC["ViewPortLeft"] = 0 + LeaPlusLC["ViewPortRight"] = 0 + LeaPlusLC["ViewPortResizeTop"] = 0 + LeaPlusLC["ViewPortResizeBottom"] = 0 + LeaPlusLC["ViewPortAlpha"] = 0.7 + RefreshViewport() + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + else + SideViewport:Show() + LeaPlusLC:HideFrames() + end + end + end) + + -- Set viewport on startup + RefreshViewport() + WorldFrame:SetPoint("TOPLEFT", 0, -LeaPlusLC["ViewPortResizeTop"]) + WorldFrame:SetPoint("BOTTOMRIGHT", 0, LeaPlusLC["ViewPortResizeBottom"]) + + -- Hide the configuration panel if combat starts + SideViewport:SetScript("OnUpdate", function() + if UnitAffectingCombat("player") then + SideViewport:Hide() + end + end) + + -- Hide borders when cinematic is shown + hooksecurefunc(CinematicFrame, "Hide", function() + BordTop:Show(); BordBot:Show(); BordLeft:Show(); BordRight:Show() + end) + hooksecurefunc(CinematicFrame, "Show", function() + BordTop:Hide(); BordBot:Hide(); BordLeft:Hide(); BordRight:Hide() + end) + + end + + ---------------------------------------------------------------------- + -- Silence rested emotes + ---------------------------------------------------------------------- + + -- Manage emotes + if LeaPlusLC["NoRestedEmotes"] == "On" then + + -- Zone table English , French , German , Italian , Russian , S Chinese , Spanish , T Chinese , + local zonetable = { "The Grim Guzzler" , "Le Sinistre écluseur" , "Zum Grimmigen Säufer" , "Torvo Beone" , "Трактир Угрюмый обжора" , "黑铁酒吧" , "Tragapenas" , "黑鐵酒吧" ,} + + -- Function to set rested state + local function UpdateEmoteSound() + + -- Find character's current zone + local szone = GetSubZoneText() or "None" + + -- Find out if emote sounds are disabled or enabled + local emoset = GetCVar("Sound_EnableEmoteSounds") + + if IsResting() then + -- Character is resting so silence emotes + if emoset ~= "0" then + SetCVar("Sound_EnableEmoteSounds", "0") + end + return + end + + -- Traverse zone table and silence emotes if character is in a designated zone + for k, v in next, zonetable do + if szone == zonetable[k] then + if emoset ~= "0" then + SetCVar("Sound_EnableEmoteSounds", "0") + end + return + end + end + + -- If the above didn't return, emote sounds should be enabled + if emoset ~= "1" then + SetCVar("Sound_EnableEmoteSounds", "1") + end + return + + end + + -- Set emote sound when rest state or zone changes + local RestEvent = CreateFrame("FRAME") + RestEvent:RegisterEvent("PLAYER_UPDATE_RESTING") + RestEvent:RegisterEvent("ZONE_CHANGED_NEW_AREA") + RestEvent:RegisterEvent("ZONE_CHANGED") + RestEvent:RegisterEvent("ZONE_CHANGED_INDOORS") + RestEvent:SetScript("OnEvent", UpdateEmoteSound) + + -- Set sound setting at startup + UpdateEmoteSound() + + end + + ---------------------------------------------------------------------- + -- Create panel in game options panel + ---------------------------------------------------------------------- + + do + + local interPanel = CreateFrame("FRAME") + interPanel.name = "Leatrix Plus" + + local maintitle = LeaPlusLC:MakeTx(interPanel, "Leatrix Plus", 0, 0) + maintitle:SetFont(maintitle:GetFont(), 72) + maintitle:ClearAllPoints() + maintitle:SetPoint("TOP", 0, -72) + + local expTitle = LeaPlusLC:MakeTx(interPanel, "Wrath of the Lich King Classic", 0, 0) + expTitle:SetFont(expTitle:GetFont(), 32) + expTitle:ClearAllPoints() + expTitle:SetPoint("TOP", 0, -152) + + local subTitle = LeaPlusLC:MakeTx(interPanel, "www.leatrix.com", 0, 0) + subTitle:SetFont(subTitle:GetFont(), 20) + subTitle:ClearAllPoints() + subTitle:SetPoint("BOTTOM", 0, 72) + + local slashTitle = LeaPlusLC:MakeTx(interPanel, "/run leaplus()", 0, 0) + slashTitle:SetFont(slashTitle:GetFont(), 72) + slashTitle:ClearAllPoints() + slashTitle:SetPoint("BOTTOM", subTitle, "TOP", 0, 40) + + local pTex = interPanel:CreateTexture(nil, "BACKGROUND") + pTex:SetAllPoints() + pTex:SetTexture("Interface\\GLUES\\Models\\UI_MainMenu\\swordgradient2") + pTex:SetAlpha(0.2) + pTex:SetTexCoord(0, 1, 1, 0) + + InterfaceOptions_AddCategory(interPanel) + + end + + ---------------------------------------------------------------------- + -- Final code for Player + ---------------------------------------------------------------------- + + -- Show first run message + if not LeaPlusDB["FirstRunMessageSeen"] then + LibCompat.After(1, function() + LeaPlusLC:Print(L["Enter"] .. " |cff00ff00" .. "/run leaplus()" .. "|r " .. L["or click the minimap button to open Leatrix Plus."]) + LeaPlusDB["FirstRunMessageSeen"] = true + end) + end + + -- Register logout event to save settings + LpEvt:RegisterEvent("PLAYER_LOGOUT") + + -- Release memory + LeaPlusLC.Player = nil + + end + +---------------------------------------------------------------------- +-- L45: World +---------------------------------------------------------------------- + + function LeaPlusLC:World() + + ---------------------------------------------------------------------- + -- Max camera zoom (no reload required) + ---------------------------------------------------------------------- + + do + + -- Function to set camera zoom + local function SetZoom() + if LeaPlusLC["MaxCameraZoom"] == "On" then + SetCVar("cameraDistanceMaxZoomFactor", 4.0) + else + SetCVar("cameraDistanceMaxZoomFactor", 1.9) + end + end + + -- Set camera zoom when option is clicked and on startup (if enabled) + LeaPlusCB["MaxCameraZoom"]:HookScript("OnClick", SetZoom) + if LeaPlusLC["MaxCameraZoom"] == "On" then SetZoom() end + + end + + end + +---------------------------------------------------------------------- +-- L50: RunOnce +---------------------------------------------------------------------- + + function LeaPlusLC:RunOnce() + + ---------------------------------------------------------------------- + -- Frame alignment grid + ---------------------------------------------------------------------- + + do + + -- Create frame alignment grid + local grid = CreateFrame('FRAME') + LeaPlusLC.grid = grid + grid:Hide() + grid:SetAllPoints(UIParent) + local w, h = GetScreenWidth() * UIParent:GetEffectiveScale(), GetScreenHeight() * UIParent:GetEffectiveScale() + local ratio = w / h + local sqsize = w / 20 + local wline = floor(sqsize - (sqsize % 2)) + local hline = floor(sqsize / ratio - ((sqsize / ratio) % 2)) + -- Plot vertical lines + for i = 0, wline do + local t = LeaPlusLC.grid:CreateTexture(nil, 'BACKGROUND') + if i == wline / 2 then t:SetVertexColor(1, 0, 0, 0.5) else t:SetVertexColor(0, 0, 0, 0.5) end + t:SetPoint('TOPLEFT', grid, 'TOPLEFT', i * w / wline - 1, 0) + t:SetPoint('BOTTOMRIGHT', grid, 'BOTTOMLEFT', i * w / wline + 1, 0) + end + -- Plot horizontal lines + for i = 0, hline do + local t = LeaPlusLC.grid:CreateTexture(nil, 'BACKGROUND') + if i == hline / 2 then t:SetVertexColor(1, 0, 0, 0.5) else t:SetVertexColor(0, 0, 0, 0.5) end + t:SetPoint('TOPLEFT', grid, 'TOPLEFT', 0, -i * h / hline + 1) + t:SetPoint('BOTTOMRIGHT', grid, 'TOPRIGHT', 0, -i * h / hline - 1) + end + + end + + ---------------------------------------------------------------------- + -- Media player + ---------------------------------------------------------------------- + + function LeaPlusLC:MediaFunc() + + -- Create tables for list data and zone listing + local ListData, playlist = {}, {} + local scrollFrame, willPlay, musicHandle, ZonePage, LastPlayed, LastFolder, TempFolder, HeadingOfClickedTrack, LastMusicHandle + local numButtons = 15 + local uframe = CreateFrame("FRAME") + + -- These categories will not appear in random track selections + local randomBannedList = {L["Narration"], L["Cinematics"]} + + -- Get media table + local ZoneList = Leatrix_Plus["ZoneList"] + + -- Show relevant list items + local function UpdateList() + FauxScrollFrame_Update(scrollFrame, #ListData, numButtons, 16) + for index = 1, numButtons do + local offset = index + FauxScrollFrame_GetOffset(scrollFrame) + local button = scrollFrame.buttons[index] + button.index = offset + if offset <= #ListData then + -- Show zone listing or track listing + button:SetText(ListData[offset].zone or ListData[offset]) + -- Set width of highlight texture + if button:GetTextWidth() > 290 then + button.t:SetSize(290, 16) + else + button.t:SetSize(button:GetTextWidth(), 16) + end + -- Show the button + button:Show() + -- Hide highlight bar texture by default + button.s:Hide() + -- Hide highlight bar if the button is a heading + if strfind(button:GetText(), "|c") then button.t:Hide() end + -- Show last played track highlight bar texture + if LastPlayed == button:GetText() then + local HeadingOfCurrentFolder = ListData[1] + if HeadingOfCurrentFolder == HeadingOfClickedTrack then + button.s:Show() + end + end + -- Show last played folder highlight bar texture + if LastFolder == button:GetText() then + button.s:Show() + end + -- Set width of highlight bar + if button:GetTextWidth() > 290 then + button.s:SetSize(290, 16) + else + button.s:SetSize(button:GetTextWidth(), 16) + end + -- Limit click to label width + local bWidth = button:GetFontString():GetStringWidth() or 0 + if bWidth > 290 then bWidth = 290 end + button:SetHitRectInsets(0, 454 - bWidth, 0, 0) + -- Disable label click movement + button:SetPushedTextOffset(0, 0) + -- Disable word wrap and set width + button:GetFontString():SetWidth(290) + button:GetFontString():SetWordWrap(false) + else + button:Hide() + end + end + end + + -- Give function file level scope (it's used in SetPlusScale to set the highlight bar scale) + LeaPlusLC.UpdateList = UpdateList + + -- Right-button click to go back + local function BackClick() + -- Return to the current zone list (back button) + if type(ListData[1]) == "string" then + -- Strip the color code from the list data + local nocol = string.gsub(ListData[1], "|cffffd800", "") + -- Strip the zone + local backzone = strsplit(":", nocol, 2) + -- Don't go back if random or search category is being shown + if backzone == L["Random"] or backzone == L["Search"] then return end + -- Show the tracklist continent + if ZoneList[backzone] then ListData = ZoneList[backzone] end + UpdateList() + scrollFrame:SetVerticalScroll(ZonePage or 0) + end + end + + -- Function to make navigation menu buttons + local function MakeButton(where, y) + local mbtn = CreateFrame("Button", nil, LeaPlusLC["Page9"]) + mbtn:Show() + mbtn:SetAlpha(1.0) + mbtn:SetPoint("TOPLEFT", 146, y) + + -- Create hover texture + mbtn.t = mbtn:CreateTexture(nil, "BACKGROUND") + mbtn.t:SetVertexColor(0.3, 0.3, 0.00, 0.8) + mbtn.t:SetAlpha(0.7) + mbtn.t:SetAllPoints() + mbtn.t:Hide() + + -- Create highlight texture + mbtn.s = mbtn:CreateTexture(nil, "BACKGROUND") + mbtn.s:SetVertexColor(0.3, 0.3, 0.00, 0.8) + mbtn.s:SetAlpha(1.0) + mbtn.s:SetAllPoints() + mbtn.s:Hide() + + -- Create fontstring + mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mbtn.f:SetPoint('LEFT', 1, 0) + mbtn.f:SetText(L[where]) + + mbtn:SetScript("OnEnter", function() + mbtn.t:Show() + end) + + mbtn:SetScript("OnLeave", function() + mbtn.t:Hide() + end) + + -- Set button size when shown + mbtn:SetScript("OnShow", function() + mbtn:SetSize(mbtn.f:GetStringWidth() + 1, 16) + end) + + mbtn:SetScript("OnClick", function() + -- Show zone listing for clicked item + ListData = ZoneList[where] + UpdateList() + end) + + return mbtn, mbtn.s + + end + + -- Create a table for each button + local conbtn = {} + for q, w in pairs(ZoneList) do + conbtn[q] = {} + end + + -- Create buttons + local function MakeButtonNow(title, anchor) + conbtn[title], conbtn[title].s = MakeButton(title, height) + conbtn[title]:ClearAllPoints() + if title == L["Zones"] then + -- Set first button position + conbtn[title]:SetPoint("TOPLEFT", LeaPlusLC["Page9"], "TOPLEFT", 145, -70) + elseif anchor then + -- Set subsequent button positions + conbtn[title]:SetPoint("TOPLEFT", conbtn[anchor], "BOTTOMLEFT", 0, 0) + conbtn[title].f:SetText(L[title]) + end + end + + MakeButtonNow(L["Zones"]) + MakeButtonNow(L["Dungeons"], L["Zones"]) + MakeButtonNow(L["Various"], L["Dungeons"]) + MakeButtonNow(L["Movies"], L["Various"]) + MakeButtonNow(L["Random"], L["Movies"]) + MakeButtonNow(L["Search"]) -- Positioned when search editbox is created + + -- Show button highlight for clicked button + for q, w in pairs(ZoneList) do + if type(w) == "string" and conbtn[w] then + conbtn[w]:HookScript("OnClick", function() + -- Hide all button highlights + for k, v in pairs(ZoneList) do + if type(v) == "string" and conbtn[v] then + conbtn[v].s:Hide() + end + end + -- Show clicked button highlight + conbtn[w].s:Show() + LeaPlusDB["MusicContinent"] = w + scrollFrame:SetVerticalScroll(0) + -- Set TempFolder for listings without folders + if w == L["Random"] then TempFolder = L["Random"] end + if w == L["Search"] then TempFolder = L["Search"] end + end) + end + end + + -- Create scroll bar + scrollFrame = CreateFrame("ScrollFrame", "LeaPlusScrollFrame", LeaPlusLC["Page9"], "FauxScrollFrameTemplate") + scrollFrame:SetPoint("TOPLEFT", 0, -32) + scrollFrame:SetPoint("BOTTOMRIGHT", -30, 50) + scrollFrame:SetFrameLevel(10) + scrollFrame:SetScript("OnVerticalScroll", function(self, offset) + FauxScrollFrame_OnVerticalScroll(self, offset, 16, UpdateList) + end) + + -- Add stop button + local stopBtn = LeaPlusLC:CreateButton("StopMusicBtn", LeaPlusLC["Page9"], "Stop", "TOPLEFT", 146, -292, 0, 25, true, "") + stopBtn:Hide(); stopBtn:Show() + LeaPlusLC:LockItem(stopBtn, true) + stopBtn:SetScript("OnClick", function() + if musicHandle then + StopSound(musicHandle) + musicHandle = nil + -- Hide highlight bars + LastPlayed = "" + LastFolder = "" + UpdateList() + end + -- Cancel sound file music timer + if LeaPlusLC.TrackTimer then LeaPlusLC.TrackTimer:Cancel() end + -- Lock button and unregister next track events + LeaPlusLC:LockItem(stopBtn, true) + uframe:UnregisterEvent("SOUNDKIT_FINISHED") + uframe:UnregisterEvent("LOADING_SCREEN_DISABLED") + end) + + -- Store currently playing track number + local tracknumber = 1 + + -- Function to play a track and show the static highlight bar + local function PlayTrack() + -- Play tracks + if musicHandle then StopSound(musicHandle) end + local file, soundID, trackTime + if strfind(playlist[tracknumber], "#") then + if strfind(playlist[tracknumber], ".mp3") then + -- Music file with track time + file, trackTime = playlist[tracknumber]:match("([^,]+)%#([^,]+)") + local cleanFile = file:gsub("(|C%a%a%a%a%a%a%a%a)[^|]*(|r)", "") -- Remove color tags + if strfind(file, "cinematics/") then + cleanFile = "interface/" .. cleanFile + elseif strfind(file, "cinematicvoices/") or strfind(file, "ambience/") or strfind(file, "spells/") then + cleanFile = "sound/" .. cleanFile + else + cleanFile = "sound/music/" .. cleanFile + end + willPlay, musicHandle = PlaySoundFile(cleanFile, "Master", false, true) + else + -- Sound kit without track time + file, soundID = playlist[tracknumber]:match("([^,]+)%#([^,]+)") + willPlay, musicHandle = PlaySound(soundID, "Master", false, true) + end + end + -- Cancel existing music timer for a sound file + if LeaPlusLC.TrackTimer then LeaPlusLC.TrackTimer:Cancel() end + if strfind(playlist[tracknumber], "#") then + if strfind(playlist[tracknumber], ".mp3") then + -- Track is a sound file with track time so create track timer + LeaPlusLC.TrackTimer = LibCompat.NewTimer(trackTime + 1, function() + if musicHandle then StopSound(musicHandle) end + if tracknumber == #playlist then + -- Playlist is at the end, restart from first track + tracknumber = 1 + end + PlayTrack() + end) + end + end + -- Store its handle for later use + LastMusicHandle = musicHandle + LastPlayed = playlist[tracknumber] + tracknumber = tracknumber + 1 + -- Show static highlight bar + for index = 1, numButtons do + local button = scrollFrame.buttons[index] + local item = button:GetText() + if item then + if strfind(item, "#") then + local item, void = item:match("([^,]+)%#([^,]+)") + if item then + if item == file and LastFolder == TempFolder then + button.s:Show() + else + button.s:Hide() + end + end + end + end + end + end + + -- Create editbox for search + local sBox = LeaPlusLC:CreateEditBox("MusicSearchBox", LeaPlusLC["Page9"], 78, 10, "TOPLEFT", 150, -260, "MusicSearchBox", "MusicSearchBox") + sBox:SetMaxLetters(50) + + -- Position search button above editbox + conbtn[L["Search"]]:ClearAllPoints() + conbtn[L["Search"]]:SetPoint("BOTTOMLEFT", sBox, "TOPLEFT", -4, 0) + + -- Set initial search data + for q, w in pairs(ZoneList) do + if conbtn[w] then + conbtn[w]:HookScript("OnClick", function() + if w == L["Search"] then + ListData[1] = "|cffffd800" .. L["Search"] + if #ListData == 1 then + ListData[2] = "|cffffffaa{" .. L["enter zone or track name"] .. "}" + end + UpdateList() + else + sBox:ClearFocus() + end + end) + end + end + + -- Function to show search results + local function ShowSearchResults() + -- Get unescaped editbox text + local searchText = gsub(strlower(sBox:GetText()), '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])', "%%%1") + -- Wipe the track listing + wipe(ListData) + -- Set the track list heading + ListData[1] = "|cffffd800" .. L["Search"] + -- Show the subheading only if no search results are being shown + if searchText == "" then + ListData[2] = "|cffffffaa{" .. L["enter zone or track name"] .. "}" + else + ListData[2] = "" + end + -- Traverse music listing and populate ListData + if searchText ~= "" then + local word1, word2, word3, word4, word5 = strsplit(" ", (strtrim(searchText):gsub("%s+", " "))) + RunScript('LeaPlusGlobalHash = {}') + local hash = LeaPlusGlobalHash + local trackCount = 0 + for i, e in pairs(ZoneList) do + if ZoneList[e] then + for a, b in pairs(ZoneList[e]) do + if b.tracks then + for k, v in pairs(b.tracks) do + if (strfind(v, "#") or strfind(v, "|r")) and (strfind(strlower(v), word1) or strfind(strlower(b.zone), word1) or strfind(strlower(b.category), word1)) then + if not word2 or word2 ~= "" and (strfind(strlower(v), word2) or strfind(strlower(b.zone), word2) or strfind(strlower(b.category), word2)) then + if not word3 or word3 ~= "" and (strfind(strlower(v), word3) or strfind(strlower(b.zone), word3) or strfind(strlower(b.category), word3)) then + if not word4 or word4 ~= "" and (strfind(strlower(v), word4) or strfind(strlower(b.zone), word4) or strfind(strlower(b.category), word4)) then + if not word5 or word5 ~= "" and (strfind(strlower(v), word5) or strfind(strlower(b.zone), word5) or strfind(strlower(b.category), word5)) then + -- Show category + if not hash[b.category] then + tinsert(ListData, "|cffffffff") + if b.category == e then + -- No category so just show ZoneList entry (such as Various) + tinsert(ListData, "|cffffd800" .. e) + else + -- Category exists so show that + tinsert(ListData, "|cffffd800" .. e .. ": " .. b.category) + end + hash[b.category] = true + end + -- Show track + tinsert(ListData, "|Cffffffaa" .. b.zone .. " |r" .. v) + trackCount = trackCount + 1 + hash[v] = true + end + end + end + end + end + end + end + end + end + end + + -- Set results tag + if trackCount == 1 then + ListData[2] = "|cffffffaa{" .. trackCount .. " " .. L["result"] .. "}" + else + ListData[2] = "|cffffffaa{" .. trackCount .. " " .. L["results"] .. "}" + end + end + -- Refresh the track listing + UpdateList() + -- Set track listing to top + scrollFrame:SetVerticalScroll(0) + end + + -- Populate ListData when editbox is changed by user + sBox:HookScript("OnTextChanged", function(self, userInput) + if userInput then + -- Show search page + conbtn[L["Search"]]:Click() + -- If search results are currently playing, stop playback since search results will be changed + if LastFolder == L["Search"] then stopBtn:Click() end + -- Show search results + ShowSearchResults() + end + end) + + -- Populate ListData when editbox enter key is pressed + sBox:HookScript("OnEnterPressed", function() + -- Show search page + conbtn[L["Search"]]:Click() + -- If search results are currently playing, stop playback since search results will be changed + if LastFolder == L["Search"] then stopBtn:Click() end + -- Show search results + ShowSearchResults() + end) + + -- Function to show random track listing + local function ShowRandomList() + -- If random track is currently playing, stop playback since random track list will be changed + if LastFolder == L["Random"] then + stopBtn:Click() + end + -- Wipe the track listing for random + wipe(ListData) + -- Set the track list heading + ListData[1] = "|cffffd800" .. L["Random"] + ListData[2] = "|Cffffffaa{" .. L["click here for new selection"] .. "}" -- Must be capital |C + ListData[3] = "|cffffd800" + ListData[4] = "|cffffd800" .. L["Selection of music tracks"] -- Must be lower case |c + -- Populate list data until it contains desired number of tracks + while #ListData < 50 do + -- Get random category + local rCategory = GetRandomArgument(L["Zones"], L["Dungeons"], L["Various"]) + -- Get random zone within category + local rZone = random(1, #ZoneList[rCategory]) + -- Get random track within zone + local rTrack = ZoneList[rCategory][rZone].tracks[random(1, #ZoneList[rCategory][rZone].tracks)] + -- Insert track into ListData if it's not a duplicate or on the banned list + if rTrack and rTrack ~= "" and strfind(rTrack, "#") and not tContains(ListData, "|Cffffffaa" .. ZoneList[rCategory][rZone].zone .. " |r" .. rTrack) then + if not tContains(randomBannedList, L[ZoneList[rCategory][rZone].zone]) and not tContains(randomBannedList, rTrack) then + tinsert(ListData, "|Cffffffaa" .. ZoneList[rCategory][rZone].zone .. " |r" .. rTrack) + end + end + end + -- Refresh the track listing + UpdateList() + -- Set track listing to top + scrollFrame:SetVerticalScroll(0) + end + + -- Show random track listing on startup when random button is clicked + for q, w in pairs(ZoneList) do + if conbtn[w] then + conbtn[w]:HookScript("OnClick", function() + if w == L["Random"] then + -- Generate initial playlist for first run + if #ListData == 0 then + ShowRandomList() + end + end + end) + end + end + + -- Create list items + scrollFrame.buttons = {} + for i = 1, numButtons do + scrollFrame.buttons[i] = CreateFrame("Button", nil, LeaPlusLC["Page9"]) + local button = scrollFrame.buttons[i] + + button:SetSize(470 - 14, 16) + button:SetNormalFontObject("GameFontHighlightLeft") + button:SetPoint("TOPLEFT", 246, -62+ -(i - 1) * 16 - 8) + + -- Create highlight bar texture + button.t = button:CreateTexture(nil, "BACKGROUND") + button.t:SetPoint("TOPLEFT", button, 0, 0) + button.t:SetSize(516, 16) + + button.t:SetVertexColor(0.3, 0.3, 0.0, 0.8) + button.t:SetAlpha(0.7) + button.t:Hide() + + -- Create last playing highlight bar texture + button.s = button:CreateTexture(nil, "BACKGROUND") + button.s:SetPoint("TOPLEFT", button, 0, 0) + button.s:SetSize(516, 16) + + button.s:SetVertexColor(0.3, 0.4, 0.00, 0.6) + button.s:Hide() + + button:SetScript("OnEnter", function() + -- Highlight links only + if not string.match(button:GetText() or "", "|c") then + button.t:Show() + end + end) + + button:SetScript("OnLeave", function() + button.t:Hide() + end) + + button:RegisterForClicks("LeftButtonUp", "RightButtonUp") + + -- Handler for playing next SoundKit track in playlist + uframe:SetScript("OnEvent", function(self, event, stoppedHandle) + if event == "SOUNDKIT_FINISHED" then + -- Do nothing if stopped sound kit handle doesnt match last played track handle + if LastMusicHandle and LastMusicHandle ~= stoppedHandle then return end + -- Reset track number if playlist has reached the end + if tracknumber == #playlist then tracknumber = 1 end + -- Play next track + PlayTrack() + elseif event == "LOADING_SCREEN_DISABLED" then + -- Restart player if it stopped between tracks during loading screen + if playlist and tracknumber and playlist[tracknumber] and not willPlay and not musicHandle then + tracknumber = tracknumber - 1 + LibCompat.After(0.1, PlayTrack) + end + end + end) + + -- Click handler for track, zone and back button + button:SetScript("OnClick", function(self, btn) + if btn == "LeftButton" then + -- Remove focus from search box + sBox:ClearFocus() + -- Get clicked track text + local item = self:GetText() + -- Do nothing if its a blank line or informational heading + if not item or strfind(item, "|c") then return end + if item == "|Cffffffaa{" .. L["click here for new selection"] .. "}" then -- must be capital |C + -- Create new random track listing + ShowRandomList() + return + elseif strfind(item, "#") then + -- Enable sound if required + if GetCVar("Sound_EnableAllSound") == "0" then SetCVar("Sound_EnableAllSound", "1") end + -- Disable music if it's currently enabled + if GetCVar("Sound_EnableMusic") == "1" then SetCVar("Sound_EnableMusic", "0") end + -- Add all tracks to playlist + wipe(playlist) + local StartItem = 0 + -- Get item clicked row number + for index = 1, #ListData do + local item = ListData[index] + if self:GetText() == item then StartItem = index end + end + -- Add all items from clicked item onwards to playlist + for index = StartItem, #ListData do + local item = ListData[index] + if item then + if strfind(item, "#") then + tinsert(playlist, item) + end + end + end + -- Add all items up to clicked item to playlist + for index = 1, StartItem do + local item = ListData[index] + if item then + if strfind(item, "#") then + tinsert(playlist, item) + end + end + end + -- Enable the stop button + LeaPlusLC:LockItem(stopBtn, false) + -- Set Temp Folder to Random if track is in Random + if ListData[1] == "|cffffd800" .. L["Random"] then TempFolder = L["Random"] end + -- Set Temp Folder to Search if track is in Search + if ListData[1] == "|cffffd800" .. L["Search"] then TempFolder = L["Search"] end + -- Store information about the track we are about to play + tracknumber = 1 + LastPlayed = item + LastFolder = TempFolder + HeadingOfClickedTrack = ListData[1] + -- Play first track + PlayTrack() + -- Play subsequent tracks + uframe:RegisterEvent("SOUNDKIT_FINISHED") + uframe:RegisterEvent("LOADING_SCREEN_DISABLED") + return + elseif strfind(item, "|r") then + -- A movie was clicked + local movieName, movieID = item:match("([^,]+)%|r([^,]+)") + movieID = strtrim(movieID, "()") + if IsMoviePlayable(movieID) then + stopBtn:Click() + MovieFrame_PlayMovie(MovieFrame, movieID) + else + LeaPlusLC:Print("Movie not playable.") + end + return + else + -- A zone was clicked so show track listing + ZonePage = scrollFrame:GetVerticalScroll() + -- Find the track listing for the clicked zone + for q, w in pairs(ZoneList) do + for k, v in pairs(ZoneList[w]) do + if item == v.zone then + -- Show track listing + TempFolder = item + LeaPlusDB["MusicZone"] = item + ListData = v.tracks + UpdateList() + -- Hide hover highlight if track under pointer is a heading + if strfind(scrollFrame.buttons[i]:GetText(), "|c") then + scrollFrame.buttons[i].t:Hide() + end + -- Show top of track list + scrollFrame:SetVerticalScroll(0) + return + end + end + end + end + elseif btn == "RightButton" then + -- Back button was clicked + BackClick() + end + end) + + end + + -- Right-click to go back (from anywhere on the main content area of the panel) + LeaPlusLC["PageF"]:HookScript("OnMouseUp", function(self, btn) + if LeaPlusLC["Page9"]:IsShown() and LeaPlusLC["Page9"]:IsMouseOver(0, 0, 0, -440) == false and LeaPlusLC["Page9"]:IsMouseOver(-330, 0, 0, 0) == false then + if btn == "RightButton" then + BackClick() + end + end + end) + + -- Delete the global scroll frame pointer + _G.LeaPlusScrollFrame = nil + + -- Set zone listing on startup + if LeaPlusDB["MusicContinent"] and LeaPlusDB["MusicContinent"] ~= "" then + -- Saved music continent exists + if conbtn[LeaPlusDB["MusicContinent"]] then + -- Saved continent is valid button so click it + conbtn[LeaPlusDB["MusicContinent"]]:Click() + else + -- Saved continent is not valid button so click default button + conbtn[L["Zones"]]:Click() + end + else + -- Saved music continent does not exist so click default button + conbtn[L["Zones"]]:Click() + end + UpdateList() + + -- Manage events + LeaPlusLC["Page9"]:RegisterEvent("PLAYER_LOGOUT") + LeaPlusLC["Page9"]:RegisterEvent("UI_SCALE_CHANGED") + LeaPlusLC["Page9"]:SetScript("OnEvent", function(self, event) + if event == "PLAYER_LOGOUT" then + -- Stop playing at reload or logout + if musicHandle then + StopSound(musicHandle) + end + elseif event == "UI_SCALE_CHANGED" then + -- Refresh list + UpdateList() + end + end) + + end + + -- Run on startup + LeaPlusLC:MediaFunc() + + -- Release memory + LeaPlusLC.MediaFunc = nil + + ---------------------------------------------------------------------- + -- Panel alpha + ---------------------------------------------------------------------- + + -- Function to set panel alpha + local function SetPlusAlpha() + -- Set panel alpha + LeaPlusLC["PageF"].t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + -- Show formatted value + LeaPlusCB["PlusPanelAlpha"].f:SetFormattedText("%.0f%%", LeaPlusLC["PlusPanelAlpha"] * 100) + end + + -- Set alpha on startup + SetPlusAlpha() + + -- Set alpha after changing slider + LeaPlusCB["PlusPanelAlpha"]:HookScript("OnValueChanged", SetPlusAlpha) + + ---------------------------------------------------------------------- + -- Panel scale + ---------------------------------------------------------------------- + + -- Function to set panel scale + local function SetPlusScale() + -- Reset panel position + LeaPlusLC["MainPanelA"], LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = "CENTER", "CENTER", 0, 0 + if LeaPlusLC["PageF"]:IsShown() then + LeaPlusLC["PageF"]:Hide() + LeaPlusLC["PageF"]:Show() + end + -- Set panel scale + LeaPlusLC["PageF"]:SetScale(LeaPlusLC["PlusPanelScale"]) + -- Update music player highlight bar scale + LeaPlusLC:UpdateList() + end + + -- Set scale on startup + LeaPlusLC["PageF"]:SetScale(LeaPlusLC["PlusPanelScale"]) + + -- Set scale and reset panel position after changing slider + LeaPlusCB["PlusPanelScale"]:HookScript("OnMouseUp", SetPlusScale) + LeaPlusCB["PlusPanelScale"]:HookScript("OnMouseWheel", SetPlusScale) + + -- Show formatted slider value + LeaPlusCB["PlusPanelScale"]:HookScript("OnValueChanged", function() + LeaPlusCB["PlusPanelScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["PlusPanelScale"] * 100) + end) + + ---------------------------------------------------------------------- + -- Options panel + ---------------------------------------------------------------------- + + -- Hide Leatrix Plus if game options panel is shown + InterfaceOptionsFrame:HookScript("OnShow", LeaPlusLC.HideFrames); + VideoOptionsFrame:HookScript("OnShow", LeaPlusLC.HideFrames); + + ---------------------------------------------------------------------- + -- Block friend requests + ---------------------------------------------------------------------- + + -- Function to decline friend requests + local function DeclineReqs() + if LeaPlusLC["NoFriendRequests"] == "On" then + for i = BNGetNumFriendInvites(), 1, -1 do + local id, player = BNGetFriendInviteInfo(i) + if id and player then + BNDeclineFriendInvite(id) + LibCompat.After(0.1, function() + LeaPlusLC:Print(L["A friend request from"] .. " " .. player .. " " .. L["was automatically declined."]) + end) + end + end + end + end + + -- Event frame for incoming friend requests + local DecEvt = CreateFrame("FRAME") + DecEvt:SetScript("OnEvent", DeclineReqs) + + -- Function to register or unregister the event + local function ControlEvent() + if LeaPlusLC["NoFriendRequests"] == "On" then + DecEvt:RegisterEvent("BN_FRIEND_INVITE_ADDED") + DeclineReqs() + else + DecEvt:UnregisterEvent("BN_FRIEND_INVITE_ADDED") + end + end + + -- Set event status when option is enabled + LeaPlusCB["NoFriendRequests"]:HookScript("OnClick", ControlEvent) + + -- Set event status on startup + ControlEvent() + + ---------------------------------------------------------------------- + -- Invite from whisper (configuration panel) + ---------------------------------------------------------------------- + + -- Create configuration panel + local InvPanel = LeaPlusLC:CreatePanel("Invite from whispers", "InvPanel") + + -- Add editbox + LeaPlusLC:MakeTx(InvPanel, "Settings", 16, -72) + LeaPlusLC:MakeCB(InvPanel, "InviteFriendsOnly", "Restrict to friends", 16, -92, false, "If checked, group invites will only be sent to friends.|n|nIf unchecked, group invites will be sent to everyone.") + + LeaPlusLC:MakeTx(InvPanel, "Keyword", 356, -72) + local KeyBox = LeaPlusLC:CreateEditBox("KeyBox", InvPanel, 140, 10, "TOPLEFT", 356, -92, "KeyBox", "KeyBox") + + -- Function to show the keyword in the option tooltip + local function SetKeywordTip() + LeaPlusCB["InviteFromWhisper"].tiptext = gsub(LeaPlusCB["InviteFromWhisper"].tiptext, "(|cffffffff)[^|]*(|r)", "%1" .. LeaPlusLC["InvKey"] .. "%2") + end + + -- Function to save the keyword + local function SetInvKey() + local keytext = KeyBox:GetText() + if keytext and keytext ~= "" then + LeaPlusLC["InvKey"] = strtrim(KeyBox:GetText()) + else + LeaPlusLC["InvKey"] = "inv" + end + -- Show the keyword in the option tooltip + SetKeywordTip() + end + + -- Show the keyword in the option tooltip on startup + SetKeywordTip() + + -- Save the keyword when it changes + KeyBox:SetScript("OnTextChanged", SetInvKey) + + -- Refresh editbox with trimmed keyword when edit focus is lost (removes additional spaces) + KeyBox:SetScript("OnEditFocusLost", function() + KeyBox:SetText(LeaPlusLC["InvKey"]) + end) + + -- Help button hidden + InvPanel.h:Hide() + + -- Back button handler + InvPanel.b:SetScript("OnClick", function() + -- Save the keyword + SetInvKey() + -- Show the options panel + InvPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page2"]:Show() + return + end) + + -- Add reset button + InvPanel.r:SetScript("OnClick", function() + -- Settings + LeaPlusLC["InviteFriendsOnly"] = "Off" + -- Reset the keyword to default + LeaPlusLC["InvKey"] = "inv" + -- Set the editbox to default + KeyBox:SetText("inv") + -- Save the keyword + SetInvKey() + -- Refresh panel + InvPanel:Hide(); InvPanel:Show() + end) + + -- Ensure keyword is a string on startup + LeaPlusLC["InvKey"] = tostring(LeaPlusLC["InvKey"]) or "inv" + + -- Set editbox value when shown + KeyBox:HookScript("OnShow", function() + KeyBox:SetText(LeaPlusLC["InvKey"]) + end) + + -- Configuration button handler + LeaPlusCB["InvWhisperBtn"]:SetScript("OnClick", function() + if IsShiftKeyDown() and IsControlKeyDown() then + -- Preset profile + LeaPlusLC["InviteFriendsOnly"] = "On" + LeaPlusLC["InvKey"] = "inv" + KeyBox:SetText(LeaPlusLC["InvKey"]) + SetInvKey() + else + -- Show panel + InvPanel:Show() + LeaPlusLC:HideFrames() + end + end) + + ---------------------------------------------------------------------- + -- Final code for RunOnce + ---------------------------------------------------------------------- + + -- Update addon memory usage (speeds up initial value) + UpdateAddOnMemoryUsage(); + + -- Release memory + LeaPlusLC.RunOnce = nil + + end + +---------------------------------------------------------------------- +-- L60: Default events +---------------------------------------------------------------------- + + local function eventHandler(self, event, arg1, arg2, ...) + + ---------------------------------------------------------------------- + -- Invite from whisper + ---------------------------------------------------------------------- + + if event == "CHAT_MSG_WHISPER" or event == "CHAT_MSG_BN_WHISPER" then + if (not UnitExists("party1") or UnitIsGroupLeader("player") or UnitIsGroupAssistant("player")) and strlower(strtrim(arg1)) == strlower(LeaPlusLC["InvKey"]) then + if not LeaPlusLC:IsInLFGQueue() then + if event == "CHAT_MSG_WHISPER" then + local void, void, void, void, viod, void, void, void, void, guid = ... + if LeaPlusLC:FriendCheck(arg2, guid) or LeaPlusLC["InviteFriendsOnly"] == "Off" then + InviteUnit(arg2) + end + elseif event == "CHAT_MSG_BN_WHISPER" then + local presenceID = select(11, ...) + if presenceID and BNIsFriend(presenceID) then + local index = BNGetFriendIndex(presenceID) + if index then + local accountInfo = C_BattleNet.GetFriendAccountInfo(index) + local gameAccountInfo = accountInfo.gameAccountInfo + local gameAccountID = gameAccountInfo.gameAccountID + if gameAccountID then + BNInviteFriend(gameAccountID) + end + end + end + end + end + end + return + end + + ---------------------------------------------------------------------- + -- Block duel requests + ---------------------------------------------------------------------- + + if event == "DUEL_REQUESTED" and not LeaPlusLC:FriendCheck(arg1) then + CancelDuel() + StaticPopup_Hide("DUEL_REQUESTED") + return + end + + ---------------------------------------------------------------------- + -- Accept summon + ---------------------------------------------------------------------- + + if event == "CONFIRM_SUMMON" then + if not UnitAffectingCombat("player") then + local sName = C_SummonInfo.GetSummonConfirmSummoner() + local sLocation = C_SummonInfo.GetSummonConfirmAreaName() + LeaPlusLC:Print(L["The summon from"] .. " " .. sName .. " (" .. sLocation .. ") " .. L["will be automatically accepted in 10 seconds unless cancelled."]) + LibCompat.After(10, function() + local sNameNew = C_SummonInfo.GetSummonConfirmSummoner() + local sLocationNew = C_SummonInfo.GetSummonConfirmAreaName() + if sName == sNameNew and sLocation == sLocationNew then + -- Automatically accept summon after 10 seconds if summoner name and location have not changed + C_SummonInfo.ConfirmSummon() + StaticPopup_Hide("CONFIRM_SUMMON") + end + end) + end + return + end + + ---------------------------------------------------------------------- + -- Block party invites and party from friends + ---------------------------------------------------------------------- + + if event == "PARTY_INVITE_REQUEST" then + + -- If a friend, accept if you're accepting friends and not in battleground queue + local void, void, void, void, guid = ... + if (LeaPlusLC["AcceptPartyFriends"] == "On" and LeaPlusLC:FriendCheck(arg1, guid)) then + if not LeaPlusLC:IsInLFGQueue() then + AcceptGroup() + for i=1, STATICPOPUP_NUMDIALOGS do + if _G["StaticPopup"..i].which == "PARTY_INVITE" then + _G["StaticPopup"..i].inviteAccepted = 1 + StaticPopup_Hide("PARTY_INVITE") + break + elseif _G["StaticPopup"..i].which == "PARTY_INVITE_XREALM" then + _G["StaticPopup"..i].inviteAccepted = 1 + StaticPopup_Hide("PARTY_INVITE_XREALM") + break + end + end + return + end + end + + -- If not a friend and you're blocking invites, decline + if LeaPlusLC["NoPartyInvites"] == "On" then + if LeaPlusLC:FriendCheck(arg1, guid) then + return + else + DeclineGroup() + StaticPopup_Hide("PARTY_INVITE") + StaticPopup_Hide("PARTY_INVITE_XREALM") + return + end + end + + return + end + + ---------------------------------------------------------------------- + -- Disable loot warnings + ---------------------------------------------------------------------- + + -- Disable warnings for attempting to roll Need on loot + if event == "CONFIRM_LOOT_ROLL" then + ConfirmLootRoll(arg1, arg2) + StaticPopup_Hide("CONFIRM_LOOT_ROLL") + return + end + + -- Disable warning for attempting to loot a Bind on Pickup item + if event == "LOOT_BIND_CONFIRM" then + ConfirmLootSlot(arg1, arg2) + StaticPopup_Hide("LOOT_BIND",...) + return + end + + -- Disable warning for attempting to vendor an item within its refund window + if event == "MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL" then + SellCursorItem() + return + end + + -- Disable warning for attempting to mail an item within its refund window + if event == "MAIL_LOCK_SEND_ITEMS" then + RespondMailLockSendItem(arg1, true) + return + end + + ---------------------------------------------------------------------- + -- Hide the combat log + ---------------------------------------------------------------------- + + if event == "UPDATE_CHAT_WINDOWS" then + ChatFrame2Tab:EnableMouse(false) + ChatFrame2Tab:SetText(" ") -- Needs to be something for chat settings to function + ChatFrame2Tab:SetScale(0.01) + ChatFrame2Tab:SetWidth(0.01) + ChatFrame2Tab:SetHeight(0.01) + end + + ---------------------------------------------------------------------- + -- L62: Profile events + ---------------------------------------------------------------------- + + if event == "ADDON_LOADED" then + if arg1 == "Leatrix_Plus" then + + -- Replace old var names with new ones + local function UpdateVars(oldvar, newvar) + if LeaPlusDB[oldvar] and not LeaPlusDB[newvar] then LeaPlusDB[newvar] = LeaPlusDB[oldvar]; LeaPlusDB[oldvar] = nil end + end + + UpdateVars("MuteStriders", "MuteMechSteps") -- 2.5.108 (1st June 2022) + UpdateVars("MinimapMod", "MinimapModder") -- 2.5.120 (24th August 2022) + + -- Automation + LeaPlusLC:LoadVarChk("AutomateQuests", "Off") -- Automate quests + LeaPlusLC:LoadVarChk("AutoQuestShift", "Off") -- Automate quests requires shift + LeaPlusLC:LoadVarChk("AutoQuestAvailable", "On") -- Accept available quests + LeaPlusLC:LoadVarChk("AutoQuestCompleted", "On") -- Turn-in completed quests + LeaPlusLC:LoadVarNum("AutoQuestKeyMenu", 1, 1, 4) -- Automate quests override key + LeaPlusLC:LoadVarChk("AutomateGossip", "Off") -- Automate gossip + LeaPlusLC:LoadVarChk("AutoAcceptSummon", "Off") -- Accept summon + LeaPlusLC:LoadVarChk("AutoAcceptRes", "Off") -- Accept resurrection + LeaPlusLC:LoadVarChk("AutoResNoCombat", "On") -- Accept resurrection exclude combat + LeaPlusLC:LoadVarChk("AutoReleasePvP", "Off") -- Release in PvP + LeaPlusLC:LoadVarChk("AutoReleaseNoAlterac", "Off") -- Release in PvP Exclude Alterac Valley + LeaPlusLC:LoadVarNum("AutoReleaseDelay", 200, 200, 3000) -- Release in PvP Delay + + LeaPlusLC:LoadVarChk("AutoSellJunk", "Off") -- Sell junk automatically + LeaPlusLC:LoadVarChk("AutoSellShowSummary", "On") -- Sell junk summary in chat + LeaPlusLC:LoadVarStr("AutoSellExcludeList", "") -- Sell junk exclude list + LeaPlusLC:LoadVarChk("AutoRepairGear", "Off") -- Repair automatically + LeaPlusLC:LoadVarChk("AutoRepairGuildFunds", "On") -- Repair using guild funds + LeaPlusLC:LoadVarChk("AutoRepairShowSummary", "On") -- Repair show summary in chat + + -- Social + LeaPlusLC:LoadVarChk("NoDuelRequests", "Off") -- Block duels + LeaPlusLC:LoadVarChk("NoPartyInvites", "Off") -- Block party invites + LeaPlusLC:LoadVarChk("NoFriendRequests", "Off") -- Block friend requests + LeaPlusLC:LoadVarChk("NoSharedQuests", "Off") -- Block shared quests + + LeaPlusLC:LoadVarChk("AcceptPartyFriends", "Off") -- Party from friends + LeaPlusLC:LoadVarChk("InviteFromWhisper", "Off") -- Invite from whispers + LeaPlusLC:LoadVarChk("InviteFriendsOnly", "Off") -- Restrict invites to friends + LeaPlusLC["InvKey"] = LeaPlusDB["InvKey"] or "inv" -- Invite from whisper keyword + LeaPlusLC:LoadVarChk("FriendlyGuild", "On") -- Friendly guild + + -- Chat + LeaPlusLC:LoadVarChk("UseEasyChatResizing", "Off") -- Use easy resizing + LeaPlusLC:LoadVarChk("NoCombatLogTab", "Off") -- Hide the combat log + LeaPlusLC:LoadVarChk("NoChatButtons", "Off") -- Hide chat buttons + LeaPlusLC:LoadVarChk("UnclampChat", "Off") -- Unclamp chat frame + LeaPlusLC:LoadVarChk("MoveChatEditBoxToTop", "Off") -- Move editbox to top + LeaPlusLC:LoadVarChk("MoreFontSizes", "Off") -- More font sizes + + LeaPlusLC:LoadVarChk("NoStickyChat", "Off") -- Disable sticky chat + LeaPlusLC:LoadVarChk("UseArrowKeysInChat", "Off") -- Use arrow keys in chat + LeaPlusLC:LoadVarChk("NoChatFade", "Off") -- Disable chat fade + LeaPlusLC:LoadVarChk("UnivGroupColor", "Off") -- Universal group color + LeaPlusLC:LoadVarChk("ClassColorsInChat", "Off") -- Use class colors in chat + LeaPlusLC:LoadVarChk("RecentChatWindow", "Off") -- Recent chat window + LeaPlusLC:LoadVarNum("RecentChatSize", 170, 170, 600) -- Recent chat size + LeaPlusLC:LoadVarChk("MaxChatHstory", "Off") -- Increase chat history + LeaPlusLC:LoadVarChk("FilterChatMessages", "Off") -- Filter chat messages + LeaPlusLC:LoadVarChk("BlockSpellLinks", "Off") -- Block spell links + LeaPlusLC:LoadVarChk("BlockDrunkenSpam", "Off") -- Block drunken spam + LeaPlusLC:LoadVarChk("BlockDuelSpam", "Off") -- Block duel spam + LeaPlusLC:LoadVarChk("RestoreChatMessages", "Off") -- Restore chat messages + + -- Text + LeaPlusLC:LoadVarChk("HideErrorMessages", "Off") -- Hide error messages + LeaPlusLC:LoadVarChk("NoHitIndicators", "Off") -- Hide portrait text + LeaPlusLC:LoadVarChk("HideZoneText", "Off") -- Hide zone text + LeaPlusLC:LoadVarChk("HideKeybindText", "Off") -- Hide keybind text + LeaPlusLC:LoadVarChk("HideMacroText", "Off") -- Hide macro text + + LeaPlusLC:LoadVarChk("MailFontChange", "Off") -- Resize mail text + LeaPlusLC:LoadVarNum("LeaPlusMailFontSize", 15, 10, 36) -- Mail text slider + + LeaPlusLC:LoadVarChk("QuestFontChange", "Off") -- Resize quest text + LeaPlusLC:LoadVarNum("LeaPlusQuestFontSize", 12, 10, 36) -- Quest text slider + + LeaPlusLC:LoadVarChk("BookFontChange", "Off") -- Resize book text + LeaPlusLC:LoadVarNum("LeaPlusBookFontSize", 15, 10, 36) -- Book text slider + + -- Interface + LeaPlusLC:LoadVarChk("MinimapModder", "Off") -- Enhance minimap + LeaPlusLC:LoadVarChk("SquareMinimap", "Off") -- Square minimap + LeaPlusLC:LoadVarChk("ShowWhoPinged", "On") -- Show who pinged + LeaPlusLC:LoadVarChk("CombineAddonButtons", "Off") -- Combine addon buttons + LeaPlusLC:LoadVarStr("MiniExcludeList", "") -- Minimap exclude list + LeaPlusLC:LoadVarChk("HideMiniZoomBtns", "Off") -- Hide zoom buttons + LeaPlusLC:LoadVarChk("HideMiniZoneText", "Off") -- Hide the zone text bar + LeaPlusLC:LoadVarChk("HideMiniAddonButtons", "On") -- Hide addon buttons + LeaPlusLC:LoadVarChk("HideMiniMapButton", "On") -- Hide the world map button + LeaPlusLC:LoadVarChk("HideMiniTracking", "Off") -- Hide the tracking button + LeaPlusLC:LoadVarNum("MinimapScale", 1, 1, 4) -- Minimap scale slider + LeaPlusLC:LoadVarNum("MinimapSize", 140, 140, 560) -- Minimap size slider + LeaPlusLC:LoadVarNum("MiniClusterScale", 1, 1, 2) -- Minimap cluster scale + LeaPlusLC:LoadVarChk("MinimapNoScale", "Off") -- Minimap not minimap + LeaPlusLC:LoadVarAnc("MinimapA", "TOPRIGHT") -- Minimap anchor + LeaPlusLC:LoadVarAnc("MinimapR", "TOPRIGHT") -- Minimap relative + LeaPlusLC:LoadVarNum("MinimapX", -17, -5000, 5000) -- Minimap X + LeaPlusLC:LoadVarNum("MinimapY", -22, -5000, 5000) -- Minimap Y + LeaPlusLC:LoadVarChk("TipModEnable", "Off") -- Enhance tooltip + LeaPlusLC:LoadVarChk("TipShowRank", "On") -- Show rank + LeaPlusLC:LoadVarChk("TipShowOtherRank", "Off") -- Show rank for other guilds + LeaPlusLC:LoadVarChk("TipShowTarget", "On") -- Show target + LeaPlusLC:LoadVarChk("TipHideInCombat", "Off") -- Hide tooltips during combat + LeaPlusLC:LoadVarChk("TipHideShiftOverride", "On") -- Hide tooltips shift override + LeaPlusLC:LoadVarChk("TipNoHealthBar", "Off") -- Hide health bar + LeaPlusLC:LoadVarNum("LeaPlusTipSize", 1.00, 0.50, 2.00) -- Tooltip scale slider + LeaPlusLC:LoadVarNum("TipOffsetX", -13, -5000, 5000) -- Tooltip X offset + LeaPlusLC:LoadVarNum("TipOffsetY", 94, -5000, 5000) -- Tooltip Y offset + LeaPlusLC:LoadVarNum("TooltipAnchorMenu", 1, 1, 5) -- Tooltip anchor menu + LeaPlusLC:LoadVarNum("TipCursorX", 0, -128, 128) -- Tooltip cursor X offset + LeaPlusLC:LoadVarNum("TipCursorY", 0, -128, 128) -- Tooltip cursor Y offset + + LeaPlusLC:LoadVarChk("EnhanceDressup", "Off") -- Enhance dressup + LeaPlusLC:LoadVarChk("DressupItemButtons", "On") -- Dressup item buttons + LeaPlusLC:LoadVarChk("DressupAnimControl", "On") -- Dressup animation control + LeaPlusLC:LoadVarChk("HideDressupStats", "Off") -- Hide dressup stats + LeaPlusLC:LoadVarChk("EnhanceQuestLog", "Off") -- Enhance quest log + LeaPlusLC:LoadVarChk("EnhanceQuestHeaders", "On") -- Enhance quest log toggle headers + LeaPlusLC:LoadVarChk("EnhanceQuestLevels", "On") -- Enhance quest log quest levels + LeaPlusLC:LoadVarChk("EnhanceQuestDifficulty", "On") -- Enhance quest log quest difficulty + LeaPlusLC:LoadVarChk("EnhanceProfessions", "Off") -- Enhance professions + LeaPlusLC:LoadVarChk("EnhanceTrainers", "Off") -- Enhance trainers + LeaPlusLC:LoadVarChk("ShowTrainAllBtn", "On") -- Enhance trainers train all button + + LeaPlusLC:LoadVarChk("ShowVolume", "Off") -- Show volume slider + LeaPlusLC:LoadVarChk("AhExtras", "Off") -- Show auction controls + LeaPlusLC:LoadVarChk("AhBuyoutOnly", "Off") -- Auction buyout only + LeaPlusLC:LoadVarChk("AhGoldOnly", "Off") -- Auction gold only + + LeaPlusLC:LoadVarChk("ShowCooldowns", "Off") -- Show cooldowns + LeaPlusLC:LoadVarChk("ShowCooldownID", "On") -- Show cooldown ID in tips + LeaPlusLC:LoadVarChk("NoCooldownDuration", "On") -- Hide cooldown duration + LeaPlusLC:LoadVarChk("CooldownsOnPlayer", "Off") -- Anchor to player + LeaPlusLC:LoadVarChk("DurabilityStatus", "Off") -- Show durability status + LeaPlusLC:LoadVarChk("ShowVanityControls", "Off") -- Show vanity controls + LeaPlusLC:LoadVarChk("VanityAltLayout", "Off") -- Vanity alternative layout + LeaPlusLC:LoadVarChk("ShowBagSearchBox", "Off") -- Show bag search box + LeaPlusLC:LoadVarChk("ShowRaidToggle", "Off") -- Show raid button + LeaPlusLC:LoadVarChk("ShowPlayerChain", "Off") -- Show player chain + LeaPlusLC:LoadVarNum("PlayerChainMenu", 2, 1, 3) -- Player chain dropdown value + LeaPlusLC:LoadVarChk("ShowReadyTimer", "Off") -- Show ready timer + LeaPlusLC:LoadVarChk("ShowWowheadLinks", "Off") -- Show Wowhead links + LeaPlusLC:LoadVarChk("WowheadLinkComments", "Off") -- Show Wowhead links to comments + + LeaPlusLC:LoadVarChk("ShowFlightTimes", "Off") -- Show flight times + LeaPlusLC:LoadVarChk("FlightBarBackground", "On") -- Show flight times bar background + LeaPlusLC:LoadVarChk("FlightBarDestination", "On") -- Show flight times bar destination + LeaPlusLC:LoadVarChk("FlightBarFillBar", "Off") -- Show flight times bar fill mode + LeaPlusLC:LoadVarChk("FlightBarSpeech", "Off") -- Show flight times bar speech + + LeaPlusLC:LoadVarChk("FlightBarContribute", "On") -- Show flight times contribute + LeaPlusLC:LoadVarAnc("FlightBarA", "TOP") -- Show flight times anchor + LeaPlusLC:LoadVarAnc("FlightBarR", "TOP") -- Show flight times relative + LeaPlusLC:LoadVarNum("FlightBarX", 0, -5000, 5000) -- Show flight position X + LeaPlusLC:LoadVarNum("FlightBarY", -66, -5000, 5000) -- Show flight position Y + LeaPlusLC:LoadVarNum("FlightBarScale", 2, 1, 5) -- Show flight times bar scale + LeaPlusLC:LoadVarNum("FlightBarWidth", 230, 40, 460) -- Show flight times bar width + + -- Frames + LeaPlusLC:LoadVarChk("FrmEnabled", "Off") -- Manage frames + + LeaPlusLC:LoadVarChk("ManageBuffs", "Off") -- Manage buffs + LeaPlusLC:LoadVarAnc("BuffFrameA", "TOPRIGHT") -- Manage buffs anchor + LeaPlusLC:LoadVarAnc("BuffFrameR", "TOPRIGHT") -- Manage buffs relative + LeaPlusLC:LoadVarNum("BuffFrameX", -205, -5000, 5000) -- Manage buffs position X + LeaPlusLC:LoadVarNum("BuffFrameY", -13, -5000, 5000) -- Manage buffs position Y + LeaPlusLC:LoadVarNum("BuffFrameScale", 1, 0.5, 2) -- Manage buffs scale + + LeaPlusLC:LoadVarChk("ManageWidget", "Off") -- Manage widget + LeaPlusLC:LoadVarAnc("WidgetA", "TOP") -- Manage widget anchor + LeaPlusLC:LoadVarAnc("WidgetR", "TOP") -- Manage widget relative + LeaPlusLC:LoadVarNum("WidgetX", 0, -5000, 5000) -- Manage widget position X + LeaPlusLC:LoadVarNum("WidgetY", -15, -5000, 5000) -- Manage widget position Y + LeaPlusLC:LoadVarNum("WidgetScale", 1, 0.5, 2) -- Manage widget scale + + LeaPlusLC:LoadVarChk("ManageFocus", "Off") -- Manage focus + LeaPlusLC:LoadVarAnc("FocusA", "CENTER") -- Manage focus anchor + LeaPlusLC:LoadVarAnc("FocusR", "CENTER") -- Manage focus relative + LeaPlusLC:LoadVarNum("FocusX", 0, -5000, 5000) -- Manage focus position X + LeaPlusLC:LoadVarNum("FocusY", 0, -5000, 5000) -- Manage focus position Y + LeaPlusLC:LoadVarNum("FocusScale", 1, 0.5, 2) -- Manage focus scale + + LeaPlusLC:LoadVarChk("ManageTimer", "Off") -- Manage timer + LeaPlusLC:LoadVarAnc("TimerA", "TOP") -- Manage timer anchor + LeaPlusLC:LoadVarAnc("TimerR", "TOP") -- Manage timer relative + LeaPlusLC:LoadVarNum("TimerX", -5, -5000, 5000) -- Manage timer position X + LeaPlusLC:LoadVarNum("TimerY", -96, -5000, 5000) -- Manage timer position Y + LeaPlusLC:LoadVarNum("TimerScale", 1, 0.5, 2) -- Manage timer scale + + LeaPlusLC:LoadVarChk("ManageDurability", "Off") -- Manage durability + LeaPlusLC:LoadVarAnc("DurabilityA", "TOPRIGHT") -- Manage durability anchor + LeaPlusLC:LoadVarAnc("DurabilityR", "TOPRIGHT") -- Manage durability relative + LeaPlusLC:LoadVarNum("DurabilityX", 0, -5000, 5000) -- Manage durability position X + LeaPlusLC:LoadVarNum("DurabilityY", -192, -5000, 5000) -- Manage durability position Y + LeaPlusLC:LoadVarNum("DurabilityScale", 1, 0.5, 2) -- Manage durability scale + + LeaPlusLC:LoadVarChk("ManageVehicle", "Off") -- Manage vehicle + LeaPlusLC:LoadVarAnc("VehicleA", "TOPRIGHT") -- Manage vehicle anchor + LeaPlusLC:LoadVarAnc("VehicleR", "TOPRIGHT") -- Manage vehicle relative + LeaPlusLC:LoadVarNum("VehicleX", -100, -5000, 5000) -- Manage vehicle position X + LeaPlusLC:LoadVarNum("VehicleY", -192, -5000, 5000) -- Manage vehicle position Y + LeaPlusLC:LoadVarNum("VehicleScale", 1, 0.5, 2) -- Manage vehicle scale + + LeaPlusLC:LoadVarChk("ClassColFrames", "Off") -- Class colored frames + LeaPlusLC:LoadVarChk("ClassColPlayer", "On") -- Class colored player frame + LeaPlusLC:LoadVarChk("ClassColTarget", "On") -- Class colored target frame + + LeaPlusLC:LoadVarChk("NoAlerts", "Off") -- Hide alerts + LeaPlusLC:LoadVarChk("NoGryphons", "Off") -- Hide gryphons + LeaPlusLC:LoadVarChk("NoClassBar", "Off") -- Hide stance bar + + -- System + LeaPlusLC:LoadVarChk("NoScreenGlow", "Off") -- Disable screen glow + LeaPlusLC:LoadVarChk("NoScreenEffects", "Off") -- Disable screen effects + LeaPlusLC:LoadVarChk("SetWeatherDensity", "Off") -- Set weather density + LeaPlusLC:LoadVarNum("WeatherLevel", 3, 0, 3) -- Weather density level + LeaPlusLC:LoadVarChk("MaxCameraZoom", "Off") -- Max camera zoom + LeaPlusLC:LoadVarChk("ViewPortEnable", "Off") -- Enable viewport + LeaPlusLC:LoadVarNum("ViewPortTop", 0, 0, 300) -- Top border + LeaPlusLC:LoadVarNum("ViewPortBottom", 0, 0, 300) -- Bottom border + LeaPlusLC:LoadVarNum("ViewPortLeft", 0, 0, 300) -- Left border + LeaPlusLC:LoadVarNum("ViewPortRight", 0, 0, 300) -- Right border + LeaPlusLC:LoadVarNum("ViewPortResizeTop", 0, 0, 300) -- Resize top border + LeaPlusLC:LoadVarNum("ViewPortResizeBottom", 0, 0, 300) -- Resize bottom border + LeaPlusLC:LoadVarNum("ViewPortAlpha", 0, 0, 0.9) -- Border alpha + + LeaPlusLC:LoadVarChk("NoRestedEmotes", "Off") -- Silence rested emotes + LeaPlusLC:LoadVarChk("MuteGameSounds", "Off") -- Mute game sounds + LeaPlusLC:LoadVarChk("MuteCustomSounds", "Off") -- Mute custom sounds + LeaPlusLC:LoadVarStr("MuteCustomList", "") -- Mute custom sounds list + + LeaPlusLC:LoadVarChk("NoBagAutomation", "Off") -- Disable bag automation + LeaPlusLC:LoadVarChk("CharAddonList", "Off") -- Show character addons + LeaPlusLC:LoadVarChk("NoConfirmLoot", "Off") -- Disable loot warnings + LeaPlusLC:LoadVarChk("FasterLooting", "Off") -- Faster auto loot + LeaPlusLC:LoadVarChk("FasterMovieSkip", "Off") -- Faster movie skip + LeaPlusLC:LoadVarChk("StandAndDismount", "Off") -- Dismount me + LeaPlusLC:LoadVarChk("DismountNoResource", "On") -- Dismount on resource error + LeaPlusLC:LoadVarChk("DismountNoMoving", "On") -- Dismount on moving + LeaPlusLC:LoadVarChk("DismountNoTaxi", "On") -- Dismount on flight map open + LeaPlusLC:LoadVarChk("DismountShowFormBtn", "On") -- Dismount cancel form button + LeaPlusLC:LoadVarChk("ShowVendorPrice", "Off") -- Show vendor price + LeaPlusLC:LoadVarChk("CombatPlates", "Off") -- Combat plates + LeaPlusLC:LoadVarChk("EasyItemDestroy", "Off") -- Easy item destroy + + -- Settings + LeaPlusLC:LoadVarChk("ShowMinimapIcon", "On") -- Show minimap button + LeaPlusLC:LoadVarNum("PlusPanelScale", 1, 1, 2) -- Panel scale + LeaPlusLC:LoadVarNum("PlusPanelAlpha", 0, 0, 1) -- Panel alpha + + -- Panel position + LeaPlusLC:LoadVarAnc("MainPanelA", "CENTER") -- Panel anchor + LeaPlusLC:LoadVarAnc("MainPanelR", "CENTER") -- Panel relative + LeaPlusLC:LoadVarNum("MainPanelX", 0, -5000, 5000) -- Panel X axis + LeaPlusLC:LoadVarNum("MainPanelY", 0, -5000, 5000) -- Panel Y axis + + -- Start page + LeaPlusLC:LoadVarNum("LeaStartPage", 0, 0, LeaPlusLC["NumberOfPages"]) + + -- Lock conflicting options + do + + -- Function to disable and lock an option and add a note to the tooltip + local function Lock(option, reason, optmodule) + LeaLockList[option] = LeaPlusLC[option] + LeaPlusLC:LockItem(LeaPlusCB[option], true) + LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. "|n|n|cff00AAFF" .. reason + if optmodule then + LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. " " .. optmodule .. " " .. L["module"] + end + LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. "." + -- Remove hover from configuration button if there is one + local temp = {LeaPlusCB[option]:GetChildren()} + if temp and temp[1] and temp[1].t and temp[1].t:GetTexture() == "Interface\\WorldMap\\Gear_64.png" then + temp[1]:SetHighlightTexture(0) + temp[1]:SetScript("OnEnter", nil) + end + end + + -- Disable items that conflict with Glass + if LeaPlusLC.Glass then + local reason = L["Cannot be used with Glass"] + Lock("UseEasyChatResizing", reason) -- Use easy resizing + Lock("NoCombatLogTab", reason) -- Hide the combat log + Lock("NoChatButtons", reason) -- Hide chat buttons + Lock("UnclampChat", reason) -- Unclamp chat frame + Lock("MoveChatEditBoxToTop", reason) -- Move editbox to top + Lock("MoreFontSizes", reason) -- More font sizes + Lock("NoChatFade", reason) -- Disable chat fade + Lock("ClassColorsInChat", reason) -- Use class colors in chat + Lock("RecentChatWindow", reason) -- Recent chat window + end + + -- Disable items that conflict with ElvUI + if LeaPlusLC.ElvUI then + local E = LeaPlusLC.ElvUI + if E and E.private then + + local reason = L["Cannot be used with ElvUI"] + + -- Chat + if E.private.chat.enable then + Lock("UseEasyChatResizing", reason, "Chat") -- Use easy resizing + Lock("NoCombatLogTab", reason, "Chat") -- Hide the combat log + Lock("NoChatButtons", reason, "Chat") -- Hide chat buttons + Lock("UnclampChat", reason, "Chat") -- Unclamp chat frame + Lock("MoreFontSizes", reason, "Chat") -- More font sizes + Lock("NoStickyChat", reason, "Chat") -- Disable sticky chat + Lock("UseArrowKeysInChat", reason, "Chat") -- Use arrow keys in chat + Lock("NoChatFade", reason, "Chat") -- Disable chat fade + Lock("MaxChatHstory", reason, "Chat") -- Increase chat history + Lock("RestoreChatMessages", reason, "Chat") -- Restore chat messages + end + + -- Minimap + if E.private.general.minimap.enable then + Lock("MinimapModder", reason, "Minimap") -- Enhance minimap + end + + -- UnitFrames + if E.private.unitframe.enable then + Lock("ShowRaidToggle", reason, "UnitFrames") -- Show raid button + end + + -- ActionBars + if E.private.actionbar.enable then + Lock("NoGryphons", reason, "ActionBars") -- Hide gryphons + Lock("NoClassBar", reason, "ActionBars") -- Hide stance bar + Lock("HideKeybindText", reason, "ActionBars") -- Hide keybind text + Lock("HideMacroText", reason, "ActionBars") -- Hide macro text + end + + -- Bags + if E.private.bags.enable then + Lock("NoBagAutomation", reason, "Bags") -- Disable bag automation + Lock("ShowBagSearchBox", reason, "Bags") -- Show bag search box + end + + -- Tooltip + if E.private.tooltip.enable then + Lock("TipModEnable", reason, "Tooltip") -- Enhance tooltip + end + + -- Buffs: Disable Blizzard + if E.private.auras.disableBlizzard then + Lock("ManageBuffs", reason, "Buffs and Debuffs (Disable Blizzard)") -- Manage buffs + end + + -- UnitFrames: Disabled Blizzard: Focus + if E.private.unitframe.disabledBlizzardFrames.focus then + Lock("ManageFocus", reason, "UnitFrames (Disabled Blizzard Frames Focus)") -- Manage focus + end + + -- UnitFrames: Disabled Blizzard: Player + if E.private.unitframe.disabledBlizzardFrames.player then + Lock("ShowPlayerChain", reason, "UnitFrames (Disabled Blizzard Frames Player)") -- Show player chain + Lock("NoHitIndicators", reason, "UnitFrames (Disabled Blizzard Frames Player)") -- Hide portrait numbers + end + + -- UnitFrames: Disabled Blizzard: Player and Target + if E.private.unitframe.disabledBlizzardFrames.player or E.private.unitframe.disabledBlizzardFrames.target then + Lock("FrmEnabled", reason, "UnitFrames (Disabled Blizzard Frames Player and Target)") -- Manage frames + end + + -- UnitFrames: Disabled Blizzard: Player, Target and Focus + if E.private.unitframe.disabledBlizzardFrames.player or E.private.unitframe.disabledBlizzardFrames.target or E.private.unitframe.disabledBlizzardFrames.focus then + Lock("ClassColFrames", reason, "UnitFrames (Disabled Blizzard Frames Player, Target and Focus)") -- Class-colored frames + end + + -- Skins: Blizzard Gossip Frame + if E.private.skins.blizzard.enable and E.private.skins.blizzard.gossip then + Lock("QuestFontChange", reason, "Skins (Blizzard Gossip Frame)") -- Resize quest font + end + + -- Base + do + Lock("ManageWidget", reason) -- Manage widget + Lock("ManageTimer", reason) -- Manage timer + Lock("ManageDurability", reason) -- Manage durability + Lock("ManageVehicle", reason) -- Manage vehicle + end + + end + + EnableAddOn("Leatrix_Plus") + end + + end + + -- Run other startup items + LeaPlusLC:Live() + LeaPlusLC:Isolated() + LeaPlusLC:RunOnce() + LeaPlusLC:SetDim() + + end + return + end + + if event == "PLAYER_LOGIN" then + LeaPlusLC:Player() + collectgarbage() + return + end + + if event == "PLAYER_ENTERING_WORLD" then + LeaPlusLC:World() + LpEvt:UnregisterEvent("PLAYER_ENTERING_WORLD") + return + end + + -- Save locals back to globals on logout + if event == "PLAYER_LOGOUT" then + + -- Run the logout function without wipe flag + LeaPlusLC:PlayerLogout(false) + + -- Automation + LeaPlusDB["AutomateQuests"] = LeaPlusLC["AutomateQuests"] + LeaPlusDB["AutoQuestShift"] = LeaPlusLC["AutoQuestShift"] + LeaPlusDB["AutoQuestAvailable"] = LeaPlusLC["AutoQuestAvailable"] + LeaPlusDB["AutoQuestCompleted"] = LeaPlusLC["AutoQuestCompleted"] + LeaPlusDB["AutoQuestKeyMenu"] = LeaPlusLC["AutoQuestKeyMenu"] + LeaPlusDB["AutomateGossip"] = LeaPlusLC["AutomateGossip"] + LeaPlusDB["AutoAcceptSummon"] = LeaPlusLC["AutoAcceptSummon"] + LeaPlusDB["AutoAcceptRes"] = LeaPlusLC["AutoAcceptRes"] + LeaPlusDB["AutoResNoCombat"] = LeaPlusLC["AutoResNoCombat"] + LeaPlusDB["AutoReleasePvP"] = LeaPlusLC["AutoReleasePvP"] + LeaPlusDB["AutoReleaseNoAlterac"] = LeaPlusLC["AutoReleaseNoAlterac"] + LeaPlusDB["AutoReleaseDelay"] = LeaPlusLC["AutoReleaseDelay"] + + LeaPlusDB["AutoSellJunk"] = LeaPlusLC["AutoSellJunk"] + LeaPlusDB["AutoSellShowSummary"] = LeaPlusLC["AutoSellShowSummary"] + LeaPlusDB["AutoSellExcludeList"] = LeaPlusLC["AutoSellExcludeList"] + LeaPlusDB["AutoRepairGear"] = LeaPlusLC["AutoRepairGear"] + LeaPlusDB["AutoRepairGuildFunds"] = LeaPlusLC["AutoRepairGuildFunds"] + LeaPlusDB["AutoRepairShowSummary"] = LeaPlusLC["AutoRepairShowSummary"] + + -- Social + LeaPlusDB["NoDuelRequests"] = LeaPlusLC["NoDuelRequests"] + LeaPlusDB["NoPartyInvites"] = LeaPlusLC["NoPartyInvites"] + LeaPlusDB["NoFriendRequests"] = LeaPlusLC["NoFriendRequests"] + LeaPlusDB["NoSharedQuests"] = LeaPlusLC["NoSharedQuests"] + + LeaPlusDB["AcceptPartyFriends"] = LeaPlusLC["AcceptPartyFriends"] + LeaPlusDB["InviteFromWhisper"] = LeaPlusLC["InviteFromWhisper"] + LeaPlusDB["InviteFriendsOnly"] = LeaPlusLC["InviteFriendsOnly"] + LeaPlusDB["InvKey"] = LeaPlusLC["InvKey"] + LeaPlusDB["FriendlyGuild"] = LeaPlusLC["FriendlyGuild"] + + -- Chat + LeaPlusDB["UseEasyChatResizing"] = LeaPlusLC["UseEasyChatResizing"] + LeaPlusDB["NoCombatLogTab"] = LeaPlusLC["NoCombatLogTab"] + LeaPlusDB["NoChatButtons"] = LeaPlusLC["NoChatButtons"] + LeaPlusDB["UnclampChat"] = LeaPlusLC["UnclampChat"] + LeaPlusDB["MoveChatEditBoxToTop"] = LeaPlusLC["MoveChatEditBoxToTop"] + LeaPlusDB["MoreFontSizes"] = LeaPlusLC["MoreFontSizes"] + + LeaPlusDB["NoStickyChat"] = LeaPlusLC["NoStickyChat"] + LeaPlusDB["UseArrowKeysInChat"] = LeaPlusLC["UseArrowKeysInChat"] + LeaPlusDB["NoChatFade"] = LeaPlusLC["NoChatFade"] + LeaPlusDB["UnivGroupColor"] = LeaPlusLC["UnivGroupColor"] + LeaPlusDB["ClassColorsInChat"] = LeaPlusLC["ClassColorsInChat"] + LeaPlusDB["RecentChatWindow"] = LeaPlusLC["RecentChatWindow"] + LeaPlusDB["RecentChatSize"] = LeaPlusLC["RecentChatSize"] + LeaPlusDB["MaxChatHstory"] = LeaPlusLC["MaxChatHstory"] + LeaPlusDB["FilterChatMessages"] = LeaPlusLC["FilterChatMessages"] + LeaPlusDB["BlockSpellLinks"] = LeaPlusLC["BlockSpellLinks"] + LeaPlusDB["BlockDrunkenSpam"] = LeaPlusLC["BlockDrunkenSpam"] + LeaPlusDB["BlockDuelSpam"] = LeaPlusLC["BlockDuelSpam"] + LeaPlusDB["RestoreChatMessages"] = LeaPlusLC["RestoreChatMessages"] + + -- Text + LeaPlusDB["HideErrorMessages"] = LeaPlusLC["HideErrorMessages"] + LeaPlusDB["NoHitIndicators"] = LeaPlusLC["NoHitIndicators"] + LeaPlusDB["HideZoneText"] = LeaPlusLC["HideZoneText"] + LeaPlusDB["HideKeybindText"] = LeaPlusLC["HideKeybindText"] + LeaPlusDB["HideMacroText"] = LeaPlusLC["HideMacroText"] + + LeaPlusDB["MailFontChange"] = LeaPlusLC["MailFontChange"] + LeaPlusDB["LeaPlusMailFontSize"] = LeaPlusLC["LeaPlusMailFontSize"] + + LeaPlusDB["QuestFontChange"] = LeaPlusLC["QuestFontChange"] + LeaPlusDB["LeaPlusQuestFontSize"] = LeaPlusLC["LeaPlusQuestFontSize"] + + LeaPlusDB["BookFontChange"] = LeaPlusLC["BookFontChange"] + LeaPlusDB["LeaPlusBookFontSize"] = LeaPlusLC["LeaPlusBookFontSize"] + + -- Interface + LeaPlusDB["MinimapModder"] = LeaPlusLC["MinimapModder"] + LeaPlusDB["SquareMinimap"] = LeaPlusLC["SquareMinimap"] + LeaPlusDB["ShowWhoPinged"] = LeaPlusLC["ShowWhoPinged"] + LeaPlusDB["CombineAddonButtons"] = LeaPlusLC["CombineAddonButtons"] + LeaPlusDB["MiniExcludeList"] = LeaPlusLC["MiniExcludeList"] + LeaPlusDB["HideMiniZoomBtns"] = LeaPlusLC["HideMiniZoomBtns"] + LeaPlusDB["HideMiniZoneText"] = LeaPlusLC["HideMiniZoneText"] + LeaPlusDB["HideMiniAddonButtons"] = LeaPlusLC["HideMiniAddonButtons"] + LeaPlusDB["HideMiniMapButton"] = LeaPlusLC["HideMiniMapButton"] + LeaPlusDB["HideMiniTracking"] = LeaPlusLC["HideMiniTracking"] + LeaPlusDB["MinimapScale"] = LeaPlusLC["MinimapScale"] + LeaPlusDB["MinimapSize"] = LeaPlusLC["MinimapSize"] + LeaPlusDB["MiniClusterScale"] = LeaPlusLC["MiniClusterScale"] + LeaPlusDB["MinimapNoScale"] = LeaPlusLC["MinimapNoScale"] + LeaPlusDB["MinimapA"] = LeaPlusLC["MinimapA"] + LeaPlusDB["MinimapR"] = LeaPlusLC["MinimapR"] + LeaPlusDB["MinimapX"] = LeaPlusLC["MinimapX"] + LeaPlusDB["MinimapY"] = LeaPlusLC["MinimapY"] + + LeaPlusDB["TipModEnable"] = LeaPlusLC["TipModEnable"] + LeaPlusDB["TipShowRank"] = LeaPlusLC["TipShowRank"] + LeaPlusDB["TipShowOtherRank"] = LeaPlusLC["TipShowOtherRank"] + LeaPlusDB["TipShowTarget"] = LeaPlusLC["TipShowTarget"] + LeaPlusDB["TipHideInCombat"] = LeaPlusLC["TipHideInCombat"] + LeaPlusDB["TipHideShiftOverride"] = LeaPlusLC["TipHideShiftOverride"] + LeaPlusDB["TipNoHealthBar"] = LeaPlusLC["TipNoHealthBar"] + LeaPlusDB["LeaPlusTipSize"] = LeaPlusLC["LeaPlusTipSize"] + LeaPlusDB["TipOffsetX"] = LeaPlusLC["TipOffsetX"] + LeaPlusDB["TipOffsetY"] = LeaPlusLC["TipOffsetY"] + LeaPlusDB["TooltipAnchorMenu"] = LeaPlusLC["TooltipAnchorMenu"] + LeaPlusDB["TipCursorX"] = LeaPlusLC["TipCursorX"] + LeaPlusDB["TipCursorY"] = LeaPlusLC["TipCursorY"] + + LeaPlusDB["EnhanceDressup"] = LeaPlusLC["EnhanceDressup"] + LeaPlusDB["DressupItemButtons"] = LeaPlusLC["DressupItemButtons"] + LeaPlusDB["DressupAnimControl"] = LeaPlusLC["DressupAnimControl"] + LeaPlusDB["HideDressupStats"] = LeaPlusLC["HideDressupStats"] + LeaPlusDB["EnhanceQuestLog"] = LeaPlusLC["EnhanceQuestLog"] + LeaPlusDB["EnhanceQuestHeaders"] = LeaPlusLC["EnhanceQuestHeaders"] + LeaPlusDB["EnhanceQuestLevels"] = LeaPlusLC["EnhanceQuestLevels"] + LeaPlusDB["EnhanceQuestDifficulty"] = LeaPlusLC["EnhanceQuestDifficulty"] + + LeaPlusDB["EnhanceProfessions"] = LeaPlusLC["EnhanceProfessions"] + LeaPlusDB["EnhanceTrainers"] = LeaPlusLC["EnhanceTrainers"] + LeaPlusDB["ShowTrainAllBtn"] = LeaPlusLC["ShowTrainAllBtn"] + + LeaPlusDB["ShowVolume"] = LeaPlusLC["ShowVolume"] + LeaPlusDB["AhExtras"] = LeaPlusLC["AhExtras"] + LeaPlusDB["AhBuyoutOnly"] = LeaPlusLC["AhBuyoutOnly"] + LeaPlusDB["AhGoldOnly"] = LeaPlusLC["AhGoldOnly"] + + LeaPlusDB["ShowCooldowns"] = LeaPlusLC["ShowCooldowns"] + LeaPlusDB["ShowCooldownID"] = LeaPlusLC["ShowCooldownID"] + LeaPlusDB["NoCooldownDuration"] = LeaPlusLC["NoCooldownDuration"] + LeaPlusDB["CooldownsOnPlayer"] = LeaPlusLC["CooldownsOnPlayer"] + LeaPlusDB["DurabilityStatus"] = LeaPlusLC["DurabilityStatus"] + LeaPlusDB["ShowVanityControls"] = LeaPlusLC["ShowVanityControls"] + LeaPlusDB["VanityAltLayout"] = LeaPlusLC["VanityAltLayout"] + LeaPlusDB["ShowBagSearchBox"] = LeaPlusLC["ShowBagSearchBox"] + LeaPlusDB["ShowRaidToggle"] = LeaPlusLC["ShowRaidToggle"] + LeaPlusDB["ShowPlayerChain"] = LeaPlusLC["ShowPlayerChain"] + LeaPlusDB["PlayerChainMenu"] = LeaPlusLC["PlayerChainMenu"] + LeaPlusDB["ShowReadyTimer"] = LeaPlusLC["ShowReadyTimer"] + LeaPlusDB["ShowWowheadLinks"] = LeaPlusLC["ShowWowheadLinks"] + LeaPlusDB["WowheadLinkComments"] = LeaPlusLC["WowheadLinkComments"] + + LeaPlusDB["ShowFlightTimes"] = LeaPlusLC["ShowFlightTimes"] + LeaPlusDB["FlightBarBackground"] = LeaPlusLC["FlightBarBackground"] + LeaPlusDB["FlightBarDestination"] = LeaPlusLC["FlightBarDestination"] + LeaPlusDB["FlightBarFillBar"] = LeaPlusLC["FlightBarFillBar"] + LeaPlusDB["FlightBarSpeech"] = LeaPlusLC["FlightBarSpeech"] + + LeaPlusDB["FlightBarContribute"] = LeaPlusLC["FlightBarContribute"] + LeaPlusDB["FlightBarA"] = LeaPlusLC["FlightBarA"] + LeaPlusDB["FlightBarR"] = LeaPlusLC["FlightBarR"] + LeaPlusDB["FlightBarX"] = LeaPlusLC["FlightBarX"] + LeaPlusDB["FlightBarY"] = LeaPlusLC["FlightBarY"] + LeaPlusDB["FlightBarScale"] = LeaPlusLC["FlightBarScale"] + LeaPlusDB["FlightBarWidth"] = LeaPlusLC["FlightBarWidth"] + + -- Frames + LeaPlusDB["FrmEnabled"] = LeaPlusLC["FrmEnabled"] + + LeaPlusDB["ManageBuffs"] = LeaPlusLC["ManageBuffs"] + LeaPlusDB["BuffFrameA"] = LeaPlusLC["BuffFrameA"] + LeaPlusDB["BuffFrameR"] = LeaPlusLC["BuffFrameR"] + LeaPlusDB["BuffFrameX"] = LeaPlusLC["BuffFrameX"] + LeaPlusDB["BuffFrameY"] = LeaPlusLC["BuffFrameY"] + LeaPlusDB["BuffFrameScale"] = LeaPlusLC["BuffFrameScale"] + + LeaPlusDB["ManageWidget"] = LeaPlusLC["ManageWidget"] + LeaPlusDB["WidgetA"] = LeaPlusLC["WidgetA"] + LeaPlusDB["WidgetR"] = LeaPlusLC["WidgetR"] + LeaPlusDB["WidgetX"] = LeaPlusLC["WidgetX"] + LeaPlusDB["WidgetY"] = LeaPlusLC["WidgetY"] + LeaPlusDB["WidgetScale"] = LeaPlusLC["WidgetScale"] + + LeaPlusDB["ManageFocus"] = LeaPlusLC["ManageFocus"] + LeaPlusDB["FocusA"] = LeaPlusLC["FocusA"] + LeaPlusDB["FocusR"] = LeaPlusLC["FocusR"] + LeaPlusDB["FocusX"] = LeaPlusLC["FocusX"] + LeaPlusDB["FocusY"] = LeaPlusLC["FocusY"] + LeaPlusDB["FocusScale"] = LeaPlusLC["FocusScale"] + + LeaPlusDB["ManageTimer"] = LeaPlusLC["ManageTimer"] + LeaPlusDB["TimerA"] = LeaPlusLC["TimerA"] + LeaPlusDB["TimerR"] = LeaPlusLC["TimerR"] + LeaPlusDB["TimerX"] = LeaPlusLC["TimerX"] + LeaPlusDB["TimerY"] = LeaPlusLC["TimerY"] + LeaPlusDB["TimerScale"] = LeaPlusLC["TimerScale"] + + LeaPlusDB["ManageDurability"] = LeaPlusLC["ManageDurability"] + LeaPlusDB["DurabilityA"] = LeaPlusLC["DurabilityA"] + LeaPlusDB["DurabilityR"] = LeaPlusLC["DurabilityR"] + LeaPlusDB["DurabilityX"] = LeaPlusLC["DurabilityX"] + LeaPlusDB["DurabilityY"] = LeaPlusLC["DurabilityY"] + LeaPlusDB["DurabilityScale"] = LeaPlusLC["DurabilityScale"] + + LeaPlusDB["ManageVehicle"] = LeaPlusLC["ManageVehicle"] + LeaPlusDB["VehicleA"] = LeaPlusLC["VehicleA"] + LeaPlusDB["VehicleR"] = LeaPlusLC["VehicleR"] + LeaPlusDB["VehicleX"] = LeaPlusLC["VehicleX"] + LeaPlusDB["VehicleY"] = LeaPlusLC["VehicleY"] + LeaPlusDB["VehicleScale"] = LeaPlusLC["VehicleScale"] + + LeaPlusDB["ClassColFrames"] = LeaPlusLC["ClassColFrames"] + LeaPlusDB["ClassColPlayer"] = LeaPlusLC["ClassColPlayer"] + LeaPlusDB["ClassColTarget"] = LeaPlusLC["ClassColTarget"] + + LeaPlusDB["NoAlerts"] = LeaPlusLC["NoAlerts"] + LeaPlusDB["NoGryphons"] = LeaPlusLC["NoGryphons"] + LeaPlusDB["NoClassBar"] = LeaPlusLC["NoClassBar"] + + -- System + LeaPlusDB["NoScreenGlow"] = LeaPlusLC["NoScreenGlow"] + LeaPlusDB["NoScreenEffects"] = LeaPlusLC["NoScreenEffects"] + LeaPlusDB["SetWeatherDensity"] = LeaPlusLC["SetWeatherDensity"] + LeaPlusDB["WeatherLevel"] = LeaPlusLC["WeatherLevel"] + LeaPlusDB["MaxCameraZoom"] = LeaPlusLC["MaxCameraZoom"] + LeaPlusDB["ViewPortEnable"] = LeaPlusLC["ViewPortEnable"] + LeaPlusDB["ViewPortTop"] = LeaPlusLC["ViewPortTop"] + LeaPlusDB["ViewPortBottom"] = LeaPlusLC["ViewPortBottom"] + LeaPlusDB["ViewPortLeft"] = LeaPlusLC["ViewPortLeft"] + LeaPlusDB["ViewPortRight"] = LeaPlusLC["ViewPortRight"] + LeaPlusDB["ViewPortResizeTop"] = LeaPlusLC["ViewPortResizeTop"] + LeaPlusDB["ViewPortResizeBottom"] = LeaPlusLC["ViewPortResizeBottom"] + LeaPlusDB["ViewPortAlpha"] = LeaPlusLC["ViewPortAlpha"] + + LeaPlusDB["NoRestedEmotes"] = LeaPlusLC["NoRestedEmotes"] + LeaPlusDB["MuteGameSounds"] = LeaPlusLC["MuteGameSounds"] + LeaPlusDB["MuteCustomSounds"] = LeaPlusLC["MuteCustomSounds"] + LeaPlusDB["MuteCustomList"] = LeaPlusLC["MuteCustomList"] + + LeaPlusDB["NoBagAutomation"] = LeaPlusLC["NoBagAutomation"] + LeaPlusDB["CharAddonList"] = LeaPlusLC["CharAddonList"] + LeaPlusDB["NoConfirmLoot"] = LeaPlusLC["NoConfirmLoot"] + LeaPlusDB["FasterLooting"] = LeaPlusLC["FasterLooting"] + LeaPlusDB["FasterMovieSkip"] = LeaPlusLC["FasterMovieSkip"] + LeaPlusDB["StandAndDismount"] = LeaPlusLC["StandAndDismount"] + LeaPlusDB["DismountNoResource"] = LeaPlusLC["DismountNoResource"] + LeaPlusDB["DismountNoMoving"] = LeaPlusLC["DismountNoMoving"] + LeaPlusDB["DismountNoTaxi"] = LeaPlusLC["DismountNoTaxi"] + LeaPlusDB["DismountShowFormBtn"] = LeaPlusLC["DismountShowFormBtn"] + LeaPlusDB["ShowVendorPrice"] = LeaPlusLC["ShowVendorPrice"] + LeaPlusDB["CombatPlates"] = LeaPlusLC["CombatPlates"] + LeaPlusDB["EasyItemDestroy"] = LeaPlusLC["EasyItemDestroy"] + + -- Settings + LeaPlusDB["ShowMinimapIcon"] = LeaPlusLC["ShowMinimapIcon"] + LeaPlusDB["PlusPanelScale"] = LeaPlusLC["PlusPanelScale"] + LeaPlusDB["PlusPanelAlpha"] = LeaPlusLC["PlusPanelAlpha"] + + -- Panel position + LeaPlusDB["MainPanelA"] = LeaPlusLC["MainPanelA"] + LeaPlusDB["MainPanelR"] = LeaPlusLC["MainPanelR"] + LeaPlusDB["MainPanelX"] = LeaPlusLC["MainPanelX"] + LeaPlusDB["MainPanelY"] = LeaPlusLC["MainPanelY"] + + -- Start page + LeaPlusDB["LeaStartPage"] = LeaPlusLC["LeaStartPage"] + + -- Mute game sounds (LeaPlusLC["MuteGameSounds"]) + for k, v in pairs(LeaPlusLC["muteTable"]) do + LeaPlusDB[k] = LeaPlusLC[k] + end + + end + + end + +-- Register event handler + LpEvt:SetScript("OnEvent", eventHandler); + +---------------------------------------------------------------------- +-- L70: Player logout +---------------------------------------------------------------------- + + -- Player Logout + function LeaPlusLC:PlayerLogout(wipe) + + ---------------------------------------------------------------------- + -- Restore default values for options that do not require reloads + ---------------------------------------------------------------------- + + if wipe then + + -- Disable screen glow (LeaPlusLC["NoScreenGlow"]) + SetCVar("ffxGlow", "1") + + -- Disable screen effects (LeaPlusLC["NoScreenEffects"]) + SetCVar("ffxDeath", "1") + SetCVar("ffxNether", "1") + + -- Set weather density (LeaPlusLC["SetWeatherDensity"]) + SetCVar("WeatherDensity", "3") + SetCVar("RAIDweatherDensity", "3") + + -- Max camera zoom (LeaPlusLC["MaxCameraZoom"]) + SetCVar("cameraDistanceMaxZoomFactor", 1.9) + + -- Universal group color (LeaPlusLC["UnivGroupColor"]) + ChangeChatColor("RAID", 1, 0.50, 0) + ChangeChatColor("RAID_LEADER", 1, 0.28, 0.04) + + -- Use class colors in chat (LeaPlusLC["ClassColorsInChat"]) + SetCVar("chatClassColorOverride", "1") + + -- Mute game sounds (LeaPlusLC["MuteGameSounds"]) + for k, v in pairs(LeaPlusLC["muteTable"]) do + for i, e in pairs(v) do + local file, soundID = e:match("([^,]+)%#([^,]+)") + UnmuteSoundFile(soundID) + end + end + + end + + ---------------------------------------------------------------------- + -- Restore default values for options that require reloads + ---------------------------------------------------------------------- + + -- Use class colors + if LeaPlusDB["ClassColorsInChat"] == "On" then + if wipe or (not wipe and LeaPlusLC["ClassColorsInChat"] == "Off") and not LeaLockList["ClassColorsInChat"] then + -- Restore local channel color + for i = 1, 18 do + if _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"] then + ToggleChatColorNamesByClassGroup(false, _G["ChatConfigChatSettingsLeftCheckBox" .. i .. "Check"]:GetParent().type) + end + end + -- Restore global channel color + for i = 1, 50 do + ToggleChatColorNamesByClassGroup(false, "CHANNEL" .. i) + end + end + end + + -- Enhance minimap restore round minimap if wipe or enhance minimap is toggled off + if LeaPlusDB["MinimapModder"] == "On" and LeaPlusDB["SquareMinimap"] == "On" and not LeaLockList["MinimapModder"] then + if wipe or (not wipe and LeaPlusLC["MinimapModder"] == "Off") then + Minimap:SetMaskTexture([[Interface\CharacterFrame\TempPortraitAlphaMask]]) + end + end + + -- Silence rested emotes + if LeaPlusDB["NoRestedEmotes"] == "On" then + if wipe or (not wipe and LeaPlusLC["NoRestedEmotes"] == "Off") then + SetCVar("Sound_EnableEmoteSounds", "1") + end + end + + -- More font sizes + if LeaPlusDB["MoreFontSizes"] == "On" and not LeaLockList["MoreFontSizes"] then + if wipe or (not wipe and LeaPlusLC["MoreFontSizes"] == "Off") then + RunScript('for i = 1, 50 do if _G["ChatFrame" .. i] then local void, fontSize = FCF_GetChatWindowInfo(i); if fontSize and fontSize ~= 12 and fontSize ~= 14 and fontSize ~= 16 and fontSize ~= 18 then FCF_SetChatWindowFontSize(self, _G["ChatFrame" .. i], CHAT_FRAME_DEFAULT_FONT_SIZE) end end end') + end + end + + ---------------------------------------------------------------------- + -- Do other stuff during logout + ---------------------------------------------------------------------- + + -- Store the auction house duration and price type values if auction house option is enabled + if LeaPlusDB["AhExtras"] == "On" then + if AuctionFrameAuctions then + if AuctionFrameAuctions.duration then + LeaPlusDB["AHDuration"] = AuctionFrameAuctions.duration + end + end + end + + end + +---------------------------------------------------------------------- +-- Options panel functions +---------------------------------------------------------------------- + + -- Function to add textures to panels + function LeaPlusLC:CreateBar(name, parent, width, height, anchor, r, g, b, alp, tex) + local ft = parent:CreateTexture(nil, "BORDER") + ft:SetTexture(tex) + ft:SetSize(width, height) + ft:SetPoint(anchor) + ft:SetVertexColor(r ,g, b, alp) + if name == "MainTexture" then + ft:SetTexCoord(0.09, 1, 0, 1); + end + end + + -- Create a configuration panel + function LeaPlusLC:CreatePanel(title, globref) + + -- Create the panel + local Side = CreateFrame("Frame", nil, UIParent) + + -- Make it a system frame + _G["LeaPlusGlobalPanel_" .. globref] = Side + table.insert(UISpecialFrames, "LeaPlusGlobalPanel_" .. globref) + + -- Store it in the configuration panel table + tinsert(LeaConfigList, Side) + + -- Set frame parameters + Side:Hide(); + Side:SetSize(570, 370); + Side:SetClampedToScreen(true) + Side:SetClampRectInsets(500, -500, -300, 300) + Side:SetFrameStrata("FULLSCREEN_DIALOG") + + -- Set the background color + Side.t = Side:CreateTexture(nil, "BACKGROUND") + Side.t:SetAllPoints() + Side.t:SetVertexColor(0.05, 0.05, 0.05, 0.9) + + -- Add a close Button + Side.c = CreateFrame("Button", nil, Side, "UIPanelCloseButton") + Side.c:SetSize(30, 30) + Side.c:SetPoint("TOPRIGHT", 0, 0) + Side.c:SetScript("OnClick", function() Side:Hide() end) + + -- Add reset, help and back buttons + Side.r = LeaPlusLC:CreateButton("ResetButton", Side, "Reset", "TOPLEFT", 16, -292, 0, 25, true, "Click to reset the settings on this page.") + Side.h = LeaPlusLC:CreateButton("HelpButton", Side, "Help", "TOPLEFT", 76, -292, 0, 25, true, "No help is available for this page.") + Side.b = LeaPlusLC:CreateButton("BackButton", Side, "Back to Main Menu", "TOPRIGHT", -16, -292, 0, 25, true, "Click to return to the main menu.") + + -- Reposition help button so it doesn't overlap reset button + Side.h:ClearAllPoints() + Side.h:SetPoint("LEFT", Side.r, "RIGHT", 10, 0) + + -- Remove the click texture from the help button + Side.h:SetPushedTextOffset(0, 0) + + -- Add a reload button and syncronise it with the main panel reload button + local reloadb = LeaPlusLC:CreateButton("ConfigReload", Side, "Reload", "BOTTOMRIGHT", -16, 10, 0, 25, true, LeaPlusCB["ReloadUIButton"].tiptext) + LeaPlusLC:LockItem(reloadb,true) + reloadb:SetScript("OnClick", ReloadUI) + + reloadb.f = reloadb:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall') + reloadb.f:SetHeight(32); + reloadb.f:SetPoint('RIGHT', reloadb, 'LEFT', -10, 0) + reloadb.f:SetText(LeaPlusCB["ReloadUIButton"].f:GetText()) + reloadb.f:Hide() + + LeaPlusCB["ReloadUIButton"]:HookScript("OnEnable", function() + LeaPlusLC:LockItem(reloadb, false) + reloadb.f:Show() + end) + + LeaPlusCB["ReloadUIButton"]:HookScript("OnDisable", function() + LeaPlusLC:LockItem(reloadb, true) + reloadb.f:Hide() + end) + + -- Set textures + LeaPlusLC:CreateBar("FootTexture", Side, 570, 48, "BOTTOM", 0.5, 0.5, 0.5, 1.0, "Interface\\DressUpFrame\\DressUpBackground-NightElf1") + LeaPlusLC:CreateBar("MainTexture", Side, 570, 323, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\DressUpFrame\\DressUpBackground-NightElf1") + + -- Allow movement + Side:EnableMouse(true) + Side:SetMovable(true) + Side:RegisterForDrag("LeftButton") + Side:SetScript("OnDragStart", Side.StartMoving) + Side:SetScript("OnDragStop", function () + Side:StopMovingOrSizing(); + Side:SetUserPlaced(false); + -- Save panel position + LeaPlusLC["MainPanelA"], void, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = Side:GetPoint() + end) + + -- Set panel attributes when shown + Side:SetScript("OnShow", function() + Side:ClearAllPoints() + Side:SetPoint(LeaPlusLC["MainPanelA"], UIParent, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"]) + Side:SetScale(LeaPlusLC["PlusPanelScale"]) + Side.t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + end) + + -- Add title + Side.f = Side:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + Side.f:SetPoint('TOPLEFT', 16, -16); + Side.f:SetText(L[title]) + + -- Add description + Side.v = Side:CreateFontString(nil, 'ARTWORK', 'GameFontHighlightSmall') + Side.v:SetHeight(32); + Side.v:SetPoint('TOPLEFT', Side.f, 'BOTTOMLEFT', 0, -8); + Side.v:SetPoint('RIGHT', Side, -32, 0) + Side.v:SetJustifyH('LEFT'); Side.v:SetJustifyV('TOP'); + Side.v:SetText(L["Configuration Panel"]) + + -- Prevent options panel from showing while side panel is showing + LeaPlusLC["PageF"]:HookScript("OnShow", function() + if Side:IsShown() then LeaPlusLC["PageF"]:Hide(); end + end) + + -- Return the frame + return Side + + end + + -- Define subheadings + function LeaPlusLC:MakeTx(frame, title, x, y) + local text = frame:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + text:SetPoint("TOPLEFT", x, y) + text:SetText(L[title]) + return text + end + + -- Define text + function LeaPlusLC:MakeWD(frame, title, x, y) + local text = frame:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') + text:SetPoint("TOPLEFT", x, y) + text:SetText(L[title]) + text:SetJustifyH"LEFT"; + return text + end + + -- Create a slider control (uses standard template) + function LeaPlusLC:MakeSL(frame, field, caption, low, high, step, x, y, form) + + -- Create slider control + local Slider = CreateFrame("Slider", "LeaPlusGlobalSlider" .. field, frame, "OptionssliderTemplate") + LeaPlusCB[field] = Slider; + Slider:SetMinMaxValues(low, high) + Slider:SetValueStep(step) + Slider:EnableMouseWheel(true) + Slider:SetPoint('TOPLEFT', x,y) + Slider:SetWidth(100) + Slider:SetHeight(20) + Slider:SetHitRectInsets(0, 0, 0, 0); + Slider.tiptext = L[caption] + Slider:SetScript("OnEnter", LeaPlusLC.TipSee) + Slider:SetScript("OnLeave", GameTooltip_Hide) + + -- Remove slider text + _G[Slider:GetName().."Low"]:SetText(''); + _G[Slider:GetName().."High"]:SetText(''); + + -- Create slider label + Slider.f = Slider:CreateFontString(nil, 'BACKGROUND') + Slider.f:SetFontObject('GameFontHighlight') + Slider.f:SetPoint('LEFT', Slider, 'RIGHT', 12, 0) + Slider.f:SetFormattedText("%.2f", Slider:GetValue()) + + -- Process mousewheel scrolling + Slider:SetScript("OnMouseWheel", function(self, arg1) + if Slider:IsEnabled() then + local step = step * arg1 + local value = self:GetValue() + if step > 0 then + self:SetValue(min(value + step, high)) + else + self:SetValue(max(value + step, low)) + end + end + end) + + -- Process value changed + Slider:SetScript("OnValueChanged", function(self, value) + local value = floor((value - low) / step + 0.5) * step + low + Slider.f:SetFormattedText(form, value) + LeaPlusLC[field] = value + end) + + -- Set slider value when shown + Slider:SetScript("OnShow", function(self) + self:SetValue(LeaPlusLC[field]) + end) + + end + + -- Create a checkbox control (uses standard template) + function LeaPlusLC:MakeCB(parent, field, caption, x, y, reload, tip, tipstyle) + + -- Create the checkbox + local Cbox = CreateFrame('CheckButton', nil, parent, "ChatConfigCheckButtonTemplate") + LeaPlusCB[field] = Cbox + Cbox:SetPoint("TOPLEFT",x, y) + Cbox:SetScript("OnEnter", LeaPlusLC.TipSee) + Cbox:SetScript("OnLeave", GameTooltip_Hide) + + -- Add label and tooltip + Cbox.f = Cbox:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') + Cbox.f:SetPoint('LEFT', 20, 0) + if reload then + -- Checkbox requires UI reload + Cbox.f:SetText(L[caption] .. "*") + Cbox.tiptext = L[tip] .. "|n|n* " .. L["Requires UI reload."] + else + -- Checkbox does not require UI reload + Cbox.f:SetText(L[caption]) + Cbox.tiptext = L[tip] + end + + -- Set label parameters + Cbox.f:SetJustifyH("LEFT") + Cbox.f:SetWordWrap(false) + + -- Set maximum label width + if parent:GetParent() == LeaPlusLC["PageF"] then + -- Main panel checkbox labels + if Cbox.f:GetWidth() > 152 then + Cbox.f:SetWidth(152) + LeaPlusLC["TruncatedLabelsList"] = LeaPlusLC["TruncatedLabelsList"] or {} + LeaPlusLC["TruncatedLabelsList"][Cbox.f] = L[caption] + end + -- Set checkbox click width + if Cbox.f:GetStringWidth() > 152 then + Cbox:SetHitRectInsets(0, -142, 0, 0) + else + Cbox:SetHitRectInsets(0, -Cbox.f:GetStringWidth() + 4, 0, 0) + end + else + -- Configuration panel checkbox labels (other checkboxes either have custom functions or blank labels) + if Cbox.f:GetWidth() > 302 then + Cbox.f:SetWidth(302) + LeaPlusLC["TruncatedLabelsList"] = LeaPlusLC["TruncatedLabelsList"] or {} + LeaPlusLC["TruncatedLabelsList"][Cbox.f] = L[caption] + end + -- Set checkbox click width + if Cbox.f:GetStringWidth() > 302 then + Cbox:SetHitRectInsets(0, -292, 0, 0) + else + Cbox:SetHitRectInsets(0, -Cbox.f:GetStringWidth() + 4, 0, 0) + end + end + + -- Set default checkbox state and click area + Cbox:SetScript('OnShow', function(self) + if LeaPlusLC[field] == "On" then + self:SetChecked(true) + else + self:SetChecked(false) + end + end) + + -- Process clicks + Cbox:SetScript('OnClick', function() + if Cbox:GetChecked() then + LeaPlusLC[field] = "On" + else + LeaPlusLC[field] = "Off" + end + LeaPlusLC:SetDim(); -- Lock invalid options + LeaPlusLC:ReloadCheck(); -- Show reload button if needed + LeaPlusLC:Live(); -- Run live code + end) + end + + -- Create an editbox (uses standard template) + function LeaPlusLC:CreateEditBox(frame, parent, width, maxchars, anchor, x, y, tab, shifttab) + + -- Create editbox + local eb = CreateFrame("EditBox", nil, parent, "InputBoxTemplate") + LeaPlusCB[frame] = eb + eb:SetPoint(anchor, x, y) + eb:SetWidth(width) + eb:SetHeight(24) + eb:SetFontObject("GameFontNormal") + eb:SetTextColor(1.0, 1.0, 1.0) + eb:SetAutoFocus(false) + eb:SetMaxLetters(maxchars) + eb:SetScript("OnEscapePressed", eb.ClearFocus) + eb:SetScript("OnEnterPressed", eb.ClearFocus) + + -- Add editbox border and backdrop + eb.f = CreateFrame("FRAME", nil, eb) + eb.f:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = false, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }}) + eb.f:SetPoint("LEFT", -6, 0) + eb.f:SetWidth(eb:GetWidth()+6) + eb.f:SetHeight(eb:GetHeight()) + eb.f:SetBackdropColor(1.0, 1.0, 1.0, 0.3) + + -- Move onto next editbox when tab key is pressed + eb:SetScript("OnTabPressed", function(self) + self:ClearFocus() + if IsShiftKeyDown() then + LeaPlusCB[shifttab]:SetFocus() + else + LeaPlusCB[tab]:SetFocus() + end + end) + + return eb + + end + + -- Create a standard button (using standard button template) + function LeaPlusLC:CreateButton(name, frame, label, anchor, x, y, width, height, reskin, tip, naked) + local mbtn = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate") + LeaPlusCB[name] = mbtn + mbtn:SetSize(width, height) + mbtn:SetPoint(anchor, x, y) + mbtn:SetHitRectInsets(0, 0, 0, 0) + mbtn:SetText(L[label]) + + -- Create fontstring so the button can be sized correctly + mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mbtn.f:SetText(L[label]) + if width > 0 then + -- Button should have static width + mbtn:SetWidth(width) + else + -- Button should have variable width + mbtn:SetWidth(mbtn.f:GetStringWidth() + 20) + end + + -- Tooltip handler + mbtn.tiptext = L[tip] + mbtn:SetScript("OnEnter", LeaPlusLC.TipSee) + mbtn:SetScript("OnLeave", GameTooltip_Hide) + + -- Texture the button + if reskin then + + -- Set skinned button textures + if not naked then + mbtn:SetNormalTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp") + mbtn:GetNormalTexture():SetTexCoord(0.125, 0.25, 0.4375, 0.5) + end + mbtn:SetHighlightTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp") + mbtn:GetHighlightTexture():SetTexCoord(0, 0.125, 0.4375, 0.5) + + -- Hide the default textures + -- mbtn:HookScript("OnShow", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnEnable", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnDisable", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnMouseDown", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + -- mbtn:HookScript("OnMouseUp", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end) + + end + + return mbtn + end + + -- Create a dropdown menu (using custom function to avoid taint) + function LeaPlusLC:CreateDropDown(ddname, label, parent, width, anchor, x, y, items, tip) + + -- Add the dropdown name to a table + tinsert(LeaDropList, ddname) + + -- Populate variable with item list + LeaPlusLC[ddname .. "Table"] = items + + -- Create outer frame + local frame = CreateFrame("FRAME", nil, parent); frame:SetWidth(width); frame:SetHeight(42); frame:SetPoint("BOTTOMLEFT", parent, anchor, x, y); + + -- Create dropdown inside outer frame + local dd = CreateFrame("Frame", nil, frame); dd:SetPoint("BOTTOMLEFT", -16, -8); dd:SetPoint("BOTTOMRIGHT", 15, -4); dd:SetHeight(32); + + -- Create dropdown textures + local lt = dd:CreateTexture(nil, "ARTWORK"); lt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); lt:SetTexCoord(0, 0.1953125, 0, 1); lt:SetPoint("TOPLEFT", dd, 0, 17); lt:SetWidth(25); lt:SetHeight(64); + local rt = dd:CreateTexture(nil, "BORDER"); rt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); rt:SetTexCoord(0.8046875, 1, 0, 1); rt:SetPoint("TOPRIGHT", dd, 0, 17); rt:SetWidth(25); rt:SetHeight(64); + local mt = dd:CreateTexture(nil, "BORDER"); mt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); mt:SetTexCoord(0.1953125, 0.8046875, 0, 1); mt:SetPoint("LEFT", lt, "RIGHT"); mt:SetPoint("RIGHT", rt, "LEFT"); mt:SetHeight(64); + + -- Create dropdown label + local lf = dd:CreateFontString(nil, "OVERLAY", "GameFontNormal"); lf:SetPoint("TOPLEFT", frame, 0, 0); lf:SetPoint("TOPRIGHT", frame, -5, 0); lf:SetJustifyH("LEFT"); lf:SetText(L[label]) + + -- Create dropdown placeholder for value (set it using OnShow) + local value = dd:CreateFontString(nil, "OVERLAY", "GameFontHighlight") + value:SetPoint("LEFT", lt, 26, 2); value:SetPoint("RIGHT", rt, -43, 0); value:SetJustifyH("LEFT"); value:SetWordWrap(false) + dd:SetScript("OnShow", function() value:SetText(LeaPlusLC[ddname.."Table"][LeaPlusLC[ddname]]) end) + + -- Create dropdown button (clicking it opens the dropdown list) + local dbtn = CreateFrame("Button", nil, dd) + dbtn:SetPoint("TOPRIGHT", rt, -16, -18); dbtn:SetWidth(24); dbtn:SetHeight(24) + dbtn:SetNormalTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Up"); dbtn:SetPushedTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Down"); dbtn:SetDisabledTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Disabled"); dbtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight"); dbtn:GetHighlightTexture():SetBlendMode("ADD") + dbtn.tiptext = tip; dbtn:SetScript("OnEnter", LeaPlusLC.ShowDropTip) + dbtn:SetScript("OnLeave", GameTooltip_Hide) + + -- Create dropdown list + local ddlist = CreateFrame("Frame",nil,frame) + LeaPlusCB["ListFrame"..ddname] = ddlist + ddlist:SetPoint("TOP",0,-42) + ddlist:SetWidth(frame:GetWidth()) + ddlist:SetHeight((#items * 16) + 16 + 16) + ddlist:SetFrameStrata("FULLSCREEN_DIALOG") + ddlist:SetFrameLevel(12) + ddlist:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background-Dark", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = false, tileSize = 0, edgeSize = 32, insets = { left = 4, right = 4, top = 4, bottom = 4 }}); + ddlist:Hide() + + -- Hide list if parent is closed + parent:HookScript("OnHide", function() ddlist:Hide() end) + + -- Create checkmark (it marks the currently selected item) + local ddlistchk = CreateFrame("FRAME", nil, ddlist) + ddlistchk:SetHeight(16); ddlistchk:SetWidth(16) + ddlistchk.t = ddlistchk:CreateTexture(nil, "ARTWORK"); ddlistchk.t:SetAllPoints(); ddlistchk.t:SetTexture("Interface\\Common\\UI-DropDownRadioChecks"); ddlistchk.t:SetTexCoord(0, 0.5, 0.5, 1.0); + + -- Create dropdown list items + for k, v in pairs(items) do + + local dditem = CreateFrame("Button", nil, LeaPlusCB["ListFrame"..ddname]) + LeaPlusCB["Drop"..ddname..k] = dditem; + dditem:Show(); + dditem:SetWidth(ddlist:GetWidth() - 22) + dditem:SetHeight(16) + dditem:SetPoint("TOPLEFT", 12, -k * 16) + + dditem.f = dditem:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight') + dditem.f:SetPoint('LEFT', 16, 0) + dditem.f:SetText(items[k]) + + dditem.f:SetWordWrap(false) + dditem.f:SetJustifyH("LEFT") + dditem.f:SetWidth(ddlist:GetWidth()-36) + + dditem.t = dditem:CreateTexture(nil, "BACKGROUND") + dditem.t:SetAllPoints() + dditem.t:SetVertexColor(0.3, 0.3, 0.00, 0.8) + dditem.t:Hide(); + + dditem:SetScript("OnEnter", function() dditem.t:Show() end) + dditem:SetScript("OnLeave", function() dditem.t:Hide() end) + dditem:SetScript("OnClick", function() + LeaPlusLC[ddname] = k + value:SetText(LeaPlusLC[ddname.."Table"][k]) + ddlist:Hide(); -- Must be last in click handler as other functions hook it + end) + + -- Show list when button is clicked + dbtn:SetScript("OnClick", function() + -- Show the dropdown + if ddlist:IsShown() then ddlist:Hide() else + ddlist:Show(); + ddlistchk:SetPoint("TOPLEFT",10,select(5,LeaPlusCB["Drop"..ddname..LeaPlusLC[ddname]]:GetPoint())) + ddlistchk:Show(); + end; + -- Hide all other dropdowns except the one we're dealing with + for void,v in pairs(LeaDropList) do + if v ~= ddname then + LeaPlusCB["ListFrame"..v]:Hide() + end + end + end) + + -- Expand the clickable area of the button to include the entire menu width + dbtn:SetHitRectInsets(-width+28, 0, 0, 0) + + end + + return frame + + end + +---------------------------------------------------------------------- +-- Create main options panel frame +---------------------------------------------------------------------- + + function LeaPlusLC:CreateMainPanel() + + -- Create the panel + local PageF = CreateFrame("Frame", nil, UIParent); + + -- Make it a system frame + _G["LeaPlusGlobalPanel"] = PageF + table.insert(UISpecialFrames, "LeaPlusGlobalPanel") + + -- Set frame parameters + LeaPlusLC["PageF"] = PageF + PageF:SetSize(570,370) + PageF:Hide(); + PageF:SetFrameStrata("FULLSCREEN_DIALOG") + PageF:SetClampedToScreen(true) + PageF:SetClampRectInsets(500, -500, -300, 300) + PageF:EnableMouse(true) + PageF:SetMovable(true) + PageF:RegisterForDrag("LeftButton") + PageF:SetScript("OnDragStart", PageF.StartMoving) + PageF:SetScript("OnDragStop", function () + PageF:StopMovingOrSizing(); + PageF:SetUserPlaced(false); + -- Save panel position + LeaPlusLC["MainPanelA"], void, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = PageF:GetPoint() + end) + + -- Add background color + PageF.t = PageF:CreateTexture(nil, "BACKGROUND") + PageF.t:SetAllPoints() + PageF.t:SetVertexColor(0.05, 0.05, 0.05, 0.9) + + -- Add textures + LeaPlusLC:CreateBar("FootTexture", PageF, 570, 42, "BOTTOM", 0.3, 0.3, 1.0, 0.9, "Interface\\GLUES\\MODELS\\UI_MAINMENU\\GRADIENT") + LeaPlusLC:CreateBar("MainTexture", PageF, 440, 348, "TOPRIGHT", 0.8, 0.8, 0.8, 0.9, "Interface\\DressUpFrame\\DressUpBackground-NightElf1") + LeaPlusLC:CreateBar("MenuTexture", PageF, 130, 348, "TOPLEFT", 0.6, 0.6, 0.6, 0.9, "Interface\\GLUES\\MODELS\\UI_MAINMENU\\GRADIENT") + + -- Set panel position when shown + PageF:SetScript("OnShow", function() + PageF:ClearAllPoints() + PageF:SetPoint(LeaPlusLC["MainPanelA"], UIParent, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"]) + end) + + -- Add main title (shown above menu in the corner) + PageF.mt = PageF:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + PageF.mt:SetPoint('TOPLEFT', 16, -16) + PageF.mt:SetText("Leatrix Plus") + + -- Add version text (shown underneath main title) + PageF.v = PageF:CreateFontString(nil, 'ARTWORK', 'GameFontHighlightSmall') + PageF.v:SetHeight(32); + PageF.v:SetPoint('TOPLEFT', PageF.mt, 'BOTTOMLEFT', 0, -8); + PageF.v:SetPoint('RIGHT', PageF, -32, 0) + PageF.v:SetJustifyH('LEFT'); PageF.v:SetJustifyV('TOP'); + PageF.v:SetNonSpaceWrap(true); PageF.v:SetText(L["WC"] .. " " .. LeaPlusLC["AddonVer"]) + + -- Add reload UI Button + local reloadb = LeaPlusLC:CreateButton("ReloadUIButton", PageF, "Reload", "BOTTOMRIGHT", -16, 10, 0, 25, true, "Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect.") + LeaPlusLC:LockItem(reloadb,true) + reloadb:SetScript("OnClick", ReloadUI) + + reloadb.f = reloadb:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall') + reloadb.f:SetHeight(32); + reloadb.f:SetPoint('RIGHT', reloadb, 'LEFT', -10, 0) + reloadb.f:SetText(L["Your UI needs to be reloaded."]) + reloadb.f:Hide() + + -- Add close Button + local CloseB = CreateFrame("Button", nil, PageF, "UIPanelCloseButton") + CloseB:SetSize(30, 30) + CloseB:SetPoint("TOPRIGHT", 0, 0) + CloseB:SetScript("OnClick", LeaPlusLC.HideFrames) + + -- Add web link Button + local PageFAlertButton = LeaPlusLC:CreateButton("PageFAlertButton", PageF, "You should keybind web link!", "BOTTOMLEFT", 16, 10, 0, 25, true, "You should set a keybind for the web link feature. It's very useful.|n|nOpen the key bindings window (accessible from the game menu) and click Leatrix Plus.|n|nSet a keybind for Show web link.|n|nNow when your pointer is over an item, NPC or spell (and more), press your keybind to get a web link.", true) + PageFAlertButton:SetPushedTextOffset(0, 0) + PageF:HookScript("OnShow", function() + if GetBindingKey("LEATRIX_PLUS_GLOBAL_WEBLINK") then PageFAlertButton:Hide() else PageFAlertButton:Show() end + end) + + -- Release memory + LeaPlusLC.CreateMainPanel = nil + + end + + LeaPlusLC:CreateMainPanel(); + +---------------------------------------------------------------------- +-- L80: Commands +---------------------------------------------------------------------- + + -- Slash command function + function LeaPlusLC:SlashFunc(str) + if str and str ~= "" then + -- Get parameters in lower case with duplicate spaces removed + local str, arg1, arg2, arg3 = strsplit(" ", string.lower(str:gsub("%s+", " "))) + -- Traverse parameters + if str == "wipe" then + -- Wipe settings + LeaPlusLC:PlayerLogout(true) -- Run logout function with wipe parameter + wipe(LeaPlusDB) + LpEvt:UnregisterAllEvents(); -- Don't save any settings + ReloadUI(); + elseif str == "nosave" then + -- Prevent Leatrix Plus from overwriting LeaPlusDB at next logout + LpEvt:UnregisterEvent("PLAYER_LOGOUT") + LeaPlusLC:Print("Leatrix Plus will not overwrite LeaPlusDB at next logout.") + return + elseif str == "reset" then + -- Reset panel positions + LeaPlusLC["MainPanelA"], LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = "CENTER", "CENTER", 0, 0 + LeaPlusLC["PlusPanelScale"] = 1 + LeaPlusLC["PlusPanelAlpha"] = 0 + LeaPlusLC["PageF"]:SetScale(1) + LeaPlusLC["PageF"].t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + -- Refresh panels + LeaPlusLC["PageF"]:ClearAllPoints() + LeaPlusLC["PageF"]:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + -- Reset currently showing configuration panel + for k, v in pairs(LeaConfigList) do + if v:IsShown() then + v:ClearAllPoints() + v:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + v:SetScale(1) + v.t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"]) + end + end + -- Refresh Leatrix Plus settings menu only + if LeaPlusLC["Page8"]:IsShown() then + LeaPlusLC["Page8"]:Hide() + LeaPlusLC["Page8"]:Show() + end + return + elseif str == "taint" then + -- Set taint log level + if arg1 and arg1 ~= "" then + arg1 = tonumber(arg1) + if arg1 and arg1 >= 0 and arg1 <= 2 then + if arg1 == 0 then + -- Disable taint log + ConsoleExec("taintLog 0") + LeaPlusLC:Print("Taint level: Disabled (0).") + elseif arg1 == 1 then + -- Basic taint log + ConsoleExec("taintLog 1") + LeaPlusLC:Print("Taint level: Basic (1).") + elseif arg1 == 2 then + -- Full taint log + ConsoleExec("taintLog 2") + LeaPlusLC:Print("Taint level: Full (2).") + end + else + LeaPlusLC:Print("Invalid taint level.") + end + else + -- Show current taint level + local taintCurrent = GetCVar("taintLog") + if taintCurrent == "0" then + LeaPlusLC:Print("Taint level: Disabled (0).") + elseif taintCurrent == "1" then + LeaPlusLC:Print("Taint level: Basic (1).") + elseif taintCurrent == "2" then + LeaPlusLC:Print("Taint level: Full (2).") + end + end + return + elseif str == "quest" then + -- Show quest completed status + if arg1 and arg1 ~= "" then + if tonumber(arg1) and tonumber(arg1) < 999999999 then + local questCompleted = C_QuestLog.IsQuestFlaggedCompleted(arg1) + local questTitle = C_QuestLog.GetQuestInfo(arg1) or L["Unknown"] + LibCompat.After(0.5, function() + local questTitle = C_QuestLog.GetQuestInfo(arg1) or L["Unknown"] + if questCompleted then + LeaPlusLC:Print(questTitle .. " (" .. arg1 .. "):" .. "|cffffffff " .. L["Completed."]) + else + LeaPlusLC:Print(questTitle .. " (" .. arg1 .. "):" .. "|cffffffff " .. L["Not completed."]) + end + end) + else + LeaPlusLC:Print("Invalid quest ID.") + end + else + LeaPlusLC:Print("Missing quest ID.") + end + return + elseif str == "rest" then + -- Show rested bubbles + LeaPlusLC:Print(L["Rested bubbles"] .. ": |cffffffff" .. (math.floor(20 * (GetXPExhaustion() or 0) / UnitXPMax("player") + 0.5))) + return + elseif str == "zygor" then + -- Toggle Zygor addon + LeaPlusLC:ZygorToggle() + return + elseif str == "npcid" then + -- Print NPC ID + local npcName = UnitName("target") + local npcGuid = UnitGUID("target") or nil + if npcName and npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + LeaPlusLC:Print(npcName .. ": |cffffffff" .. npcID) + end + end + return + elseif str == "id" then + -- Show web link + if not LeaPlusLC.WowheadLock then + -- Set Wowhead link prefix + if GameLocale == "deDE" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/de" + elseif GameLocale == "esMX" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/es" + elseif GameLocale == "esES" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/es" + elseif GameLocale == "frFR" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/fr" + elseif GameLocale == "itIT" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/it" + elseif GameLocale == "ptBR" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/pt" + elseif GameLocale == "ruRU" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/ru" + elseif GameLocale == "koKR" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/ko" + elseif GameLocale == "zhCN" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/cn" + elseif GameLocale == "zhTW" then LeaPlusLC.WowheadLock = "wowhead.com/wotlk/cn" + else LeaPlusLC.WowheadLock = "wowhead.com/wotlk" + end + end + -- Store frame under mouse + local mouseFocus = GetMouseFocus() + -- ItemRefTooltip or GameTooltip + local tooltip + if mouseFocus == ItemRefTooltip then tooltip = ItemRefTooltip else tooltip = GameTooltip end + -- Process tooltip + if tooltip:IsShown() then + -- Item + local void, itemLink = tooltip:GetItem() + if itemLink then + local itemID = GetItemInfoFromHyperlink(itemLink) + if itemID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/item=" .. itemID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Item"] .. ": " .. itemLink .. " (" .. itemID .. ")") + return + end + end + -- Spell + local name, spellID = tooltip:GetSpell() + if name and spellID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. name .. " (" .. spellID .. ")") + return + end + -- NPC + local npcName = UnitName("mouseover") + local npcGuid = UnitGUID("mouseover") or nil + if npcName and npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/npc=" .. npcID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["NPC"] .. ": " .. npcName .. " (" .. npcID .. ")") + return + end + end + -- Buffs and debuffs + for i = 1, BUFF_MAX_DISPLAY do + if _G["BuffButton" .. i] and mouseFocus == _G["BuffButton" .. i] then + local spellName, void, void, void, void, void, void, void, void, spellID = UnitBuff("player", i) + if spellName and spellID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. spellName .. " (" .. spellID .. ")") + end + return + end + end + for i = 1, DEBUFF_MAX_DISPLAY do + if _G["DebuffButton" .. i] and mouseFocus == _G["DebuffButton" .. i] then + local spellName, void, void, void, void, void, void, void, void, spellID = UnitDebuff("player", i) + if spellName and spellID then + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false) + LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. spellName .. " (" .. spellID .. ")") + end + return + end + end + -- Unknown tooltip (this must be last) + local tipTitle = GameTooltipTextLeft1:GetText() + if tipTitle then + -- Show unknown link + local unitFocus + if mouseFocus == WorldFrame then unitFocus = "mouseover" else unitFocus = select(2, GameTooltip:GetUnit()) end + if not unitFocus or not UnitIsPlayer(unitFocus) then + tipTitle = tipTitle:gsub("|c%x%x%x%x%x%x%x%x", "") -- Remove color tag + LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/search?q=" .. tipTitle, false) + LeaPlusLC.FactoryEditBox.f:SetText("|cffff0000" .. L["Link will search Wowhead"]) + return + end + end + end + return + elseif str == "tooltip" then + -- Print tooltip frame name + local enumf = EnumerateFrames() + while enumf do + if (enumf:GetObjectType() == "GameTooltip" or strfind((enumf:GetName() or ""):lower(),"tip")) and enumf:IsVisible() and enumf:GetPoint() then + print(enumf:GetName()) + end + enumf = EnumerateFrames(enumf) + end + collectgarbage() + return + elseif str == "rsnd" then + -- Restart sound system + if LeaPlusCB["StopMusicBtn"] then LeaPlusCB["StopMusicBtn"]:Click() end + Sound_GameSystem_RestartSoundSystem() + LeaPlusLC:Print("Sound system restarted.") + return + elseif str == "event" then + -- List events (used for debug) + LeaPlusLC["DbF"] = LeaPlusLC["DbF"] or CreateFrame("FRAME") + if not LeaPlusLC["DbF"]:GetScript("OnEvent") then + LeaPlusLC:Print("Tracing started.") + LeaPlusLC["DbF"]:RegisterAllEvents() + LeaPlusLC["DbF"]:SetScript("OnEvent", function(self, event) + if event == "ACTIONBAR_UPDATE_COOLDOWN" + or event == "BAG_UPDATE_COOLDOWN" + or event == "CHAT_MSG_TRADESKILLS" + or event == "COMBAT_LOG_EVENT_UNFILTERED" + or event == "SPELL_UPDATE_COOLDOWN" + or event == "SPELL_UPDATE_USABLE" + or event == "UNIT_POWER_FREQUENT" + or event == "UPDATE_INVENTORY_DURABILITY" + then return + else + print(event) + end + end) + else + LeaPlusLC["DbF"]:UnregisterAllEvents() + LeaPlusLC["DbF"]:SetScript("OnEvent", nil) + LeaPlusLC:Print("Tracing stopped.") + end + return + elseif str == "game" then + -- Show game build + local version, build, gdate, tocversion = GetBuildInfo() + LeaPlusLC:Print(L["World of Warcraft"] .. ": |cffffffff" .. version .. "." .. build .. " (" .. gdate .. ") (" .. tocversion .. ")") + return + elseif str == "config" then + -- Show maximum camera distance + LeaPlusLC:Print(L["Camera distance"] .. ": |cffffffff" .. GetCVar("cameraDistanceMaxZoomFactor")) + -- Show particle density + LeaPlusLC:Print(L["Particle density"] .. ": |cffffffff" .. GetCVar("particleDensity")) + LeaPlusLC:Print(L["Weather density"] .. ": |cffffffff" .. GetCVar("weatherDensity")) + -- Show config + LeaPlusLC:Print("SynchroniseConfig: |cffffffff" .. GetCVar("synchronizeConfig")) + -- Show raid restrictions + local unRaid = GetAllowLowLevelRaid() + if unRaid and unRaid == true then + LeaPlusLC:Print("GetAllowLowLevelRaid: |cffffffff" .. "True") + else + LeaPlusLC:Print("GetAllowLowLevelRaid: |cffffffff" .. "False") + end + return + elseif str == "move" then + -- Move minimap + MinimapZoneTextButton:Hide() + MinimapBorderTop:SetTexture("") + MiniMapWorldMapButton:Hide() + MinimapBackdrop:ClearAllPoints() + MinimapBackdrop:SetPoint("CENTER", UIParent, "CENTER", -330, -75) + Minimap:SetPoint("CENTER", UIParent, "CENTER", -320, -50) + return + elseif str == "tipcol" then + -- Show default tooltip title color + if GameTooltipTextLeft1:IsShown() then + local r, g, b, a = GameTooltipTextLeft1:GetTextColor() + r = r <= 1 and r >= 0 and r or 0 + g = g <= 1 and g >= 0 and g or 0 + b = b <= 1 and b >= 0 and b or 0 + LeaPlusLC:Print(L["Tooltip title color"] .. ": " .. strupper(string.format("%02x%02x%02x", r * 255, g * 255, b * 255) .. ".")) + else + LeaPlusLC:Print("No tooltip showing.") + end + return + elseif str == "list" then + -- Enumerate frames + local frame = EnumerateFrames() + while frame do + if (frame:IsVisible() and MouseIsOver(frame)) then + LeaPlusLC:Print(frame:GetName() or string.format("[Unnamed Frame: %s]", tostring(frame))) + end + frame = EnumerateFrames(frame) + end + return + elseif str == "grid" then + -- Toggle frame alignment grid + if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end + return + elseif str == "chk" then + -- List truncated checkbox labels + if LeaPlusLC["TruncatedLabelsList"] then + for i, v in pairs(LeaPlusLC["TruncatedLabelsList"]) do + LeaPlusLC:Print(LeaPlusLC["TruncatedLabelsList"][i]) + end + else + LeaPlusLC:Print("Checkbox labels are Ok.") + end + return + elseif str == "cv" then + -- Print and set console variable setting + if arg1 and arg1 ~= "" then + if GetCVar(arg1) then + if arg2 and arg2 ~= "" then + if tonumber(arg2) then + SetCVar(arg1, arg2) + else + LeaPlusLC:Print("Value must be a number.") + return + end + end + LeaPlusLC:Print(arg1 .. ": |cffffffff" .. GetCVar(arg1)) + else + LeaPlusLC:Print("Invalid console variable.") + end + else + LeaPlusLC:Print("Missing console variable.") + end + return + elseif str == "play" then + -- Play sound ID + if arg1 and arg1 ~= "" then + if tonumber(arg1) then + -- Stop last played sound ID + if LeaPlusLC.SNDcanitHandle then + StopSound(LeaPlusLC.SNDcanitHandle) + end + -- Play sound ID + LeaPlusLC.SNDcanitPlay, LeaPlusLC.SNDcanitHandle = PlaySound(arg1, "Master", false, false) + if not LeaPlusLC.SNDcanitPlay then LeaPlusLC:Print(L["Invalid sound ID"] .. ": |cffffffff" .. arg1) end + else + LeaPlusLC:Print(L["Invalid sound ID"] .. ": |cffffffff" .. arg1) + end + else + LeaPlusLC:Print("Missing sound ID.") + end + return + elseif str == "stop" then + -- Stop last played sound ID + if LeaPlusLC.SNDcanitHandle then + StopSound(LeaPlusLC.SNDcanitHandle) + end + return + elseif str == "wipecds" then + -- Wipe cooldowns + LeaPlusDB["Cooldowns"] = nil + ReloadUI() + return + elseif str == "tipchat" then + -- Print tooltip contents in chat + local numLines = GameTooltip:NumLines() + if numLines then + for i = 1, numLines do + print(_G["GameTooltipTextLeft" .. i]:GetText() or "") + end + end + return + elseif str == "tiplang" then + -- Tooltip tag locale code constructor + local msg = "" + msg = msg .. 'if GameLocale == "' .. GameLocale .. '" then ' + msg = msg .. 'ttLevel = "' .. LEVEL .. '"; ' + msg = msg .. 'ttBoss = "' .. BOSS .. '"; ' + msg = msg .. 'ttElite = "' .. ELITE .. '"; ' + msg = msg .. 'ttRare = "' .. ITEM_QUALITY3_DESC .. '"; ' + msg = msg .. 'ttRareElite = "' .. ITEM_QUALITY3_DESC .. " " .. ELITE .. '"; ' + msg = msg .. 'ttRareBoss = "' .. ITEM_QUALITY3_DESC .. " " .. BOSS .. '"; ' + msg = msg .. 'ttTarget = "' .. TARGET .. '"; ' + msg = msg .. "end" + print(msg) + return + elseif str == "con" then + -- Show the developer console + C_Console.SetFontHeight(28) + DeveloperConsole:Toggle(true) + return + elseif str == "movlist" then + -- List playable movie IDs + local count = 0 + for i = 1, 1000 do + if IsMoviePlayable(i) then + print(i) + count = count + 1 + end + end + LeaPlusLC:Print("Total movies: |cffffffff" .. count) + return + elseif str == "movie" then + -- Playback movie by ID + arg1 = tonumber(arg1) + if arg1 and arg1 ~= "" then + if IsMoviePlayable(arg1) then + MovieFrame_PlayMovie(MovieFrame, arg1) + else + LeaPlusLC:Print("Movie not playable.") + end + else + LeaPlusLC:Print("Missing movie ID.") + end + return + elseif str == "cin" then + -- Play opening cinematic (only works if character has never gained XP) (used for testing) + OpeningCinematic() + return + elseif str == "skit" then + -- Play a test sound kit + PlaySound("1020", "Master", false, true) + return + elseif str == "marker" then + -- Prevent showing raid target markers on self + if not LeaPlusLC.MarkerFrame then + LeaPlusLC.MarkerFrame = CreateFrame("FRAME") + LeaPlusLC.MarkerFrame:RegisterEvent("RAID_TARGET_UPDATE") + end + LeaPlusLC.MarkerFrame.Update = true + if LeaPlusLC.MarkerFrame.Toggle == false then + -- Show markers + LeaPlusLC.MarkerFrame:SetScript("OnEvent", nil) + ActionStatus_DisplayMessage(L["Self Markers Allowed"], true) + LeaPlusLC.MarkerFrame.Toggle = true + else + -- Hide markers + SetRaidTarget("player", 0) + LeaPlusLC.MarkerFrame:SetScript("OnEvent", function() + if LeaPlusLC.MarkerFrame.Update == true then + LeaPlusLC.MarkerFrame.Update = false + SetRaidTarget("player", 0) + end + LeaPlusLC.MarkerFrame.Update = true + end) + ActionStatus_DisplayMessage(L["Self Markers Blocked"], true) + LeaPlusLC.MarkerFrame.Toggle = false + end + return + elseif str == "pos" then + -- Map POI code builder + local mapID = C_Map.GetBestMapForUnit("player") or nil + local mapName = C_Map.GetMapInfo(mapID).name or nil + local mapRects = {} + local tempVec2D = CreateVector2D(0, 0) + local void + -- Get player map position + tempVec2D.x, tempVec2D.y = UnitPosition("player") + if not tempVec2D.x then return end + local mapRect = mapRects[mapID] + if not mapRect then + mapRect = {} + void, mapRect[1] = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(0, 0)) + void, mapRect[2] = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(1, 1)) + mapRect[2]:Subtract(mapRect[1]) + mapRects[mapID] = mapRect + end + tempVec2D:Subtract(mapRects[mapID][1]) + local pX, pY = tempVec2D.y/mapRects[mapID][2].y, tempVec2D.x/mapRects[mapID][2].x + pX = string.format("%0.1f", 100 * pX) + pY = string.format("%0.1f", 100 * pY) + if mapID and mapName and pX and pY then + ChatFrame1:Clear() + local dnType, dnTex = "Dungeon", "dnTex" + if arg1 == "raid" then dnType, dnTex = "Raid", "rdTex" end + if arg1 == "portal" then dnType = "Portal" end + print('[' .. mapID .. '] = --[[' .. mapName .. ']] {{' .. pX .. ', ' .. pY .. ', L[' .. '"Name"' .. '], L[' .. '"' .. dnType .. '"' .. '], ' .. dnTex .. '},},') + end + return + elseif str == "mapref" then + -- Print map reveal structure code + if not WorldMapFrame:IsShown() then + LeaPlusLC:Print("Open the map first!") + return + end + ChatFrame1:Clear() + local msg = "" + local mapID = WorldMapFrame.mapID + local mapName = C_Map.GetMapInfo(mapID).name + local mapArt = C_Map.GetMapArtID(mapID) + msg = msg .. "--[[" .. mapName .. "]] [" .. mapArt .. "] = {" + local exploredMapTextures = C_MapExplorationInfo.GetExploredMapTextures(mapID); + if exploredMapTextures then + for i, exploredTextureInfo in ipairs(exploredMapTextures) do + local twidth = exploredTextureInfo.textureWidth or 0 + if twidth > 0 then + local theight = exploredTextureInfo.textureHeight or 0 + local offsetx = exploredTextureInfo.offsetX + local offsety = exploredTextureInfo.offsetY + local filedataIDS = exploredTextureInfo.fileDataIDs + msg = msg .. "[" .. '"' .. twidth .. ":" .. theight .. ":" .. offsetx .. ":" .. offsety .. '"' .. "] = " .. '"' + for fileData = 1, #filedataIDS do + msg = msg .. filedataIDS[fileData] + if fileData < #filedataIDS then + msg = msg .. ", " + else + msg = msg .. '",' + if i < #exploredMapTextures then + msg = msg .. " " + end + end + end + end + end + msg = msg .. "}," + print(msg) + end + return + elseif str == "mk" then + -- Print a map key + if not arg1 then LeaPlusLC:Print("Key missing!") return end + if not tonumber(arg1) then LeaPlusLC:Print("Must be a number!") return end + local key = arg1 + ChatFrame1:Clear() + print('"' .. mod(floor(key / 2^36), 2^12) .. ":" .. mod(floor(key / 2^24), 2^12) .. ":" .. mod(floor(key / 2^12), 2^12) .. ":" .. mod(key, 2^12) .. '"') + return + elseif str == "map" then + -- Set map by ID, print currently showing map ID or print character map ID + if not arg1 then + -- Print map ID + if WorldMapFrame:IsShown() then + -- Show world map ID + local mapID = WorldMapFrame.mapID or nil + local artID = C_Map.GetMapArtID(mapID) or nil + local mapName = C_Map.GetMapInfo(mapID).name or nil + if mapID and artID and mapName then + LeaPlusLC:Print(mapID .. " (" .. artID .. "): " .. mapName .. " (map)") + end + else + -- Show character map ID + local mapID = C_Map.GetBestMapForUnit("player") or nil + local artID = C_Map.GetMapArtID(mapID) or nil + local mapName = C_Map.GetMapInfo(mapID).name or nil + if mapID and artID and mapName then + LeaPlusLC:Print(mapID .. " (" .. artID .. "): " .. mapName .. " (player)") + end + end + return + elseif not tonumber(arg1) or not C_Map.GetMapInfo(arg1) then + -- Invalid map ID + LeaPlusLC:Print("Invalid map ID.") + else + -- Set map by ID + WorldMapFrame:SetMapID(tonumber(arg1)) + end + return + elseif str == "cls" then + -- Clear chat frame + ChatFrame1:Clear() + return + elseif str == "al" then + -- Enable auto loot + SetCVar("autoLootDefault", "1") + LeaPlusLC:Print("Auto loot is now enabled.") + return + elseif str == "realm" then + -- Show list of connected realms + local titleRealm = GetRealmName() + local userRealm = GetNormalizedRealmName() + local connectedServers = GetAutoCompleteRealms() + if titleRealm and userRealm and connectedServers then + LeaPlusLC:Print(L["Connections for"] .. "|cffffffff " .. titleRealm) + if #connectedServers > 0 then + local count = 1 + for i = 1, #connectedServers do + if userRealm ~= connectedServers[i] then + LeaPlusLC:Print(count .. ". " .. connectedServers[i]) + count = count + 1 + end + end + else + LeaPlusLC:Print("None") + end + end + return + elseif str == "dup" then + -- Print music track duplicates + local mask, found, badidfound = false, false, false + for i, e in pairs(Leatrix_Plus["ZoneList"]) do + if Leatrix_Plus["ZoneList"][e] then + for a, b in pairs(Leatrix_Plus["ZoneList"][e]) do + local same = {} + if b.tracks then + for k, v in pairs(b.tracks) do + -- Check for bad sound IDs + if not strfind(v, "|c") then + if not strfind(v, ".mp3") then + local temFile, temSoundID = v:match("([^,]+)%#([^,]+)") + if temSoundID then + local temPlay, temHandle = PlaySound(temSoundID, "Master", false, true) + if temHandle then StopSound(temHandle) end + temPlay, temHandle = PlaySound(temSoundID, "Master", false, true) + if not temPlay and not temHandle then + print("|cffff5400" .. L["Bad ID"] .. ": |r" .. e, v) + badidfound = true + else + if temHandle then StopSound(temHandle) end + end + end + end + -- Check for duplicate IDs + if tContains(same, v) and mask == false then + mask = true + found = true + print("|cffec51ff" .. L["Dup ID"] .. ": |r" .. e, v) + end + tinsert(same, v) + mask = false + end + end + end + end + end + end + if badidfound == false then + LeaPlusLC:Print("No bad sound IDs found.") + end + if found == false then + LeaPlusLC:Print("No media duplicates found.") + end + Sound_GameSystem_RestartSoundSystem() + collectgarbage() + return + elseif str == "help" then + -- Help panel + if not LeaPlusLC.HelpFrame then + local frame = CreateFrame("FRAME", nil, UIParent) + frame:SetSize(570, 340); frame:SetFrameStrata("FULLSCREEN_DIALOG"); frame:SetFrameLevel(100) + frame.tex = frame:CreateTexture(nil, "BACKGROUND"); frame.tex:SetAllPoints(); + frame.tex:SetVertexColor(0.05, 0.05, 0.05, 0.9) + frame.close = CreateFrame("Button", nil, frame, "UIPanelCloseButton"); frame.close:SetSize(30, 30); frame.close:SetPoint("TOPRIGHT", 0, 0); frame.close:SetScript("OnClick", function() frame:Hide() end) + frame:ClearAllPoints(); frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + frame:SetClampedToScreen(true) + frame:SetClampRectInsets(450, -450, -300, 300) + frame:EnableMouse(true) + frame:SetMovable(true) + frame:RegisterForDrag("LeftButton") + frame:SetScript("OnDragStart", frame.StartMoving) + frame:SetScript("OnDragStop", function() frame:StopMovingOrSizing() frame:SetUserPlaced(false) end) + frame:Hide() + LeaPlusLC:CreateBar("HelpPanelMainTexture", frame, 570, 340, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\DressUpFrame\\DressUpBackground-NightElf1") + -- Panel contents + local col1, col2, color1 = 10, 120, "|cffffffaa" + LeaPlusLC:MakeTx(frame, "Leatrix Plus Help", col1, -10) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp", col1, -30) + LeaPlusLC:MakeWD(frame, "Toggle opttions panel.", col2, -30) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp reset", col1, -50) + LeaPlusLC:MakeWD(frame, "Reset addon panel position and scale.", col2, -50) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp wipe", col1, -70) + LeaPlusLC:MakeWD(frame, "Wipe all addon settings (reloads UI).", col2, -70) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp realm", col1, -90) + LeaPlusLC:MakeWD(frame, "Show realms connected to yours.", col2, -90) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp rest", col1, -110) + LeaPlusLC:MakeWD(frame, "Show number of rested XP bubbles remaining.", col2, -110) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp quest ", col1, -130) + LeaPlusLC:MakeWD(frame, "Show quest completion status for .", col2, -130) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp grid", col1, -150) + LeaPlusLC:MakeWD(frame, "Toggle a frame alignment grid.", col2, -150) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp id", col1, -170) + LeaPlusLC:MakeWD(frame, "Show a web link for whatever the pointer is over.", col2, -170) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp zygor", col1, -190) + LeaPlusLC:MakeWD(frame, "Toggle the Zygor addon (reloads UI).", col2, -190) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp movie ", col1, -210) + LeaPlusLC:MakeWD(frame, "Play a movie by its ID.", col2, -210) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp marker", col1, -230) + LeaPlusLC:MakeWD(frame, "Block target markers (toggle) (requires assistant or leader in raid).", col2, -230) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp rsnd", col1, -250) + LeaPlusLC:MakeWD(frame, "Restart the sound system.", col2, -250) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp ra", col1, -270) + LeaPlusLC:MakeWD(frame, "Announce target in General chat channel (useful for rares).", col2, -270) + LeaPlusLC:MakeWD(frame, color1 .. "/ltp con", col1, -290) + LeaPlusLC:MakeWD(frame, "Launch the developer console with a large font.", col2, -290) + LeaPlusLC:MakeWD(frame, color1 .. "/rl", col1, -310) + LeaPlusLC:MakeWD(frame, "Reload the UI.", col2, -310) + LeaPlusLC.HelpFrame = frame + _G["LeaPlusGlobalHelpPanel"] = frame + table.insert(UISpecialFrames, "LeaPlusGlobalHelpPanel") + end + if LeaPlusLC.HelpFrame:IsShown() then LeaPlusLC.HelpFrame:Hide() else LeaPlusLC.HelpFrame:Show() end + return + elseif str == "ra" then + -- Announce target name, health percentage, coordinates and map pin link in General chat channel + local genChannel + if GameLocale == "deDE" then genChannel = "Allgemein" + elseif GameLocale == "esMX" then genChannel = "General" + elseif GameLocale == "esES" then genChannel = "General" + elseif GameLocale == "frFR" then genChannel = "Général" + elseif GameLocale == "itIT" then genChannel = "Generale" + elseif GameLocale == "ptBR" then genChannel = "Geral" + elseif GameLocale == "ruRU" then genChannel = "Общий" + elseif GameLocale == "koKR" then genChannel = "공개" + elseif GameLocale == "zhCN" then genChannel = "综合" + elseif GameLocale == "zhTW" then genChannel = "綜合" + else genChannel = "General" + end + if genChannel then + local index = GetChannelName(genChannel) + if index and index > 0 then + local mapID = C_Map.GetBestMapForUnit("player") + local pos = C_Map.GetPlayerMapPosition(mapID, "player") + if pos.x and pos.x ~= "0" and pos.y and pos.y ~= "0" then + local uHealth = UnitHealth("target") + local uHealthMax = UnitHealthMax("target") + -- Announce in chat + if uHealth and uHealth > 0 and uHealthMax and uHealthMax > 0 then + -- Get unit classification (elite, rare, rare elite or boss) + local unitType, unitTag = UnitClassification("target"), "" + if unitType then + if unitType == "rare" or unitType == "rareelite" then unitTag = "(" .. L["Rare"] .. ") " elseif unitType == "worldboss" then unitTag = "(" .. L["Boss"] .. ") " end + end + SendChatMessage(format("%%t " .. unitTag .. "(%d%%)%s", uHealth / uHealthMax * 100, " " .. string.format("%.0f", pos.x * 100) .. ":" .. string.format("%.0f", pos.y * 100)), "CHANNEL", nil, index) + -- SendChatMessage(format("%%t " .. unitTag .. "(%d%%)%s", uHealth / uHealthMax * 100, " " .. string.format("%.0f", pos.x * 100) .. ":" .. string.format("%.0f", pos.y * 100)), "WHISPER", nil, GetUnitName("player")) -- Debug + else + LeaPlusLC:Print("Invalid target.") + end + else + LeaPlusLC:Print("Cannot announce in this zone.") + end + else + LeaPlusLC:Print("Cannot find General chat channel.") + end + end + return + elseif str == "camp" then + -- Camp + if not LeaPlusLC.NoCampFrame then + -- Load LibChatAnims + Leatrix_Plus:LeaPlusLCA() + -- Chat filter + function LeaPlusLC.CampFilterFunc(self, event, msg) + if msg:match(_G["MARKED_AFK_MESSAGE"]:gsub("%%s", "%s-")) + or msg:match(_G["MARKED_AFK"]) + or msg:match(_G["CLEARED_AFK"]) + or msg:match(_G["IDLE_MESSAGE"]) + then return true + end + end + LeaPlusLC.NoCampFrame = CreateFrame("FRAME", nil, UIParent) + end + if LeaPlusLC.NoCampFrame:IsEventRegistered("PLAYER_CAMPING") then + -- Disable camp + LeaPlusLC.NoCampFrame:UnregisterEvent("PLAYER_CAMPING") + ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", LeaPlusLC.CampFilterFunc) + LeaPlusLC:Print("Camping enabled. You will camp.") + else + -- Enable camp + LeaPlusLC.NoCampFrame:RegisterEvent("PLAYER_CAMPING") + ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", LeaPlusLC.CampFilterFunc) + LeaPlusLC:Print("Camping disabled. You won't camp.") + end + -- Event handler + LeaPlusLC.NoCampFrame:SetScript("OnEvent", function() + local p = StaticPopup_Visible("CAMP") + _G[p .. "Button1"]:Click() + end) + return + elseif str == "perf" then + -- Average FPS during combat + local fTab = {} + if not LeaPlusLC.perf then + LeaPlusLC.perf = CreateFrame("FRAME") + end + local fFrm = LeaPlusLC.perf + local k, startTime = 0, 0 + if fFrm:IsEventRegistered("PLAYER_REGEN_DISABLED") then + fFrm:UnregisterAllEvents() + fFrm:SetScript("OnUpdate", nil) + LeaPlusLC:Print("PERF unloaded.") + else + fFrm:RegisterEvent("PLAYER_REGEN_DISABLED") + fFrm:RegisterEvent("PLAYER_REGEN_ENABLED") + LeaPlusLC:Print("Waiting for combat to start...") + end + fFrm:SetScript("OnEvent", function(self, event) + if event == "PLAYER_REGEN_DISABLED" then + LeaPlusLC:Print("Monitoring FPS during combat...") + fFrm:SetScript("OnUpdate", function() + k = k + 1 + fTab[k] = GetFramerate() + end) + startTime = GetTime() + else + fFrm:SetScript("OnUpdate", nil) + local tSum = 0 + for i = 1, #fTab do + tSum = tSum + fTab[i] + end + local timeTaken = string.format("%.0f", GetTime() - startTime) + if tSum > 0 then + LeaPlusLC:Print("Average FPS for " .. timeTaken .. " seconds of combat: " .. string.format("%.0f", tSum / #fTab)) + end + end + end) + return + elseif str == "col" then + -- Convert color values + LeaPlusLC:Print("|n") + local r, g, b = tonumber(arg1), tonumber(arg2), tonumber(arg3) + if r and g and b then + -- RGB source + LeaPlusLC:Print("Source: |cffffffff" .. r .. " " .. g .. " " .. b .. " ") + -- RGB to Hex + if r > 1 and g > 1 and b > 1 then + -- RGB to Hex + LeaPlusLC:Print("Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r, g, b)) .. " (from RGB)") + else + -- Wow to Hex + LeaPlusLC:Print("Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r * 255, g * 255, b * 255)) .. " (from Wow)") + -- Wow to RGB + local rwow = string.format("%.0f", r * 255) + local gwow = string.format("%.0f", g * 255) + local bwow = string.format("%.0f", b * 255) + if rwow ~= "0.0" and gwow ~= "0.0" and bwow ~= "0.0" then + LeaPlusLC:Print("RGB: |cffffffff" .. rwow .. " " .. gwow .. " " .. bwow .. " (from Wow)") + end + end + -- RGB to Wow + local rwow = string.format("%.1f", r / 255) + local gwow = string.format("%.1f", g / 255) + local bwow = string.format("%.1f", b / 255) + if rwow ~= "0.0" and gwow ~= "0.0" and bwow ~= "0.0" then + LeaPlusLC:Print("Wow: |cffffffff" .. rwow .. " " .. gwow .. " " .. bwow) + end + LeaPlusLC:Print("|n") + elseif arg1 and strlen(arg1) == 6 and strmatch(arg1,"%x") and arg2 == nil and arg3 == nil then + -- Hex source + local rhex, ghex, bhex = string.sub(arg1, 1, 2), string.sub(arg1, 3, 4), string.sub(arg1, 5, 6) + if strmatch(rhex,"%x") and strmatch(ghex,"%x") and strmatch(bhex,"%x") then + LeaPlusLC:Print("Source: |cffffffff" .. strupper(arg1)) + LeaPlusLC:Print("Wow: |cffffffff" .. string.format("%.1f", tonumber(rhex, 16) / 255) .. " " .. string.format("%.1f", tonumber(ghex, 16) / 255) .. " " .. string.format("%.1f", tonumber(bhex, 16) / 255)) + LeaPlusLC:Print("RGB: |cffffffff" .. tonumber(rhex, 16) .. " " .. tonumber(ghex, 16) .. " " .. tonumber(bhex, 16)) + else + LeaPlusLC:Print("Invalid arguments.") + end + LeaPlusLC:Print("|n") + else + LeaPlusLC:Print("Invalid arguments.") + end + return + elseif str == "click" then + -- Click a button + local frame = GetMouseFocus() + local ftype = frame:GetObjectType() + if frame and ftype and ftype == "Button" then + frame:Click() + else + LeaPlusLC:Print("Hover the pointer over a button.") + end + return + elseif str == "frame" then + -- Print frame name under mouse + local frame = GetMouseFocus() + local ftype = frame:GetObjectType() + if frame and ftype then + local fname = frame:GetName() + local issecure, tainted = issecurevariable(fname) + if issecure then issecure = "Yes" else issecure = "No" end + if tainted then tainted = "Yes" else tainted = "No" end + if fname then + LeaPlusLC:Print("Name: |cffffffff" .. fname) + LeaPlusLC:Print("Type: |cffffffff" .. ftype) + LeaPlusLC:Print("Secure: |cffffffff" .. issecure) + LeaPlusLC:Print("Tainted: |cffffffff" .. tainted) + end + end + return + elseif str == "arrow" then + -- Arrow (left: drag, shift/ctrl: rotate, mouseup: loc, pointer must be on arrow stem) + local f = CreateFrame("Frame", nil, WorldMapFrame.ScrollContainer) + f:SetSize(64, 64) + f:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + f:SetFrameLevel(500) + f:SetParent(WorldMapFrame.ScrollContainer) + f:SetScale(0.6) + + f.t = f:CreateTexture(nil, "ARTWORK") + f.t:SetAtlas("Garr_LevelUpgradeArrow") + f.t:SetAllPoints() + + f.f = f:CreateFontString(nil, "ARTWORK", "GameFontNormal") + f.f:SetText("0.0") + + local x = 0 + f:SetScript("OnUpdate", function() + if IsShiftKeyDown() then + x = x + 0.01 + if x > 6.3 then x = 0 end + f.t:SetRotation(x) + f.f:SetFormattedText("%.1f", x) + elseif IsControlKeyDown() then + x = x - 0.01 + if x < 0 then x = 6.3 end + f.t:SetRotation(x) + f.f:SetFormattedText("%.1f", x) + end + -- Print coordinates when mouse is in right place + local x, y = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition() + if x and y and x > 0 and y > 0 then + if MouseIsOver(f, -31, 31, 31, -31) then + ChatFrame1:Clear() + print(('{"Arrow", ' .. floor(x * 1000 + 0.5) / 10) .. ',', (floor(y * 1000 + 0.5) / 10) .. ', L["Step 1"], L["Start here."], arTex, nil, nil, nil, nil, nil, ' .. f.f:GetText() .. "},") + PlaySoundFile(567412, "Master", false, true) + end + end + end) + + f:SetMovable(true) + f:SetScript("OnMouseDown", function(self, btn) + if btn == "LeftButton" then + f:StartMoving() + end + end) + + f:SetScript("OnMouseUp", function() + f:StopMovingOrSizing() + --ChatFrame1:Clear() + --local x, y = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition() + --if x and y and x > 0 and y > 0 and MouseIsOver(f) then + -- print(('{"Arrow", ' .. floor(x * 1000 + 0.5) / 10) .. ',', (floor(y * 1000 + 0.5) / 10) .. ', L["Step 1"], L["Start here."], ' .. f.f:GetText() .. "},") + --end + end) + return + elseif str == "dis" then + -- Disband group + if not LeaPlusLC:IsInLFGQueue() and not IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then + local x = GetNumGroupMembers() or 0 + for i = x, 1, -1 do + if GetNumGroupMembers() > 0 then + local name = GetRaidRosterInfo(i) + if name and name ~= UnitName("player") then + UninviteUnit(name) + end + end + end + else + LeaPlusLC:Print("You cannot do that while in group finder.") + end + return + elseif str == "reinv" then + -- Disband and reinvite raid + if not LeaPlusLC:IsInLFGQueue() then + if UnitIsGroupLeader("player") then + -- Disband + local groupNames = {} + local x = GetNumGroupMembers() or 0 + for i = x, 1, -1 do + if GetNumGroupMembers() > 0 then + local name = GetRaidRosterInfo(i) + if name and name ~= UnitName("player") then + UninviteUnit(name) + tinsert(groupNames, name) + end + end + end + -- Reinvite + LibCompat.After(0.1, function() + for k, v in pairs(groupNames) do + C_PartyInfo.InviteUnit(v) + end + end) + else + LeaPlusLC:Print("You need to be group leader.") + end + else + LeaPlusLC:Print("You cannot do that while in group finder.") + end + return + elseif str == "limit" then + -- Sound Limit + if not LeaPlusLC.MuteFrame then + -- Panel frame + local frame = CreateFrame("FRAME", nil, UIParent) + frame:SetSize(294, 86); frame:SetFrameStrata("FULLSCREEN_DIALOG"); frame:SetFrameLevel(100); frame:SetScale(2) + frame.tex = frame:CreateTexture(nil, "BACKGROUND"); frame.tex:SetAllPoints(); + frame.tex:SetVertexColor(0.05, 0.05, 0.05, 0.9) + frame.close = CreateFrame("Button", nil, frame, "UIPanelCloseButton"); frame.close:SetSize(30, 30); frame.close:SetPoint("TOPRIGHT", 0, 0); frame.close:SetScript("OnClick", function() frame:Hide() end) + frame:ClearAllPoints(); frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + frame:SetClampedToScreen(true) + frame:EnableMouse(true) + frame:SetMovable(true) + frame:RegisterForDrag("LeftButton") + frame:SetScript("OnDragStart", frame.StartMoving) + frame:SetScript("OnDragStop", function() frame:StopMovingOrSizing() frame:SetUserPlaced(false) end) + frame:Hide() + LeaPlusLC:CreateBar("MutePanelMainTexture", frame, 294, 86, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\DressUpFrame\\DressUpBackground-NightElf1") + -- Panel contents + LeaPlusLC:MakeTx(frame, "Sound Limit", 16, -12) + local endBox = LeaPlusLC:CreateEditBox("SoundEndBox", frame, 116, 10, "TOPLEFT", 16, -32, "SoundEndBox", "SoundEndBox") + endBox:SetText(3000000) + endBox:SetScript("OnMouseWheel", function(self, delta) + local endSound = tonumber(endBox:GetText()) + if endSound then + if delta == 1 then endSound = endSound + LeaPlusLC.SoundByte else endSound = endSound - LeaPlusLC.SoundByte end + if endSound < 1 then endSound = 1 elseif endSound >= 3000000 then endSound = 3000000 end + endBox:SetText(endSound) + else + endSound = 100000 + endBox:SetText(endSound) + end + end) + -- Set limit button + frame.btn = LeaPlusLC:CreateButton("muteRangeButton", frame, "SET LIMIT", "TOPLEFT", 16, -72, 0, 25, true, "Click to set the sound file limit. Use the mousewheel on the editbox along with the step buttons below to adjust the sound limit. Acceptable range is from 1 to 3000000. Sound files higher than this limit will be muted.") + frame.btn:ClearAllPoints() + frame.btn:SetPoint("LEFT", endBox, "RIGHT", 10, 0) + frame.btn:SetScript("OnClick", function() + local endSound = tonumber(endBox:GetText()) + if endSound then + if endSound > 3000000 then endSound = 3000000 endBox:SetText(endSound) end + frame.btn:SetText("WAIT") + LibCompat.After(0.1, function() + for i = 1, 3000000 do + MuteSoundFile(i) + end + for i = 1, endSound do + UnmuteSoundFile(i) + end + Sound_GameSystem_RestartSoundSystem() + frame.btn:SetText("SET LIMIT") + end) + else + frame.btn:SetText("INVALID") + frame.btn:EnableMouse(false) + LibCompat.After(2, function() + frame.btn:SetText("SET LIMIT") + frame.btn:EnableMouse(true) + end) + end + end) + -- Mute all button + frame.MuteAllBtn = LeaPlusLC:CreateButton("muteMuteAllButton", frame, "MUTE ALL", "TOPLEFT", 16, -92, 0, 25, true, "Click to mute every sound in the game.") + frame.MuteAllBtn:SetScale(0.5) + frame.MuteAllBtn:ClearAllPoints() + frame.MuteAllBtn:SetPoint("TOPLEFT", frame.btn, "TOPRIGHT", 20, 0) + frame.MuteAllBtn:SetScript("OnClick", function() + frame.MuteAllBtn:SetText("WAIT") + LibCompat.After(0.1, function() + for i = 1, 3000000 do + MuteSoundFile(i) + end + Sound_GameSystem_RestartSoundSystem() + frame.MuteAllBtn:SetText("MUTE ALL") + end) + return + end) + -- Unmute all button + frame.UnmuteAllBtn = LeaPlusLC:CreateButton("muteUnmuteAllButton", frame, "UNMUTE ALL", "TOPLEFT", 16, -92, 0, 25, true, "Click to unmute every sound in the game.") + frame.UnmuteAllBtn:SetScale(0.5) + frame.UnmuteAllBtn:ClearAllPoints() + frame.UnmuteAllBtn:SetPoint("TOPLEFT", frame.MuteAllBtn, "BOTTOMLEFT", 0, -10) + frame.UnmuteAllBtn:SetScript("OnClick", function() + frame.UnmuteAllBtn:SetText("WAIT") + LibCompat.After(0.1, function() + for i = 1, 3000000 do + UnmuteSoundFile(i) + end + Sound_GameSystem_RestartSoundSystem() + frame.UnmuteAllBtn:SetText("UNMUTE ALL") + end) + return + end) + -- Step buttons + frame.millionBtn = LeaPlusLC:CreateButton("SoundMillionButton", frame, "1000000", "TOPLEFT", 26, -122, 0, 25, true, "Set the editbox step value to 1000000.") + frame.millionBtn:SetScale(0.5) + + frame.hundredThousandBtn = LeaPlusLC:CreateButton("SoundHundredThousandButton", frame, "100000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 100000.") + frame.hundredThousandBtn:ClearAllPoints() + frame.hundredThousandBtn:SetPoint("LEFT", frame.millionBtn, "RIGHT", 10, 0) + frame.hundredThousandBtn:SetScale(0.5) + + frame.tenThousandBtn = LeaPlusLC:CreateButton("SoundTenThousandButton", frame, "10000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 10000.") + frame.tenThousandBtn:ClearAllPoints() + frame.tenThousandBtn:SetPoint("LEFT", frame.hundredThousandBtn, "RIGHT", 10, 0) + frame.tenThousandBtn:SetScale(0.5) + + frame.thousandBtn = LeaPlusLC:CreateButton("SoundThousandButton", frame, "1000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 1000.") + frame.thousandBtn:ClearAllPoints() + frame.thousandBtn:SetPoint("LEFT", frame.tenThousandBtn, "RIGHT", 10, 0) + frame.thousandBtn:SetScale(0.5) + + frame.hundredBtn = LeaPlusLC:CreateButton("SoundHundredButton", frame, "100", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 100.") + frame.hundredBtn:ClearAllPoints() + frame.hundredBtn:SetPoint("LEFT", frame.thousandBtn, "RIGHT", 10, 0) + frame.hundredBtn:SetScale(0.5) + + frame.tenBtn = LeaPlusLC:CreateButton("SoundTenButton", frame, "10", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 10.") + frame.tenBtn:ClearAllPoints() + frame.tenBtn:SetPoint("LEFT", frame.hundredBtn, "RIGHT", 10, 0) + frame.tenBtn:SetScale(0.5) + + frame.oneBtn = LeaPlusLC:CreateButton("SoundTenButton", frame, "1", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 1.") + frame.oneBtn:ClearAllPoints() + frame.oneBtn:SetPoint("LEFT", frame.tenBtn, "RIGHT", 10, 0) + frame.oneBtn:SetScale(0.5) + + local function DimAllBoxes() + frame.millionBtn:SetAlpha(0.3) + frame.hundredThousandBtn:SetAlpha(0.3) + frame.tenThousandBtn:SetAlpha(0.3) + frame.thousandBtn:SetAlpha(0.3) + frame.hundredBtn:SetAlpha(0.3) + frame.tenBtn:SetAlpha(0.3) + frame.oneBtn:SetAlpha(0.3) + end + + LeaPlusLC.SoundByte = 1000000 + DimAllBoxes() + frame.millionBtn:SetAlpha(1) + + -- Step button handlers + frame.millionBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 1000000 + DimAllBoxes() + frame.millionBtn:SetAlpha(1) + end) + + frame.hundredThousandBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 100000 + DimAllBoxes() + frame.hundredThousandBtn:SetAlpha(1) + end) + + frame.tenThousandBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 10000 + DimAllBoxes() + frame.tenThousandBtn:SetAlpha(1) + end) + + frame.thousandBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 1000 + DimAllBoxes() + frame.thousandBtn:SetAlpha(1) + end) + + frame.hundredBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 100 + DimAllBoxes() + frame.hundredBtn:SetAlpha(1) + end) + + frame.tenBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 10 + DimAllBoxes() + frame.tenBtn:SetAlpha(1) + end) + + frame.oneBtn:SetScript("OnClick", function() + LeaPlusLC.SoundByte = 1 + DimAllBoxes() + frame.oneBtn:SetAlpha(1) + end) + + -- Final code + LeaPlusLC.MuteFrame = frame + _G["LeaPlusGlobalMutePanel"] = frame + table.insert(UISpecialFrames, "LeaPlusGlobalMutePanel") + end + if LeaPlusLC.MuteFrame:IsShown() then LeaPlusLC.MuteFrame:Hide() else LeaPlusLC.MuteFrame:Show() end + return + elseif str == "mem" or str == "m" then + -- Show addon panel with memory usage + if LeaPlusLC.ShowMemoryUsage then + LeaPlusLC:ShowMemoryUsage(LeaPlusLC["Page8"], "TOPLEFT", 146, -262) + end + -- Prevent options panel from showing if a game options panel is showing + if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() or ChatConfigFrame:IsShown() then return end + -- Prevent options panel from showing if Blizzard Store is showing + if StoreFrame and StoreFrame:GetAttribute("isshown") then return end + -- Toggle the options panel if game options panel is not showing + if LeaPlusLC:IsPlusShowing() then + LeaPlusLC:HideFrames() + LeaPlusLC:HideConfigPanels() + else + LeaPlusLC:HideFrames() + LeaPlusLC["PageF"]:Show() + end + LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show() + return + elseif str == "gossinfo" then + -- Print gossip frame information + if GossipFrame:IsShown() then + local npcName = UnitName("target") + local npcGuid = UnitGUID("target") or nil + if npcName and npcGuid then + local void, void, void, void, void, npcID = strsplit("-", npcGuid) + if npcID then + LeaPlusLC:Print(npcName .. ": |cffffffff" .. npcID) + end + end + LeaPlusLC:Print("Available quests: |cffffffff" .. GetNumGossipAvailableQuests()) + LeaPlusLC:Print("Active quests: |cffffffff" .. GetNumGossipActiveQuests()) + LeaPlusLC:Print("Gossip count: |cffffffff" .. GetNumGossipOptions()) + if GetGossipOptions() then + local void, gossipType = GetGossipOptions() + LeaPlusLC:Print("Gossip type: |cffffffff" .. gossipType) + else + LeaPlusLC:Print("Gossip type: |cffffffff" .. "Nil") + end + if GossipTitleButton1 and GossipTitleButton1:GetText() then + LeaPlusLC:Print("First option: |cffffffff" .. GossipTitleButton1:GetText()) + end + -- LeaPlusLC:Print("Gossip text: |cffffffff" .. GetGossipText()) + if not IsShiftKeyDown() then + SelectGossipOption(1) + end + else + LeaPlusLC:Print("Gossip frame not open.") + end + return + elseif str == "admin" then + -- Preset profile (used for testing) + LpEvt:UnregisterAllEvents() -- Prevent changes + wipe(LeaPlusDB) -- Wipe settings + LeaPlusLC:PlayerLogout(true) -- Reset permanent settings + -- Automation + LeaPlusDB["AutomateQuests"] = "On" -- Automate quests + LeaPlusDB["AutoQuestShift"] = "Off" -- Automate quests requires shift + LeaPlusDB["AutoQuestAvailable"] = "On" -- Accept available quests + LeaPlusDB["AutoQuestCompleted"] = "On" -- Turn-in completed quests + LeaPlusDB["AutoQuestKeyMenu"] = 1 -- Automate quests override key + LeaPlusDB["AutomateGossip"] = "On" -- Automate gossip + LeaPlusDB["AutoAcceptSummon"] = "On" -- Accept summon + LeaPlusDB["AutoAcceptRes"] = "On" -- Accept resurrection + LeaPlusDB["AutoReleasePvP"] = "On" -- Release in PvP + LeaPlusDB["AutoSellJunk"] = "On" -- Sell junk automatically + LeaPlusDB["AutoSellExcludeList"] = "" -- Sell junk exclusions list + LeaPlusDB["AutoRepairGear"] = "On" -- Repair automatically + + -- Social + LeaPlusDB["NoDuelRequests"] = "On" -- Block duels + LeaPlusDB["NoPartyInvites"] = "Off" -- Block party invites + LeaPlusDB["NoFriendRequests"] = "Off" -- Block friend requests + LeaPlusDB["NoSharedQuests"] = "Off" -- Block shared quests + + LeaPlusDB["AcceptPartyFriends"] = "On" -- Party from friends + LeaPlusDB["InviteFromWhisper"] = "On" -- Invite from whispers + LeaPlusDB["InviteFriendsOnly"] = "On" -- Restrict invites to friends + LeaPlusDB["FriendlyGuild"] = "On" -- Friendly guild + + -- Chat + LeaPlusDB["UseEasyChatResizing"] = "On" -- Use easy resizing + LeaPlusDB["NoCombatLogTab"] = "On" -- Hide the combat log + LeaPlusDB["NoChatButtons"] = "On" -- Hide chat buttons + LeaPlusDB["UnclampChat"] = "On" -- Unclamp chat frame + LeaPlusDB["MoveChatEditBoxToTop"] = "On" -- Move editbox to top + LeaPlusDB["MoreFontSizes"] = "On" -- More font sizes + + LeaPlusDB["NoStickyChat"] = "On" -- Disable sticky chat + LeaPlusDB["UseArrowKeysInChat"] = "On" -- Use arrow keys in chat + LeaPlusDB["NoChatFade"] = "On" -- Disable chat fade + LeaPlusDB["UnivGroupColor"] = "On" -- Universal group color + LeaPlusDB["ClassColorsInChat"] = "On" -- Use class colors in chat + LeaPlusDB["RecentChatWindow"] = "On" -- Recent chat window + LeaPlusDB["RecentChatSize"] = 170 -- Recent chat size + LeaPlusDB["MaxChatHstory"] = "Off" -- Increase chat history + LeaPlusDB["FilterChatMessages"] = "On" -- Filter chat messages + LeaPlusDB["BlockSpellLinks"] = "On" -- Block spell links + LeaPlusDB["BlockDrunkenSpam"] = "On" -- Block drunken spam + LeaPlusDB["BlockDuelSpam"] = "On" -- Block duel spam + LeaPlusDB["RestoreChatMessages"] = "On" -- Restore chat messages + + -- Text + LeaPlusDB["HideErrorMessages"] = "On" -- Hide error messages + LeaPlusDB["NoHitIndicators"] = "On" -- Hide portrait text + LeaPlusDB["HideKeybindText"] = "On" -- Hide keybind text + LeaPlusDB["HideMacroText"] = "On" -- Hide macro text + + LeaPlusDB["MailFontChange"] = "On" -- Resize mail text + LeaPlusDB["LeaPlusMailFontSize"] = 22 -- Mail font size + LeaPlusDB["QuestFontChange"] = "On" -- Resize quest text + LeaPlusDB["LeaPlusQuestFontSize"] = 18 -- Quest font size + LeaPlusDB["BookFontChange"] = "On" -- Resize book text + LeaPlusDB["LeaPlusBookFontSize"] = 22 -- Book font size + + -- Interface + LeaPlusDB["MinimapModder"] = "On" -- Enhance minimap + LeaPlusDB["SquareMinimap"] = "On" -- Square minimap + LeaPlusDB["ShowWhoPinged"] = "On" -- Show who pinged + LeaPlusDB["CombineAddonButtons"] = "Off" -- Combine addon buttons + LeaPlusDB["MiniExcludeList"] = "BugSack, Leatrix_Plus" -- Excluded addon list + LeaPlusDB["MinimapScale"] = 1.40 -- Minimap scale slider + LeaPlusDB["MinimapSize"] = 180 -- Minimap size slider + LeaPlusDB["MiniClusterScale"] = 1 -- Minimap cluster scale + LeaPlusDB["MinimapNoScale"] = "Off" -- Minimap not minimap + LeaPlusDB["HideMiniZoneText"] = "On" -- Hide zone text bar + LeaPlusDB["HideMiniMapButton"] = "On" -- Hide world map button + LeaPlusDB["HideMiniTracking"] = "On" -- Hide tracking button + LeaPlusDB["MinimapA"] = "TOPRIGHT" -- Minimap anchor + LeaPlusDB["MinimapR"] = "TOPRIGHT" -- Minimap relative + LeaPlusDB["MinimapX"] = 0 -- Minimap X + LeaPlusDB["MinimapY"] = 0 -- Minimap Y + + LeaPlusDB["TipModEnable"] = "On" -- Enhance tooltip + LeaPlusDB["LeaPlusTipSize"] = 1.25 -- Tooltip scale slider + LeaPlusDB["TooltipAnchorMenu"] = 2 -- Tooltip anchor + LeaPlusDB["TipCursorX"] = 0 -- X offset + LeaPlusDB["TipCursorY"] = 0 -- Y offset + LeaPlusDB["EnhanceDressup"] = "On" -- Enhance dressup + LeaPlusDB["HideDressupStats"] = "On" -- Hide dressup stats + LeaPlusDB["EnhanceQuestLog"] = "On" -- Enhance quest log + LeaPlusDB["EnhanceQuestHeaders"] = "On" -- Enhance quest log toggle headers + LeaPlusDB["EnhanceQuestLevels"] = "On" -- Enhance quest log quest levels + LeaPlusDB["EnhanceQuestDifficulty"] = "On" -- Enhance quest log quest difficulty + + LeaPlusDB["EnhanceProfessions"] = "On" -- Enhance professions + LeaPlusDB["EnhanceTrainers"] = "On" -- Enhance trainers + LeaPlusDB["ShowTrainAllBtn"] = "On" -- Show train all button + + LeaPlusDB["ShowVolume"] = "On" -- Show volume slider + LeaPlusDB["AhExtras"] = "On" -- Show auction controls + LeaPlusDB["ShowCooldowns"] = "On" -- Show cooldowns + LeaPlusDB["DurabilityStatus"] = "On" -- Show durability status + LeaPlusDB["ShowVanityControls"] = "On" -- Show vanity controls + LeaPlusDB["ShowBagSearchBox"] = "On" -- Show bag search box + LeaPlusDB["ShowRaidToggle"] = "On" -- Show raid button + LeaPlusDB["ShowPlayerChain"] = "On" -- Show player chain + LeaPlusDB["PlayerChainMenu"] = 3 -- Player chain style + LeaPlusDB["ShowReadyTimer"] = "On" -- Show ready timer + LeaPlusDB["ShowWowheadLinks"] = "On" -- Show Wowhead links + LeaPlusDB["WowheadLinkComments"] = "On" -- Show Wowhead links to comments + LeaPlusDB["ShowFlightTimes"] = "On" -- Show flight times + LeaPlusDB["FlightBarBackground"] = "Off" -- Show flight times bar background + LeaPlusDB["FlightBarDestination"] = "On" -- Show flight times bar destination + LeaPlusDB["FlightBarFillBar"] = "Off" -- Show flight times bar fill mode + LeaPlusDB["FlightBarSpeech"] = "On" -- Show flight times bar speech + LeaPlusDB["FlightBarContribute"] = "On" -- Show flight times contribute + + -- Interface: Manage frames + LeaPlusDB["FrmEnabled"] = "On" + + LeaPlusDB["Frames"] = {} + LeaPlusDB["Frames"]["PlayerFrame"] = {} + LeaPlusDB["Frames"]["PlayerFrame"]["Point"] = "TOPLEFT" + LeaPlusDB["Frames"]["PlayerFrame"]["Relative"] = "TOPLEFT" + LeaPlusDB["Frames"]["PlayerFrame"]["XOffset"] = -35 + LeaPlusDB["Frames"]["PlayerFrame"]["YOffset"] = -14 + LeaPlusDB["Frames"]["PlayerFrame"]["Scale"] = 1.20 + + LeaPlusDB["Frames"]["TargetFrame"] = {} + LeaPlusDB["Frames"]["TargetFrame"]["Point"] = "TOPLEFT" + LeaPlusDB["Frames"]["TargetFrame"]["Relative"] = "TOPLEFT" + LeaPlusDB["Frames"]["TargetFrame"]["XOffset"] = 190 + LeaPlusDB["Frames"]["TargetFrame"]["YOffset"] = -14 + LeaPlusDB["Frames"]["TargetFrame"]["Scale"] = 1.20 + + LeaPlusDB["ManageBuffs"] = "On" -- Manage buffs + LeaPlusDB["BuffFrameA"] = "TOPRIGHT" -- Manage buffs anchor + LeaPlusDB["BuffFrameR"] = "TOPRIGHT" -- Manage buffs relative + LeaPlusDB["BuffFrameX"] = -271 -- Manage buffs position X + LeaPlusDB["BuffFrameY"] = 0 -- Manage buffs position Y + LeaPlusDB["BuffFrameScale"] = 0.8 -- Manage buffs scale + + LeaPlusDB["ManageWidget"] = "On" -- Manage widget + LeaPlusDB["WidgetA"] = "TOP" -- Manage widget anchor + LeaPlusDB["WidgetR"] = "TOP" -- Manage widget relative + LeaPlusDB["WidgetX"] = 0 -- Manage widget position X + LeaPlusDB["WidgetY"] = -432 -- Manage widget position Y + LeaPlusDB["WidgetScale"] = 1.25 -- Manage widget scale + + LeaPlusDB["ManageFocus"] = "On" -- Manage focus + LeaPlusDB["FocusA"] = "TOPLEFT" -- Manage focus anchor + LeaPlusDB["FocusR"] = "TOPLEFT" -- Manage focus relative + LeaPlusDB["FocusX"] = 250 -- Manage focus position X + LeaPlusDB["FocusY"] = -240 -- Manage focus position Y + LeaPlusDB["FocusScale"] = 1.00 -- Manage focus scale + + LeaPlusDB["ManageTimer"] = "On" -- Manage timer + LeaPlusDB["TimerA"] = "TOP" -- Manage timer anchor + LeaPlusDB["TimerR"] = "TOP" -- Manage timer relative + LeaPlusDB["TimerX"] = 0 -- Manage timer position X + LeaPlusDB["TimerY"] = -120 -- Manage timer position Y + LeaPlusDB["TimerScale"] = 1.00 -- Manage timer scale + + LeaPlusDB["ManageDurability"] = "On" -- Manage durability + LeaPlusDB["DurabilityA"] = "TOPRIGHT" -- Manage durability anchor + LeaPlusDB["DurabilityR"] = "TOPRIGHT" -- Manage durability relative + LeaPlusDB["DurabilityX"] = 0 -- Manage durability position X + LeaPlusDB["DurabilityY"] = -192 -- Manage durability position Y + LeaPlusDB["DurabilityScale"] = 1.00 -- Manage durability scale + + LeaPlusDB["ManageVehicle"] = "On" -- Manage vehicle + LeaPlusDB["VehicleA"] = "TOPRIGHT" -- Manage vehicle anchor + LeaPlusDB["VehicleR"] = "TOPRIGHT" -- Manage vehicle relative + LeaPlusDB["VehicleX"] = -100 -- Manage vehicle position X + LeaPlusDB["VehicleY"] = -192 -- Manage vehicle position Y + LeaPlusDB["VehicleScale"] = 1.00 -- Manage vehicle scale + + LeaPlusDB["ClassColFrames"] = "On" -- Class colored frames + + LeaPlusDB["NoAlerts"] = "On" -- Hide alerts + LeaPlusDB["NoGryphons"] = "On" -- Hide gryphons + LeaPlusDB["NoClassBar"] = "On" -- Hide stance bar + + -- System + LeaPlusDB["NoScreenGlow"] = "On" -- Disable screen glow + LeaPlusDB["NoScreenEffects"] = "On" -- Disable screen effects + LeaPlusDB["SetWeatherDensity"] = "On" -- Set weather density + LeaPlusDB["WeatherLevel"] = 0 -- Weather density level + LeaPlusDB["MaxCameraZoom"] = "On" -- Max camera zoom + LeaPlusDB["ViewPortEnable"] = "On" -- Enable viewport + LeaPlusDB["NoRestedEmotes"] = "On" -- Silence rested emotes + LeaPlusDB["MuteGameSounds"] = "On" -- Mute game sounds + LeaPlusDB["MuteCustomSounds"] = "On" -- Mute custom sounds + LeaPlusDB["MuteCustomList"] = "" -- Mute custom sounds list + + LeaPlusDB["NoBagAutomation"] = "On" -- Disable bag automation + LeaPlusDB["CharAddonList"] = "On" -- Show character addons + LeaPlusDB["NoConfirmLoot"] = "On" -- Disable loot warnings + LeaPlusDB["FasterLooting"] = "On" -- Faster auto loot + LeaPlusDB["FasterMovieSkip"] = "On" -- Faster movie skip + LeaPlusDB["StandAndDismount"] = "On" -- Dismount me + LeaPlusDB["ShowVendorPrice"] = "On" -- Show vendor price + LeaPlusDB["CombatPlates"] = "On" -- Combat plates + LeaPlusDB["EasyItemDestroy"] = "On" -- Easy item destroy + + -- Function to assign cooldowns + local function setIcon(pclass, pspec, sp1, pt1, sp2, pt2, sp3, pt3, sp4, pt4, sp5, pt5) + -- Set spell ID + if sp1 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Idn"] = sp1 end + if sp2 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Idn"] = sp2 end + if sp3 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Idn"] = sp3 end + if sp4 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Idn"] = sp4 end + if sp5 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Idn"] = sp5 end + -- Set pet checkbox + if pt1 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Pet"] = true end + if pt2 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Pet"] = true end + if pt3 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Pet"] = true end + if pt4 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Pet"] = true end + if pt5 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Pet"] = true end + end + + -- Create main table + LeaPlusDB["Cooldowns"] = {} + + -- Create class tables + local classList = {"WARRIOR", "PALADIN", "HUNTER", "SHAMAN", "ROGUE", "DRUID", "MAGE", "WARLOCK", "PRIEST"} + for index = 1, #classList do + if LeaPlusDB["Cooldowns"][classList[index]] == nil then + LeaPlusDB["Cooldowns"][classList[index]] = {} + end + end + + -- Assign cooldowns + setIcon("WARRIOR", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) + setIcon("PALADIN", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 19740, 0) -- nil, nil, nil, nil, Might + setIcon("HUNTER", 1, --[[1]] 136, 1, --[[2]] 118455, 1, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 5384, 0) -- Mend Pet, nil, nil, nil, Feign Death + setIcon("SHAMAN", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 215864, 0, --[[5]] 546, 0) -- nil, nil, nil, Rainfall, Water Walking + setIcon("ROGUE", 1, --[[1]] 1784, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 2823, 0, --[[5]] 3408, 0) -- Stealth, nil, nil, Deadly Poison, Crippling Poison + setIcon("DRUID", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) + setIcon("MAGE", 1, --[[1]] 235450, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Prismatic Barrier + setIcon("WARLOCK", 1, --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) + setIcon("PRIEST", 1, --[[1]] 17, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Power Word: Shield + + -- Mute game sounds (LeaPlusLC["MuteGameSounds"]) + for k, v in pairs(LeaPlusLC["muteTable"]) do + LeaPlusDB[k] = "On" + end + LeaPlusDB["MuteReady"] = "Off" -- Mute ready check + + -- Set chat font sizes + RunScript('for i = 1, 50 do if _G["ChatFrame" .. i] then FCF_SetChatWindowFontSize(self, _G["ChatFrame" .. i], 20) end end') + + -- Reload + ReloadUI() + else + LeaPlusLC:Print("Invalid parameter.") + end + return + else + -- Prevent options panel from showing if a game options panel is showing + if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() or ChatConfigFrame:IsShown() then return end + -- Prevent options panel from showing if Blizzard Store is showing + if StoreFrame and StoreFrame:GetAttribute("isshown") then return end + -- Toggle the options panel if game options panel is not showing + if LeaPlusLC:IsPlusShowing() then + LeaPlusLC:HideFrames() + LeaPlusLC:HideConfigPanels() + else + LeaPlusLC:HideFrames() + LeaPlusLC["PageF"]:Show() + end + LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show() + end + end + + -- Slash command for global function + -- _G.SLASH_Leatrix_Plus1 = "/ltp" + -- _G.SLASH_Leatrix_Plus2 = "/leaplus" + _G.SLASH_Leatrix_Plus1 = "/ztp" -- temp + + SlashCmdList["Leatrix_Plus"] = function(self) + -- Run slash command function + LeaPlusLC:SlashFunc(self) + -- Redirect tainted variables + RunScript('ACTIVE_CHAT_EDIT_BOX = ACTIVE_CHAT_EDIT_BOX') + RunScript('LAST_ACTIVE_CHAT_EDIT_BOX = LAST_ACTIVE_CHAT_EDIT_BOX') + end + + -- Slash command for UI reload + _G.SLASH_LEATRIX_PLUS_RL1 = "/rl" + SlashCmdList["LEATRIX_PLUS_RL"] = function() + ReloadUI() + end + + -- Replacement for broken slash command system + function leaplus(self) + LeaPlusLC:SlashFunc(self) + end + + -- To reproduce slash command bug, enter combat, enter an addn related slash command, toggle tracking on a + -- quest 4 times then click that quest in the objective tracker. + +---------------------------------------------------------------------- +-- L90: Create options panel pages (no content yet) +---------------------------------------------------------------------- + + -- Function to add menu button + function LeaPlusLC:MakeMN(name, text, parent, anchor, x, y, width, height) + + local mbtn = CreateFrame("Button", nil, parent) + LeaPlusLC[name] = mbtn + mbtn:Show(); + mbtn:SetSize(width, height) + mbtn:SetAlpha(1.0) + mbtn:SetPoint(anchor, x, y) + + mbtn.t = mbtn:CreateTexture(nil, "BACKGROUND") + mbtn.t:SetAllPoints() + mbtn.t:SetVertexColor(0.3, 0.3, 0.00, 0.8) + mbtn.t:SetAlpha(0.7) + mbtn.t:Hide() + + mbtn.s = mbtn:CreateTexture(nil, "BACKGROUND") + mbtn.s:SetAllPoints() + mbtn.s:SetVertexColor(0.3, 0.3, 0.00, 0.8) + mbtn.s:Hide() + + mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal') + mbtn.f:SetPoint('LEFT', 16, 0) + mbtn.f:SetText(L[text]) + + mbtn:SetScript("OnEnter", function() + mbtn.t:Show() + end) + + mbtn:SetScript("OnLeave", function() + mbtn.t:Hide() + end) + + return mbtn, mbtn.s + + end + + -- Function to create individual options panel pages + function LeaPlusLC:MakePage(name, title, menu, menuname, menuparent, menuanchor, menux, menuy, menuwidth, menuheight) + + -- Create frame + local oPage = CreateFrame("Frame", nil, LeaPlusLC["PageF"]); + LeaPlusLC[name] = oPage + oPage:SetAllPoints(LeaPlusLC["PageF"]) + oPage:Hide(); + + -- Add page title + oPage.s = oPage:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge') + oPage.s:SetPoint('TOPLEFT', 146, -16) + oPage.s:SetText(L[title]) + + -- Add menu item if needed + if menu then + LeaPlusLC[menu], LeaPlusLC[menu .. ".s"] = LeaPlusLC:MakeMN(menu, menuname, menuparent, menuanchor, menux, menuy, menuwidth, menuheight) + LeaPlusLC[name]:SetScript("OnShow", function() LeaPlusLC[menu .. ".s"]:Show(); end) + LeaPlusLC[name]:SetScript("OnHide", function() LeaPlusLC[menu .. ".s"]:Hide(); end) + end + + return oPage; + + end + + -- Create options pages + LeaPlusLC["Page0"] = LeaPlusLC:MakePage("Page0", "Home" , "LeaPlusNav0", "Home" , LeaPlusLC["PageF"], "TOPLEFT", 16, -72, 112, 20) + LeaPlusLC["Page1"] = LeaPlusLC:MakePage("Page1", "Automation" , "LeaPlusNav1", "Automation" , LeaPlusLC["PageF"], "TOPLEFT", 16, -112, 112, 20) + LeaPlusLC["Page2"] = LeaPlusLC:MakePage("Page2", "Social" , "LeaPlusNav2", "Social" , LeaPlusLC["PageF"], "TOPLEFT", 16, -132, 112, 20) + LeaPlusLC["Page3"] = LeaPlusLC:MakePage("Page3", "Chat" , "LeaPlusNav3", "Chat" , LeaPlusLC["PageF"], "TOPLEFT", 16, -152, 112, 20) + LeaPlusLC["Page4"] = LeaPlusLC:MakePage("Page4", "Text" , "LeaPlusNav4", "Text" , LeaPlusLC["PageF"], "TOPLEFT", 16, -172, 112, 20) + LeaPlusLC["Page5"] = LeaPlusLC:MakePage("Page5", "Interface" , "LeaPlusNav5", "Interface" , LeaPlusLC["PageF"], "TOPLEFT", 16, -192, 112, 20) + LeaPlusLC["Page6"] = LeaPlusLC:MakePage("Page6", "Frames" , "LeaPlusNav6", "Frames" , LeaPlusLC["PageF"], "TOPLEFT", 16, -212, 112, 20) + LeaPlusLC["Page7"] = LeaPlusLC:MakePage("Page7", "System" , "LeaPlusNav7", "System" , LeaPlusLC["PageF"], "TOPLEFT", 16, -232, 112, 20) + LeaPlusLC["Page8"] = LeaPlusLC:MakePage("Page8", "Settings" , "LeaPlusNav8", "Settings" , LeaPlusLC["PageF"], "TOPLEFT", 16, -272, 112, 20) + LeaPlusLC["Page9"] = LeaPlusLC:MakePage("Page9", "Media" , "LeaPlusNav9", "Media" , LeaPlusLC["PageF"], "TOPLEFT", 16, -292, 112, 20) + + -- Page navigation mechanism + for i = 0, LeaPlusLC["NumberOfPages"] do + LeaPlusLC["LeaPlusNav"..i]:SetScript("OnClick", function() + LeaPlusLC:HideFrames() + LeaPlusLC["PageF"]:Show(); + LeaPlusLC["Page"..i]:Show(); + LeaPlusLC["LeaStartPage"] = i + end) + end + + -- Use a variable to contain the page number (makes it easier to move options around) + local pg; + +---------------------------------------------------------------------- +-- LC0: Welcome +---------------------------------------------------------------------- + + pg = "Page0"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Welcome to Leatrix Plus.", 146, -72); + LeaPlusLC:MakeWD(LeaPlusLC[pg], "To begin, choose an options page.", 146, -92); + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Support", 146, -132); + LeaPlusLC:MakeWD(LeaPlusLC[pg], "www.leatrix.com", 146, -152); + +---------------------------------------------------------------------- +-- LC1: Automation +---------------------------------------------------------------------- + + pg = "Page1"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Character" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutomateQuests" , "Automate quests" , 146, -92, false, "If checked, quests will be selected, accepted and turned-in automatically.|n|nQuests which have a gold requirement will not be turned-in automatically.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutomateGossip" , "Automate gossip" , 146, -112, false, "If checked, you can hold down the alt key while opening a gossip window to automatically select a single gossip item.|n|nIf the gossip item type is banker, taxi, trainer, vendor, battlemaster or stable master, gossip will be skipped without needing to hold the alt key. You can hold the shift key down to prevent this.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoAcceptSummon" , "Accept summon" , 146, -132, false, "If checked, summon requests will be accepted automatically unless you are in combat.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoAcceptRes" , "Accept resurrection" , 146, -152, false, "If checked, resurrection requests will be accepted automatically.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoReleasePvP" , "Release in PvP" , 146, -172, false, "If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Vendors" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoSellJunk" , "Sell junk automatically" , 340, -92, false, "If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoRepairGear" , "Repair automatically" , 340, -112, false, "If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting.") + + LeaPlusLC:CfgBtn("AutomateQuestsBtn", LeaPlusCB["AutomateQuests"]) + LeaPlusLC:CfgBtn("AutoAcceptResBtn", LeaPlusCB["AutoAcceptRes"]) + LeaPlusLC:CfgBtn("AutoReleasePvPBtn", LeaPlusCB["AutoReleasePvP"]) + LeaPlusLC:CfgBtn("AutoSellJunkBtn", LeaPlusCB["AutoSellJunk"]) + LeaPlusLC:CfgBtn("AutoRepairBtn", LeaPlusCB["AutoRepairGear"]) + +---------------------------------------------------------------------- +-- LC2: Social +---------------------------------------------------------------------- + + pg = "Page2"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Blocks" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoDuelRequests" , "Block duels" , 146, -92, false, "If checked, duel requests will be blocked unless the player requesting the duel is a friend.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoPartyInvites" , "Block party invites" , 146, -112, false, "If checked, party invitations will be blocked unless the player inviting you is a friend.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoFriendRequests" , "Block friend requests" , 146, -132, false, "If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoSharedQuests" , "Block shared quests" , 146, -152, false, "If checked, shared quests will be declined unless the player sharing the quest is a friend.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Groups" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AcceptPartyFriends" , "Party from friends" , 340, -92, false, "If checked, party invitations from friends will be automatically accepted unless you are queued for a battleground.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "InviteFromWhisper" , "Invite from whispers" , 340, -112, false, L["If checked, a group invite will be sent to anyone who whispers you with a set keyword as long as you are ungrouped, group leader or raid assistant and not queued for a battleground.|n|nFriends who message the keyword using Battle.net will not be sent a group invite if they are appearing offline. They need to either change their online status or use character whispers."] .. "|n|n" .. L["Keyword"] .. ": |cffffffff" .. "dummy" .. "|r") + + LeaPlusLC:MakeFT(LeaPlusLC[pg], "For all of the social options above, you can treat guild members as friends too.", 146, 380) + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FriendlyGuild" , "Guild" , 146, -282, false, "If checked, members of your guild will be treated as friends for all of the options on this page.") + + if LeaPlusCB["FriendlyGuild"].f:GetStringWidth() > 90 then + LeaPlusCB["FriendlyGuild"].f:SetWidth(90) + LeaPlusCB["FriendlyGuild"]:SetHitRectInsets(0, -84, 0, 0) + end + + LeaPlusLC:CfgBtn("InvWhisperBtn", LeaPlusCB["InviteFromWhisper"]) + +---------------------------------------------------------------------- +-- LC3: Chat +---------------------------------------------------------------------- + + pg = "Page3"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Chat Frame" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UseEasyChatResizing" , "Use easy resizing" , 146, -92, true, "If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoCombatLogTab" , "Hide the combat log" , 146, -112, true, "If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu).") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoChatButtons" , "Hide chat buttons" , 146, -132, true, "If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UnclampChat" , "Unclamp chat frame" , 146, -152, true, "If checked, you will be able to drag the chat frame to the edge of the screen.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MoveChatEditBoxToTop" , "Move editbox to top" , 146, -172, true, "If checked, the editbox will be moved to the top of the chat frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MoreFontSizes" , "More font sizes" , 146, -192, true, "If checked, additional font sizes will be available in the chat frame font size menu.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Mechanics" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoStickyChat" , "Disable sticky chat" , 340, -92, true, "If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UseArrowKeysInChat" , "Use arrow keys in chat" , 340, -112, true, "If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoChatFade" , "Disable chat fade" , 340, -132, true, "If checked, chat text will not fade out after a time period.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "UnivGroupColor" , "Universal group color" , 340, -152, false, "If checked, raid chat will be colored blue (to match the default party chat color).") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ClassColorsInChat" , "Use class colors in chat" , 340, -172, true, "If checked, class colors will be used in the chat frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "RecentChatWindow" , "Recent chat window" , 340, -192, true, "If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MaxChatHstory" , "Increase chat history" , 340, -212, true, "If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FilterChatMessages" , "Filter chat messages" , 340, -232, true, "If checked, you can block spell links, drunken spam and duel spam.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "RestoreChatMessages" , "Restore chat messages" , 340, -252, true, "If checked, recent chat will be restored when you reload your interface.") + + LeaPlusLC:CfgBtn("FilterChatMessagesBtn", LeaPlusCB["FilterChatMessages"]) + +---------------------------------------------------------------------- +-- LC4: Text +---------------------------------------------------------------------- + + pg = "Page4"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Visibility" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideErrorMessages" , "Hide error messages" , 146, -92, true, "If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the alt key and click it to toggle error messages without affecting this setting.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoHitIndicators" , "Hide portrait numbers" , 146, -112, true, "If checked, damage and healing numbers in the player and pet portrait frames will be hidden.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideZoneText" , "Hide zone text" , 146, -132, true, "If checked, zone text will not be shown (eg. 'Ironforge').") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideKeybindText" , "Hide keybind text" , 146, -152, true, "If checked, keybind text will not be shown on action buttons.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideMacroText" , "Hide macro text" , 146, -172, true, "If checked, macro text will not be shown on action buttons.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Text Size" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MailFontChange" , "Resize mail text" , 340, -92, true, "If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices).") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "QuestFontChange" , "Resize quest text" , 340, -112, true, "If checked, you will be able to change the font size of quest text.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "BookFontChange" , "Resize book text" , 340, -132, true, "If checked, you will be able to change the font size of book text.") + + LeaPlusLC:CfgBtn("MailTextBtn", LeaPlusCB["MailFontChange"]) + LeaPlusLC:CfgBtn("QuestTextBtn", LeaPlusCB["QuestFontChange"]) + LeaPlusLC:CfgBtn("BookTextBtn", LeaPlusCB["BookFontChange"]) + +---------------------------------------------------------------------- +-- LC5: Interface +---------------------------------------------------------------------- + + pg = "Page5"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Enhancements" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MinimapModder" , "Enhance minimap" , 146, -92, true, "If checked, you will be able to customise the minimap.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "TipModEnable" , "Enhance tooltip" , 146, -112, true, "If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceDressup" , "Enhance dressup" , 146, -132, true, "If checked, you will be able to pan (right-button) and zoom (mousewheel) in the character frame, dressup frame and inspect frame.|n|nA toggle stats button will be shown in the character frame. You can also middle-click the character model to toggle stats.|n|nModel rotation controls will be hidden. Buttons to toggle gear will be added to the dressup frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceQuestLog" , "Enhance quest log" , 146, -152, true, "If checked, you will be able to customise the quest log frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceProfessions" , "Enhance professions" , 146, -172, true, "If checked, the professions frame will be larger.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceTrainers" , "Enhance trainers" , 146, -192, true, "If checked, the skill trainer frame will be larger and feature a train all skills button.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Extras" , 146, -232); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowVolume" , "Show volume slider" , 146, -252, true, "If checked, a master volume slider will be shown in the character frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "AhExtras" , "Show auction controls" , 146, -272, true, "If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Extras" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowCooldowns" , "Show cooldowns" , 340, -92, true, "If checked, you will be able to place up to five beneficial cooldown icons above the target frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "DurabilityStatus" , "Show durability status" , 340, -112, true, "If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowVanityControls" , "Show vanity controls" , 340, -132, true, "If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowBagSearchBox" , "Show bag search box" , 340, -152, true, "If checked, a bag search box will be shown in the backpack frame and the bank frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowRaidToggle" , "Show raid button" , 340, -172, true, "If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowPlayerChain" , "Show player chain" , 340, -192, true, "If checked, you will be able to show a rare, elite or rare elite chain around the player frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowReadyTimer" , "Show ready timer" , 340, -212, true, "If checked, a timer will be shown under the PvP encounter ready frame so that you know how long you have left to click the enter button.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowWowheadLinks" , "Show Wowhead links" , 340, -232, true, "If checked, Wowhead links will be shown in the world map frame and the achievements frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowFlightTimes" , "Show flight times" , 340, -252, true, "If checked, flight times will be shown in the flight map and when you take a flight.") + + LeaPlusLC:CfgBtn("ModMinimapBtn", LeaPlusCB["MinimapModder"]) + LeaPlusLC:CfgBtn("MoveTooltipButton", LeaPlusCB["TipModEnable"]) + LeaPlusLC:CfgBtn("EnhanceDressupBtn", LeaPlusCB["EnhanceDressup"]) + LeaPlusLC:CfgBtn("EnhanceQuestLogBtn", LeaPlusCB["EnhanceQuestLog"]) + LeaPlusLC:CfgBtn("EnhanceTrainersBtn", LeaPlusCB["EnhanceTrainers"]) + LeaPlusLC:CfgBtn("CooldownsButton", LeaPlusCB["ShowCooldowns"]) + LeaPlusLC:CfgBtn("ModPlayerChain", LeaPlusCB["ShowPlayerChain"]) + LeaPlusLC:CfgBtn("ShowWowheadLinksBtn", LeaPlusCB["ShowWowheadLinks"]) + LeaPlusLC:CfgBtn("ShowFlightTimesBtn", LeaPlusCB["ShowFlightTimes"]) + +---------------------------------------------------------------------- +-- LC6: Frames +---------------------------------------------------------------------- + + pg = "Page6"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Features" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FrmEnabled" , "Manage frames" , 146, -92, true, "If checked, you will be able to change the position and scale of the player frame and target frame.|n|nNote that enabling this option will prevent you from using the default UI to move the player and target frames.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageBuffs" , "Manage buffs" , 146, -112, true, "If checked, you will be able to change the position and scale of the buffs frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageWidget" , "Manage widget" , 146, -132, true, "If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageFocus" , "Manage focus" , 146, -152, true, "If checked, you will be able to change the position and scale of the focus frame.|n|nNote that enabling this option will prevent you from using the default UI to move the focus frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageTimer" , "Manage timer" , 146, -172, true, "If checked, you will be able to change the position and scale of the timer bar.|n|nThe timer bar is used for showing remaining breath when underwater as well as other things.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageDurability" , "Manage durability" , 146, -192, true, "If checked, you will be able to change the position and scale of the armored man durability frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageVehicle" , "Manage vehicle" , 146, -212, true, "If checked, you will be able to change the position and scale of the vehicle seat indicator frame.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ClassColFrames" , "Class colored frames" , 146, -232, true, "If checked, class coloring will be used in the player frame, target frame and focus frame.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Visibility" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoAlerts" , "Hide alerts" , 340, -92, true, "If checked, alert frames will not be shown.|n|nWhen you earn an achievement, a message will be shown in chat instead.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoGryphons" , "Hide gryphons" , 340, -112, true, "If checked, the main bar gryphons will not be shown.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoClassBar" , "Hide stance bar" , 340, -132, true, "If checked, the stance bar will not be shown.") + + LeaPlusLC:CfgBtn("MoveFramesButton", LeaPlusCB["FrmEnabled"]) + LeaPlusLC:CfgBtn("ManageBuffsButton", LeaPlusCB["ManageBuffs"]) + LeaPlusLC:CfgBtn("ManageWidgetButton", LeaPlusCB["ManageWidget"]) + LeaPlusLC:CfgBtn("ManageFocusButton", LeaPlusCB["ManageFocus"]) + LeaPlusLC:CfgBtn("ManageTimerButton", LeaPlusCB["ManageTimer"]) + LeaPlusLC:CfgBtn("ManageDurabilityButton", LeaPlusCB["ManageDurability"]) + LeaPlusLC:CfgBtn("ManageVehicleButton", LeaPlusCB["ManageVehicle"]) + LeaPlusLC:CfgBtn("ClassColFramesBtn", LeaPlusCB["ClassColFrames"]) + +---------------------------------------------------------------------- +-- LC7: System +---------------------------------------------------------------------- + + pg = "Page7"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Graphics and Sound" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoScreenGlow" , "Disable screen glow" , 146, -92, false, "If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoScreenEffects" , "Disable screen effects" , 146, -112, false, "If checked, the grey screen of death and the netherworld effect will be disabled.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "SetWeatherDensity" , "Set weather density" , 146, -132, false, "If checked, you will be able to set the density of weather effects.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MaxCameraZoom" , "Max camera zoom" , 146, -152, false, "If checked, you will be able to zoom out to a greater distance.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ViewPortEnable" , "Enable viewport" , 146, -172, true, "If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoRestedEmotes" , "Silence rested emotes" , 146, -192, true, "If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MuteGameSounds" , "Mute game sounds" , 146, -212, false, "If checked, you will be able to mute a selection of game sounds.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "MuteCustomSounds" , "Mute custom sounds" , 146, -232, false, "If checked, you will be able to mute your own choice of sounds.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Game Options" , 340, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoBagAutomation" , "Disable bag automation" , 340, -92, true, "If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "CharAddonList" , "Show character addons" , 340, -112, true, "If checked, the addon list (accessible from the game menu) will show character based addons by default.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoConfirmLoot" , "Disable loot warnings" , 340, -132, false, "If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FasterLooting" , "Faster auto loot" , 340, -152, true, "If checked, the amount of time it takes to auto loot creatures will be significantly reduced.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "FasterMovieSkip" , "Faster movie skip" , 340, -172, true, "If checked, you will be able to cancel cinematics without being prompted for confirmation.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "StandAndDismount" , "Dismount me" , 340, -192, true, "If checked, you will be able to set some additional rules for when your character is automatically dismounted.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowVendorPrice" , "Show vendor price" , 340, -212, true, "If checked, the vendor price will be shown in item tooltips.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "CombatPlates" , "Combat plates" , 340, -232, true, "If checked, enemy nameplates will be shown during combat and hidden when combat ends.") + LeaPlusLC:MakeCB(LeaPlusLC[pg], "EasyItemDestroy" , "Easy item destroy" , 340, -252, true, "If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows.") + + LeaPlusLC:CfgBtn("SetWeatherDensityBtn", LeaPlusCB["SetWeatherDensity"]) + LeaPlusLC:CfgBtn("ModViewportBtn", LeaPlusCB["ViewPortEnable"]) + LeaPlusLC:CfgBtn("MuteGameSoundsBtn", LeaPlusCB["MuteGameSounds"]) + LeaPlusLC:CfgBtn("MuteCustomSoundsBtn", LeaPlusCB["MuteCustomSounds"]) + LeaPlusLC:CfgBtn("DismountBtn", LeaPlusCB["StandAndDismount"]) + +---------------------------------------------------------------------- +-- LC8: Settings +---------------------------------------------------------------------- + + pg = "Page8"; + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Addon" , 146, -72); + LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowMinimapIcon" , "Show minimap button" , 146, -92, false, "If checked, a minimap button will be available.|n|nClick - Toggle options panel.|n|nSHIFT-click - Toggle music.|n|nALT-click - Toggle errors (if enabled).|n|nCTRL/SHIFT-click - Toggle Zygor (if installed).|n|nCTRL/ALT-click - Toggle windowed mode.") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Scale", 340, -72); + LeaPlusLC:MakeSL(LeaPlusLC[pg], "PlusPanelScale", "Drag to set the scale of the Leatrix Plus panel.", 1, 2, 0.1, 340, -92, "%.1f") + + LeaPlusLC:MakeTx(LeaPlusLC[pg], "Transparency", 340, -132); + LeaPlusLC:MakeSL(LeaPlusLC[pg], "PlusPanelAlpha", "Drag to set the transparency of the Leatrix Plus panel.", 0, 1, 0.1, 340, -152, "%.1f") diff --git a/Leatrix_Plus.toc b/Leatrix_Plus.toc new file mode 100644 index 0000000..28253a0 --- /dev/null +++ b/Leatrix_Plus.toc @@ -0,0 +1,31 @@ +## Interface: 30300 + +## Title: Leatrix Plus +## Title-zhCN: Leatrix Plus [|cffeda55f功能百宝箱|r] +## Title-zhTW: Leatrix Plus [|cffeda55f功能百寶箱|r] + +## Notes: Quality of life addon. +## Notes-zhCN: 哆啦A梦的百宝袋 +## Notes-zhTW: 哆啦A夢的百寶袋 + +## Version: 3.0.131 +## Author: Leatrix +## SavedVariables: LeaPlusDB + +## OptionalDeps: Leatrix_enUS, ElvUI, Glass + +## X-Curse-Project-ID: 463863 + +libs\LibStub\LibStub.lua +libs\LibCompat-1.0\lib.xml +Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua +Libs\LibDataBroker-1.1\LibDataBroker-1.1.lua +Libs\LibDBIcon-1.0\LibDBIcon-1.0.lua + + +Leatrix_Plus_Library.lua +Leatrix_Plus_Locale.lua +Leatrix_Plus_Media.lua +Leatrix_Plus_Flight_Alliance.lua +Leatrix_Plus_Flight_Horde.lua +Leatrix_Plus.lua diff --git a/Leatrix_Plus_Flight_Alliance.lua b/Leatrix_Plus_Flight_Alliance.lua new file mode 100644 index 0000000..dea15b5 --- /dev/null +++ b/Leatrix_Plus_Flight_Alliance.lua @@ -0,0 +1,4563 @@ + + ---------------------------------------------------------------------- + -- Leatrix Plus Flight Alliance + ---------------------------------------------------------------------- + + local void, Leatrix_Plus = ... + local L = Leatrix_Plus.L + + -- Function to load flight data (load-on-demand) + function Leatrix_Plus:LoadFlightDataAlliance() + + Leatrix_Plus["FlightData"]["Alliance"] = { + + ---------------------------------------------------------------------- + -- Alliance + ---------------------------------------------------------------------- + + -- Alliance: Eastern Kingdoms + [1415] = { + + -- Alliance: Acherus (Eastern Plaguelands) + ["0.62:0.34:0.61:0.35:0.58:0.06"] = 385, -- Acherus: The Ebon Hold, Light's Hope Chapel, Shattered Sun Staging Area + ["0.62:0.34:0.61:0.35"] = 50, -- Acherus: The Ebon Hold, Light's Hope Chapel + ["0.62:0.34:0.61:0.35:0.51:0.36"] = 149, -- Acherus: The Ebon Hold, Light's Hope Chapel, Thondoril River + ["0.62:0.34:0.61:0.35:0.61:0.28"] = 151, -- Acherus: The Ebon Hold, Light's Hope Chapel, Zul'Aman + ["0.62:0.34:0.61:0.35:0.48:0.39"] = 198, -- Acherus: The Ebon Hold, Light's Hope Chapel, Chillwind Camp + ["0.62:0.34:0.61:0.35:0.50:0.42"] = 210, -- Acherus: The Ebon Hold, Light's Hope Chapel, Aerie Peak + ["0.62:0.34:0.61:0.35:0.50:0.42:0.44:0.45"] = 272, -- Acherus: The Ebon Hold, Light's Hope Chapel, Aerie Peak, Southshore + ["0.62:0.34:0.61:0.35:0.50:0.42:0.51:0.47"] = 280, -- Acherus: The Ebon Hold, Light's Hope Chapel, Aerie Peak, Refuge Pointe + ["0.62:0.34:0.61:0.35:0.50:0.42:0.44:0.45:0.45:0.56"] = 380, -- Acherus: The Ebon Hold, Light's Hope Chapel, Aerie Peak, Southshore, Menethil Harbor + ["0.62:0.34:0.61:0.35:0.47:0.59"] = 416, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge + ["0.62:0.34:0.61:0.35:0.50:0.42:0.51:0.47:0.53:0.61"] = 450, -- Acherus: The Ebon Hold, Light's Hope Chapel, Aerie Peak, Refuge Pointe, Thelsamar + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65"] = 464, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72"] = 548, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73"] = 576, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 580, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 638, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 717, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 638, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 654, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.62:0.34:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 760, -- Acherus: The Ebon Hold, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Booty Bay + + -- Alliance: Aerie Peak (The Hinterlands) + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.41:0.93"] = 633, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Booty Bay + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.43:0.82"] = 527, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Rebel Camp + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.39:0.80"] = 512, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Sentinel Hill + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73"] = 448, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Stormwind + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 504, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72:0.55:0.81"] = 583, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72:0.50:0.75"] = 446, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil, Lakeshire + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72"] = 414, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65"] = 324, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point + ["0.50:0.42:0.51:0.47:0.53:0.61"] = 246, -- Aerie Peak, Refuge Pointe, Thelsamar + ["0.50:0.42:0.47:0.59"] = 256, -- Aerie Peak, Ironforge + ["0.50:0.42:0.44:0.45:0.45:0.56"] = 176, -- Aerie Peak, Southshore, Menethil Harbor + ["0.50:0.42:0.51:0.47"] = 75, -- Aerie Peak, Refuge Pointe + ["0.50:0.42:0.44:0.45"] = 68, -- Aerie Peak, Southshore + ["0.50:0.42:0.48:0.39"] = 53, -- Aerie Peak, Chillwind Camp + ["0.50:0.42:0.61:0.35"] = 164, -- Aerie Peak, Light's Hope Chapel + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.50:0.75"] = 547, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Lakeshire + ["0.50:0.42:0.47:0.59:0.41:0.73:0.55:0.81"] = 592, -- Aerie Peak, Ironforge, Stormwind, Nethergarde Keep + ["0.50:0.42:0.47:0.59:0.41:0.73:0.41:0.93"] = 614, -- Aerie Peak, Ironforge, Stormwind, Booty Bay + ["0.50:0.42:0.47:0.59:0.41:0.73:0.47:0.79"] = 531, -- Aerie Peak, Ironforge, Stormwind, Darkshire + ["0.50:0.42:0.47:0.59:0.41:0.73"] = 429, -- Aerie Peak, Ironforge, Stormwind (James Bird reported 257) + ["0.50:0.42:0.47:0.59:0.41:0.73:0.50:0.75"] = 527, -- Aerie Peak, Ironforge, Stormwind, Lakeshire + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.47:0.79"] = 550, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Darkshire + ["0.50:0.42:0.61:0.35:0.61:0.28"] = 262, -- Aerie Peak, Light's Hope Chapel, Zul'Aman + ["0.50:0.42:0.61:0.35:0.58:0.06"] = 501, -- Aerie Peak, Light's Hope Chapel, Shattered Sun Staging Area + ["0.50:0.42:0.44:0.45:0.45:0.56:0.53:0.61"] = 339, -- Aerie Peak, Southshore, Menethil Harbor, Thelsamar + ["0.50:0.42:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.55:0.81"] = 611, -- Aerie Peak, Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Nethergarde Keep + ["0.50:0.42:0.47:0.59:0.47:0.65"] = 302, -- Aerie Peak, Ironforge, Thorium Point + ["0.50:0.42:0.47:0.59:0.41:0.73:0.43:0.82"] = 508, -- Aerie Peak, Ironforge, Stormwind, Rebel Camp + ["0.50:0.42:0.48:0.39:0.51:0.36"] = 107, -- Aerie Peak, Chillwind Camp, Thondroril River + ["0.50:0.42:0.61:0.35:0.62:0.34"] = 233, -- Aerie Peak, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.50:0.42:0.47:0.59:0.47:0.65:0.41:0.73"] = 413, -- Aerie Peak, Ironforge, Thorium Point, Stormwind + ["0.50:0.42:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 598, -- Aerie Peak, Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.50:0.42:0.47:0.59:0.41:0.73:0.52:0.72"] = 568, -- Aerie Peak, Ironforge, Stormwind, Morgan's Vigil + ["0.50:0.42:0.47:0.59:0.53:0.61"] = 323, -- Aerie Peak, Ironforge, Thelsamar + ["0.50:0.42:0.51:0.47:0.45:0.56"] = 202, -- Aerie Peak, Refuge Pointe, Menethil Harbor + ["0.50:0.42:0.47:0.59:0.45:0.56"] = 336, -- Aerie Peak, Ironforge, Menethil Harbor + ["0.50:0.42:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 477, -- Aerie Peak, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + + -- Alliance: Booty Bay (Stranglethorn Vale) + ["0.41:0.93:0.39:0.80"] = 148, -- Booty Bay, Sentinel Hill + ["0.41:0.93:0.43:0.82"] = 118, -- Booty Bay, Rebel Camp + ["0.41:0.93:0.47:0.79"] = 167, -- Booty Bay, Darkshire + ["0.41:0.93:0.43:0.82:0.47:0.79:0.55:0.81"] = 252, -- Booty Bay, Rebel Camp, Darkshire, Nethergarde Keep + ["0.41:0.93:0.43:0.82:0.47:0.79:0.50:0.75"] = 215, -- Booty Bay, Rebel Camp, Darkshire, Lakeshire + ["0.41:0.93:0.43:0.82:0.47:0.79:0.50:0.75:0.52:0.72"] = 276, -- Booty Bay, Rebel Camp, Darkshire, Lakeshire, Morgan's Vigil + ["0.41:0.93:0.41:0.73"] = 200, -- Booty Bay, Stormwind + ["0.41:0.93:0.41:0.73:0.47:0.65"] = 318, -- Booty Bay, Stormwind, Thorium Point + ["0.41:0.93:0.41:0.73:0.47:0.65:0.53:0.61"] = 397, -- Booty Bay, Stormwind, Thorium Point, Thelsamar + ["0.41:0.93:0.41:0.73:0.47:0.59"] = 401, -- Booty Bay, Stormwind, Ironforge (howieyard27@aol.com reported 200, not changed yet) + ["0.41:0.93:0.41:0.73:0.47:0.59:0.45:0.56"] = 472, -- Booty Bay, Stormwind, Ironforge, Menethil Harbor + ["0.41:0.93:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47"] = 560, -- Booty Bay, Stormwind, Thorium Point, Thelsamar, Refuge Pointe + ["0.41:0.93:0.41:0.73:0.47:0.59:0.44:0.45"] = 573, -- Booty Bay, Stormwind, Ironforge, Southshore + ["0.41:0.93:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 632, -- Booty Bay, Stormwind, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak + ["0.41:0.93:0.41:0.73:0.47:0.59:0.48:0.39"] = 614, -- Booty Bay, Stormwind, Ironforge, Chillwind Camp + ["0.41:0.93:0.41:0.73:0.47:0.59:0.61:0.35"] = 708, -- Booty Bay, Stormwind, Ironforge, Light's Hope Chapel + ["0.41:0.93:0.41:0.73:0.47:0.59:0.61:0.35:0.61:0.28"] = 806, -- Booty Bay, Stormwind, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.41:0.93:0.41:0.73:0.47:0.59:0.51:0.47"] = 562, -- Booty Bay, Stormwind, Ironforge, Refuge Pointe + ["0.41:0.93:0.41:0.73:0.47:0.59:0.53:0.61"] = 460, -- Booty Bay, Stormwind, Ironforge, Thelsamar + ["0.41:0.93:0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 633, -- Booty Bay, Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.41:0.93:0.47:0.79:0.55:0.81"] = 258, -- Booty Bay, Darkshire, Nethergarde Keep + ["0.41:0.93:0.47:0.79:0.50:0.75"] = 222, -- Booty Bay, Darkshire, Lakeshire + ["0.41:0.93:0.41:0.73:0.47:0.59:0.58:0.06"] = 465, -- Booty Bay, Stormwind, Ironforge, Shattered Sun Staging Area + ["0.41:0.93:0.41:0.73:0.55:0.81"] = 363, -- Booty Bay, Stormwind, Nethergarde Keep + ["0.41:0.93:0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 667, -- Booty Bay, Stormwind, Ironforge, Chillwind Camp, Thondroril River + ["0.41:0.93:0.41:0.73:0.47:0.59:0.61:0.35:0.62:0.34"] = 774, -- Booty Bay, Stormwind, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.41:0.93:0.39:0.80:0.50:0.75"] = 277, -- Booty Bay, Sentinel Hill, Lakeshire + ["0.41:0.93:0.41:0.73:0.47:0.59:0.61:0.35:0.51:0.36"] = 805, -- Booty Bay, Stormwind, Ironforge, Light's Hope Chapel, Thondoril River + ["0.41:0.93:0.47:0.79:0.50:0.75:0.52:0.72"] = 283, -- Booty Bay, Darkshire, Lakeshire, Morgan's Vigil + + -- Alliance: Chillwind Camp (Western Plaguelands) + ["0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 603, -- Chillwind Camp, Ironforge, Thorium Point, Stormwind, Booty Bay (was 662, changed by Roman Seidelsohn) + ["0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 481, -- Chillwind Camp, Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 497, -- Chillwind Camp, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 482, -- Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 560, -- Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 423, -- Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72"] = 395, -- Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil + ["0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73"] = 418, -- Chillwind Camp, Ironforge, Thorium Point, Stormwind + ["0.48:0.39:0.47:0.59:0.47:0.65"] = 309, -- Chillwind Camp, Ironforge, Thorium Point + ["0.48:0.39:0.50:0.42:0.51:0.47:0.53:0.61"] = 308, -- Chillwind Camp, Aerie Peak, Refuge Pointe, Thelsamar + ["0.48:0.39:0.47:0.59"] = 259, -- Chillwind Camp, Ironforge + ["0.48:0.39:0.44:0.45:0.45:0.56"] = 193, -- Chillwind Camp, Southshore, Menethil Harbor + ["0.48:0.39:0.50:0.42:0.51:0.47"] = 138, -- Chillwind Camp, Aerie Peak, Refuge Pointe + ["0.48:0.39:0.44:0.45"] = 86, -- Chillwind Camp, Southshore + ["0.48:0.39:0.50:0.42"] = 66, -- Chillwind Camp, Aerie Peak + ["0.48:0.39:0.61:0.35"] = 146, -- Chillwind Camp, Light's Hope Chapel (Viter reported 88) + ["0.48:0.39:0.47:0.59:0.41:0.73:0.41:0.93"] = 617, -- Chillwind Camp, Ironforge, Stormwind, Baie-du-Butin, Booty Bay + ["0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.50:0.75"] = 516, -- Chillwind Camp, Ironforge, Thorium Point, Stormwind, Lakeshire + ["0.48:0.39:0.47:0.59:0.41:0.73:0.50:0.75"] = 531, -- Chillwind Camp, Ironforge, Stormwind, Lakeshire + ["0.48:0.39:0.47:0.59:0.41:0.73"] = 433, -- Chillwind Camp, Ironforge, Stormwind + ["0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.55:0.81"] = 581, -- Chillwind Camp, Ironforge, Thorium Point, Stormwind, Nethergarde Keep + ["0.48:0.39:0.61:0.35:0.61:0.28"] = 244, -- Chillwind Camp, Light's Hope Chapel, Zul'Aman + ["0.48:0.39:0.61:0.35:0.58:0.06"] = 482, -- Chillwind Camp, Light's Hope Chapel, Shattered Sun Staging Area + ["0.48:0.39:0.47:0.59:0.41:0.73:0.55:0.81"] = 595, -- Chillwind Camp, Ironforge, Stormwind, Nethergarde Keep + ["0.48:0.39:0.44:0.45:0.51:0.47:0.53:0.61"] = 327, -- Chillwind Camp, Southshore, Refuge Pointe, Thelsamar + ["0.48:0.39:0.44:0.45:0.51:0.47"] = 157, -- Chillwind Camp, Southshore, Refuge Pointe + ["0.48:0.39:0.47:0.59:0.41:0.73:0.43:0.82"] = 512, -- Chillwind Camp, Ironforge, Stormwind, Rebel Camp + ["0.48:0.39:0.47:0.59:0.41:0.73:0.47:0.79"] = 534, -- Chillwind Camp, Ironforge, Stormwind, Darkshire + ["0.48:0.39:0.47:0.59:0.41:0.73:0.52:0.72"] = 572, -- Chillwind Camp, Ironforge, Stormwind, Morgan's Vigil + ["0.48:0.39:0.51:0.36"] = 54, -- Chillwind Camp, Thondroril River + ["0.48:0.39:0.61:0.35:0.62:0.34"] = 214, -- Chillwind Camp, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.48:0.39:0.47:0.59:0.51:0.47"] = 428, -- Chillwind Camp, Ironforge, Refuge Pointe + ["0.48:0.39:0.50:0.42:0.51:0.47:0.45:0.56"] = 264, -- Chillwind Camp, Aerie Peak, Refuge Pointe, Menethil Harbor + ["0.48:0.39:0.47:0.59:0.45:0.56"] = 337, -- Chillwind Camp, Ironforge, Menethil Harbor + ["0.48:0.39:0.47:0.59:0.41:0.73:0.39:0.80"] = 496, -- Chillwind Camp, Ironforge, Stormwind, Sentinel Hill + + -- Alliance: Darkshire (Duskwood) + ["0.47:0.79:0.41:0.93"] = 171, -- Darkshire, Booty Bay + ["0.47:0.79:0.43:0.82"] = 48, -- Darkshire, Rebel Camp + ["0.47:0.79:0.39:0.80"] = 93, -- Darkshire, Sentinel Hill + ["0.47:0.79:0.41:0.73"] = 88, -- Darkshire, Stormwind + ["0.47:0.79:0.50:0.75"] = 60, -- Darkshire, Lakeshire + ["0.47:0.79:0.55:0.81"] = 97, -- Darkshire, Nethergarde Keep + ["0.47:0.79:0.50:0.75:0.52:0.72"] = 120, -- Darkshire, Lakeshire, Morgan's Vigil + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.53:0.61"] = 270, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Thelsamar + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65"] = 188, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59"] = 268, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.45:0.56"] = 337, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Menethil Harbor (was 417, changed to 337 by Roman Seidelsohn) + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47"] = 432, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.44:0.45"] = 439, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Southshore + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 504, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak (was 582, changed by Mediana via email) + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35"] = 575, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.50:0.42:0.44:0.45"] = 548, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Aerie Peak, Southshore + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.61:0.28"] = 674, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.47:0.79:0.41:0.73:0.47:0.59:0.45:0.56"] = 361, -- Darkshire, Stormwind, Ironforge, Menethil Harbor + ["0.47:0.79:0.41:0.73:0.47:0.59"] = 291, -- Darkshire, Stormwind, Ironforge + ["0.47:0.79:0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 522, -- Darkshire, Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.47:0.79:0.41:0.73:0.47:0.59:0.44:0.45"] = 462, -- Darkshire, Stormwind, Ironforge, Southshore + ["0.47:0.79:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 521, -- Darkshire, Stormwind, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak + ["0.47:0.79:0.41:0.73:0.47:0.59:0.48:0.39"] = 503, -- Darkshire, Stormwind, Ironforge, Chillwind Camp + ["0.47:0.79:0.41:0.73:0.47:0.59:0.51:0.47"] = 451, -- Darkshire, Stormwind, Ironforge, Refuge Pointe + ["0.47:0.79:0.41:0.73:0.47:0.59:0.53:0.61"] = 348, -- Darkshire, Stormwind, Ironforge, Thelsamar + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39"] = 480, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp (changed to 480 by Kory Krebs and jody stapleton, was 534) + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.58:0.06"] = 333, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Shattered Sun Staging Area + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39:0.51:0.36"] = 533, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp, Thondroril River + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.62:0.34"] = 641, -- Darkshire, Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.47:0.79:0.41:0.73:0.47:0.65"] = 208, -- Darkshire, Stormwind, Thorium Point + ["0.47:0.79:0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.44:0.45:0.50:0.42"] = 509, -- Villa Oscura, Villa del Lago, Vigilia de Morgan, Puesto del Torio, Forjaz, Costasur, Pico Nidal + ["0.47:0.79:0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 556, -- Darkshire, Stormwind, Ironforge, Chillwind Camp, Thondoril River + ["0.47:0.79:0.41:0.73:0.47:0.65:0.53:0.61"] = 287, -- Darkshire, Stormwind, Thorium Point, Thelsamar + ["0.47:0.79:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47"] = 449, -- Darkshire, Stormwind, Thorium Point, Thelsamar, Refuge Pointe + + -- Alliance: Ironforge (Dun Morogh) + ["0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 381, -- Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 260, -- Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 275, -- Ironforge, Thorium Point, Stormwind, Rebel Camp (8imras8 reported 224) + ["0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 260, -- Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 338, -- Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 201, -- Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.47:0.59:0.47:0.65:0.52:0.72"] = 173, -- Ironforge, Thorium Point, Morgan's Vigil + ["0.47:0.59:0.41:0.73"] = 210, -- Ironforge, Stormwind (Tatiana Beaklini reported 215) (William Aamodt reported 227) + ["0.47:0.59:0.47:0.65"] = 87, -- Ironforge, Thorium Point + ["0.47:0.59:0.53:0.61"] = 101, -- Ironforge, Thelsamar + ["0.47:0.59:0.45:0.56"] = 115, -- Ironforge, Menethil Harbor + ["0.47:0.59:0.51:0.47"] = 204, -- Ironforge, Refuge Pointe + ["0.47:0.59:0.44:0.45"] = 216, -- Ironforge, Southshore + ["0.47:0.59:0.50:0.42"] = 299, -- Ironforge, Aerie Peak + ["0.47:0.59:0.48:0.39"] = 258, -- Ironforge, Chillwind Camp (Sexy Steven reported 106) + ["0.47:0.59:0.61:0.35"] = 349, -- Ironforge, Light's Hope Chapel (Viter reported 40, Matthew Smith reported 271) + ["0.47:0.59:0.61:0.35:0.61:0.28"] = 445, -- Ironforge, Light's Hope Chapel, Zul'Aman + ["0.47:0.59:0.41:0.73:0.43:0.82"] = 290, -- Ironforge, Stormwind, Rebel Camp (Hayley Levesque reported 308) + ["0.47:0.59:0.41:0.73:0.39:0.80"] = 275, -- Ironforge, Stormwind, Sentinel Hill + ["0.47:0.59:0.41:0.73:0.50:0.75"] = 310, -- Ironforge, Stormwind, Lakeshire (was 309, changed to 211 by Dylan, changed back to 310 by Trev B and Steevan BARBOYON so 310 is correct) + ["0.47:0.59:0.41:0.73:0.55:0.81"] = 373, -- Ironforge, Stormwind, Nethergarde Keep + ["0.47:0.59:0.41:0.73:0.47:0.79"] = 313, -- Ironforge, Stormwind, Darkshire + ["0.47:0.59:0.47:0.65:0.41:0.73:0.50:0.75"] = 295, -- Ironforge, Thorium Point, Stormwind, Lakeshire + ["0.47:0.59:0.41:0.73:0.41:0.93"] = 396, -- Ironforge, Stormwind, Booty Bay + ["0.47:0.59:0.47:0.65:0.41:0.73:0.55:0.81"] = 359, -- Ironforge, Thorium Point, Stormwind, Nethergarde Keep + ["0.47:0.59:0.47:0.65:0.41:0.73:0.47:0.79"] = 298, -- Ironforge, Thorium Point, Stormwind, Darkshire + ["0.47:0.59:0.41:0.73:0.52:0.72"] = 350, -- Ironforge, Stormwind, Morgan's Vigil + ["0.47:0.59:0.58:0.06"] = 101, -- Ironforge, Shattered Sun Staging Area (was 100, changed to 111 by Maximilian Wittig, changed back to 99 by many others, changed to 100 by Oliver, changed to 101 by Daehoon Oh who reported 105) + ["0.47:0.59:0.58:0.06:0.61:0.28"] = 330, -- Ironforge, Shattered Sun Staging Area, Zul'Aman + ["0.47:0.59:0.48:0.39:0.51:0.36"] = 311, -- Ironforge, Chillwind Camp, Thondroril River + ["0.47:0.59:0.61:0.35:0.62:0.34"] = 415, -- Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + + -- Alliance: Lakeshire (Redridge Mountains) + ["0.50:0.75:0.47:0.79:0.43:0.82:0.41:0.93"] = 218, -- Lakeshire, Darkshire, Rebel Camp, Booty Bay + ["0.50:0.75:0.47:0.79:0.55:0.81"] = 148, -- Lakeshire, Darkshire, Nethergarde Keep + ["0.50:0.75:0.47:0.79"] = 60, -- Lakeshire, Darkshire + ["0.50:0.75:0.47:0.79:0.43:0.82"] = 104, -- Lakeshire, Darkshire, Rebel Camp + ["0.50:0.75:0.39:0.80"] = 133, -- Lakeshire, Sentinel Hill + ["0.50:0.75:0.41:0.73"] = 113, -- Lakeshire, Stormwind + ["0.50:0.75:0.52:0.72"] = 61, -- Lakeshire, Morgan's Vigil + ["0.50:0.75:0.52:0.72:0.47:0.65"] = 129, -- Lakeshire, Morgan's Vigil, Thorium Point + ["0.50:0.75:0.52:0.72:0.47:0.65:0.53:0.61"] = 210, -- Lakeshire, Morgan's Vigil, Thorium Point, Thelsamar + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59"] = 209, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.45:0.56"] = 278, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Menethil Harbor + ["0.50:0.75:0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47"] = 374, -- Lakeshire, Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.44:0.45"] = 379, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Southshore (was 489, changed by Isaac Guinn and Georgi Georgiev) + ["0.50:0.75:0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 445, -- Lakeshire, Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39"] = 421, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp (was 475, changed to 421 by Christian Bösherz and Jonathon Hicks) + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35"] = 516, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel (changed to 516 by Embracefate and Henrik Löfström) + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.50:0.42:0.44:0.45"] = 489, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Aerie Peak, Southshore + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.61:0.28"] = 614, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.50:0.75:0.41:0.73:0.47:0.59"] = 315, -- Lakeshire, Stormwind, Ironforge + ["0.50:0.75:0.41:0.73:0.47:0.59:0.45:0.56"] = 385, -- Lakeshire, Stormwind, Ironforge, Menethil Harbor + ["0.50:0.75:0.41:0.73:0.47:0.59:0.53:0.61"] = 373, -- Lakeshire, Stormwind, Ironforge, Thelsamar + ["0.50:0.75:0.41:0.73:0.55:0.81"] = 276, -- Seenhain, Sturmwind, Burg Nethergarde + ["0.50:0.75:0.41:0.73:0.47:0.59:0.48:0.39"] = 528, -- Lakeshire, Stormwind, Ironforge, Chillwind Camp + ["0.50:0.75:0.41:0.73:0.47:0.59:0.44:0.45"] = 487, -- Lakeshire, Stormwind, Ironforge, Southshore + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.58:0.06"] = 273, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Shattered Sun Staging Area + ["0.50:0.75:0.47:0.79:0.41:0.93"] = 228, -- Lakeshire, Darkshire, Booty Bay + ["0.50:0.75:0.41:0.73:0.47:0.65"] = 232, -- Lakeshire, Stormwind, Thorium Point + ["0.50:0.75:0.41:0.73:0.47:0.59:0.51:0.47"] = 475, -- Lakeshire, Stormwind, Ironforge, Refuge Pointe + ["0.50:0.75:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47"] = 474, -- Lakeshire, Stormwind, Thorium Point, Thelsamar, Refuge Pointe + ["0.50:0.75:0.39:0.80:0.43:0.82"] = 196, -- Lakeshire, Sentinel Hill, Rebel Camp + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39:0.51:0.36"] = 474, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp, Thondroril River + ["0.50:0.75:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.62:0.34"] = 582, -- Lakeshire, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.50:0.75:0.41:0.73:0.47:0.65:0.53:0.61"] = 311, -- Lakeshire, Stormwind, Thorium Point, Thelsamar + ["0.50:0.75:0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 547, -- Lakeshire, Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.50:0.75:0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 581, -- Lakeshire, Stormwind, Ironforge, Chillwind Camp, Thondoril River + ["0.50:0.75:0.41:0.73:0.41:0.93"] = 297, -- Lakeshire, Stormwind, Booty Bay + ["0.50:0.75:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 546, -- Seenhain, Sturmwind, Thoriumspitze, Thelsamar, Die Zuflucht, Nistgipfel + + -- Alliance: Light's Hope Chapel (Eastern Plaguelands) + ["0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 712, -- Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 590, -- Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 606, -- Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 591, -- Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 669, -- Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 532, -- Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72"] = 503, -- Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil + ["0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73"] = 527, -- Light's Hope Chapel, Ironforge, Thorium Point, Stormwind + ["0.61:0.35:0.47:0.59:0.47:0.65"] = 417, -- Light's Hope Chapel, Ironforge, Thorium Point + ["0.61:0.35:0.50:0.42:0.51:0.47:0.53:0.61"] = 403, -- Light's Hope Chapel, Aerie Peak, Refuge Pointe, Thelsamar + ["0.61:0.35:0.47:0.59"] = 369, -- Light's Hope Chapel, Ironforge + ["0.61:0.35:0.50:0.42:0.44:0.45:0.45:0.56"] = 333, -- Light's Hope Chapel, Aerie Peak, Southshore, Menethil Harbor + ["0.61:0.35:0.50:0.42:0.51:0.47"] = 232, -- Light's Hope Chapel, Aerie Peak, Refuge Pointe + ["0.61:0.35:0.50:0.42:0.44:0.45"] = 225, -- Light's Hope Chapel, Aerie Peak, Southshore + ["0.61:0.35:0.50:0.42"] = 163, -- Light's Hope Chapel, Aerie Peak + ["0.61:0.35:0.48:0.39"] = 149, -- Light's Hope Chapel, Chillwind Camp + ["0.61:0.35:0.61:0.28"] = 104, -- Light's Hope Chapel, Zul'Aman + ["0.61:0.35:0.48:0.39:0.44:0.45"] = 226, -- Light's Hope Chapel, Chillwind Camp, Southshore + ["0.61:0.35:0.47:0.59:0.41:0.73"] = 541, -- Light's Hope Chapel, Ironforge, Stormwind + ["0.61:0.35:0.58:0.06"] = 339, -- Light's Hope Chapel, Shattered Sun Staging Area + ["0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.55:0.81"] = 690, -- Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Nethergarde + ["0.61:0.35:0.47:0.59:0.41:0.73:0.55:0.81"] = 704, -- Light's Hope Chapel, Ironforge, Stormwind, Nethergarde Keep + ["0.61:0.35:0.47:0.59:0.53:0.61"] = 434, -- Light's Hope Chapel, Ironforge, Thelsamar + ["0.61:0.35:0.48:0.39:0.44:0.45:0.45:0.56"] = 334, -- Light's Hope Chapel, Chillwind Camp, Southshore, Menethil Harbor + ["0.61:0.35:0.47:0.59:0.41:0.73:0.47:0.79"] = 643, -- Light's Hope Chapel, Ironforge, Stormwind, Darkshire + ["0.61:0.35:0.48:0.39:0.44:0.45:0.51:0.47"] = 298, -- Light's Hope Chapel, Chillwind Camp, Southshore, Refuge Pointe + ["0.61:0.35:0.51:0.36"] = 102, -- Light's Hope Chapel, Thondroril River + ["0.61:0.35:0.62:0.34"] = 71, -- Light's Hope Chapel, Acherus: The Ebon Hold + ["0.61:0.35:0.47:0.59:0.41:0.73:0.52:0.72"] = 680, -- Light's Hope Chapel, Ironforge, Stormwind, Morgan's Vigil + ["0.61:0.35:0.47:0.59:0.41:0.73:0.41:0.93"] = 726, -- Light's Hope Chapel, Ironforge, Stormwind, Booty Bay + ["0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.50:0.75"] = 625, -- Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Lakeshire + ["0.61:0.35:0.47:0.59:0.41:0.73:0.50:0.75"] = 639, -- Light's Hope Chapel, Ironforge, Stormwind, Lakeshire + + -- Alliance: Menethil Harbor (Wetlands) + ["0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 429, -- Menethil Harbor, Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 323, -- Menethil Harbor, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 307, -- Menethil Harbor, Ironforge, Thorium Point, Stormwind, Sentinel Hill (was 324, changed to 307 by advocate@wrath-wow.com) + ["0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73"] = 244, -- Menethil Harbor, Ironforge, Thorium Point, Stormwind + ["0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 309, -- Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 386, -- Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 250, -- Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72"] = 221, -- Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil + ["0.45:0.56:0.47:0.59:0.47:0.65"] = 135, -- Menethil Harbor, Ironforge, Thorium Point + ["0.45:0.56:0.53:0.61"] = 163, -- Menethil Harbor, Thelsamar + ["0.45:0.56:0.47:0.59"] = 89, -- Menethil Harbor, Ironforge + ["0.45:0.56:0.51:0.47"] = 114, -- Menethil Harbor, Refuge Pointe + ["0.45:0.56:0.44:0.45"] = 107, -- Menethil Harbor, Southshore + ["0.45:0.56:0.44:0.45:0.50:0.42"] = 176, -- Menethil Harbor, Southshore, Aerie Peak + ["0.45:0.56:0.44:0.45:0.48:0.39"] = 186, -- Menethil Harbor, Southshore, Chillwind Camp + ["0.45:0.56:0.44:0.45:0.48:0.39:0.61:0.35"] = 324, -- Menethil Harbor, Southshore, Chillwind Camp, Light's Hope Chapel + ["0.45:0.56:0.47:0.59:0.41:0.73:0.41:0.93"] = 445, -- Menethil Harbor, Ironforge, Stormwind, Booty Bay + ["0.45:0.56:0.47:0.59:0.41:0.73"] = 260, -- Menethil Harbor, Ironforge, Stormwind + ["0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.55:0.81"] = 407, -- Menethil Harbor, Ironforge, Thorium Point, Stormwind, Nethergarde Keep + ["0.45:0.56:0.47:0.59:0.41:0.73:0.39:0.80"] = 323, -- Menethil Harbor, Ironforge, Stormwind, Sentinel Hill + ["0.45:0.56:0.47:0.59:0.41:0.73:0.50:0.75"] = 358, -- Menethil Harbor, Ironforge, Stormwind, Lakeshire + ["0.45:0.56:0.47:0.59:0.41:0.73:0.47:0.79"] = 362, -- Menethil Harbor, Ironforge, Stormwind, Darkshire + ["0.45:0.56:0.47:0.59:0.41:0.73:0.43:0.82"] = 339, -- Menethil Harbor, Ironforge, Stormwind, Rebel Camp + ["0.45:0.56:0.47:0.59:0.41:0.73:0.55:0.81"] = 422, -- Menethil Harbor, Ironforge, Stormwind, Nethergarde Keep + ["0.45:0.56:0.44:0.45:0.48:0.39:0.61:0.35:0.61:0.28"] = 422, -- Menethil Harbor, Southshore, Chillwind Camp, Light's Hope Chapel, Zul'Aman + ["0.45:0.56:0.47:0.59:0.58:0.06"] = 153, -- Menethil Harbor, Ironforge, Shattered Sun Staging Area + ["0.45:0.56:0.47:0.59:0.48:0.39"] = 309, -- Menethil Harbor, Ironforge, Chillwind Camp + ["0.45:0.56:0.51:0.47:0.50:0.42"] = 185, -- Menethil Harbor, Refuge Pointe, Aerie Peak + ["0.45:0.56:0.44:0.45:0.48:0.39:0.51:0.36"] = 236, -- Menethil Harbor, Southshore, Chillwind Camp, Thondroril River + ["0.45:0.56:0.44:0.45:0.48:0.39:0.61:0.35:0.62:0.34"] = 392, -- Menethil Harbor, Southshore, Chillwind Camp, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.50:0.75"] = 343, -- Menethil Harbor, Ironforge, Thorium Point, Stormwind, Lakeshire + ["0.45:0.56:0.44:0.45:0.50:0.42:0.61:0.35"] = 339, -- Menethil Harbor, Southshore, Aerie Peak, Light's Hope Chapel + ["0.45:0.56:0.51:0.47:0.50:0.42:0.48:0.39"] = 235, -- Menethil Harbor, Refuge Pointe, Aerie Peak, Chillwind Camp + ["0.45:0.56:0.47:0.59:0.41:0.73:0.52:0.72"] = 398, -- Menethil Harbor, Ironforge, Stormwind, Morgan's Vigil + ["0.45:0.56:0.47:0.59:0.61:0.35"] = 393, -- Menethil Harbor, Ironforge, Light's Hope Chapel + ["0.45:0.56:0.53:0.61:0.47:0.65:0.41:0.73"] = 368, -- Menethil Harbor, Thelsamar, Thorium Point, Stormwind + ["0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.47:0.79"] = 346, -- Menethil Harbor, Ironforge, Thorium Point, Stormwind, Darkshire + + -- Alliance: Morgan's Vigil (Burning Steppes) + ["0.52:0.72:0.50:0.75:0.47:0.79:0.43:0.82:0.41:0.93"] = 278, -- Morgan's Vigil, Lakeshire, Darkshire, Rebel Camp, Booty Bay + ["0.52:0.72:0.50:0.75:0.47:0.79:0.43:0.82"] = 165, -- Morgan's Vigil, Lakeshire, Darkshire, Rebel Camp + ["0.52:0.72:0.50:0.75:0.39:0.80"] = 195, -- Morgan's Vigil, Lakeshire, Sentinel Hill + ["0.52:0.72:0.41:0.73"] = 151, -- Morgan's Vigil, Stormwind + ["0.52:0.72:0.50:0.75:0.47:0.79"] = 121, -- Morgan's Vigil, Lakeshire, Darkshire + ["0.52:0.72:0.55:0.81"] = 198, -- Morgan's Vigil, Nethergarde Keep + ["0.52:0.72:0.50:0.75"] = 64, -- Morgan's Vigil, Lakeshire + ["0.52:0.72:0.47:0.65:0.53:0.61"] = 172, -- Morgan's Vigil, Thorium Point, Thelsamar + ["0.52:0.72:0.47:0.65"] = 91, -- Morgan's Vigil, Thorium Point + ["0.52:0.72:0.47:0.65:0.47:0.59"] = 171, -- Morgan's Vigil, Thorium Point, Ironforge + ["0.52:0.72:0.47:0.65:0.47:0.59:0.45:0.56"] = 240, -- Morgan's Vigil, Thorium Point, Ironforge, Menethil Harbor + ["0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47"] = 335, -- Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe + ["0.52:0.72:0.47:0.65:0.47:0.59:0.44:0.45"] = 342, -- Morgan's Vigil, Thorium Point, Ironforge, Southshore + ["0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 407, -- Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak (was 436, changed by Ludvig - Angelis0712) + ["0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39"] = 383, -- Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp + ["0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35"] = 478, -- Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel + ["0.52:0.72:0.47:0.65:0.47:0.59:0.50:0.42:0.48:0.39"] = 437, -- Morgan's Vigil, Thorium Point, Ironforge, Aerie Peak, Chillwind Camp + ["0.52:0.72:0.41:0.73:0.47:0.59"] = 354, -- Morgan's Vigil, Stormwind, Ironforge + ["0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.61:0.28"] = 576, -- Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.52:0.72:0.41:0.73:0.47:0.59:0.45:0.56"] = 423, -- Morgan's Vigil, Stormwind, Ironforge, Menethil Harbor + ["0.52:0.72:0.41:0.73:0.47:0.59:0.53:0.61"] = 411, -- Morgan's Vigil, Stormwind, Ironforge, Thelsamar + ["0.52:0.72:0.47:0.65:0.47:0.59:0.58:0.06"] = 236, -- Morgan's Vigil, Thorium Point, Ironforge, Shattered Sun Staging Area + ["0.52:0.72:0.50:0.75:0.47:0.79:0.41:0.93"] = 289, -- Morgan's Vigil, Lakeshire, Darkshire, Booty Bay + ["0.52:0.72:0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 586, -- Morgan's Vigil, Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.52:0.72:0.41:0.73:0.47:0.59:0.61:0.35"] = 660, -- Morgan's Vigil, Stormwind, Ironforge, Light's Hope Chapel + ["0.52:0.72:0.41:0.73:0.47:0.59:0.48:0.39"] = 566, -- Morgan's Vigil, Stormwind, Ironforge, Chillwind Camp + ["0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39:0.51:0.36"] = 436, -- Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp, Thondroril River + ["0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.62:0.34"] = 544, -- Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.52:0.72:0.41:0.73:0.41:0.93"] = 336, -- Morgan's Vigil, Stormwind, Booty Bay + ["0.52:0.72:0.41:0.73:0.47:0.59:0.44:0.45"] = 525, -- Morgan's Vigil, Stormwind, Ironforge, Southshore + ["0.52:0.72:0.41:0.73:0.47:0.79"] = 254, -- Morgan's Vigil, Stormwind, Darkshire + ["0.52:0.72:0.41:0.73:0.43:0.82"] = 230, -- Morgan's Vigil, Stormwind, Rebel Camp + ["0.52:0.72:0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 619, -- Morgan's Vigil, Stormwind, Ironforge, Chillwind Camp, Thondoril River + + -- Alliance: Nethergarde Keep (Blasted Lands) + ["0.55:0.81:0.47:0.79:0.43:0.82:0.41:0.93"] = 251, -- Nethergarde Keep, Darkshire, Rebel Camp, Booty Bay + ["0.55:0.81:0.47:0.79:0.43:0.82"] = 138, -- Nethergarde Keep, Darkshire, Rebel Camp (Güray Ggggs reported 58) + ["0.55:0.81:0.47:0.79:0.39:0.80"] = 183, -- Nethergarde Keep, Darkshire, Sentinel Hill + ["0.55:0.81:0.41:0.73"] = 189, -- Nethergarde Keep, Stormwind + ["0.55:0.81:0.47:0.79"] = 91, -- Nethergarde Keep, Darkshire + ["0.55:0.81:0.47:0.79:0.50:0.75"] = 150, -- Nethergarde Keep, Darkshire, Lakeshire + ["0.55:0.81:0.52:0.72"] = 207, -- Nethergarde Keep, Morgan's Vigil + ["0.55:0.81:0.52:0.72:0.47:0.65:0.53:0.61"] = 359, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Thelsamar + ["0.55:0.81:0.52:0.72:0.47:0.65"] = 278, -- Nethergarde Keep, Morgan's Vigil, Thorium Point + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59"] = 357, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.45:0.56"] = 426, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Menethil Harbor + ["0.55:0.81:0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47"] = 522, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.44:0.45"] = 528, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Southshore + ["0.55:0.81:0.52:0.72:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 593, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak (The Khan reported 210) + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39"] = 570, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35"] = 664, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.61:0.28"] = 763, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.55:0.81:0.47:0.79:0.41:0.93"] = 262, -- Nethergarde Keep, Darkshire, Booty Bay + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.45:0.56"] = 451, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Menethil Harbor (Scott C, IJ, Nick de Vaan, Duncan Kennedy and Justin Chinn reported 150) + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 611, -- Nethergarde Keep, Darkshire, Stormwind, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.48:0.39"] = 594, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Chillwind Camp + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.65"] = 298, -- Nethergarde Keep, Darkshire, Stormwind, Thorium Point + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 612, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.51:0.47"] = 541, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Refuge Pointe + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.53:0.61"] = 439, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Thelsamar + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.58:0.06"] = 422, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Shattered Sun Staging Area + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59"] = 381, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.44:0.45"] = 552, -- Burg Nethergarde, Dunkelhain, Sturmwind, Eisenschmiede, Süderstade + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.65:0.53:0.61"] = 377, -- Nethergarde Keep, Darkshire, Stormwind, Thorium Point, Thelsamar + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.61:0.35"] = 687, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Light's Hope Chapel + ["0.55:0.81:0.41:0.73:0.47:0.59:0.53:0.61"] = 450, -- Nethergarde Keep, Stormwind, Ironforge, Thelsamar + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47"] = 540, -- Nethergarde Keep, Darkshire, Stormwind, Thorium Point, Thelsamar, Refuge Pointe + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.48:0.39:0.51:0.36"] = 623, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Chillwind Camp, Thondroril River + ["0.55:0.81:0.52:0.72:0.47:0.65:0.47:0.59:0.61:0.35:0.62:0.34"] = 731, -- Nethergarde Keep, Morgan's Vigil, Thorium Point, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.44:0.45:0.50:0.42"] = 622, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Southshore, Aerie Peak + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 646, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Chillwind Camp, Thondoril River + ["0.55:0.81:0.41:0.73:0.43:0.82"] = 268, -- Nethergarde Keep, Stormwind, Rebel Camp + ["0.55:0.81:0.47:0.79:0.41:0.73:0.47:0.59:0.58:0.06"] = 445, -- Nethergarde Keep, Darkshire, Stormwind, Ironforge, Shattered Sun Staging Area + + -- Alliance: Rebel Camp (Stranglethorn Vale) + ["0.43:0.82:0.41:0.93"] = 116, -- Rebel Camp, Booty Bay + ["0.43:0.82:0.39:0.80"] = 66, -- Rebel Camp, Sentinel Hill + ["0.43:0.82:0.41:0.73"] = 98, -- Rebel Camp, Stormwind + ["0.43:0.82:0.47:0.79:0.55:0.81"] = 139, -- Rebel Camp, Darkshire, Nethergarde Keep + ["0.43:0.82:0.47:0.79"] = 48, -- Rebel Camp, Darkshire + ["0.43:0.82:0.47:0.79:0.50:0.75"] = 102, -- Rebel Camp, Darkshire, Lakeshire + ["0.43:0.82:0.47:0.79:0.50:0.75:0.52:0.72"] = 163, -- Rebel Camp, Darkshire, Lakeshire, Morgan's Vigil + ["0.43:0.82:0.41:0.73:0.47:0.65"] = 218, -- Rebel Camp, Stormwind, Thorium Point + ["0.43:0.82:0.41:0.73:0.47:0.65:0.53:0.61"] = 296, -- Rebel Camp, Stormwind, Thorium Point, Thelsamar + ["0.43:0.82:0.41:0.73:0.47:0.59"] = 300, -- Rebel Camp, Stormwind, Ironforge + ["0.43:0.82:0.41:0.73:0.47:0.59:0.45:0.56"] = 370, -- Rebel Camp, Stormwind, Ironforge, Menethil Harbor + ["0.43:0.82:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47"] = 459, -- Rebel Camp, Stormwind, Thorium Point, Thelsamar, Refuge Pointe + ["0.43:0.82:0.41:0.73:0.47:0.59:0.44:0.45"] = 472, -- Rebel Camp, Stormwind, Ironforge, Southshore + ["0.43:0.82:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 531, -- Rebel Camp, Stormwind, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak + ["0.43:0.82:0.41:0.73:0.47:0.59:0.48:0.39"] = 513, -- Rebel Camp, Stormwind, Ironforge, Chillwind Camp (was 567, changed by SchinknBrot on CurseForge and Alexander Vestbjerg) + ["0.43:0.82:0.41:0.73:0.47:0.59:0.61:0.35"] = 607, -- Rebel Camp, Stormwind, Ironforge, Light's Hope Chapel (was 676, changed to 607 by Kaptin Kraut, Brenda Adams and Erik Roslund) + ["0.43:0.82:0.41:0.73:0.47:0.59:0.61:0.35:0.61:0.28"] = 704, -- Rebel Camp, Stormwind, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.43:0.82:0.41:0.73:0.47:0.59:0.51:0.47"] = 461, -- Rebel Camp, Stormwind, Ironforge, Refuge Pointe + ["0.43:0.82:0.41:0.73:0.47:0.59:0.53:0.61"] = 358, -- Rebel Camp, Stormwind, Ironforge, Thelsamar + ["0.43:0.82:0.41:0.73:0.47:0.59:0.58:0.06"] = 365, -- Rebel Camp, Stormwind, Ironforge, Shattered Sun Staging Area + ["0.43:0.82:0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 532, -- Rebel Camp, Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.43:0.82:0.39:0.80:0.50:0.75"] = 196, -- Rebel Camp, Sentinel Hill, Lakeshire + ["0.43:0.82:0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 566, -- Rebel Camp, Stormwind, Ironforge, Chillwind Camp, Thondroril River + ["0.43:0.82:0.41:0.73:0.47:0.59:0.61:0.35:0.62:0.34"] = 673, -- Rebel Camp, Stormwind, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.43:0.82:0.41:0.73:0.55:0.81"] = 261, -- Rebel Camp, Stormwind, Nethergarde Keep + + -- Alliance: Refuge Pointe (Arathi Highlands) + ["0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.41:0.93"] = 558, -- Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Booty Bay + ["0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.39:0.80"] = 436, -- Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Sentinel Hill + ["0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.43:0.82"] = 452, -- Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Rebel Camp + ["0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 429, -- Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72:0.55:0.81"] = 509, -- Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72:0.50:0.75"] = 371, -- Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil, Lakeshire + ["0.51:0.47:0.53:0.61:0.47:0.65:0.52:0.72"] = 339, -- Refuge Pointe, Thelsamar, Thorium Point, Morgan's Vigil + ["0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73"] = 373, -- Refuge Pointe, Thelsamar, Thorium Point, Stormwind + ["0.51:0.47:0.53:0.61:0.47:0.65"] = 249, -- Refuge Pointe, Thelsamar, Thorium Point + ["0.51:0.47:0.53:0.61"] = 171, -- Refuge Pointe, Thelsamar + ["0.51:0.47:0.47:0.59"] = 270, -- Refuge Pointe, Ironforge (David R reported 301) + ["0.51:0.47:0.45:0.56"] = 126, -- Refuge Pointe, Menethil Harbor + ["0.51:0.47:0.44:0.45"] = 87, -- Refuge Pointe, Southshore + ["0.51:0.47:0.50:0.42"] = 72, -- Refuge Pointe, Aerie Peak + ["0.51:0.47:0.50:0.42:0.48:0.39"] = 123, -- Refuge Pointe, Aerie Peak, Chillwind Camp + ["0.51:0.47:0.50:0.42:0.61:0.35"] = 233, -- Refuge Pointe, Aerie Peak, Light's Hope Chapel + ["0.51:0.47:0.45:0.56:0.47:0.59:0.41:0.73:0.41:0.93"] = 570, -- Refuge Pointe, Menethil Harbor, Ironforge, Stormwind, Booty Bay + ["0.51:0.47:0.45:0.56:0.47:0.59:0.41:0.73"] = 386, -- Refuge Pointe, Menethil Harbor, Ironforge, Stormwind + ["0.51:0.47:0.45:0.56:0.47:0.59:0.41:0.73:0.39:0.80"] = 449, -- Refuge Pointe, Menethil Harbor, Ironforge, Stormwind, Sentinel Hill + ["0.51:0.47:0.47:0.59:0.41:0.73"] = 440, -- Refuge Pointe, Ironforge, Stormwind + ["0.51:0.47:0.45:0.56:0.47:0.59:0.41:0.73:0.47:0.79"] = 488, -- Refuge Pointe, Menethil Harbor, Ironforge, Stormwind, Darkshire + ["0.51:0.47:0.45:0.56:0.47:0.59:0.41:0.73:0.43:0.82"] = 464, -- Refuge Pointe, Menethil Harbor, Ironforge, Stormwind, Rebel Camp + ["0.51:0.47:0.45:0.56:0.47:0.59:0.41:0.73:0.55:0.81"] = 548, -- Refuge Pointe, Menethil Harbor, Ironforge, Stormwind, Nethergarde Keep + ["0.51:0.47:0.45:0.56:0.47:0.59:0.41:0.73:0.50:0.75"] = 484, -- Refuge Pointe, Menethil Harbor, Ironforge, Stormwind, Lakeshire + ["0.51:0.47:0.50:0.42:0.61:0.35:0.58:0.06"] = 569, -- Refuge Pointe, Aerie Peak, Light's Hope Chapel, Shattered Sun Staging Area + ["0.51:0.47:0.44:0.45:0.48:0.39"] = 166, -- Refuge Pointe, Southshore, Chillwind Camp + ["0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.47:0.79"] = 475, -- Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Darkshire + ["0.51:0.47:0.50:0.42:0.61:0.35:0.61:0.28"] = 332, -- Refuge Pointe, Aerie Peak, Light's Hope Chapel, Zul'Aman + ["0.51:0.47:0.50:0.42:0.48:0.39:0.51:0.36"] = 175, -- Refuge Pointe, Aerie Peak, Chillwind Camp, Thondroril River + ["0.51:0.47:0.50:0.42:0.61:0.35:0.62:0.34"] = 302, -- Refuge Pointe, Aerie Peak, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73:0.55:0.81"] = 536, -- Refuge Pointe, Thelsamar, Thorium Point, Stormwind, Nethergarde Keep + ["0.51:0.47:0.47:0.59:0.48:0.39"] = 477, -- Refuge Pointe, Ironforge, Chillwind Camp + ["0.51:0.47:0.47:0.59:0.41:0.73:0.39:0.80"] = 503, -- Refuge Pointe, Ironforge, Stormwind, Sentinel Hill + ["0.51:0.47:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 554, -- Refuge Pointe, Menethil Harbor, Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.51:0.47:0.44:0.45:0.48:0.39:0.51:0.36"] = 216, -- Die Zuflucht, Süderstade, Zugwindlager, Thondroril + ["0.51:0.47:0.47:0.59:0.41:0.73:0.41:0.93"] = 624, -- Refuge Pointe, Ironforge, Stormwind, Booty Bay + + -- Alliance: Sentinel Hill (Westfall) + ["0.39:0.80:0.41:0.93"] = 185, -- Sentinel Hill, Booty Bay + ["0.39:0.80:0.43:0.82"] = 62, -- Sentinel Hill, Rebel Camp + ["0.39:0.80:0.47:0.79:0.55:0.81"] = 186, -- Sentinel Hill, Darkshire, Nethergarde Keep + ["0.39:0.80:0.47:0.79"] = 97, -- Sentinel Hill, Darkshire + ["0.39:0.80:0.50:0.75"] = 130, -- Sentinel Hill, Lakeshire + ["0.39:0.80:0.50:0.75:0.52:0.72"] = 190, -- Sentinel Hill, Lakeshire, Morgan's Vigil + ["0.39:0.80:0.41:0.73"] = 86, -- Sentinel Hill, Stormwind + ["0.39:0.80:0.41:0.73:0.47:0.65"] = 205, -- Sentinel Hill, Stormwind, Thorium Point + ["0.39:0.80:0.41:0.73:0.47:0.65:0.53:0.61"] = 284, -- Sentinel Hill, Stormwind, Thorium Point, Thelsamar + ["0.39:0.80:0.41:0.73:0.47:0.59"] = 288, -- Sentinel Hill, Stormwind, Ironforge + ["0.39:0.80:0.41:0.73:0.47:0.59:0.45:0.56"] = 358, -- Sentinel Hill, Stormwind, Ironforge, Menethil Harbor + ["0.39:0.80:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47"] = 447, -- Sentinel Hill, Stormwind, Thorium Point, Thelsamar, Refuge Pointe + ["0.39:0.80:0.41:0.73:0.47:0.59:0.44:0.45"] = 460, -- Sentinel Hill, Stormwind, Ironforge, Southshore + ["0.39:0.80:0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 518, -- Sentinel Hill, Stormwind, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak (Originally 376 but Norman Kustov and William reported 518) + ["0.39:0.80:0.41:0.73:0.47:0.59:0.48:0.39"] = 501, -- Sentinel Hill, Stormwind, Ironforge, Chillwind Camp (changed to 501 by veri and Cary Rodgers, was 555) + ["0.39:0.80:0.41:0.73:0.47:0.59:0.61:0.35"] = 595, -- Sentinel Hill, Stormwind, Ironforge, Light's Hope Chapel + ["0.39:0.80:0.41:0.73:0.47:0.59:0.53:0.61"] = 346, -- Sentinel Hill, Stormwind, Ironforge, Thelsamar + ["0.39:0.80:0.41:0.73:0.47:0.59:0.61:0.35:0.61:0.28"] = 693, -- Sentinel Hill, Stormwind, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.39:0.80:0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 519, -- Sentinel Hill, Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.39:0.80:0.41:0.73:0.47:0.59:0.51:0.47"] = 449, -- Sentinel Hill, Stormwind, Ironforge, Refuge Pointe + ["0.39:0.80:0.41:0.73:0.47:0.59:0.58:0.06"] = 352, -- Sentinel Hill, Stormwind, Ironforge, Shattered Sun Staging Area + ["0.39:0.80:0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 554, -- Sentinel Hill, Stormwind, Ironforge, Chillwind Camp, Thondroril River + ["0.39:0.80:0.41:0.73:0.47:0.59:0.61:0.35:0.62:0.34"] = 661, -- Sentinel Hill, Stormwind, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + + -- Alliance: Shattered Sun Staging Area (Isle of Quel'Danas) + ["0.58:0.06:0.61:0.35"] = 324, -- Shattered Sun Staging Area, Light's Hope Chapel + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73"] = 849, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind + ["0.58:0.06:0.61:0.35:0.48:0.39"] = 470, -- Shattered Sun Staging Area, Light's Hope Chapel, Chillwind Camp + ["0.58:0.06:0.61:0.35:0.47:0.59"] = 690, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge + ["0.58:0.06:0.61:0.35:0.50:0.42"] = 483, -- Shattered Sun Staging Area, Light's Hope Chapel, Aerie Peak + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 1033, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72"] = 822, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 991, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 912, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 928, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 912, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65"] = 738, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 854, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.58:0.06:0.61:0.35:0.50:0.42:0.51:0.47"] = 553, -- Shattered Sun Staging Area, Light's Hope Chapel, Aerie Peak, Refuge Pointe + ["0.58:0.06:0.61:0.35:0.50:0.42:0.51:0.47:0.53:0.61"] = 723, -- Shattered Sun Staging Area, Light's Hope Chapel, Aerie Peak, Refuge Pointe, Thelsamar + ["0.58:0.06:0.61:0.35:0.50:0.42:0.44:0.45"] = 545, -- Shattered Sun Staging Area, Light's Hope Chapel, Aerie Peak, Southshore + ["0.58:0.06:0.61:0.35:0.50:0.42:0.44:0.45:0.45:0.56"] = 653, -- Shattered Sun Staging Area, Light's Hope Chapel, Aerie Peak, Southshore, Menethil Harbor (Bilegt reported 670) + ["0.58:0.06:0.61:0.28"] = 233, -- Shattered Sun Staging Area, Zul'Aman (Yunus Gürbüz reported 242 but my own testing shows 233) (Will Hausenfluck reported 134) + ["0.58:0.06:0.61:0.35:0.47:0.59:0.41:0.73"] = 864, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Stormwind + ["0.58:0.06:0.61:0.35:0.47:0.59:0.41:0.73:0.55:0.81"] = 1027, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Stormwind, Nethergarde Keep + ["0.58:0.06:0.61:0.35:0.47:0.59:0.41:0.73:0.47:0.79"] = 965, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Stormwind, Darkshire + ["0.58:0.06:0.61:0.35:0.51:0.36"] = 424, -- Shattered Sun Staging Area, Light's Hope Chapel, Thondroril River + ["0.58:0.06:0.61:0.35:0.47:0.59:0.41:0.73:0.41:0.93"] = 1050, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Stormwind, Booty Bay + ["0.58:0.06:0.61:0.35:0.48:0.39:0.44:0.45:0.45:0.56"] = 680, -- Shattered Sun Staging Area, Light's Hope Chapel, Chillwind Camp, Southshore, Menethil Harbor + ["0.58:0.06:0.61:0.35:0.48:0.39:0.44:0.45"] = 547, -- Shattered Sun Staging Area, Light's Hope Chapel, Chillwind Camp, Southshore + ["0.58:0.06:0.61:0.35:0.62:0.34"] = 392, -- Shattered Sun Staging Area, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.58:0.06:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.47:0.79"] = 952, -- Shattered Sun Staging Area, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Darkshire + + -- Alliance: Southshore (Hillsbrad Foothills) + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 539, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Stormwind, Booty Bay (was 597, changed by Daniel Hoedt and Robert Keller) + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 430, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 433, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 417, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 496, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 359, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.52:0.72"] = 327, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Morgan's Vigil + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73"] = 354, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Stormwind + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65"] = 243, -- Southshore, Menethil Harbor, Ironforge, Thorium Point + ["0.44:0.45:0.51:0.47:0.53:0.61"] = 244, -- Southshore, Refuge Pointe, Thelsamar + ["0.44:0.45:0.47:0.59"] = 207, -- Southshore, Ironforge + ["0.44:0.45:0.45:0.56"] = 110, -- Southshore, Menethil Harbor + ["0.44:0.45:0.51:0.47"] = 74, -- Southshore, Refuge Pointe + ["0.44:0.45:0.50:0.42"] = 71, -- Southshore, Aerie Peak + ["0.44:0.45:0.48:0.39"] = 81, -- Southshore, Chillwind Camp (Will Hausenfluck reported 44) + ["0.44:0.45:0.48:0.39:0.61:0.35"] = 219, -- Southshore, Chillwind Camp, Light's Hope Chapel + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73"] = 370, -- Southshore, Menethil Harbor, Ironforge, Stormwind + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.55:0.81"] = 517, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Stormwind, Nethergarde Keep + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73:0.41:0.93"] = 554, -- Southshore, Menethil Harbor, Ironforge, Stormwind, Booty Bay + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73:0.43:0.82"] = 449, -- Southshore, Menethil Harbor, Ironforge, Stormwind, Rebel Camp + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73:0.39:0.80"] = 433, -- Southshore, Menethil Harbor, Ironforge, Stormwind, Sentinel Hill + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73:0.50:0.75"] = 468, -- Southshore, Menethil Harbor, Ironforge, Stormwind, Lakeshire + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73:0.47:0.79"] = 472, -- Southshore, Menethil Harbor, Ironforge, Stormwind, Darkshire + ["0.44:0.45:0.48:0.39:0.61:0.35:0.58:0.06"] = 555, -- Southshore, Chillwind Camp, Light's Hope Chapel, Shattered Sun Staging Area + ["0.44:0.45:0.48:0.39:0.61:0.35:0.61:0.28"] = 318, -- Southshore, Chillwind Camp, Light's Hope Chapel, Zul'Aman + ["0.44:0.45:0.45:0.56:0.53:0.61"] = 273, -- Southshore, Menethil Harbor, Thelsamar + ["0.44:0.45:0.47:0.59:0.41:0.73"] = 373, -- Southshore, Ironforge, Stormwind + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73:0.55:0.81"] = 532, -- Southshore, Menethil Harbor, Ironforge, Stormwind, Nethergarde Keep + ["0.44:0.45:0.47:0.59:0.41:0.73:0.50:0.75"] = 471, -- Southshore, Ironforge, Stormwind, Lakeshire + ["0.44:0.45:0.48:0.39:0.51:0.36"] = 131, -- Southshore, Chillwind Camp, Thondroril River + ["0.44:0.45:0.48:0.39:0.61:0.35:0.62:0.34"] = 286, -- Southshore, Chillwind Camp, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.44:0.45:0.45:0.56:0.47:0.59:0.41:0.73:0.52:0.72"] = 508, -- Southshore, Menethil Harbor, Ironforge, Stormwind, Morgan's Vigil + ["0.44:0.45:0.47:0.59:0.41:0.73:0.43:0.82"] = 451, -- Southshore, Ironforge, Stormwind, Rebel Camp + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.50:0.75"] = 453, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Stormwind, Lakeshire + ["0.44:0.45:0.45:0.56:0.47:0.59:0.58:0.06"] = 263, -- Southshore, Menethil Harbor, Ironforge, Shattered Sun Staging Area + ["0.44:0.45:0.45:0.56:0.47:0.59:0.47:0.65:0.41:0.73:0.47:0.79"] = 457, -- Southshore, Menethil Harbor, Ironforge, Thorium Point, Stormwind, Darkshire + ["0.44:0.45:0.51:0.47:0.53:0.61:0.47:0.65:0.41:0.73"] = 447, -- Southshore, Refuge Pointe, Thelsamar, Thorium Point, Stormwind + ["0.44:0.45:0.47:0.59:0.53:0.61"] = 262, -- Southshore, Ironforge, Thelsamar + ["0.44:0.45:0.47:0.59:0.41:0.73:0.39:0.80"] = 436, -- Southshore, Ironforge, Stormwind, Sentinel Hill + ["0.44:0.45:0.47:0.59:0.41:0.73:0.41:0.93"] = 557, -- Southshore, Ironforge, Stormwind, Booty Bay + ["0.44:0.45:0.50:0.42:0.61:0.35:0.51:0.36"] = 332, -- Southshore, Aerie Peak, Light's Hope Chapel, Thondoril River + + -- Alliance: Stormwind (Elwynn Forest) + ["0.41:0.73:0.41:0.93"] = 200, -- Stormwind, Booty Bay + ["0.41:0.73:0.55:0.81"] = 176, -- Stormwind, Nethergarde Keep + ["0.41:0.73:0.43:0.82"] = 93, -- Stormwind, Rebel Camp + ["0.41:0.73:0.39:0.80"] = 78, -- Stormwind, Sentinel Hill + ["0.41:0.73:0.47:0.79"] = 116, -- Stormwind, Darkshire + ["0.41:0.73:0.50:0.75"] = 113, -- Stormwind, Lakeshire + ["0.41:0.73:0.52:0.72"] = 157, -- Stormwind, Morgan's Vigil + ["0.41:0.73:0.47:0.65"] = 133, -- Stormwind, Thorium Point + ["0.41:0.73:0.47:0.65:0.53:0.61"] = 212, -- Stormwind, Thorium Point, Thelsamar + ["0.41:0.73:0.47:0.59"] = 216, -- Stormwind, Ironforge + ["0.41:0.73:0.47:0.59:0.45:0.56"] = 286, -- Stormwind, Ironforge, Menethil Harbor + ["0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47"] = 375, -- Stormwind, Thorium Point, Thelsamar, Refuge Pointe + ["0.41:0.73:0.47:0.59:0.44:0.45"] = 387, -- Stormwind, Ironforge, Southshore + ["0.41:0.73:0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 446, -- Stormwind, Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak + ["0.41:0.73:0.47:0.59:0.48:0.39"] = 429, -- Stormwind, Ironforge, Chillwind Camp + ["0.41:0.73:0.47:0.59:0.61:0.35"] = 523, -- Stormwind, Ironforge, Light's Hope Chapel + ["0.41:0.73:0.47:0.59:0.61:0.35:0.61:0.28"] = 621, -- Stormwind, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.41:0.73:0.47:0.59:0.53:0.61"] = 274, -- Stormwind, Ironforge, Thelsamar + ["0.41:0.73:0.47:0.59:0.51:0.47"] = 377, -- Stormwind, Ironforge, Refuge Pointe + ["0.41:0.73:0.47:0.59:0.50:0.42:0.44:0.45"] = 497, -- Stormwind, Ironforge, Aerie Peak, Southshore + ["0.41:0.73:0.47:0.59:0.50:0.42"] = 464, -- Stormwind, Ironforge, Aerie Peak (was 304, changed by Jesper to 464) + ["0.41:0.73:0.47:0.59:0.50:0.42:0.48:0.39"] = 484, -- Stormwind, Ironforge, Aerie Peak, Chillwind Camp + ["0.41:0.73:0.47:0.59:0.51:0.47:0.50:0.42"] = 448, -- Stormwind, Ironforge, Refuge Pointe, Aerie Peak + ["0.41:0.73:0.47:0.59:0.58:0.06"] = 281, -- Stormwind, Ironforge, Shattered Sun Staging Area + ["0.41:0.73:0.47:0.59:0.44:0.45:0.50:0.42"] = 457, -- Stormwind, Ironforge, Southshore, Aerie Peak + ["0.41:0.73:0.47:0.59:0.48:0.39:0.51:0.36"] = 482, -- Stormwind, Ironforge, Chillwind Camp, Thondroril River + ["0.41:0.73:0.47:0.59:0.61:0.35:0.62:0.34"] = 589, -- Stormwind, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + + -- Alliance: Thelsamar (Loch Modan) + ["0.53:0.61:0.47:0.65:0.41:0.73:0.41:0.93"] = 390, -- Thelsamar, Thorium Point, Stormwind, Booty Bay + ["0.53:0.61:0.47:0.65:0.41:0.73:0.43:0.82"] = 284, -- Thelsamar, Thorium Point, Stormwind, Rebel Camp + ["0.53:0.61:0.47:0.65:0.41:0.73:0.39:0.80"] = 269, -- Thelsamar, Thorium Point, Stormwind, Sentinel Hill + ["0.53:0.61:0.47:0.65:0.41:0.73"] = 206, -- Thelsamar, Thorium Point, Stormwind + ["0.53:0.61:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 262, -- Thelsamar, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.53:0.61:0.47:0.65:0.52:0.72:0.55:0.81"] = 341, -- Thelsamar, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.53:0.61:0.47:0.65:0.52:0.72:0.50:0.75"] = 204, -- Thelsamar, Thorium Point, Morgan's Vigil, Lakeshire + ["0.53:0.61:0.47:0.65:0.52:0.72"] = 172, -- Thelsamar, Thorium Point, Morgan's Vigil + ["0.53:0.61:0.47:0.65"] = 82, -- Thelsamar, Thorium Point + ["0.53:0.61:0.47:0.59"] = 109, -- Thelsamar, Ironforge + ["0.53:0.61:0.45:0.56"] = 153, -- Thelsamar, Menethil Harbor + ["0.53:0.61:0.51:0.47"] = 164, -- Thelsamar, Refuge Pointe + ["0.53:0.61:0.51:0.47:0.44:0.45"] = 250, -- Thelsamar, Refuge Pointe, Southshore + ["0.53:0.61:0.51:0.47:0.50:0.42"] = 235, -- Thelsamar, Refuge Pointe, Aerie Peak + ["0.53:0.61:0.51:0.47:0.50:0.42:0.48:0.39"] = 285, -- Thelsamar, Refuge Pointe, Aerie Peak, Chillwind Camp + ["0.53:0.61:0.51:0.47:0.50:0.42:0.61:0.35"] = 396, -- Thelsamar, Refuge Pointe, Aerie Peak, Light's Hope Chapel + ["0.53:0.61:0.47:0.59:0.41:0.73:0.39:0.80"] = 340, -- Thelsamar, Ironforge, Stormwind, Sentinel Hill + ["0.53:0.61:0.47:0.59:0.41:0.73"] = 277, -- Thelsamar, Ironforge, Stormwind + ["0.53:0.61:0.51:0.47:0.50:0.42:0.61:0.35:0.61:0.28"] = 495, -- Thelsamar, Refuge Pointe, Aerie Peak, Light's Hope Chapel, Zul'Aman + ["0.53:0.61:0.47:0.59:0.41:0.73:0.47:0.79"] = 379, -- Thelsamar, Ironforge, Stormwind, Darkshire + ["0.53:0.61:0.47:0.59:0.41:0.73:0.50:0.75"] = 376, -- Thelsamar, Ironforge, Stormwind, Lakeshire + ["0.53:0.61:0.47:0.59:0.41:0.73:0.43:0.82"] = 355, -- Thelsamar, Ironforge, Stormwind, Rebel Camp + ["0.53:0.61:0.47:0.59:0.41:0.73:0.41:0.93"] = 461, -- Thelsamar, Ironforge, Stormwind, Booty Bay + ["0.53:0.61:0.47:0.59:0.58:0.06"] = 175, -- Thelsamar, Ironforge, Shattered Sun Staging Area + ["0.53:0.61:0.47:0.65:0.41:0.73:0.47:0.79"] = 307, -- Thelsamar, Thorium Point, Stormwind, Darkshire + ["0.53:0.61:0.47:0.59:0.41:0.73:0.55:0.81"] = 440, -- Thelsamar, Ironforge, Stormwind, Nethergarde Keep + ["0.53:0.61:0.47:0.65:0.41:0.73:0.55:0.81"] = 368, -- Thelsamar, Thorium Point, Stormwind, Nethergarde Keep + ["0.53:0.61:0.51:0.47:0.44:0.45:0.48:0.39"] = 329, -- Thelsamar, Refuge Pointe, Southshore, Chillwind Camp + ["0.53:0.61:0.51:0.47:0.50:0.42:0.48:0.39:0.51:0.36"] = 339, -- Thelsamar, Refuge Pointe, Aerie Peak, Chillwind Camp, Thondroril River + ["0.53:0.61:0.51:0.47:0.50:0.42:0.61:0.35:0.62:0.34"] = 465, -- Thelsamar, Refuge Pointe, Aerie Peak, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.53:0.61:0.45:0.56:0.44:0.45"] = 254, -- Thelsamar, Menethil Harbor, Southshore + ["0.53:0.61:0.51:0.47:0.44:0.45:0.48:0.39:0.51:0.36"] = 379, -- Thelsamar, Refuge Pointe, Southshore, Chillwind Camp, Thondoril River + ["0.53:0.61:0.47:0.59:0.41:0.73:0.52:0.72"] = 416, -- Thelsamar, Ironforge, Stormwind, Morgan's Vigil + ["0.53:0.61:0.45:0.56:0.44:0.45:0.50:0.42"] = 323, -- Thelsamar, Menethil Harbor, Southshore, Aerie Peak + ["0.53:0.61:0.47:0.65:0.41:0.73:0.50:0.75"] = 304, -- Thelsamar, Thorium Point, Stormwind, Lakeshire + ["0.53:0.61:0.47:0.59:0.48:0.39"] = 319, -- Thelsamar, Ironforge, Chillwind Camp + + -- Alliance: Thondroril River (Western Plaguelands) + ["0.51:0.36:0.48:0.39:0.50:0.42"] = 123, -- Thondroril River, Chillwind Camp, Aerie Peak + ["0.51:0.36:0.48:0.39"] = 59, -- Thondroril River, Chillwind Camp + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 655, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 550, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72"] = 443, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil + ["0.51:0.36:0.48:0.39:0.44:0.45"] = 135, -- Thondroril River, Chillwind Camp, Southshore + ["0.51:0.36:0.48:0.39:0.50:0.42:0.51:0.47:0.53:0.61"] = 365, -- Thondroril River, Chillwind Camp, Aerie Peak, Refuge Pointe, Thelsamar + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 613, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.51:0.36:0.61:0.35:0.58:0.06"] = 433, -- Thondroril River, Light's Hope Chapel, Shattered Sun Staging Area + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73"] = 471, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Stormwind + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 534, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 534, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65"] = 359, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 476, -- Thondroril River, Chillwind Camp, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.51:0.36:0.48:0.39:0.47:0.59"] = 312, -- Thondroril River, Chillwind Camp, Ironforge + ["0.51:0.36:0.48:0.39:0.44:0.45:0.45:0.56"] = 242, -- Thondroril River, Chillwind Camp, Southshore, Menethil Harbor + ["0.51:0.36:0.48:0.39:0.50:0.42:0.51:0.47"] = 195, -- Thondroril River, Chillwind Camp, Aerie Peak, Refuge Pointe + ["0.51:0.36:0.61:0.35"] = 98, -- Thondroril River, Light's Hope Chapel (Sexy Steven reported 27) + ["0.51:0.36:0.61:0.35:0.61:0.28"] = 197, -- Thondroril River, Light's Hope Chapel, Zul'Aman + ["0.51:0.36:0.61:0.35:0.62:0.34"] = 165, -- Thondoril River, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.51:0.36:0.48:0.39:0.47:0.59:0.47:0.65:0.41:0.73:0.55:0.81"] = 634, -- Thondoril River, Chillwind Camp, Ironforge, Thorium Point, Stormwind, Nethergarde Keep + ["0.51:0.36:0.48:0.39:0.44:0.45:0.51:0.47"] = 206, -- Thondoril River, Chillwind Camp, Southshore, Refuge Pointe + ["0.51:0.36:0.48:0.39:0.47:0.59:0.41:0.73"] = 485, -- Thondoril River, Chillwind Camp, Ironforge, Stormwind + ["0.51:0.36:0.48:0.39:0.47:0.59:0.41:0.73:0.41:0.93"] = 669, -- Thondoril River, Chillwind Camp, Ironforge, Stormwind, Booty Bay + ["0.51:0.36:0.48:0.39:0.47:0.59:0.41:0.73:0.47:0.79"] = 587, -- Thondroril, Zugwindlager, Eisenschmiede, Sturmwind, Dunkelhain + + -- Alliance: Thorium Point (Searing Gorge) + ["0.47:0.65:0.41:0.73:0.41:0.93"] = 310, -- Thorium Point, Stormwind, Booty Bay + ["0.47:0.65:0.41:0.73:0.43:0.82"] = 206, -- Thorium Point, Stormwind, Rebel Camp + ["0.47:0.65:0.41:0.73:0.39:0.80"] = 190, -- Thorium Point, Stormwind, Sentinel Hill + ["0.47:0.65:0.41:0.73"] = 126, -- Thorium Point, Stormwind + ["0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 181, -- Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.47:0.65:0.52:0.72:0.55:0.81"] = 260, -- Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.47:0.65:0.52:0.72:0.50:0.75"] = 122, -- Thorium Point, Morgan's Vigil, Lakeshire + ["0.47:0.65:0.52:0.72"] = 90, -- Thorium Point, Morgan's Vigil + ["0.47:0.65:0.53:0.61"] = 88, -- Thorium Point, Thelsamar + ["0.47:0.65:0.47:0.59"] = 94, -- Thorium Point, Ironforge + ["0.47:0.65:0.47:0.59:0.45:0.56"] = 159, -- Thorium Point, Ironforge, Menethil Harbor + ["0.47:0.65:0.53:0.61:0.51:0.47"] = 251, -- Thorium Point, Thelsamar, Refuge Pointe + ["0.47:0.65:0.47:0.59:0.44:0.45"] = 261, -- Thorium Point, Ironforge, Southshore (was 370, changed by Yannick Jacoby) + ["0.47:0.65:0.53:0.61:0.51:0.47:0.50:0.42"] = 323, -- Thorium Point, Thelsamar, Refuge Pointe, Aerie Peak + ["0.47:0.65:0.47:0.59:0.48:0.39"] = 302, -- Thorium Point, Ironforge, Chillwind Camp + ["0.47:0.65:0.47:0.59:0.61:0.35"] = 398, -- Thorium Point, Ironforge, Light's Hope Chapel + ["0.47:0.65:0.47:0.59:0.61:0.35:0.61:0.28"] = 495, -- Thorium Point, Ironforge, Light's Hope Chapel, Zul'Aman + ["0.47:0.65:0.41:0.73:0.47:0.79"] = 228, -- Thorium Point, Stormwind, Darkshire + ["0.47:0.65:0.41:0.73:0.55:0.81"] = 289, -- Thorium Point, Stormwind, Nethergarde Keep + ["0.47:0.65:0.41:0.73:0.50:0.75"] = 224, -- Thorium Point, Stormwind, Lakeshire + ["0.47:0.65:0.47:0.59:0.58:0.06"] = 155, -- Thorium Point, Ironforge, Shattered Sun Staging Area + ["0.47:0.65:0.47:0.59:0.48:0.39:0.51:0.36"] = 355, -- Thorium Point, Ironforge, Chillwind Camp, Thondroril River + ["0.47:0.65:0.47:0.59:0.61:0.35:0.62:0.34"] = 463, -- Thorium Point, Ironforge, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.47:0.65:0.47:0.59:0.44:0.45:0.50:0.42"] = 330, -- Thorium Point, Ironforge, Southshore, Aerie Peak + ["0.47:0.65:0.47:0.59:0.51:0.47:0.50:0.42"] = 322, -- Thoriumspitze, Eisenschmiede, Die Zuflucht, Nistgipfel + ["0.47:0.65:0.47:0.59:0.51:0.47"] = 250, -- Thorium Point, Ironforge, Refuge Pointe + + -- Alliance: Zul'Aman (Ghostlands) + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73"] = 631, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind + ["0.61:0.28:0.61:0.35:0.47:0.59"] = 473, -- Zul'Aman, Light's Hope Chapel, Ironforge + ["0.61:0.28:0.61:0.35"] = 107, -- Zul'Aman, Light's Hope Chapel + ["0.61:0.28:0.61:0.35:0.50:0.42:0.44:0.45"] = 328, -- Zul'Aman, Light's Hope Chapel, Aerie Peak, Southshore + ["0.61:0.28:0.61:0.35:0.48:0.39"] = 253, -- Zul'Aman, Light's Hope Chapel, Chillwind Camp + ["0.61:0.28:0.61:0.35:0.50:0.42:0.51:0.47"] = 337, -- Zul'Aman, Light's Hope Chapel, Aerie Peak, Refuge Pointe + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75:0.47:0.79"] = 696, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire, Darkshire + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.43:0.82"] = 710, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Rebel Camp + ["0.61:0.28:0.61:0.35:0.50:0.42:0.44:0.45:0.45:0.56"] = 436, -- Zul'Aman, Light's Hope Chapel, Aerie Peak, Southshore, Menethil Harbor + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.55:0.81"] = 775, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Nethergarde Keep + ["0.61:0.28:0.61:0.35:0.50:0.42"] = 266, -- Zul'Aman, Light's Hope Chapel, Aerie Peak + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.41:0.93"] = 818, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Booty Bay + ["0.61:0.28:0.61:0.35:0.50:0.42:0.51:0.47:0.53:0.61"] = 506, -- Zul'Aman, Light's Hope Chapel, Aerie Peak, Refuge Pointe, Thelsamar + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72:0.50:0.75"] = 637, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil, Lakeshire + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.52:0.72"] = 605, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Morgan's Vigil + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65:0.41:0.73:0.39:0.80"] = 695, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point, Stormwind, Sentinel Hill + ["0.61:0.28:0.58:0.06"] = 252, -- Zul'Aman, Shattered Sun Staging Area + ["0.61:0.28:0.61:0.35:0.47:0.59:0.47:0.65"] = 521, -- Zul'Aman, Light's Hope Chapel, Ironforge, Thorium Point + ["0.61:0.28:0.61:0.35:0.47:0.59:0.41:0.73:0.55:0.81"] = 809, -- Zul'Aman, Light's Hope Chapel, Ironforge, Stormwind, Nethergarde Keep + ["0.61:0.28:0.61:0.35:0.47:0.59:0.41:0.73"] = 647, -- Zul'Aman, Light's Hope Chapel, Ironforge, Stormwind + ["0.61:0.28:0.61:0.35:0.62:0.34"] = 175, -- Zul'Aman, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.61:0.28:0.61:0.35:0.51:0.36"] = 207, -- Zul'Aman, Light's Hope Chapel, Thondoril River + + }, + + -- Alliance: Kalimdor + [1414] = { + + -- Alliance: Blood Watch (Bloodmyst Isle) + ["0.22:0.18:0.21:0.26"] = 77, -- Blood Watch, The Exodar (Nick Bijl reported 110) + + -- Alliance: The Exodar (The Exodar) + ["0.21:0.26:0.22:0.18"] = 77, -- The Exodar, Blood Watch + + -- Alliance: Astranaar (Ashenvale) + ["0.46:0.40:0.39:0.40:0.40:0.51:0.31:0.69"] = 511, -- Astranaar, Stonetalon Peak, Nijel's Point, Feathermoon + ["0.46:0.40:0.61:0.55:0.60:0.81:0.42:0.79"] = 631, -- Astranaar, Ratchet, Gadgetzan, Cenarion Hold + ["0.46:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 538, -- Astranaar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.46:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 457, -- Astranaar, Ratchet, Theramore, Thalanaar + ["0.46:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 357, -- Astranaar, Ratchet, Theramore, Mudsprocket + ["0.46:0.40:0.64:0.67"] = 388, -- Astranaar, Theramore + ["0.46:0.40:0.61:0.55:0.60:0.81"] = 434, -- Astranaar, Ratchet, Gadgetzan + ["0.46:0.40:0.61:0.55"] = 194, -- Astranaar, Ratchet + ["0.46:0.40:0.39:0.40:0.40:0.51"] = 279, -- Astranaar, Stonetalon Peak, Nijel's Point + ["0.46:0.40:0.39:0.40"] = 153, -- Astranaar, Stonetalon Peak + ["0.46:0.40:0.61:0.40"] = 148, -- Astranaar, Talrendis Point + ["0.46:0.40:0.58:0.39"] = 134, -- Astranaar, Forest Song + ["0.46:0.40:0.50:0.35"] = 79, -- Astranaar, Emerald Sanctuary + ["0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 296, -- Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.46:0.40:0.50:0.35:0.53:0.26"] = 206, -- Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.46:0.40:0.50:0.35:0.53:0.26:0.55:0.21"] = 265, -- Astranaar, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.46:0.40:0.43:0.25"] = 149, -- Astranaar, Auberdine + ["0.46:0.40:0.43:0.25:0.42:0.16"] = 233, -- Astranaar, Auberdine, Rut'theran Village + ["0.46:0.40:0.43:0.25:0.53:0.26"] = 338, -- Astranaar, Auberdine, Talonbranch Glade + ["0.46:0.40:0.43:0.25:0.40:0.51"] = 440, -- Astranaar, Auberdine, Nijel's Point + ["0.46:0.40:0.61:0.40:0.65:0.23"] = 327, -- Astranaar, Talrendis Point, Everlook + ["0.46:0.40:0.43:0.25:0.31:0.69"] = 621, -- Astranaar, Auberdine, Feathermoon + ["0.46:0.40:0.39:0.40:0.40:0.51:0.31:0.69:0.48:0.70"] = 666, -- Astranaar, Stonetalon Peak, Nijel's Point, Feathermoon, Thalanaar + ["0.46:0.40:0.43:0.25:0.53:0.26:0.65:0.23"] = 427, -- Astranaar, Auberdine, Talonbranch Glade, Everlook + ["0.46:0.40:0.64:0.67:0.48:0.70"] = 551, -- Astranaar, Theramore, Thalanaar + ["0.46:0.40:0.43:0.25:0.55:0.21"] = 300, -- Astranaar, Auberdine, Moonglade + ["0.46:0.40:0.64:0.67:0.60:0.81"] = 545, -- Astranaar, Theramore, Gadgetzan + + -- Alliance: Auberdine (Darkshore) + ["0.43:0.25:0.31:0.69"] = 473, -- Auberdine, Feathermoon + ["0.43:0.25:0.31:0.69:0.42:0.79"] = 623, -- Auberdine, Feathermoon, Cenarion Hold + ["0.43:0.25:0.64:0.67:0.60:0.81:0.50:0.76"] = 700, -- Auberdine, Theramore, Gadgetzan, Marshal's Refuge + ["0.43:0.25:0.64:0.67:0.48:0.70"] = 602, -- Auberdine, Theramore, Thalanaar + ["0.43:0.25:0.64:0.67:0.58:0.70"] = 503, -- Auberdine, Theramore, Mudsprocket + ["0.43:0.25:0.64:0.67"] = 443, -- Auberdine, Theramore + ["0.43:0.25:0.64:0.67:0.60:0.81"] = 596, -- Auberdine, Theramore, Gadgetzan + ["0.43:0.25:0.46:0.40:0.61:0.55"] = 361, -- Auberdine, Astranaar, Ratchet + ["0.43:0.25:0.40:0.51"] = 291, -- Auberdine, Nijel's Point + ["0.43:0.25:0.39:0.40"] = 181, -- Auberdine, Stonetalon Peak + ["0.43:0.25:0.46:0.40"] = 168, -- Auberdine, Astranaar + ["0.43:0.25:0.46:0.40:0.50:0.35"] = 246, -- Auberdine, Astranaar, Emerald Sanctuary + ["0.43:0.25:0.46:0.40:0.58:0.39"] = 302, -- Auberdine, Astranaar, Forest Song + ["0.43:0.25:0.61:0.40"] = 300, -- Auberdine, Talrendis Point + ["0.43:0.25:0.55:0.21:0.65:0.23"] = 270, -- Auberdine, Moonglade, Everlook + ["0.43:0.25:0.53:0.26"] = 190, -- Auberdine, Talonbranch Glade + ["0.43:0.25:0.55:0.21"] = 151, -- Auberdine, Moonglade + ["0.43:0.25:0.42:0.16"] = 84, -- Auberdine, Rut'theran Village + ["0.43:0.25:0.53:0.26:0.65:0.23"] = 279, -- Auberdine, Talonbranch Glade, Everlook + ["0.43:0.25:0.31:0.69:0.48:0.70"] = 627, -- Auberdine, Feathermoon, Thalanaar + ["0.43:0.25:0.64:0.67:0.61:0.55"] = 552, -- Auberdine, Theramore, Ratchet + ["0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81:0.48:0.70:0.58:0.70"] = 863, -- Auberdine, Astranaar, Ratchet, Gadgetzan, Thalanaar, Mudsprocket + ["0.43:0.25:0.61:0.40:0.58:0.39"] = 326, -- Auberdine, Talrendis Point, Forest Song + ["0.43:0.25:0.61:0.40:0.65:0.23"] = 478, -- Auberdine, Talrendis Point, Everlook + ["0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81"] = 602, -- Auberdine, Astranaar, Trinquete, Gadgetzan + ["0.43:0.25:0.53:0.26:0.50:0.35"] = 293, -- Auberdine, Talonbranch Glade, Emerald Sanctuary + ["0.43:0.25:0.64:0.67:0.60:0.81:0.42:0.79"] = 793, -- Auberdine, Theramore, Gadgetzan, Cenarion Hold + ["0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 706, -- Auberdine, Astranaar, Ratchet, Gadgetzan, Marshal's Refuge + + -- Alliance: Cenarion Hold (Silithus) + ["0.42:0.79:0.31:0.69"] = 175, -- Cenarion Hold, Feathermoon + ["0.42:0.79:0.31:0.69:0.48:0.70"] = 329, -- Cenarion Hold, Feathermoon, Thalanaar + ["0.42:0.79:0.50:0.76"] = 92, -- Cenarion Hold, Marshal's Refuge + ["0.42:0.79:0.60:0.81"] = 189, -- Cenarion Hold, Gadgetzan + ["0.42:0.79:0.60:0.81:0.64:0.67:0.58:0.70"] = 399, -- Cenarion Hold, Gadgetzan, Theramore, Mudsprocket + ["0.42:0.79:0.60:0.81:0.64:0.67"] = 342, -- Cenarion Hold, Gadgetzan, Theramore + ["0.42:0.79:0.60:0.81:0.61:0.55"] = 435, -- Cenarion Hold, Gadgetzan, Ratchet + ["0.42:0.79:0.31:0.69:0.40:0.51"] = 402, -- Cenarion Hold, Feathermoon, Nijel's Point + ["0.42:0.79:0.31:0.69:0.40:0.51:0.39:0.40"] = 521, -- Cenarion Hold, Feathermoon, Nijel's Point, Stonetalon Peak + ["0.42:0.79:0.60:0.81:0.61:0.55:0.46:0.40"] = 630, -- Cenarion Hold, Gadgetzan, Ratchet, Astranaar + ["0.42:0.79:0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35"] = 694, -- Cenarion Hold, Gadgetzan, Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.42:0.79:0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39"] = 587, -- Cenarion Hold, Gadgetzan, Ratchet, Talrendis Point, Forest Song + ["0.42:0.79:0.60:0.81:0.61:0.55:0.61:0.40"] = 562, -- Cenarion Hold, Gadgetzan, Ratchet, Talrendis Point + ["0.42:0.79:0.60:0.81:0.61:0.55:0.61:0.40:0.65:0.23"] = 740, -- Cenarion Hold, Gadgetzan, Ratchet, Talrendis Point, Everlook + ["0.42:0.79:0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26"] = 821, -- Cenarion Hold, Gadgetzan, Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.42:0.79:0.31:0.69:0.43:0.25:0.55:0.21"] = 793, -- Cenarion Hold, Feathermoon, Auberdine, Moonglade + ["0.42:0.79:0.31:0.69:0.43:0.25"] = 642, -- Cenarion Hold, Feathermoon, Auberdine + ["0.42:0.79:0.31:0.69:0.43:0.25:0.42:0.16"] = 726, -- Cenarion Hold, Feathermoon, Auberdine, Rut'theran Village + ["0.42:0.79:0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35"] = 709, -- Cenarion Hold, Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary + ["0.42:0.79:0.31:0.69:0.43:0.25:0.55:0.21:0.65:0.23"] = 911, -- Cenarion Hold, Feathermoon, Auberdine, Moonglade, Everlook + ["0.42:0.79:0.60:0.81:0.48:0.70"] = 366, -- Cenarion Hold, Gadgetzan, Thalanaar + ["0.42:0.79:0.31:0.69:0.43:0.25:0.53:0.26"] = 832, -- Cenarion Hold, Feathermoon, Auberdine, Talonbranch Glade + ["0.42:0.79:0.60:0.81:0.64:0.67:0.40:0.51"] = 668, -- Cenarion Hold, Gadgetzan, Theramore, Nijel's Point + ["0.42:0.79:0.60:0.81:0.64:0.67:0.43:0.25:0.42:0.16"] = 860, -- Cenarion Hold, Gadgetzan, Theramore, Auberdine, Rut'theran Village + ["0.42:0.79:0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.55:0.21"] = 895, -- Cenarion Hold, Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.42:0.79:0.60:0.81:0.64:0.67:0.46:0.40:0.50:0.35"] = 784, -- Cenarion Hold, Gadgetzan, Theramore, Astranaar, Emerald Sanctuary + ["0.42:0.79:0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.42:0.16"] = 862, -- Cenarion Hold, Gadgetzan, Ratchet, Astranaar, Auberdine, Rut'theran Village + ["0.42:0.79:0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 926, -- Cenarion Hold, Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.42:0.79:0.31:0.69:0.43:0.25:0.53:0.26:0.65:0.23"] = 920, -- Cenarion Hold, Feathermoon, Auberdine, Talonbranch Glade, Everlook + + -- Alliance: Emerald Sanctuary (Felwood) + ["0.50:0.35:0.46:0.40:0.39:0.40:0.40:0.51:0.31:0.69"] = 592, -- Emerald Sanctuary, Astranaar, Stonetalon Peak, Nijel's Point, Feathermoon + ["0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81:0.42:0.79"] = 696, -- Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Gadgetzan, Cenarion Hold + ["0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 602, -- Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Gadgetzan, Marshal's Refuge + ["0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 523, -- Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Theramore, Thalanaar + ["0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81"] = 499, -- Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Gadgetzan + ["0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 424, -- Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Theramore, Mudsprocket + ["0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67"] = 361, -- Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Theramore + ["0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55"] = 263, -- Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet + ["0.50:0.35:0.46:0.40:0.39:0.40:0.40:0.51"] = 361, -- Emerald Sanctuary, Astranaar, Stonetalon Peak, Nijel's Point + ["0.50:0.35:0.46:0.40:0.39:0.40"] = 234, -- Emerald Sanctuary, Astranaar, Stonetalon Peak + ["0.50:0.35:0.46:0.40"] = 81, -- Emerald Sanctuary, Astranaar + ["0.50:0.35:0.58:0.39"] = 103, -- Emerald Sanctuary, Forest Song + ["0.50:0.35:0.58:0.39:0.61:0.40"] = 128, -- Emerald Sanctuary, Forest Song, Talrendis Point + ["0.50:0.35:0.53:0.26:0.65:0.23"] = 218, -- Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.50:0.35:0.53:0.26:0.55:0.21"] = 187, -- Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.50:0.35:0.53:0.26"] = 128, -- Emerald Sanctuary, Talonbranch Glade + ["0.50:0.35:0.46:0.40:0.43:0.25"] = 229, -- Emerald Sanctuary, Astranaar, Auberdine + ["0.50:0.35:0.46:0.40:0.43:0.25:0.42:0.16"] = 313, -- Emerald Sanctuary, Astranaar, Auberdine, Rut'theran Village + ["0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 618, -- Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81"] = 514, -- Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan + ["0.50:0.35:0.46:0.40:0.61:0.55"] = 274, -- Emerald Sanctuary, Astranaar, Ratchet + ["0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67"] = 374, -- Emerald Sanctuary, Astranaar, Ratchet, Theramore + ["0.50:0.35:0.53:0.26:0.43:0.25"] = 297, -- Emerald Sanctuary, Talonbranch Glade, Auberdine + ["0.50:0.35:0.53:0.26:0.43:0.25:0.42:0.16"] = 381, -- Emerald Sanctuary, Talonbranch Glade, Auberdine, Rut'theran Village + ["0.50:0.35:0.46:0.40:0.61:0.40"] = 228, -- Emerald Sanctuary, Astranaar, Talrendis Point + ["0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 537, -- Emerald Sanctuary, Astranaar, Ratchet, Theramore, Thalanaar + ["0.50:0.35:0.46:0.40:0.43:0.25:0.31:0.69"] = 701, -- Emerald Sanctuary, Astranaar, Auberdine, Feathermoon + ["0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81:0.42:0.79"] = 711, -- Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan, Cenarion Hold + ["0.50:0.35:0.46:0.40:0.64:0.67:0.60:0.81:0.50:0.76"] = 728, -- Emerald Sanctuary, Astranaar, Theramore, Gadgetzan, Marshal's Refuge + ["0.50:0.35:0.46:0.40:0.64:0.67"] = 468, -- Emerald Sanctuary, Astranaar, Theramore + ["0.50:0.35:0.46:0.40:0.64:0.67:0.60:0.81"] = 624, -- Emerald Sanctuary, Astranaar, Theramore, Gadgetzan + ["0.50:0.35:0.53:0.26:0.43:0.25:0.64:0.67:0.61:0.55"] = 848, -- Emerald Sanctuary, Talonbranch Glade, Auberdine, Theramore, Ratchet + ["0.50:0.35:0.58:0.39:0.61:0.40:0.65:0.23"] = 306, -- Emerald Sanctuary, Forest Song, Talrendis Point, Everlook + ["0.50:0.35:0.53:0.26:0.43:0.25:0.31:0.69"] = 769, -- Sanctuaire d'émeraude, Clairière de Griffebranche, Auberdine, Pennelune + ["0.50:0.35:0.46:0.40:0.43:0.25:0.40:0.51"] = 520, -- Emerald Sanctuary, Astranaar, Auberdine, Nijel's Point + ["0.50:0.35:0.53:0.26:0.43:0.25:0.64:0.67:0.60:0.81:0.50:0.76"] = 996, -- Emerald Sanctuary, Talonbranch Glade, Auberdine, Theramore, Gadgetzan, Marshal's Refuge + + -- Alliance: Everlook (Winterspring) + ["0.65:0.23:0.55:0.21:0.43:0.25:0.31:0.69"] = 724, -- Everlook, Moonglade, Auberdine, Feathermoon + ["0.65:0.23:0.61:0.40:0.61:0.55:0.60:0.81:0.42:0.79"] = 734, -- Everlook, Talrendis Point, Ratchet, Gadgetzan, Cenarion Hold + ["0.65:0.23:0.61:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 641, -- Everlook, Talrendis Point, Ratchet, Gadgetzan, Marshal's Refuge + ["0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 562, -- Everlook, Talrendis Point, Ratchet, Theramore, Thalanaar + ["0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 462, -- Everlook, Talrendis Point, Ratchet, Theramore, Mudsprocket + ["0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67"] = 399, -- Everlook, Talrendis Point, Ratchet, Theramore + ["0.65:0.23:0.61:0.40:0.61:0.55:0.60:0.81"] = 537, -- Everlook, Talrendis Point, Ratchet, Gadgetzan + ["0.65:0.23:0.61:0.40:0.61:0.55"] = 301, -- Everlook, Talrendis Point, Ratchet + ["0.65:0.23:0.55:0.21:0.43:0.25:0.40:0.51"] = 542, -- Everlook, Moonglade, Auberdine, Nijel's Point + ["0.65:0.23:0.55:0.21:0.43:0.25:0.39:0.40"] = 433, -- Everlook, Moonglade, Auberdine, Stonetalon Peak + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40"] = 295, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Astranaar + ["0.65:0.23:0.53:0.26:0.50:0.35"] = 216, -- Everlook, Talonbranch Glade, Emerald Sanctuary + ["0.65:0.23:0.61:0.40:0.58:0.39"] = 191, -- Everlook, Talrendis Point, Forest Song + ["0.65:0.23:0.61:0.40"] = 167, -- Everlook, Talrendis Point + ["0.65:0.23:0.55:0.21"] = 111, -- Everlook, Moonglade + ["0.65:0.23:0.53:0.26"] = 107, -- Everlook, Talonbranch Glade + ["0.65:0.23:0.55:0.21:0.43:0.25"] = 252, -- Everlook, Moonglade, Auberdine + ["0.65:0.23:0.55:0.21:0.43:0.25:0.42:0.16"] = 335, -- Everlook, Moonglade, Auberdine, Rut'theran Village + ["0.65:0.23:0.53:0.26:0.43:0.25"] = 277, -- Everlook, Talonbranch Glade, Auberdine + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 834, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.65:0.23:0.55:0.21:0.43:0.25:0.31:0.69:0.42:0.79"] = 874, -- Everlook, Moonglade, Auberdine, Feathermoon, Cenarion Hold + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67"] = 590, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Theramore + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55"] = 489, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet + ["0.65:0.23:0.55:0.21:0.43:0.25:0.64:0.67:0.60:0.81"] = 847, -- Everlook, Moonglade, Auberdine, Theramore, Gadgetzan + ["0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70:0.31:0.69"] = 740, -- Everlook, Talrendis Point, Ratchet, Theramore, Thalanaar, Feathermoon + ["0.65:0.23:0.53:0.26:0.43:0.25:0.42:0.16"] = 361, -- Everlook, Talonbranch Glade, Auberdine, Rut'theran Village + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 752, -- Long-guet, Clairière de Griffebranche, Sanctuaire d'émeraude, Astranaar, Cabestan, Theramore, Thalanaar + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81"] = 730, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan + ["0.65:0.23:0.61:0.40:0.46:0.40"] = 316, -- Everlook, Talrendis Point, Astranaar + ["0.65:0.23:0.55:0.21:0.43:0.25:0.46:0.40"] = 419, -- Everlook, Moonglade, Auberdine, Astranaar + ["0.65:0.23:0.61:0.40:0.46:0.40:0.39:0.40"] = 470, -- Everlook, Talrendis Point, Astranaar, Stonetalon Peak + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.39:0.40"] = 450, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Astranaar, Stonetalon Peak + ["0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67:0.40:0.51"] = 733, -- Everlook, Talrendis Point, Ratchet, Theramore, Nijel's Point + ["0.65:0.23:0.53:0.26:0.50:0.35:0.58:0.39"] = 319, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Forest Song + ["0.65:0.23:0.53:0.26:0.43:0.25:0.31:0.69"] = 749, -- Everlook, Talonbranch Glade, Auberdine, Feathermoon + ["0.65:0.23:0.61:0.40:0.46:0.40:0.50:0.35"] = 394, -- Everlook, Talrendis Point, Astranaar, Emerald Sanctuary + ["0.65:0.23:0.53:0.26:0.43:0.25:0.64:0.67:0.60:0.81"] = 872, -- Everlook, Talonbranch Glade, Auberdine, Theramore, Gadgetzan + ["0.65:0.23:0.55:0.21:0.43:0.25:0.46:0.40:0.50:0.35"] = 497, -- Everlook, Moonglade, Auberdine, Astranaar, Emerald Sanctuary + ["0.65:0.23:0.55:0.21:0.43:0.25:0.64:0.67:0.60:0.81:0.50:0.76"] = 951, -- Everlook, Moonglade, Auberdine, Theramore, Gadgetzan, Marshal's Refuge + ["0.65:0.23:0.55:0.21:0.43:0.25:0.64:0.67"] = 694, -- Everlook, Moonglade, Auberdine, Theramore + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.39:0.40:0.40:0.51:0.31:0.69"] = 807, -- Everlook, Talonbranch Glade, Emerald Sanctuary, Astranaar, Stonetalon Peak, Nijel's Point, Feathermoon + ["0.65:0.23:0.61:0.40:0.58:0.39:0.50:0.35"] = 298, -- Everlook, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.65:0.23:0.53:0.26:0.43:0.25:0.40:0.51"] = 568, -- Everlook, Talonbranch Glade, Auberdine, Nijel's Point + ["0.65:0.23:0.61:0.40:0.46:0.40:0.43:0.25:0.42:0.16"] = 549, -- Everlook, Talrendis Point, Astranaar, Auberdine, Rut'theran Village + ["0.65:0.23:0.55:0.21:0.43:0.25:0.46:0.40:0.61:0.55"] = 612, -- Everlook, Moonglade, Auberdine, Astranaar, Ratchet + ["0.65:0.23:0.53:0.26:0.50:0.35:0.46:0.40:0.64:0.67:0.60:0.81"] = 840, -- Vista Eterna, Claro Ramaespolón, Santuario Esmeralda, Astranaar, Theramore, Gadgetzan + ["0.65:0.23:0.53:0.26:0.43:0.25:0.64:0.67"] = 720, -- Everlook, Talonbranch Glade, Auberdine, Theramore + ["0.65:0.23:0.53:0.26:0.43:0.25:0.31:0.69:0.42:0.79"] = 900, -- Vista Eterna, Claro Ramaespolón, Auberdine, Plumaluna, Fuerte Cenarion + ["0.65:0.23:0.53:0.26:0.43:0.25:0.46:0.40:0.58:0.39"] = 578, -- Everlook, Talonbranch Glade, Auberdine, Astranaar, Forest Song + ["0.65:0.23:0.55:0.21:0.43:0.25:0.46:0.40:0.58:0.39"] = 553, -- Круговзор, Лунная поляна, Аубердин, Астранаар, Лесная Песнь + + -- Alliance: Feathermoon (Feralas) + ["0.31:0.69:0.42:0.79"] = 153, -- Feathermoon, Cenarion Hold + ["0.31:0.69:0.42:0.79:0.50:0.76"] = 242, -- Feathermoon, Cenarion Hold, Marshal's Refuge + ["0.31:0.69:0.48:0.70"] = 155, -- Feathermoon, Thalanaar + ["0.31:0.69:0.48:0.70:0.58:0.70"] = 240, -- Feathermoon, Thalanaar, Mudsprocket + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67"] = 292, -- Feathermoon, Thalanaar, Mudsprocket, Theramore + ["0.31:0.69:0.48:0.70:0.60:0.81"] = 326, -- Feathermoon, Thalanaar, Gadgetzan + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55"] = 406, -- Feathermoon, Thalanaar, Mudsprocket, Theramore, Ratchet + ["0.31:0.69:0.40:0.51"] = 227, -- Feathermoon, Nijel's Point + ["0.31:0.69:0.40:0.51:0.39:0.40"] = 346, -- Feathermoon, Nijel's Point, Stonetalon Peak + ["0.31:0.69:0.40:0.51:0.39:0.40:0.46:0.40"] = 500, -- Feathermoon, Nijel's Point, Stonetalon Peak, Astranaar + ["0.31:0.69:0.40:0.51:0.39:0.40:0.46:0.40:0.50:0.35"] = 578, -- Feathermoon, Nijel's Point, Stonetalon Peak, Astranaar, Emerald Sanctuary + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39"] = 550, -- Feathermoon, Thalanaar, Mudsprocket, Theramore, Talrendis Point, Forest Song + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40"] = 524, -- Feathermoon, Thalanaar, Mudsprocket, Theramore, Talrendis Point + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.65:0.23"] = 703, -- Feathermoon, Thalanaar, Mudsprocket, Theramore, Talrendis Point, Everlook + ["0.31:0.69:0.43:0.25:0.55:0.21"] = 618, -- Feathermoon, Auberdine, Moonglade + ["0.31:0.69:0.43:0.25:0.53:0.26"] = 657, -- Feathermoon, Auberdine, Talonbranch Glade + ["0.31:0.69:0.43:0.25"] = 468, -- Feathermoon, Auberdine + ["0.31:0.69:0.43:0.25:0.42:0.16"] = 552, -- Feathermoon, Auberdine, Rut'theran Village + ["0.31:0.69:0.48:0.70:0.64:0.67:0.61:0.55"] = 429, -- Feathermoon, Thalanaar, Theramore, Ratchet + ["0.31:0.69:0.40:0.51:0.64:0.67"] = 535, -- Feathermoon, Nijel's Point, Theramore + ["0.31:0.69:0.40:0.51:0.64:0.67:0.60:0.81"] = 690, -- Feathermoon, Nijel's Point, Theramore, Gadgetzan + ["0.31:0.69:0.42:0.79:0.60:0.81:0.64:0.67"] = 491, -- Feathermoon, Cenarion Hold, Gadgetzan, Theramore + ["0.31:0.69:0.48:0.70:0.60:0.81:0.50:0.76"] = 430, -- Feathermoon, Thalanaar, Gadgetzan, Marshal's Refuge + ["0.31:0.69:0.43:0.25:0.39:0.40"] = 649, -- Feathermoon, Auberdine, Stonetalon Peak + ["0.31:0.69:0.48:0.70:0.64:0.67:0.61:0.40:0.65:0.23"] = 724, -- Feathermoon, Thalanaar, Theramore, Talrendis Point, Everlook + ["0.31:0.69:0.43:0.25:0.55:0.21:0.65:0.23"] = 737, -- Feathermoon, Auberdine, Moonglade, Everlook + ["0.31:0.69:0.48:0.70:0.64:0.67"] = 314, -- Mondfederfeste, Thalanaar, Theramore + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40"] = 601, -- Feathermoon, Thalanaar, Mudsprocket, Theramore, Ratchet, Astranaar + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35"] = 656, -- Feathermoon, Thalanaar, Mudsprocket, Theramore, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.31:0.69:0.48:0.70:0.60:0.81:0.61:0.55"] = 570, -- Feathermoon, Thalanaar, Gadgetzan, Ratchet + ["0.31:0.69:0.40:0.51:0.64:0.67:0.58:0.70"] = 598, -- Feathermoon, Nijel's Point, Theramore, Mudsprocket + ["0.31:0.69:0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35"] = 680, -- Feathermoon, Thalanaar, Mudsprocket, Theramore, Ratchet, Astranaar, Emerald Sanctuary + ["0.31:0.69:0.42:0.79:0.60:0.81"] = 338, -- Feathermoon, Cenarion Hold, Gadgetzan + ["0.31:0.69:0.40:0.51:0.39:0.40:0.46:0.40:0.61:0.55"] = 694, -- Feathermoon, Nijel's Point, Stonetalon Peak, Astranaar, Ratchet + ["0.31:0.69:0.40:0.51:0.64:0.67:0.61:0.55"] = 649, -- Feathermoon, Nijel's Point, Theramore, Ratchet + ["0.31:0.69:0.40:0.51:0.64:0.67:0.60:0.81:0.50:0.76"] = 794, -- Feathermoon, Nijel's Point, Theramore, Gadgetzan, Marshal's Refuge + ["0.31:0.69:0.48:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35"] = 701, -- Feathermoon, Thalanaar, Theramore, Ratchet, Astranaar, Emerald Sanctuary + ["0.31:0.69:0.48:0.70:0.64:0.67:0.61:0.55:0.46:0.40"] = 623, -- Feathermoon, Thalanaar, Theramore, Ratchet, Astranaar + ["0.31:0.69:0.48:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.58:0.39"] = 757, -- Feathermoon, Thalanaar, Theramore, Ratchet, Astranaar, Forest Song + ["0.31:0.69:0.48:0.70:0.64:0.67:0.61:0.40"] = 546, -- Feathermoon, Thalanaar, Theramore, Talrendis Point + ["0.31:0.69:0.43:0.25:0.53:0.26:0.65:0.23"] = 746, -- Feathermoon, Auberdine, Talonbranch Glade, Everlook + ["0.31:0.69:0.43:0.25:0.64:0.67:0.60:0.81:0.50:0.76"] = 1167, -- Feathermoon, Auberdine, Theramore, Gadgetzan, Marshal's Refuge + ["0.31:0.69:0.40:0.51:0.39:0.40:0.46:0.40:0.58:0.39"] = 634, -- Feathermoon, Nijel's Point, Stonetalon Peak, Astranaar, Forest Song + ["0.31:0.69:0.48:0.70:0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35"] = 678, -- Feathermoon, Thalanaar, Theramore, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.31:0.69:0.43:0.25:0.46:0.40"] = 635, -- Feathermoon, Auberdine, Astranaar + ["0.31:0.69:0.43:0.25:0.46:0.40:0.50:0.35"] = 713, -- Feathermoon, Auberdine, Astranaar, Emerald Sanctuary + + -- Alliance: Forest Song (Ashenvale) + ["0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70:0.31:0.69"] = 602, -- Forest Song, Talrendis Point, Ratchet, Theramore, Thalanaar, Feathermoon + ["0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81:0.42:0.79"] = 596, -- Forest Song, Talrendis Point, Ratchet, Gadgetzan, Cenarion Hold + ["0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 503, -- Forest Song, Talrendis Point, Ratchet, Gadgetzan, Marshal's Refuge + ["0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 424, -- Forest Song, Talrendis Point, Ratchet, Theramore, Thalanaar + ["0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 324, -- Forest Song, Talrendis Point, Ratchet, Theramore, Mudsprocket + ["0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67"] = 261, -- Forest Song, Talrendis Point, Ratchet, Theramore + ["0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81"] = 400, -- Forest Song, Talrendis Point, Ratchet, Gadgetzan + ["0.58:0.39:0.61:0.40:0.61:0.55"] = 163, -- Forest Song, Talrendis Point, Ratchet + ["0.58:0.39:0.46:0.40:0.39:0.40:0.40:0.51"] = 421, -- Forest Song, Astranaar, Stonetalon Peak, Nijel's Point + ["0.58:0.39:0.46:0.40:0.39:0.40"] = 295, -- Forest Song, Astranaar, Stonetalon Peak + ["0.58:0.39:0.46:0.40"] = 141, -- Forest Song, Astranaar + ["0.58:0.39:0.50:0.35"] = 111, -- Forest Song, Emerald Sanctuary + ["0.58:0.39:0.61:0.40"] = 28, -- Forest Song, Talrendis Point + ["0.58:0.39:0.61:0.40:0.65:0.23"] = 207, -- Forest Song, Talrendis Point, Everlook + ["0.58:0.39:0.50:0.35:0.53:0.26"] = 238, -- Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.58:0.39:0.50:0.35:0.53:0.26:0.55:0.21"] = 297, -- Forest Song, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.58:0.39:0.46:0.40:0.43:0.25"] = 290, -- Forest Song, Astranaar, Auberdine + ["0.58:0.39:0.46:0.40:0.43:0.25:0.42:0.16"] = 374, -- Forest Song, Astranaar, Auberdine, Rut'theran Village + ["0.58:0.39:0.46:0.40:0.61:0.55:0.64:0.67"] = 436, -- Forest Song, Astranaar, Ratchet, Theramore + ["0.58:0.39:0.46:0.40:0.43:0.25:0.55:0.21"] = 441, -- Forest Song, Astranaar, Auberdine, Moonglade + ["0.58:0.39:0.46:0.40:0.61:0.55"] = 335, -- Forest Song, Astranaar, Ratchet + ["0.58:0.39:0.46:0.40:0.43:0.25:0.31:0.69"] = 762, -- Forest Song, Astranaar, Auberdine, Feathermoon + ["0.58:0.39:0.50:0.35:0.53:0.26:0.65:0.23"] = 328, -- Forest Song, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.58:0.39:0.46:0.40:0.39:0.40:0.40:0.51:0.31:0.69:0.48:0.70"] = 807, -- Forest Song, Astranaar, Stonetalon Peak, Nijel's Point, Feathermoon, Thalanaar + ["0.58:0.39:0.61:0.40:0.43:0.25:0.39:0.40"] = 510, -- Forest Song, Talrendis Point, Auberdine, Stonetalon Peak + ["0.58:0.39:0.46:0.40:0.61:0.55:0.60:0.81"] = 576, -- Forest Song, Astranaar, Ratchet, Gadgetzan + ["0.58:0.39:0.46:0.40:0.64:0.67"] = 529, -- Forest Song, Astranaar, Theramore + ["0.58:0.39:0.46:0.40:0.64:0.67:0.48:0.70"] = 692, -- Forest Song, Astranaar, Theramore, Thalanaar + ["0.58:0.39:0.50:0.35:0.53:0.26:0.43:0.25:0.64:0.67:0.60:0.81"] = 1002, -- Forest Song, Emerald Sanctuary, Talonbranch Glade, Auberdine, Theramore, Gadgetzan + ["0.58:0.39:0.46:0.40:0.43:0.25:0.40:0.51"] = 580, -- Forest Song, Astranaar, Auberdine, Nijel's Point + ["0.58:0.39:0.46:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 598, -- Waldeslied, Astranaar, Ratschet, Theramore, Thalanaar + + -- Alliance: Gadgetzan (Tanaris) + ["0.60:0.81:0.48:0.70:0.31:0.69"] = 354, -- Gadgetzan, Thalanaar, Feathermoon + ["0.60:0.81:0.42:0.79"] = 197, -- Gadgetzan, Cenarion Hold + ["0.60:0.81:0.50:0.76"] = 104, -- Gadgetzan, Marshal's Refuge + ["0.60:0.81:0.48:0.70"] = 177, -- Gadgetzan, Thalanaar + ["0.60:0.81:0.64:0.67:0.58:0.70"] = 212, -- Gadgetzan, Theramore, Mudsprocket + ["0.60:0.81:0.64:0.67"] = 154, -- Gadgetzan, Theramore + ["0.60:0.81:0.61:0.55"] = 247, -- Gadgetzan, Ratchet + ["0.60:0.81:0.64:0.67:0.40:0.51"] = 481, -- Gadgetzan, Theramore, Nijel's Point + ["0.60:0.81:0.61:0.55:0.46:0.40:0.39:0.40"] = 596, -- Gadgetzan, Ratchet, Astranaar, Stonetalon Peak + ["0.60:0.81:0.61:0.55:0.46:0.40"] = 442, -- Gadgetzan, Ratchet, Astranaar + ["0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35"] = 506, -- Gadgetzan, Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39"] = 400, -- Gadgetzan, Ratchet, Talrendis Point, Forest Song + ["0.60:0.81:0.61:0.55:0.61:0.40"] = 374, -- Gadgetzan, Ratchet, Talrendis Point + ["0.60:0.81:0.61:0.55:0.61:0.40:0.65:0.23"] = 553, -- Gadgetzan, Ratchet, Talrendis Point, Everlook + ["0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26"] = 634, -- Gadgetzan, Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.60:0.81:0.61:0.55:0.61:0.40:0.65:0.23:0.55:0.21"] = 663, -- Gadgetzan, Ratchet, Talrendis Point, Everlook, Moonglade + ["0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25"] = 591, -- Gadgetzan, Ratchet, Astranaar, Auberdine + ["0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.42:0.16"] = 675, -- Gadgetzan, Ratchet, Astranaar, Auberdine, Rut'theran Village + ["0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26"] = 648, -- Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 738, -- Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35"] = 521, -- Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary + ["0.60:0.81:0.64:0.67:0.61:0.40"] = 387, -- Gadgetzan, Theramore, Talrendis Point + ["0.60:0.81:0.64:0.67:0.43:0.25:0.42:0.16"] = 672, -- Gadgetzan, Theramore, Auberdine, Rut'theran Village + ["0.60:0.81:0.64:0.67:0.46:0.40:0.50:0.35"] = 596, -- Gadgetzan, Theramore, Astranaar, Emerald Sanctuary + ["0.60:0.81:0.64:0.67:0.46:0.40"] = 518, -- Gadgetzan, Theramore, Astranaar + ["0.60:0.81:0.61:0.55:0.46:0.40:0.58:0.39"] = 576, -- Gadgetzan, Ratchet, Astranaar, Forest Song + ["0.60:0.81:0.64:0.67:0.46:0.40:0.39:0.40"] = 672, -- Gadgetzan, Theramore, Astranaar, Stonetalon Peak + ["0.60:0.81:0.64:0.67:0.40:0.51:0.31:0.69"] = 712, -- Gadgetzan, Theramore, Nijel's Point, Feathermoon + ["0.60:0.81:0.64:0.67:0.43:0.25"] = 588, -- Gadgetzan, Theramore, Auberdine + ["0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.53:0.26"] = 780, -- Gadgetzan, Ratchet, Astranaar, Auberdine, Talonbranch Glade + ["0.60:0.81:0.64:0.67:0.46:0.40:0.58:0.39"] = 652, -- Gadgetzan, Theramore, Astranaar, Forest Song + ["0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26:0.55:0.21"] = 692, -- Gadgetzan, Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.60:0.81:0.48:0.70:0.31:0.69:0.40:0.51"] = 581, -- Gadgetzan, Thalanaar, Feathermoon, Nijel's Point + ["0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.55:0.21"] = 741, -- Gadgetzan, Ratchet, Astranaar, Auberdine, Moonglade + ["0.60:0.81:0.48:0.70:0.58:0.70"] = 263, -- Gadgetzan, Thalanaar, Mudsprocket + ["0.60:0.81:0.64:0.67:0.43:0.25:0.53:0.26:0.50:0.35"] = 880, -- Gadgetzan, Theramore, Auberdine, Talonbranch Glade, Emerald Sanctuary + ["0.60:0.81:0.61:0.55:0.61:0.40:0.53:0.26"] = 657, -- Gadgetzan, Ratchet, Talrendis Point, Talonbranch Glade + ["0.60:0.81:0.64:0.67:0.61:0.40:0.65:0.23:0.55:0.21"] = 676, -- Gadgetzan, Theramore, Talrendis Point, Everlook, Moonglade + ["0.60:0.81:0.48:0.70:0.31:0.69:0.40:0.51:0.39:0.40"] = 701, -- Gadgetzan, Thalanaar, Feathermoon, Nijel's Point, Stonetalon Peak + ["0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.55:0.21:0.65:0.23"] = 860, -- Gadgetzan, Ratchet, Astranaar, Auberdine, Moonglade, Everlook + ["0.60:0.81:0.64:0.67:0.40:0.51:0.39:0.40"] = 600, -- Gadgetzan, Theramore, Punta de Nijel, Cima del Espolón + ["0.60:0.81:0.61:0.55:0.46:0.40:0.39:0.40:0.40:0.51"] = 723, -- Gadgetzan, Ratchet, Astranaar, Stonetalon Peak, Nijel's Point + ["0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.55:0.21"] = 707, -- Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.60:0.81:0.42:0.79:0.31:0.69"] = 364, -- Gadgetzan, Cenarion Hold, Feathermoon + + -- Alliance: Marshal's Refuge (Un'Goro Crater) + ["0.50:0.76:0.42:0.79:0.31:0.69"] = 258, -- Marshal's Refuge, Cenarion Hold, Feathermoon + ["0.50:0.76:0.42:0.79"] = 94, -- Marshal's Refuge, Cenarion Hold + ["0.50:0.76:0.60:0.81:0.48:0.70"] = 281, -- Marshal's Refuge, Gadgetzan, Thalanaar + ["0.50:0.76:0.60:0.81:0.64:0.67:0.58:0.70"] = 315, -- Marshal's Refuge, Gadgetzan, Theramore, Mudsprocket + ["0.50:0.76:0.60:0.81:0.64:0.67"] = 257, -- Marshal's Refuge, Gadgetzan, Theramore + ["0.50:0.76:0.60:0.81"] = 104, -- Marshal's Refuge, Gadgetzan (Liam Walt reported 111 but my own test reports 104) + ["0.50:0.76:0.60:0.81:0.61:0.55"] = 351, -- Marshal's Refuge, Gadgetzan, Ratchet + ["0.50:0.76:0.42:0.79:0.31:0.69:0.40:0.51"] = 485, -- Marshal's Refuge, Cenarion Hold, Feathermoon, Nijel's Point + ["0.50:0.76:0.42:0.79:0.31:0.69:0.40:0.51:0.39:0.40"] = 605, -- Marshal's Refuge, Cenarion Hold, Feathermoon, Nijel's Point, Stonetalon Peak + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40"] = 545, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar + ["0.50:0.76:0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35"] = 609, -- Marshal's Refuge, Gadgetzan, Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.50:0.76:0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39"] = 503, -- Marshal's Refuge, Gadgetzan, Ratchet, Talrendis Point, Forest Song + ["0.50:0.76:0.60:0.81:0.61:0.55:0.61:0.40"] = 477, -- Marshal's Refuge, Gadgetzan, Ratchet, Talrendis Point + ["0.50:0.76:0.60:0.81:0.61:0.55:0.61:0.40:0.65:0.23"] = 656, -- Marshal's Refuge, Gadgetzan, Ratchet, Talrendis Point, Everlook + ["0.50:0.76:0.60:0.81:0.61:0.55:0.61:0.40:0.65:0.23:0.55:0.21"] = 765, -- Marshal's Refuge, Gadgetzan, Ratchet, Talrendis Point, Everlook, Moonglade + ["0.50:0.76:0.60:0.81:0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26"] = 737, -- Marshal's Refuge, Gadgetzan, Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25"] = 694, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Auberdine + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.42:0.16"] = 778, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Auberdine, Rut'theran Village + ["0.50:0.76:0.60:0.81:0.48:0.70:0.31:0.69"] = 458, -- Marshal's Refuge, Gadgetzan, Thalanaar, Feathermoon + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.58:0.39"] = 680, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Forest Song + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35"] = 624, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary + ["0.50:0.76:0.60:0.81:0.64:0.67:0.40:0.51:0.31:0.69"] = 815, -- Marshal's Refuge, Gadgetzan, Theramore, Nijel's Point, Feathermoon + ["0.50:0.76:0.60:0.81:0.64:0.67:0.43:0.25:0.42:0.16"] = 776, -- Marshal's Refuge, Gadgetzan, Theramore, Auberdine, Rut'theran Village + ["0.50:0.76:0.60:0.81:0.61:0.55:0.61:0.40:0.53:0.26"] = 760, -- Marshal's Refuge, Gadgetzan, Ratchet, Talrendis Point, Talonbranch Glade + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26"] = 752, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 841, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.50:0.76:0.60:0.81:0.64:0.67:0.43:0.25"] = 691, -- Marshal's Refuge, Gadgetzan, Theramore, Auberdine + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.55:0.21:0.65:0.23"] = 963, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Auberdine, Moonglade, Everlook + ["0.50:0.76:0.60:0.81:0.64:0.67:0.46:0.40"] = 621, -- Marshal's Refuge, Gadgetzan, Theramore, Astranaar + ["0.50:0.76:0.60:0.81:0.64:0.67:0.40:0.51"] = 584, -- Marshal's Refuge, Gadgetzan, Theramore, Nijel's Point + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.55:0.21"] = 810, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.50:0.76:0.60:0.81:0.64:0.67:0.46:0.40:0.58:0.39"] = 755, -- Marshal's Refuge, Gadgetzan, Theramore, Astranaar, Forest Song + ["0.50:0.76:0.60:0.81:0.64:0.67:0.46:0.40:0.50:0.35"] = 699, -- Marshal's Refuge, Gadgetzan, Theramore, Astranaar, Emerald Sanctuary + ["0.50:0.76:0.60:0.81:0.64:0.67:0.46:0.40:0.50:0.35:0.53:0.26"] = 827, -- Marshal's Refuge, Gadgetzan, Theramore, Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.50:0.76:0.60:0.81:0.61:0.55:0.46:0.40:0.43:0.25:0.55:0.21"] = 845, -- Marshal's Refuge, Gadgetzan, Ratchet, Astranaar, Auberdine, Moonglade + ["0.50:0.76:0.60:0.81:0.64:0.67:0.43:0.25:0.53:0.26:0.65:0.23"] = 969, -- Marshal's Refuge, Gadgetzan, Theramore, Auberdine, Talonbranch Glade, Everlook + + -- Alliance: Moonglade (Moonglade) + ["0.55:0.21:0.43:0.25:0.31:0.69"] = 614, -- Moonglade, Auberdine, Feathermoon + ["0.55:0.21:0.43:0.25:0.31:0.69:0.42:0.79"] = 764, -- Moonglade, Auberdine, Feathermoon, Cenarion Hold + ["0.55:0.21:0.65:0.23:0.61:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 755, -- Moonglade, Everlook, Talrendis Point, Ratchet, Gadgetzan, Marshal's Refuge + ["0.55:0.21:0.65:0.23:0.61:0.40:0.61:0.55:0.60:0.81"] = 651, -- Moonglade, Everlook, Talrendis Point, Ratchet, Gadgetzan + ["0.55:0.21:0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 576, -- Moonglade, Everlook, Talrendis Point, Ratchet, Theramore, Mudsprocket + ["0.55:0.21:0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67"] = 513, -- Moonglade, Everlook, Talrendis Point, Ratchet, Theramore + ["0.55:0.21:0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 675, -- Moonglade, Everlook, Talrendis Point, Ratchet, Theramore, Thalanaar + ["0.55:0.21:0.65:0.23:0.61:0.40:0.61:0.55"] = 415, -- Moonglade, Everlook, Talrendis Point, Ratchet + ["0.55:0.21:0.43:0.25:0.40:0.51"] = 433, -- Moonglade, Auberdine, Nijel's Point + ["0.55:0.21:0.43:0.25:0.39:0.40"] = 323, -- Moonglade, Auberdine, Stonetalon Peak + ["0.55:0.21:0.53:0.26:0.50:0.35:0.46:0.40"] = 253, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Astranaar + ["0.55:0.21:0.53:0.26:0.50:0.35"] = 174, -- Moonglade, Talonbranch Glade, Emerald Sanctuary + ["0.55:0.21:0.53:0.26:0.50:0.35:0.58:0.39"] = 277, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Forest Song + ["0.55:0.21:0.65:0.23:0.61:0.40"] = 281, -- Moonglade, Everlook, Talrendis Point + ["0.55:0.21:0.65:0.23"] = 119, -- Moonglade, Everlook + ["0.55:0.21:0.53:0.26"] = 62, -- Moonglade, Talonbranch Glade + ["0.55:0.21:0.43:0.25"] = 142, -- Moonglade, Auberdine + ["0.55:0.21:0.43:0.25:0.42:0.16"] = 226, -- Moonglade, Auberdine, Rut'theran Village + ["0.55:0.21:0.43:0.25:0.64:0.67:0.60:0.81"] = 738, -- Moonglade, Auberdine, Theramore, Gadgetzan + ["0.55:0.21:0.43:0.25:0.64:0.67"] = 585, -- Moonglade, Auberdine, Theramore + ["0.55:0.21:0.43:0.25:0.46:0.40:0.58:0.39"] = 443, -- Moonglade, Auberdine, Astranaar, Forest Song + ["0.55:0.21:0.43:0.25:0.46:0.40:0.61:0.55"] = 503, -- Mondlichtung, Auberdine, Astranaar, Ratschet + ["0.55:0.21:0.43:0.25:0.46:0.40"] = 310, -- Moonglade, Auberdine, Astranaar + ["0.55:0.21:0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 776, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Gadgetzan, Marshal's Refuge + ["0.55:0.21:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55"] = 447, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet + ["0.55:0.21:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 710, -- Reflet-de-Lune, Clairière de Griffebranche, Sanctuaire d'émeraude, Astranaar, Cabestan, Theramore, Thalanaar + ["0.55:0.21:0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67"] = 535, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Theramore + ["0.55:0.21:0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40"] = 302, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point + ["0.55:0.21:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81"] = 689, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan + ["0.55:0.21:0.43:0.25:0.46:0.40:0.50:0.35"] = 388, -- Moonglade, Auberdine, Astranaar, Emerald Sanctuary + ["0.55:0.21:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67"] = 548, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Theramore + ["0.55:0.21:0.43:0.25:0.64:0.67:0.48:0.70"] = 744, -- Moonglade, Auberdine, Theramore, Thalanaar + ["0.55:0.21:0.43:0.25:0.64:0.67:0.58:0.70"] = 644, -- Moonglade, Auberdine, Theramore, Mudsprocket + ["0.55:0.21:0.43:0.25:0.64:0.67:0.60:0.81:0.50:0.76"] = 842, -- Moonglade, Auberdine, Theramore, Gadgetzan, Marshal's Refuge + ["0.55:0.21:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 792, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.55:0.21:0.43:0.25:0.64:0.67:0.61:0.55"] = 693, -- Moonglade, Auberdine, Theramore, Ratchet + ["0.55:0.21:0.65:0.23:0.61:0.40:0.64:0.67:0.60:0.81"] = 675, -- Moonglade, Everlook, Talrendis Point, Theramore, Gadgetzan + ["0.55:0.21:0.43:0.25:0.61:0.40"] = 442, -- Moonglade, Auberdine, Talrendis Point + ["0.55:0.21:0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55"] = 436, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet + ["0.55:0.21:0.43:0.25:0.31:0.69:0.48:0.70"] = 769, -- Moonglade, Auberdine, Feathermoon, Thalanaar + ["0.55:0.21:0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81"] = 673, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Gadgetzan + ["0.55:0.21:0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81"] = 744, -- Moonglade, Auberdine, Astranaar, Ratchet, Gadgetzan + ["0.55:0.21:0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 611, -- Moonglade, Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Theramore, Mudsprocket + ["0.55:0.21:0.65:0.23:0.61:0.40:0.58:0.39"] = 305, -- Moonglade, Everlook, Talrendis Point, Forest Song + ["0.55:0.21:0.53:0.26:0.61:0.40"] = 330, -- Moonglade, Talonbranch Glade, Talrendis Point + + -- Alliance: Mudsprocket (Dustwallow Marsh) + ["0.58:0.70:0.48:0.70:0.31:0.69"] = 283, -- Mudsprocket, Thalanaar, Feathermoon + ["0.58:0.70:0.64:0.67:0.60:0.81:0.42:0.79"] = 405, -- Mudsprocket, Theramore, Gadgetzan, Cenarion Hold + ["0.58:0.70:0.64:0.67:0.60:0.81:0.50:0.76"] = 312, -- Mudsprocket, Theramore, Gadgetzan, Marshal's Refuge + ["0.58:0.70:0.48:0.70"] = 105, -- Mudsprocket, Thalanaar + ["0.58:0.70:0.64:0.67"] = 52, -- Mudsprocket, Theramore + ["0.58:0.70:0.64:0.67:0.60:0.81"] = 209, -- Mudsprocket, Theramore, Gadgetzan + ["0.58:0.70:0.64:0.67:0.61:0.55"] = 167, -- Mudsprocket, Theramore, Ratchet + ["0.58:0.70:0.64:0.67:0.40:0.51"] = 386, -- Mudsprocket, Theramore, Nijel's Point + ["0.58:0.70:0.64:0.67:0.40:0.51:0.39:0.40"] = 505, -- Mudsprocket, Theramore, Nijel's Point, Stonetalon Peak + ["0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40"] = 361, -- Mudsprocket, Theramore, Ratchet, Astranaar + ["0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35"] = 416, -- Mudsprocket, Theramore, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39"] = 310, -- Mudsprocket, Theramore, Talrendis Point, Forest Song + ["0.58:0.70:0.64:0.67:0.61:0.40"] = 285, -- Mudsprocket, Theramore, Talrendis Point + ["0.58:0.70:0.64:0.67:0.61:0.40:0.65:0.23"] = 463, -- Mudsprocket, Theramore, Talrendis Point, Everlook + ["0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26"] = 544, -- Mudsprocket, Theramore, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.58:0.70:0.64:0.67:0.61:0.40:0.65:0.23:0.55:0.21"] = 573, -- Mudsprocket, Theramore, Talrendis Point, Everlook, Moonglade + ["0.58:0.70:0.64:0.67:0.43:0.25"] = 492, -- Mudsprocket, Theramore, Auberdine + ["0.58:0.70:0.64:0.67:0.43:0.25:0.42:0.16"] = 576, -- Mudsprocket, Theramore, Auberdine, Rut'theran Village + ["0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.58:0.39"] = 496, -- Mudsprocket, Theramore, Ratchet, Astranaar, Forest Song + ["0.58:0.70:0.64:0.67:0.40:0.51:0.31:0.69"] = 618, -- Mudsprocket, Theramore, Nijel's Point, Feathermoon + ["0.58:0.70:0.48:0.70:0.60:0.81"] = 277, -- Bourbe-à-brac, Thalanaar, Gadgetzan + ["0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.39:0.40"] = 515, -- Bourbe-à-brac, Theramore, Ratchet, Astranaar, Stonetalon Peak + ["0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35"] = 440, -- Mudsprocket, Theramore, Ratchet, Astranaar, Emerald Sanctuary + ["0.58:0.70:0.64:0.67:0.46:0.40:0.39:0.40"] = 576, -- Mudsprocket, Theramore, Astranaar, Stonetalon Peak + + -- Alliance: Nijel's Point (Desolace) + ["0.40:0.51:0.31:0.69"] = 232, -- Nijel's Point, Feathermoon + ["0.40:0.51:0.31:0.69:0.42:0.79"] = 381, -- Nijel's Point, Feathermoon, Cenarion Hold + ["0.40:0.51:0.31:0.69:0.42:0.79:0.50:0.76"] = 470, -- Nijel's Point, Feathermoon, Cenarion Hold, Marshal's Refuge + ["0.40:0.51:0.31:0.69:0.48:0.70"] = 387, -- Nijel's Point, Feathermoon, Thalanaar + ["0.40:0.51:0.64:0.67:0.58:0.70"] = 370, -- Nijel's Point, Theramore, Mudsprocket + ["0.40:0.51:0.64:0.67"] = 308, -- Nijel's Point, Theramore + ["0.40:0.51:0.64:0.67:0.60:0.81"] = 464, -- Nijel's Point, Theramore, Gadgetzan + ["0.40:0.51:0.64:0.67:0.61:0.55"] = 422, -- Nijel's Point, Theramore, Ratchet + ["0.40:0.51:0.39:0.40:0.46:0.40:0.61:0.40"] = 421, -- Nijel's Point, Stonetalon Peak, Astranaar, Talrendis Point + ["0.40:0.51:0.39:0.40:0.46:0.40:0.58:0.39"] = 408, -- Nijel's Point, Stonetalon Peak, Astranaar, Forest Song + ["0.40:0.51:0.39:0.40:0.46:0.40:0.50:0.35"] = 351, -- Nijel's Point, Stonetalon Peak, Astranaar, Emerald Sanctuary + ["0.40:0.51:0.39:0.40:0.46:0.40"] = 274, -- Nijel's Point, Stonetalon Peak, Astranaar + ["0.40:0.51:0.39:0.40"] = 120, -- Nijel's Point, Stonetalon Peak + ["0.40:0.51:0.43:0.25"] = 282, -- Nijel's Point, Auberdine + ["0.40:0.51:0.43:0.25:0.42:0.16"] = 367, -- Nijel's Point, Auberdine, Rut'theran Village + ["0.40:0.51:0.43:0.25:0.53:0.26"] = 471, -- Nijel's Point, Auberdine, Talonbranch Glade + ["0.40:0.51:0.43:0.25:0.55:0.21"] = 433, -- Nijel's Point, Auberdine, Moonglade + ["0.40:0.51:0.43:0.25:0.55:0.21:0.65:0.23"] = 552, -- Nijel's Point, Auberdine, Moonglade, Everlook + ["0.40:0.51:0.43:0.25:0.46:0.40"] = 449, -- Nijel's Point, Auberdine, Astranaar + ["0.40:0.51:0.64:0.67:0.48:0.70"] = 471, -- Nijel's Point, Theramore, Thalanaar + ["0.40:0.51:0.39:0.40:0.46:0.40:0.61:0.55"] = 466, -- Nijel's Point, Stonetalon Peak, Astranaar, Ratchet + ["0.40:0.51:0.64:0.67:0.60:0.81:0.50:0.76"] = 568, -- Nijel's Point, Theramore, Gadgetzan, Marshal's Refuge + ["0.40:0.51:0.43:0.25:0.46:0.40:0.50:0.35"] = 528, -- Nijel's Point, Auberdine, Astranaar, Emerald Sanctuary + ["0.40:0.51:0.43:0.25:0.53:0.26:0.65:0.23"] = 560, -- Nijel's Point, Auberdine, Talonbranch Glade, Everlook + ["0.40:0.51:0.31:0.69:0.48:0.70:0.60:0.81"] = 557, -- Nijel's Point, Feathermoon, Thalanaar, Gadgetzan + ["0.40:0.51:0.39:0.40:0.46:0.40:0.61:0.55:0.60:0.81"] = 708, -- Nijel's Point, Stonetalon Peak, Astranaar, Ratchet, Gadgetzan + ["0.40:0.51:0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81"] = 884, -- Nijel's Point, Auberdine, Astranaar, Ratchet, Gadgetzan + ["0.40:0.51:0.43:0.25:0.46:0.40:0.61:0.55"] = 643, -- Nijel's Point, Auberdine, Astranaar, Ratchet + ["0.40:0.51:0.31:0.69:0.48:0.70:0.58:0.70"] = 472, -- Nijel's Point, Feathermoon, Thalanaar, Mudsprocket + ["0.40:0.51:0.64:0.67:0.61:0.40:0.58:0.39"] = 565, -- Combe de Nijel, Theramore, Halte de Talrendis, Chant des forêts + ["0.40:0.51:0.64:0.67:0.61:0.40:0.65:0.23:0.55:0.21"] = 828, -- Nijel's Point, Theramore, Talrendis Point, Everlook, Moonglade + ["0.40:0.51:0.64:0.67:0.61:0.40"] = 539, -- Nijel's Point, Theramore, Talrendis Point + + -- Alliance: Ratchet (The Barrens) + ["0.61:0.55:0.64:0.67:0.48:0.70:0.31:0.69"] = 446, -- Ratchet, Theramore, Thalanaar, Feathermoon + ["0.61:0.55:0.60:0.81:0.42:0.79"] = 442, -- Ratchet, Gadgetzan, Cenarion Hold + ["0.61:0.55:0.60:0.81:0.50:0.76"] = 349, -- Ratchet, Gadgetzan, Marshal's Refuge + ["0.61:0.55:0.64:0.67:0.48:0.70"] = 268, -- Ratchet, Theramore, Thalanaar + ["0.61:0.55:0.64:0.67:0.58:0.70"] = 168, -- Ratchet, Theramore, Mudsprocket + ["0.61:0.55:0.64:0.67"] = 106, -- Ratchet, Theramore + ["0.61:0.55:0.60:0.81"] = 245, -- Ratchet, Gadgetzan + ["0.61:0.55:0.61:0.40"] = 130, -- Ratchet, Talrendis Point + ["0.61:0.55:0.61:0.40:0.58:0.39"] = 155, -- Ratchet, Talrendis Point, Forest Song + ["0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35"] = 262, -- Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.61:0.55:0.46:0.40"] = 197, -- Ratchet, Astranaar + ["0.61:0.55:0.46:0.40:0.39:0.40"] = 352, -- Ratchet, Astranaar, Stonetalon Peak + ["0.61:0.55:0.64:0.67:0.40:0.51"] = 439, -- Ratchet, Theramore, Nijel's Point + ["0.61:0.55:0.46:0.40:0.43:0.25:0.42:0.16"] = 430, -- Ratchet, Astranaar, Auberdine, Rut'theran Village + ["0.61:0.55:0.46:0.40:0.43:0.25"] = 345, -- Ratchet, Astranaar, Auberdine + ["0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26"] = 389, -- Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.61:0.55:0.61:0.40:0.65:0.23:0.55:0.21"] = 420, -- Ratchet, Talrendis Point, Everlook, Moonglade + ["0.61:0.55:0.61:0.40:0.65:0.23"] = 310, -- Ratchet, Talrendis Point, Everlook + ["0.61:0.55:0.46:0.40:0.50:0.35"] = 276, -- Ratchet, Astranaar, Emerald Sanctuary + ["0.61:0.55:0.46:0.40:0.58:0.39"] = 332, -- Ratchet, Astranaar, Forest Song + ["0.61:0.55:0.64:0.67:0.43:0.25:0.42:0.16"] = 629, -- Ratchet, Theramore, Auberdine, Rut'theran Village + ["0.61:0.55:0.46:0.40:0.39:0.40:0.40:0.51"] = 477, -- Ratchet, Astranaar, Stonetalon Peak, Nijel's Point + ["0.61:0.55:0.61:0.40:0.43:0.25:0.42:0.16"] = 515, -- Ratchet, Talrendis Point, Auberdine, Rut'theran Village + ["0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26"] = 403, -- Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.61:0.55:0.60:0.81:0.48:0.70"] = 421, -- Ratchet, Gadgetzan, Thalanaar + ["0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 493, -- Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.61:0.55:0.64:0.67:0.43:0.25"] = 545, -- Ratchet, Theramore, Auberdine + ["0.61:0.55:0.46:0.40:0.43:0.25:0.55:0.21:0.65:0.23"] = 615, -- Ratchet, Astranaar, Auberdine, Moonglade, Everlook + ["0.61:0.55:0.46:0.40:0.43:0.25:0.53:0.26"] = 535, -- Ratchet, Astranaar, Auberdine, Talonbranch Glade + ["0.61:0.55:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26:0.55:0.21"] = 449, -- Ratchet, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.61:0.55:0.46:0.40:0.43:0.25:0.40:0.51"] = 636, -- Ratchet, Astranaar, Auberdine, Nijel's Point + ["0.61:0.55:0.64:0.67:0.40:0.51:0.31:0.69"] = 671, -- Ratchet, Theramore, Nijel's Point, Feathermoon + ["0.61:0.55:0.60:0.81:0.48:0.70:0.31:0.69:0.40:0.51"] = 825, -- Ratchet, Gadgetzan, Thalanaar, Feathermoon, Nijel's Point + ["0.61:0.55:0.64:0.67:0.40:0.51:0.39:0.40"] = 558, -- Ratchet, Theramore, Nijel's Point, Stonetalon Peak + ["0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.55:0.21"] = 462, -- Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Moonglade + + -- Alliance: Rut'theran Village (Teldrassil) + ["0.42:0.16:0.43:0.25:0.31:0.69"] = 557, -- Rut'theran Village, Auberdine, Feathermoon + ["0.42:0.16:0.43:0.25:0.31:0.69:0.42:0.79"] = 708, -- Rut'theran Village, Auberdine, Feathermoon, Cenarion Hold + ["0.42:0.16:0.43:0.25:0.64:0.67:0.60:0.81:0.50:0.76"] = 785, -- Rut'theran Village, Auberdine, Theramore, Gadgetzan, Marshal's Refuge + ["0.42:0.16:0.43:0.25:0.64:0.67:0.48:0.70"] = 687, -- Rut'theran Village, Auberdine, Theramore, Thalanaar + ["0.42:0.16:0.43:0.25:0.64:0.67:0.60:0.81"] = 681, -- Rut'theran Village, Auberdine, Theramore, Gadgetzan (Gladhappy Guffaws reported 777) + ["0.42:0.16:0.43:0.25:0.64:0.67:0.58:0.70"] = 587, -- Rut'theran Village, Auberdine, Theramore, Mudsprocket + ["0.42:0.16:0.43:0.25:0.64:0.67"] = 528, -- Rut'theran Village, Auberdine, Theramore + ["0.42:0.16:0.43:0.25:0.46:0.40:0.61:0.55"] = 446, -- Rut'theran Village, Auberdine, Astranaar, Ratchet + ["0.42:0.16:0.43:0.25:0.40:0.51"] = 376, -- Rut'theran Village, Auberdine, Nijel's Point + ["0.42:0.16:0.43:0.25:0.61:0.40"] = 385, -- Rut'theran Village, Auberdine, Talrendis Point + ["0.42:0.16:0.43:0.25:0.46:0.40:0.58:0.39"] = 387, -- Rut'theran Village, Auberdine, Astranaar, Forest Song + ["0.42:0.16:0.43:0.25:0.46:0.40:0.50:0.35"] = 331, -- Rut'theran Village, Auberdine, Astranaar, Emerald Sanctuary + ["0.42:0.16:0.43:0.25:0.46:0.40"] = 252, -- Rut'theran Village, Auberdine, Astranaar + ["0.42:0.16:0.43:0.25:0.39:0.40"] = 267, -- Rut'theran Village, Auberdine, Stonetalon Peak + ["0.42:0.16:0.43:0.25"] = 86, -- Rut'theran Village, Auberdine + ["0.42:0.16:0.43:0.25:0.53:0.26"] = 274, -- Rut'theran Village, Auberdine, Talonbranch Glade + ["0.42:0.16:0.43:0.25:0.55:0.21"] = 236, -- Rut'theran Village, Auberdine, Moonglade + ["0.42:0.16:0.43:0.25:0.55:0.21:0.65:0.23"] = 355, -- Rut'theran Village, Auberdine, Moonglade, Everlook + ["0.42:0.16:0.43:0.25:0.53:0.26:0.65:0.23"] = 363, -- Rut'theran Village, Auberdine, Talonbranch Glade, Everlook + ["0.42:0.16:0.43:0.25:0.61:0.40:0.65:0.23"] = 564, -- Rut'theran Village, Auberdine, Talrendis Point, Everlook + ["0.42:0.16:0.43:0.25:0.64:0.67:0.61:0.55"] = 637, -- Rut'theran Village, Auberdine, Theramore, Ratchet + ["0.42:0.16:0.43:0.25:0.64:0.67:0.60:0.81:0.42:0.79"] = 878, -- Rut'theran Village, Auberdine, Theramore, Gadgetzan, Cenarion Hold + ["0.42:0.16:0.43:0.25:0.61:0.40:0.58:0.39"] = 410, -- Rut'theran Village, Auberdine, Talrendis Point, Forest Song + ["0.42:0.16:0.43:0.25:0.53:0.26:0.50:0.35"] = 378, -- Rut'theran Village, Auberdine, Talonbranch Glade, Emerald Sanctuary + ["0.42:0.16:0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81"] = 687, -- Rut'theran Village, Auberdine, Astranaar, Ratchet, Gadgetzan + ["0.42:0.16:0.43:0.25:0.31:0.69:0.48:0.70"] = 712, -- Rut'theran Village, Auberdine, Feathermoon, Thalanaar + ["0.42:0.16:0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 790, -- Rut'theran Village, Auberdine, Astranaar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.42:0.16:0.43:0.25:0.31:0.69:0.48:0.70:0.60:0.81:0.50:0.76"] = 986, -- Rut'theran Village, Auberdine, Feathermoon, Thalanaar, Gadgetzan, Marshal's Refuge + ["0.42:0.16:0.43:0.25:0.61:0.40:0.61:0.55"] = 521, -- Rut'theran Village, Auberdine, Talrendis Point, Ratchet + ["0.42:0.16:0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81:0.48:0.70"] = 863, -- Rut'theran Village, Auberdine, Astranaar, Ratchet, Gadgetzan, Thalanaar + ["0.42:0.16:0.43:0.25:0.46:0.40:0.61:0.55:0.60:0.81:0.48:0.70:0.58:0.70"] = 948, -- Rut'theran Village, Auberdine, Astranaar, Ratchet, Gadgetzan, Thalanaar, Mudsprocket + + -- Alliance: Stonetalon Peak (Stonetalon Mountains) + ["0.39:0.40:0.40:0.51:0.31:0.69"] = 359, -- Stonetalon Peak, Nijel's Point, Feathermoon + ["0.39:0.40:0.40:0.51:0.31:0.69:0.42:0.79"] = 508, -- Stonetalon Peak, Nijel's Point, Feathermoon, Cenarion Hold + ["0.39:0.40:0.40:0.51:0.31:0.69:0.42:0.79:0.50:0.76"] = 596, -- Stonetalon Peak, Nijel's Point, Feathermoon, Cenarion Hold, Marshal's Refuge + ["0.39:0.40:0.40:0.51:0.31:0.69:0.48:0.70"] = 513, -- Stonetalon Peak, Nijel's Point, Feathermoon, Thalanaar + ["0.39:0.40:0.40:0.51:0.64:0.67:0.58:0.70"] = 497, -- Stonetalon Peak, Nijel's Point, Theramore, Mudsprocket + ["0.39:0.40:0.40:0.51:0.64:0.67"] = 434, -- Stonetalon Peak, Nijel's Point, Theramore + ["0.39:0.40:0.40:0.51:0.64:0.67:0.60:0.81"] = 591, -- Stonetalon Peak, Nijel's Point, Theramore, Gadgetzan + ["0.39:0.40:0.46:0.40:0.61:0.55"] = 348, -- Stonetalon Peak, Astranaar, Ratchet + ["0.39:0.40:0.40:0.51"] = 126, -- Stonetalon Peak, Nijel's Point + ["0.39:0.40:0.46:0.40"] = 154, -- Stonetalon Peak, Astranaar + ["0.39:0.40:0.46:0.40:0.50:0.35"] = 234, -- Stonetalon Peak, Astranaar, Emerald Sanctuary + ["0.39:0.40:0.46:0.40:0.58:0.39"] = 288, -- Stonetalon Peak, Astranaar, Forest Song + ["0.39:0.40:0.46:0.40:0.61:0.40"] = 303, -- Stonetalon Peak, Astranaar, Talrendis Point + ["0.39:0.40:0.43:0.25:0.55:0.21:0.65:0.23"] = 447, -- Stonetalon Peak, Auberdine, Moonglade, Everlook + ["0.39:0.40:0.46:0.40:0.50:0.35:0.53:0.26"] = 361, -- Stonetalon Peak, Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.39:0.40:0.43:0.25:0.55:0.21"] = 328, -- Stonetalon Peak, Auberdine, Moonglade + ["0.39:0.40:0.43:0.25"] = 177, -- Stonetalon Peak, Auberdine + ["0.39:0.40:0.43:0.25:0.42:0.16"] = 261, -- Stonetalon Peak, Auberdine, Rut'theran Village + ["0.39:0.40:0.40:0.51:0.64:0.67:0.61:0.55"] = 549, -- Stonetalon Peak, Nijel's Point, Theramore, Ratchet + ["0.39:0.40:0.46:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 612, -- Stonetalon Peak, Astranaar, Ratchet, Theramore, Thalanaar + ["0.39:0.40:0.43:0.25:0.53:0.26"] = 367, -- Stonetalon Peak, Auberdine, Talonbranch Glade + ["0.39:0.40:0.46:0.40:0.61:0.55:0.64:0.67"] = 449, -- Stonetalon Peak, Astranaar, Ratchet, Theramore + ["0.39:0.40:0.40:0.51:0.64:0.67:0.48:0.70"] = 598, -- Stonetalon Peak, Nijel's Point, Theramore, Thalanaar + ["0.39:0.40:0.43:0.25:0.64:0.67:0.61:0.55"] = 728, -- Stonetalon Peak, Auberdine, Theramore, Ratchet + ["0.39:0.40:0.43:0.25:0.53:0.26:0.65:0.23"] = 455, -- Stonetalon Peak, Auberdine, Talonbranch Glade, Everlook + + -- Alliance: Talonbranch Glade (Felwood) + ["0.53:0.26:0.43:0.25:0.31:0.69"] = 660, -- Talonbranch Glade, Auberdine, Feathermoon + ["0.53:0.26:0.43:0.25:0.31:0.69:0.42:0.79"] = 810, -- Talonbranch Glade, Auberdine, Feathermoon, Cenarion Hold + ["0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 731, -- Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Gadgetzan, Marshal's Refuge + ["0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 652, -- Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Theramore, Thalanaar + ["0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 552, -- Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Theramore, Mudsprocket + ["0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.64:0.67"] = 489, -- Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Theramore + ["0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55:0.60:0.81"] = 627, -- Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet, Gadgetzan + ["0.53:0.26:0.50:0.35:0.58:0.39:0.61:0.40:0.61:0.55"] = 391, -- Talonbranch Glade, Emerald Sanctuary, Forest Song, Talrendis Point, Ratchet + ["0.53:0.26:0.43:0.25:0.40:0.51"] = 478, -- Talonbranch Glade, Auberdine, Nijel's Point + ["0.53:0.26:0.50:0.35:0.46:0.40:0.39:0.40"] = 363, -- Talonbranch Glade, Emerald Sanctuary, Astranaar, Stonetalon Peak + ["0.53:0.26:0.50:0.35:0.46:0.40"] = 209, -- Talonbranch Glade, Emerald Sanctuary, Astranaar + ["0.53:0.26:0.50:0.35"] = 129, -- Talonbranch Glade, Emerald Sanctuary + ["0.53:0.26:0.50:0.35:0.58:0.39"] = 232, -- Talonbranch Glade, Emerald Sanctuary, Forest Song + ["0.53:0.26:0.61:0.40"] = 283, -- Talonbranch Glade, Talrendis Point + ["0.53:0.26:0.65:0.23"] = 107, -- Talonbranch Glade, Everlook + ["0.53:0.26:0.55:0.21"] = 67, -- Talonbranch Glade, Moonglade + ["0.53:0.26:0.43:0.25:0.42:0.16"] = 272, -- Talonbranch Glade, Auberdine, Rut'theran Village + ["0.53:0.26:0.43:0.25"] = 188, -- Talonbranch Glade, Auberdine + ["0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 747, -- Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.53:0.26:0.43:0.25:0.64:0.67:0.60:0.81"] = 783, -- Talonbranch Glade, Auberdine, Theramore, Gadgetzan + ["0.53:0.26:0.43:0.25:0.46:0.40"] = 356, -- Talonbranch Glade, Auberdine, Astranaar + ["0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55"] = 402, -- Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet + ["0.53:0.26:0.43:0.25:0.39:0.40"] = 369, -- Talonbranch Glade, Auberdine, Stonetalon Peak + ["0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.60:0.81"] = 643, -- Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Gadgetzan + ["0.53:0.26:0.61:0.40:0.58:0.39"] = 308, -- Talonbranch Glade, Talrendis Point, Forest Song + ["0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67"] = 502, -- Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Theramore + ["0.53:0.26:0.50:0.35:0.46:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 665, -- Talonbranch Glade, Emerald Sanctuary, Astranaar, Ratchet, Theramore, Thalanaar + ["0.53:0.26:0.65:0.23:0.61:0.40:0.61:0.55:0.60:0.81"] = 640, -- Talonbranch Glade, Everlook, Talrendis Point, Ratchet, Gadgetzan + ["0.53:0.26:0.65:0.23:0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 665, -- Clairière de Griffebranche, Long-guet, Halte de Talrendis, Cabestan, Theramore, Thalanaar + ["0.53:0.26:0.65:0.23:0.61:0.40:0.58:0.39"] = 293, -- Talonbranch Glade, Everlook, Talrendis Point, Forest Song + ["0.53:0.26:0.50:0.35:0.46:0.40:0.64:0.67:0.60:0.81"] = 753, -- Talonbranch Glade, Emerald Sanctuary, Astranaar, Theramore, Gadgetzan + + -- Alliance: Talrendis Point (Azshara) + ["0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70:0.31:0.69"] = 574, -- Talrendis Point, Ratchet, Theramore, Thalanaar, Feathermoon + ["0.61:0.40:0.61:0.55:0.60:0.81:0.42:0.79"] = 569, -- Talrendis Point, Ratchet, Gadgetzan, Cenarion Hold + ["0.61:0.40:0.61:0.55:0.60:0.81:0.50:0.76"] = 476, -- Talrendis Point, Ratchet, Gadgetzan, Marshal's Refuge + ["0.61:0.40:0.61:0.55:0.64:0.67:0.48:0.70"] = 397, -- Talrendis Point, Ratchet, Theramore, Thalanaar + ["0.61:0.40:0.61:0.55:0.64:0.67:0.58:0.70"] = 297, -- Talrendis Point, Ratchet, Theramore, Mudsprocket + ["0.61:0.40:0.64:0.67"] = 241, -- Talrendis Point, Theramore + ["0.61:0.40:0.61:0.55:0.60:0.81"] = 373, -- Talrendis Point, Ratchet, Gadgetzan + ["0.61:0.40:0.61:0.55"] = 135, -- Talrendis Point, Ratchet (Brian Villarreal suggested 129) + ["0.61:0.40:0.46:0.40:0.39:0.40:0.40:0.51"] = 431, -- Talrendis Point, Astranaar, Stonetalon Peak, Nijel's Point + ["0.61:0.40:0.46:0.40:0.39:0.40"] = 305, -- Talrendis Point, Astranaar, Stonetalon Peak + ["0.61:0.40:0.46:0.40"] = 153, -- Talrendis Point, Astranaar + ["0.61:0.40:0.58:0.39:0.50:0.35"] = 132, -- Talrendis Point, Forest Song, Emerald Sanctuary + ["0.61:0.40:0.58:0.39"] = 26, -- Talrendis Point, Forest Song + ["0.61:0.40:0.53:0.26"] = 284, -- Talrendis Point, Talonbranch Glade + ["0.61:0.40:0.65:0.23:0.55:0.21"] = 289, -- Talrendis Point, Everlook, Moonglade + ["0.61:0.40:0.65:0.23"] = 179, -- Talrendis Point, Everlook + ["0.61:0.40:0.46:0.40:0.43:0.25:0.42:0.16"] = 383, -- Talrendis Point, Astranaar, Auberdine, Rut'theran Village + ["0.61:0.40:0.43:0.25"] = 301, -- Talrendis Point, Auberdine + ["0.61:0.40:0.64:0.67:0.60:0.81"] = 397, -- Talrendis Point, Theramore, Gadgetzan + ["0.61:0.40:0.46:0.40:0.50:0.35"] = 229, -- Talrendis Point, Astranaar, Emerald Sanctuary + ["0.61:0.40:0.43:0.25:0.42:0.16"] = 386, -- Talrendis Point, Auberdine, Rut'theran Village + ["0.61:0.40:0.46:0.40:0.39:0.40:0.40:0.51:0.31:0.69"] = 662, -- Talrendis Point, Astranaar, Stonetalon Peak, Nijel's Point, Feathermoon + ["0.61:0.40:0.64:0.67:0.48:0.70:0.31:0.69"] = 581, -- Talrendis Point, Theramore, Thalanaar, Feathermoon + ["0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26:0.55:0.21"] = 319, -- Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade, Moonglade + + -- Alliance: Thalanaar + ["0.48:0.70:0.31:0.69"] = 179, -- Thalanaar, Feathermoon + ["0.48:0.70:0.31:0.69:0.42:0.79"] = 329, -- Thalanaar, Feathermoon, Cenarion Hold + ["0.48:0.70:0.60:0.81:0.50:0.76"] = 274, -- Thalanaar, Gadgetzan, Marshal's Refuge + ["0.48:0.70:0.60:0.81"] = 171, -- Thalanaar, Gadgetzan + ["0.48:0.70:0.58:0.70"] = 86, -- Thalanaar, Mudsprocket + ["0.48:0.70:0.64:0.67"] = 159, -- Thalanaar, Theramore + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55"] = 253, -- Thalanaar, Mudsprocket, Theramore, Ratchet + ["0.48:0.70:0.31:0.69:0.40:0.51"] = 405, -- Thalanaar, Feathermoon, Nijel's Point + ["0.48:0.70:0.31:0.69:0.40:0.51:0.39:0.40"] = 524, -- Thalanaar, Feathermoon, Nijel's Point, Stonetalon Peak + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40"] = 447, -- Thalanaar, Mudsprocket, Theramore, Ratchet, Astranaar + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35"] = 502, -- Thalanaar, Mudsprocket, Theramore, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39"] = 396, -- Thalanaar, Mudsprocket, Theramore, Talrendis Point, Forest Song + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40"] = 370, -- Thalanaar, Mudsprocket, Theramore, Talrendis Point + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.65:0.23"] = 548, -- Thalanaar, Mudsprocket, Theramore, Talrendis Point, Everlook + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26"] = 629, -- Thalanaar, Mudsprocket, Theramore, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.40:0.65:0.23:0.55:0.21"] = 658, -- Thalanaar, Mudsprocket, Theramore, Talrendis Point, Everlook, Moonglade + ["0.48:0.70:0.58:0.70:0.64:0.67:0.43:0.25"] = 577, -- Thalanaar, Mudsprocket, Theramore, Auberdine + ["0.48:0.70:0.58:0.70:0.64:0.67:0.43:0.25:0.42:0.16"] = 661, -- Thalanaar, Mudsprocket, Theramore, Auberdine, Rut'theran Village + ["0.48:0.70:0.64:0.67:0.61:0.55"] = 275, -- Thalanaar, Theramore, Ratchet + ["0.48:0.70:0.64:0.67:0.46:0.40:0.39:0.40"] = 683, -- Thalanaar, Theramore, Astranaar, Stonetalon Peak + ["0.48:0.70:0.64:0.67:0.43:0.25"] = 599, -- Thalanaar, Theramore, Auberdine + ["0.48:0.70:0.64:0.67:0.43:0.25:0.42:0.16"] = 683, -- Thalanaar, Theramore, Auberdine, Rut'theran Village + ["0.48:0.70:0.64:0.67:0.40:0.51"] = 494, -- Thalanaar, Theramore, Nijel's Point + ["0.48:0.70:0.58:0.70:0.64:0.67:0.40:0.51"] = 472, -- Thalanaar, Mudsprocket, Theramore, Nijel's Point + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 742, -- Thalanaar, Mudsprocket, Theramore, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.48:0.70:0.60:0.81:0.61:0.55"] = 416, -- Thalanaar, Gadgetzan, Ratchet + ["0.48:0.70:0.64:0.67:0.61:0.55:0.46:0.40"] = 469, -- Thalanaar, Theramore, Ratchet, Astranaar + ["0.48:0.70:0.31:0.69:0.43:0.25"] = 646, -- Thalanaar, Feathermoon, Auberdine + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35"] = 526, -- Thalanaar, Mudsprocket, Theramore, Ratchet, Astranaar, Emerald Sanctuary + ["0.48:0.70:0.64:0.67:0.46:0.40"] = 529, -- Thalanaar, Theramore, Astranaar + ["0.48:0.70:0.60:0.81:0.61:0.55:0.46:0.40"] = 611, -- Thalanaar, Gadgetzan, Ratchet, Astranaar + ["0.48:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35"] = 547, -- Thalanaar, Theramore, Ratchet, Astranaar, Emerald Sanctuary + ["0.48:0.70:0.58:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.58:0.39"] = 581, -- Thalanaar, Mudsprocket, Theramore, Ratchet, Astranaar, Forest Song + ["0.48:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.58:0.39"] = 603, -- Thalanaar, Theramore, Ratchet, Astranaar, Forest Song + ["0.48:0.70:0.64:0.67:0.61:0.55:0.46:0.40:0.39:0.40"] = 623, -- Thalanaar, Theramore, Ratchet, Astranaar, Stonetalon Peak + ["0.48:0.70:0.64:0.67:0.61:0.40:0.53:0.26"] = 674, -- Thalanaar, Theramore, Talrendis Point, Talonbranch Glade + ["0.48:0.70:0.58:0.70:0.64:0.67:0.40:0.51:0.39:0.40"] = 591, -- Thalanaar, Mudsprocket, Theramore, Nijel's Point, Stonetalon Peak + + -- Alliance: Theramore (Dustwallow Marsh) + ["0.64:0.67:0.48:0.70:0.31:0.69"] = 340, -- Theramore, Thalanaar, Feathermoon + ["0.64:0.67:0.60:0.81:0.42:0.79"] = 354, -- Theramore, Gadgetzan, Cenarion Hold + ["0.64:0.67:0.60:0.81:0.50:0.76"] = 261, -- Theramore, Gadgetzan, Marshal's Refuge + ["0.64:0.67:0.48:0.70"] = 162, -- Theramore, Thalanaar + ["0.64:0.67:0.58:0.70"] = 64, -- Theramore, Mudsprocket + ["0.64:0.67:0.60:0.81"] = 157, -- Theramore, Gadgetzan + ["0.64:0.67:0.61:0.55"] = 115, -- Theramore, Ratchet + ["0.64:0.67:0.40:0.51"] = 334, -- Theramore, Nijel's Point + ["0.64:0.67:0.40:0.51:0.39:0.40"] = 453, -- Theramore, Nijel's Point, Stonetalon Peak + ["0.64:0.67:0.46:0.40"] = 369, -- Theramore, Astranaar + ["0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35"] = 366, -- Theramore, Talrendis Point, Forest Song, Emerald Sanctuary + ["0.64:0.67:0.61:0.40:0.58:0.39"] = 259, -- Theramore, Talrendis Point, Forest Song + ["0.64:0.67:0.61:0.40"] = 234, -- Theramore, Talrendis Point + ["0.64:0.67:0.61:0.40:0.65:0.23"] = 412, -- Theramore, Talrendis Point, Everlook + ["0.64:0.67:0.61:0.40:0.58:0.39:0.50:0.35:0.53:0.26"] = 494, -- Theramore, Talrendis Point, Forest Song, Emerald Sanctuary, Talonbranch Glade + ["0.64:0.67:0.61:0.40:0.65:0.23:0.55:0.21"] = 523, -- Theramore, Talrendis Point, Everlook, Moonglade + ["0.64:0.67:0.43:0.25"] = 440, -- Theramore, Auberdine (Serhii Nedilia reported 458) + ["0.64:0.67:0.43:0.25:0.42:0.16"] = 524, -- Theramore, Auberdine, Rut'theran Village + ["0.64:0.67:0.61:0.55:0.46:0.40:0.39:0.40"] = 464, -- Theramore, Ratchet, Astranaar, Stonetalon Peak + ["0.64:0.67:0.40:0.51:0.31:0.69"] = 567, -- Theramore, Nijel's Point, Feathermoon + ["0.64:0.67:0.61:0.55:0.46:0.40:0.58:0.39"] = 443, -- Theramore, Ratchet, Astranaar, Forest Song + ["0.64:0.67:0.43:0.25:0.39:0.40"] = 621, -- Theramore, Auberdine, Stonetalon Peak + ["0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35"] = 388, -- Theramore, Ratchet, Astranaar, Emerald Sanctuary + ["0.64:0.67:0.43:0.25:0.53:0.26"] = 629, -- Theramore, Auberdine, Talonbranch Glade + ["0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 605, -- Theramore, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.64:0.67:0.61:0.40:0.53:0.26"] = 516, -- Theramore, Talrendis Point, Talonbranch Glade (was 234, changed by Michael Keller) + ["0.64:0.67:0.46:0.40:0.58:0.39"] = 504, -- Theramore, Astranaar, Forest Song + ["0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26"] = 516, -- Theramore, Ratschet, Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.64:0.67:0.60:0.81:0.42:0.79:0.31:0.69"] = 520, -- Theramore, Gadgetzan, Cenarion Hold, Feathermoon + ["0.64:0.67:0.46:0.40:0.39:0.40"] = 524, -- Theramore, Astranaar, Stonetalon Peak + ["0.64:0.67:0.43:0.25:0.55:0.21:0.65:0.23"] = 710, -- Theramore, Auberdine, Moonglade, Everlook + ["0.64:0.67:0.46:0.40:0.50:0.35"] = 448, -- Theramore, Astranaar, Emerald Sanctuary + ["0.64:0.67:0.46:0.40:0.50:0.35:0.53:0.26"] = 575, -- Theramore, Astranaar, Emerald Sanctuary, Talonbranch Glade + ["0.64:0.67:0.46:0.40:0.50:0.35:0.53:0.26:0.65:0.23"] = 665, -- Theramore, Astranaar, Emerald Sanctuary, Talonbranch Glade, Everlook + ["0.64:0.67:0.61:0.55:0.46:0.40:0.50:0.35:0.53:0.26:0.55:0.21"] = 574, -- Theramore, Ratchet, Astranaar, Emerald Sanctuary, Talonbranch Glade, Moonglade + ["0.64:0.67:0.43:0.25:0.55:0.21"] = 591, -- Theramore, Auberdine, Moonglade + ["0.64:0.67:0.43:0.25:0.53:0.26:0.50:0.35"] = 733, -- Theramore, Auberdine, Talonbranch Glade, Emerald Sanctuary + + }, + + -- Alliance: Outland + [1945] = { + + -- Alliance: Allerian Stronghold (Terokkar Forest) + ["0.55:0.77:0.27:0.74"] = 149, -- Allerian Stronghold, Telaar + ["0.55:0.77:0.44:0.67"] = 75, -- Allerian Stronghold, Shattrath (Luis C. reported 82, not changed yet) + ["0.55:0.77:0.69:0.85"] = 79, -- Allerian Stronghold, Wildhammer Stronghold + ["0.55:0.77:0.65:0.58"] = 96, -- Allerian Stronghold, Honor Hold + ["0.55:0.77:0.65:0.58:0.79:0.55"] = 156, -- Allerian Stronghold, Honor Hold, Hellfire Peninsula + ["0.55:0.77:0.65:0.58:0.52:0.51"] = 170, -- Allerian Stronghold, Honor Hold, Temple of Telhamat + ["0.55:0.77:0.44:0.67:0.38:0.50"] = 158, -- Allerian Stronghold, Shattrath, Telredor + ["0.55:0.77:0.44:0.67:0.38:0.50:0.27:0.44"] = 221, -- Allerian Stronghold, Shattrath, Telredor, Orebor Harborage + ["0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37"] = 227, -- Allerian Stronghold, Shattrath, Telredor, Toshley's Station + ["0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34"] = 249, -- Allerian Stronghold, Shattrath, Telredor, Sylvanaar + ["0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.42:0.28"] = 280, -- Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Evergrove + ["0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 311, -- Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52 + ["0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 358, -- Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 375, -- Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.55:0.77:0.69:0.85:0.81:0.77"] = 161, -- Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.55:0.77:0.69:0.85:0.78:0.85"] = 121, -- Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.55:0.77:0.65:0.58:0.75:0.50"] = 150, -- Allerian Stronghold, Honor Hold, Shatter Point + ["0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.63:0.18"] = 404, -- Allerian Stronghold, Shattrath, Telredor, Sylvanaar, The Stormspire + ["0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.58:0.27"] = 368, -- Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Area 52 + ["0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.42:0.28"] = 300, -- Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Evergrove + ["0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.58:0.27:0.72:0.28"] = 433, -- Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Area 52, Cosmowrench + ["0.55:0.77:0.65:0.58:0.52:0.51:0.38:0.50"] = 251, -- Allerian Stronghold, Honor Hold, Temple of Telhamat, Telredor + + -- Alliance: Altar of Sha'tar (Shadowmoon Valley) + ["0.81:0.77:0.69:0.85"] = 81, -- Altar of Sha'tar, Wildhammer Stronghold + ["0.81:0.77:0.55:0.77:0.44:0.67"] = 254, -- Altar of Sha'tar, Allerian Stronghold, Shattrath + ["0.81:0.77:0.55:0.77:0.65:0.58:0.75:0.50"] = 330, -- Altar of Sha'tar, Allerian Stronghold, Honor Hold, Shatter Point + ["0.81:0.77:0.55:0.77:0.65:0.58:0.79:0.55"] = 336, -- Altar of Sha'tar, Allerian Stronghold, Honor Hold, Hellfire Peninsula + ["0.81:0.77:0.55:0.77"] = 182, -- Altar of Sha'tar, Allerian Stronghold + ["0.81:0.77:0.55:0.77:0.65:0.58"] = 276, -- Altar of Sha'tar, Allerian Stronghold, Honor Hold + ["0.81:0.77:0.55:0.77:0.27:0.74"] = 330, -- Altar of Sha'tar, Allerian Stronghold, Telaar + ["0.81:0.77:0.55:0.77:0.65:0.58:0.52:0.51"] = 351, -- Altar of Sha'tar, Allerian Stronghold, Honor Hold, Temple of Telhamat + ["0.81:0.77:0.55:0.77:0.44:0.67:0.38:0.50"] = 338, -- Altar of Sha'tar, Allerian Stronghold, Shattrath, Telredor + ["0.81:0.77:0.55:0.77:0.44:0.67:0.38:0.50:0.27:0.44"] = 400, -- Altar of Sha'tar, Allerian Stronghold, Shattrath, Telredor, Orebor Harborage + ["0.81:0.77:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 555, -- Altar of Sha'tar, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.81:0.77:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 537, -- Altar of Sha'tar, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.81:0.77:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37"] = 406, -- Altar of Sha'tar, Allerian Stronghold, Shattrath, Telredor, Toshley's Station + ["0.81:0.77:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 489, -- Altar of Sha'tar, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52 + ["0.81:0.77:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.42:0.28"] = 458, -- Altar of Sha'tar, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Evergrove + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67"] = 254, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50"] = 338, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor + ["0.81:0.77:0.69:0.85:0.55:0.77:0.27:0.74"] = 329, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Telaar + ["0.81:0.77:0.69:0.85:0.55:0.77:0.65:0.58"] = 276, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Honor Hold + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 537, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34"] = 428, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar + ["0.81:0.77:0.69:0.85:0.55:0.77:0.65:0.58:0.52:0.51"] = 350, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Temple of Telhamat + ["0.81:0.77:0.69:0.85:0.55:0.77"] = 181, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 489, -- Altar der Sha'tar, Wildhammerfeste, Allerias Feste, Shattrath, Telredor, Toshleys Station, Area 52 + ["0.81:0.77:0.69:0.85:0.55:0.77:0.65:0.58:0.75:0.50"] = 329, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Shatter Point + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.27:0.44"] = 400, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Orebor Harborage + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.42:0.28"] = 459, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Evergrove + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37"] = 406, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station + ["0.81:0.77:0.69:0.85:0.55:0.77:0.65:0.58:0.79:0.55"] = 336, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Hellfire Peninsula + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 555, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.58:0.27"] = 547, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Area 52 + ["0.81:0.77:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.42:0.28"] = 479, -- Altar of Sha'tar, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Evergrove + + -- Alliance: Area 52 (Netherstorm) + ["0.58:0.27:0.42:0.37:0.38:0.50:0.27:0.74"] = 290, -- Area 52, Toshley's Station, Telredor, Telaar + ["0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67"] = 262, -- Area 52, Toshley's Station, Telredor, Shattrath + ["0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77"] = 337, -- Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold + ["0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 414, -- Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58"] = 333, -- Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold + ["0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 395, -- Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51"] = 247, -- Area 52, Toshley's Station, Telredor, Temple of Telhamat + ["0.58:0.27:0.42:0.37:0.38:0.50"] = 165, -- Area 52, Toshley's Station, Telredor + ["0.58:0.27:0.32:0.34:0.27:0.44"] = 202, -- Area 52, Sylvanaar, Orebor Harborage + ["0.58:0.27:0.32:0.34"] = 127, -- Area 52, Sylvanaar + ["0.58:0.27:0.42:0.37"] = 93, -- Area 52, Toshley's Station + ["0.58:0.27:0.42:0.28"] = 80, -- Area 52, Evergrove + ["0.58:0.27:0.72:0.28"] = 66, -- Area 52, Cosmowrench + ["0.58:0.27:0.63:0.18"] = 47, -- Area 52, The Stormspire + ["0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 388, -- Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 495, -- Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 456, -- Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.58:0.27:0.32:0.34:0.38:0.50:0.44:0.67"] = 305, -- Area 52, Sylvanaar, Telredor, Shattrath + ["0.58:0.27:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77"] = 380, -- Area 52, Sylvanaar, Telredor, Shattrath, Allerian Stronghold + ["0.58:0.27:0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58"] = 377, -- Area 52, Sylvanaar, Telredor, Temple of Telhamat, Honor Hold + ["0.58:0.27:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 499, -- Area 52, Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.58:0.27:0.32:0.34:0.38:0.50:0.27:0.74"] = 332, -- Area 52, Sylvanaar, Telredor, Telaar + ["0.58:0.27:0.32:0.34:0.38:0.50:0.52:0.51"] = 290, -- Area 52, Sylvanaar, Telredor, Temple of Telhamat + ["0.58:0.27:0.32:0.34:0.38:0.50"] = 208, -- Area 52, Sylvanaar, Telredor + ["0.58:0.27:0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 431, -- Area 52, Sylvanaar, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.58:0.27:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 458, -- Area 52, Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.58:0.27:0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 438, -- Area 52, Sylvanaar, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + + -- Alliance: Cosmowrench (Netherstorm) + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.27:0.74"] = 353, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Telaar (Alan Miles reported 65) + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67"] = 326, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Shattrath + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77"] = 401, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 478, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58"] = 396, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 458, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51"] = 310, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Temple of Telhamat + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50"] = 229, -- Cosmowrench, Area 52, Toshley's Station, Telredor + ["0.72:0.28:0.58:0.27:0.32:0.34:0.27:0.44"] = 266, -- Cosmowrench, Area 52, Sylvanaar, Orebor Harborage + ["0.72:0.28:0.58:0.27:0.42:0.37"] = 157, -- Cosmowrench, Area 52, Toshley's Station + ["0.72:0.28:0.58:0.27:0.32:0.34"] = 192, -- Cosmowrench, Area 52, Sylvanaar + ["0.72:0.28:0.58:0.27:0.42:0.28"] = 145, -- Cosmowrench, Area 52, Evergrove + ["0.72:0.28:0.58:0.27"] = 64, -- Cosmowrench, Area 52 + ["0.72:0.28:0.63:0.18"] = 61, -- Cosmowrench, The Stormspire + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 451, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 559, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.72:0.28:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 520, -- Cosmowrench, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.72:0.28:0.63:0.18:0.32:0.34:0.38:0.50"] = 296, -- Cosmowrench, The Stormspire, Sylvanaar, Telredor + ["0.72:0.28:0.58:0.27:0.32:0.34:0.38:0.50:0.44:0.67"] = 369, -- Cosmowrench, Area 52, Sylvanaar, Telredor, Shattrath + ["0.72:0.28:0.58:0.27:0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58"] = 441, -- Cosmowrench, Area 52, Sylvanaar, Telredor, Temple of Telhamat, Honor Hold + ["0.72:0.28:0.58:0.27:0.32:0.34:0.38:0.50:0.52:0.51"] = 353, -- Cosmowrench, Area 52, Sylvanaar, Telredor, Temple of Telhamat + ["0.72:0.28:0.63:0.18:0.32:0.34:0.38:0.50:0.44:0.67"] = 392, -- Cosmowrench, The Stormspire, Sylvanaar, Telredor, Shattrath + + -- Alliance: Evergrove (Blade's Edge Mountains) + ["0.42:0.28:0.42:0.37:0.38:0.50:0.27:0.74"] = 240, -- Evergrove, Toshley's Station, Telredor, Telaar + ["0.42:0.28:0.42:0.37:0.38:0.50:0.44:0.67"] = 213, -- Evergrove, Toshley's Station, Telredor, Shattrath + ["0.42:0.28:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77"] = 287, -- Evergrove, Toshley's Station, Telredor, Shattrath, Allerian Stronghold + ["0.42:0.28:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 366, -- Evergrove, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.42:0.28:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58"] = 284, -- Evergrove, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold + ["0.42:0.28:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 346, -- Evergrove, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.42:0.28:0.42:0.37:0.38:0.50:0.52:0.51"] = 197, -- Evergrove, Toshley's Station, Telredor, Temple of Telhamat + ["0.42:0.28:0.42:0.37:0.38:0.50"] = 116, -- Evergrove, Toshley's Station, Telredor + ["0.42:0.28:0.32:0.34:0.27:0.44"] = 130, -- Evergrove, Sylvanaar, Orebor Harborage + ["0.42:0.28:0.42:0.37"] = 44, -- Evergrove, Toshley's Station + ["0.42:0.28:0.32:0.34"] = 54, -- Evergrove, Sylvanaar + ["0.42:0.28:0.58:0.27"] = 78, -- Evergrove, Area 52 + ["0.42:0.28:0.58:0.27:0.63:0.18"] = 124, -- Evergrove, Area 52, The Stormspire + ["0.42:0.28:0.58:0.27:0.72:0.28"] = 143, -- Evergrove, Area 52, Cosmowrench + ["0.42:0.28:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 407, -- Evergrove, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.42:0.28:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 428, -- Evergrove, Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.42:0.28:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 446, -- Evergrove, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.42:0.28:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 339, -- Evergrove, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.42:0.28:0.32:0.34:0.38:0.50:0.27:0.74"] = 261, -- Evergrove, Sylvanaar, Telredor, Telaar + ["0.42:0.28:0.32:0.34:0.38:0.50:0.44:0.67"] = 234, -- Evergrove, Sylvanaar, Telredor, Shattrath + ["0.42:0.28:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77"] = 308, -- Evergrove, Sylvanaar, Telredor, Shattrath, Allerian Stronghold + ["0.42:0.28:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 386, -- Evergrove, Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.42:0.28:0.32:0.34:0.38:0.50"] = 137, -- Evergrove, Sylvanaar, Telredor + ["0.42:0.28:0.42:0.37:0.38:0.50:0.27:0.44"] = 178, -- Evergrove, Toshley's Station, Telredor, Orebor Harborage + ["0.42:0.28:0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58"] = 305, -- Evergrove, Sylvanaar, Telredor, Temple of Telhamat, Honor Hold + + -- Alliance: Hellfire Peninsula (Hellfire Peninsula) (Dark Portal) + ["0.79:0.55:0.65:0.58:0.44:0.67:0.27:0.74"] = 277, -- Hellfire Peninsula, Honor Hold, Shattrath, Telaar + ["0.79:0.55:0.65:0.58:0.44:0.67"] = 190, -- Hellfire Peninsula, Honor Hold, Shattrath + ["0.79:0.55:0.65:0.58:0.55:0.77"] = 188, -- Hellfire Peninsula, Honor Hold, Allerian Stronghold + ["0.79:0.55:0.65:0.58:0.55:0.77:0.69:0.85"] = 266, -- Hellfire Peninsula, Honor Hold, Allerian Stronghold, Wildhammer Stronghold + ["0.79:0.55:0.65:0.58"] = 73, -- Hellfire Peninsula, Honor Hold + ["0.79:0.55:0.52:0.51"] = 115, -- Hellfire Peninsula, Temple of Telhamat + ["0.79:0.55:0.52:0.51:0.38:0.50"] = 196, -- Hellfire Peninsula, Temple of Telhamat, Telredor + ["0.79:0.55:0.52:0.51:0.38:0.50:0.27:0.44"] = 259, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Orebor Harborage + ["0.79:0.55:0.52:0.51:0.38:0.50:0.42:0.37"] = 265, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Toshley's Station + ["0.79:0.55:0.52:0.51:0.38:0.50:0.32:0.34"] = 287, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Sylvanaar + ["0.79:0.55:0.52:0.51:0.38:0.50:0.42:0.37:0.42:0.28"] = 317, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Toshley's Station, Evergrove + ["0.79:0.55:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27"] = 348, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Toshley's Station, Area 52 + ["0.79:0.55:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 413, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.79:0.55:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 396, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.79:0.55:0.75:0.50"] = 28, -- Hellfire Peninsula, Shatter Point + ["0.79:0.55:0.65:0.58:0.55:0.77:0.69:0.85:0.81:0.77"] = 348, -- Hellfire Peninsula, Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.79:0.55:0.65:0.58:0.55:0.77:0.69:0.85:0.78:0.85"] = 308, -- Hellfire Peninsula, Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.79:0.55:0.52:0.51:0.38:0.50:0.27:0.74"] = 321, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Telaar + ["0.79:0.55:0.52:0.51:0.38:0.50:0.32:0.34:0.42:0.28"] = 339, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Sylvanaar, Evergrove + ["0.79:0.55:0.52:0.51:0.38:0.50:0.32:0.34:0.58:0.27"] = 406, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Sylvanaar, Area 52 + ["0.79:0.55:0.52:0.51:0.38:0.50:0.32:0.34:0.63:0.18"] = 441, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Sylvanaar, The Stormspire + ["0.79:0.55:0.65:0.58:0.44:0.67:0.38:0.50:0.27:0.44"] = 336, -- Hellfire Peninsula, Honor Hold, Shattrath, Telredor, Orebor Harborage + ["0.79:0.55:0.65:0.58:0.44:0.67:0.38:0.50:0.32:0.34"] = 364, -- Hellfire Peninsula, Honor Hold, Shattrath, Telredor, Sylvanaar + ["0.79:0.55:0.65:0.58:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 425, -- Hellfire Peninsula, Honor Hold, Shattrath, Telredor, Toshley's Station, Area 52 + ["0.79:0.55:0.52:0.51:0.38:0.50:0.32:0.34:0.58:0.27:0.72:0.28"] = 471, -- Hellfire Peninsula, Temple of Telhamat, Telredor, Sylvanaar, Area 52, Cosmowrench + ["0.79:0.55:0.65:0.58:0.44:0.67:0.38:0.50"] = 274, -- Hellfire Peninsula, Honor Hold, Shattrath, Telredor + + -- Alliance: Honor Hold (Hellfire Peninsula) + ["0.65:0.58:0.44:0.67:0.27:0.74"] = 207, -- Honor Hold, Shattrath, Telaar + ["0.65:0.58:0.44:0.67"] = 120, -- Honor Hold, Shattrath + ["0.65:0.58:0.55:0.77"] = 118, -- Honor Hold, Allerian Stronghold + ["0.65:0.58:0.55:0.77:0.69:0.85"] = 196, -- Honor Hold, Allerian Stronghold, Wildhammer Stronghold + ["0.65:0.58:0.79:0.55"] = 64, -- Honor Hold, Hellfire Peninsula + ["0.65:0.58:0.52:0.51"] = 76, -- Honor Hold, Temple of Telhamat + ["0.65:0.58:0.52:0.51:0.38:0.50"] = 156, -- Honor Hold, Temple of Telhamat, Telredor + ["0.65:0.58:0.52:0.51:0.38:0.50:0.27:0.44"] = 219, -- Honor Hold, Temple of Telhamat, Telredor, Orebor Harborage + ["0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37"] = 225, -- Honor Hold, Temple of Telhamat, Telredor, Toshley's Station + ["0.65:0.58:0.52:0.51:0.38:0.50:0.32:0.34"] = 248, -- Honor Hold, Temple of Telhamat, Telredor, Sylvanaar + ["0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.42:0.28"] = 278, -- Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Evergrove + ["0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27"] = 309, -- Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Area 52 + ["0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 356, -- Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 374, -- Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.65:0.58:0.75:0.50"] = 57, -- Honor Hold, Shatter Point + ["0.65:0.58:0.55:0.77:0.69:0.85:0.81:0.77"] = 278, -- Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.65:0.58:0.55:0.77:0.69:0.85:0.78:0.85"] = 238, -- Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.65:0.58:0.44:0.67:0.38:0.50:0.27:0.44"] = 266, -- Honor Hold, Shattrath, Telredor, Orebor Harborage + ["0.65:0.58:0.44:0.67:0.38:0.50"] = 203, -- Honor Hold, Shattrath, Telredor + ["0.65:0.58:0.52:0.51:0.38:0.50:0.32:0.34:0.58:0.27"] = 366, -- Honor Hold, Temple of Telhamat, Telredor, Sylvanaar, Area 52 + ["0.65:0.58:0.55:0.77:0.27:0.74"] = 267, -- Honor Hold, Allerian Stronghold, Telaar + ["0.65:0.58:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 403, -- Honor Hold, Shattrath, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.65:0.58:0.52:0.51:0.38:0.50:0.32:0.34:0.63:0.18"] = 402, -- Honor Hold, Temple of Telhamat, Telredor, Sylvanaar, The Stormspire + ["0.65:0.58:0.52:0.51:0.38:0.50:0.27:0.74"] = 281, -- Honor Hold, Temple of Telhamat, Telredor, Telaar + ["0.65:0.58:0.44:0.67:0.38:0.50:0.32:0.34"] = 295, -- Honor Hold, Shattrath, Telredor, Sylvanaar + + -- Alliance: Orebor Harborage (Zangarmarsh) + ["0.27:0.44:0.38:0.50:0.27:0.74"] = 177, -- Orebor Harborage, Telredor, Telaar + ["0.27:0.44:0.38:0.50:0.44:0.67"] = 150, -- Orebor Harborage, Telredor, Shattrath + ["0.27:0.44:0.38:0.50:0.44:0.67:0.55:0.77"] = 225, -- Orebor Harborage, Telredor, Shattrath, Allerian Stronghold + ["0.27:0.44:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 302, -- Orebor Harborage, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.27:0.44:0.38:0.50:0.52:0.51:0.65:0.58"] = 221, -- Orebor Harborage, Telredor, Temple of Telhamat, Honor Hold + ["0.27:0.44:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 282, -- Orebor Harborage, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.27:0.44:0.38:0.50:0.52:0.51"] = 134, -- Orebor Harborage, Telredor, Temple of Telhamat + ["0.27:0.44:0.38:0.50"] = 53, -- Orebor Harborage, Telredor + ["0.27:0.44:0.32:0.34"] = 65, -- Orebor Harborage, Sylvanaar + ["0.27:0.44:0.32:0.34:0.42:0.37"] = 122, -- Orebor Harborage, Sylvanaar, Toshley's Station + ["0.27:0.44:0.32:0.34:0.42:0.28"] = 116, -- Orebor Harborage, Sylvanaar, Evergrove + ["0.27:0.44:0.32:0.34:0.58:0.27"] = 184, -- Orebor Harborage, Sylvanaar, Area 52 + ["0.27:0.44:0.32:0.34:0.58:0.27:0.72:0.28"] = 249, -- Orebor Harborage, Sylvanaar, Area 52, Cosmowrench + ["0.27:0.44:0.32:0.34:0.63:0.18"] = 219, -- Orebor Harborage, Sylvanaar, The Stormspire + ["0.27:0.44:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 275, -- Orebor Harborage, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.27:0.44:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 384, -- Orebor Harborage, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.27:0.44:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 253, -- Orebor Harborage, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.27:0.44:0.38:0.50:0.44:0.67:0.65:0.58"] = 261, -- Orebor Harborage, Telredor, Shattrath, Honor Hold + ["0.27:0.44:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 344, -- Orebor Harborage, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.27:0.44:0.38:0.50:0.42:0.37"] = 121, -- Orebor Harborage, Telredor, Toshley's Station + + -- Alliance: Sanctum of the Stars (Shadowmoon Valley) + ["0.78:0.85:0.55:0.77:0.44:0.67"] = 215, -- Sanctum of the Stars, Allerian Stronghold, Shattrath + ["0.78:0.85:0.55:0.77"] = 142, -- Sanctum of the Stars, Allerian Stronghold + ["0.78:0.85:0.69:0.85"] = 42, -- Sanctum of the Stars, Wildhammer Stronghold + ["0.78:0.85:0.55:0.77:0.27:0.74"] = 290, -- Sanctum of the Stars, Allerian Stronghold, Telaar + ["0.78:0.85:0.55:0.77:0.65:0.58"] = 237, -- Sanctum of the Stars, Allerian Stronghold, Honor Hold + ["0.78:0.85:0.55:0.77:0.65:0.58:0.79:0.55"] = 296, -- Sanctum of the Stars, Allerian Stronghold, Honor Hold, Hellfire Peninsula + ["0.78:0.85:0.55:0.77:0.65:0.58:0.75:0.50"] = 290, -- Sanctum of the Stars, Allerian Stronghold, Honor Hold, Shatter Point + ["0.78:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 450, -- Sanctum of the Stars, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52 + ["0.78:0.85:0.55:0.77:0.65:0.58:0.52:0.51"] = 311, -- Sanctum of the Stars, Allerian Stronghold, Honor Hold, Temple of Telhamat + ["0.78:0.85:0.55:0.77:0.44:0.67:0.38:0.50"] = 298, -- Sanctum of the Stars, Allerian Stronghold, Shattrath, Telredor + ["0.78:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 515, -- Sanctum of the Stars, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.78:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34"] = 389, -- Sanctum of the Stars, Allerian Stronghold, Shattrath, Telredor, Sylvanaar + ["0.78:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.27:0.44"] = 361, -- Sanctum of the Stars, Allerian Stronghold, Shattrath, Telredor, Orebor Harborage + ["0.78:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37"] = 366, -- Sanctum of the Stars, Allerian Stronghold, Shattrath, Telredor, Toshley's Station + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.42:0.28"] = 419, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Evergrove + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67"] = 215, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath + ["0.78:0.85:0.69:0.85:0.55:0.77"] = 142, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34"] = 389, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar + ["0.78:0.85:0.69:0.85:0.55:0.77:0.65:0.58"] = 237, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Honor Hold + ["0.78:0.85:0.69:0.85:0.55:0.77:0.27:0.74"] = 290, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Telaar + ["0.78:0.85:0.69:0.85:0.55:0.77:0.65:0.58:0.79:0.55"] = 296, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Hellfire Peninsula + ["0.78:0.85:0.69:0.85:0.55:0.77:0.65:0.58:0.75:0.50"] = 290, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Shatter Point + ["0.78:0.85:0.69:0.85:0.55:0.77:0.65:0.58:0.52:0.51"] = 311, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Temple of Telhamat + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50"] = 298, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.27:0.44"] = 361, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Orebor Harborage + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 516, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37"] = 367, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 498, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 450, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52 + ["0.78:0.85:0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.42:0.28"] = 440, -- Sanctum of the Stars, Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Evergrove + + -- Alliance: Shatter Point (Hellfire Peninsula) + ["0.75:0.50:0.79:0.55"] = 33, -- Shatter Point, Hellfire Peninsula + ["0.75:0.50:0.65:0.58"] = 57, -- Shatter Point, Honor Hold + ["0.75:0.50:0.65:0.58:0.55:0.77:0.69:0.85:0.81:0.77"] = 334, -- Shatter Point, Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.75:0.50:0.65:0.58:0.55:0.77:0.69:0.85"] = 252, -- Shatter Point, Honor Hold, Allerian Stronghold, Wildhammer Stronghold + ["0.75:0.50:0.65:0.58:0.55:0.77"] = 174, -- Shatter Point, Honor Hold, Allerian Stronghold + ["0.75:0.50:0.65:0.58:0.52:0.51"] = 132, -- Shatter Point, Honor Hold, Temple of Telhamat + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50"] = 213, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor + ["0.75:0.50:0.65:0.58:0.44:0.67"] = 175, -- Shatter Point, Honor Hold, Shattrath + ["0.75:0.50:0.65:0.58:0.44:0.67:0.27:0.74"] = 263, -- Shatter Point, Honor Hold, Shattrath, Telaar + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 430, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27"] = 364, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Area 52 + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50:0.27:0.44"] = 275, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor, Orebor Harborage + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 412, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.75:0.50:0.65:0.58:0.55:0.77:0.69:0.85:0.78:0.85"] = 294, -- Shatter Point, Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37"] = 282, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor, Toshley's Station + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50:0.42:0.37:0.42:0.28"] = 334, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor, Toshley's Station, Evergrove + ["0.75:0.50:0.65:0.58:0.52:0.51:0.38:0.50:0.32:0.34"] = 303, -- Shatter Point, Honor Hold, Temple of Telhamat, Telredor, Sylvanaar + + -- Alliance: Shattrath (Terokkar Forest) + ["0.44:0.67:0.27:0.74"] = 88, -- Shattrath, Telaar + ["0.44:0.67:0.55:0.77"] = 75, -- Shattrath, Allerian Stronghold (r-beauvais@hotmail.com reported 38) + ["0.44:0.67:0.55:0.77:0.69:0.85"] = 153, -- Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.44:0.67:0.65:0.58:0.79:0.55"] = 172, -- Shattrath, Honor Hold, Hellfire Peninsula + ["0.44:0.67:0.65:0.58"] = 111, -- Shattrath, Honor Hold (Juniardo reported 157) + ["0.44:0.67:0.38:0.50:0.52:0.51"] = 165, -- Shattrath, Telredor, Temple of Telhamat + ["0.44:0.67:0.38:0.50"] = 84, -- Shattrath, Telredor + ["0.44:0.67:0.38:0.50:0.27:0.44"] = 146, -- Shattrath, Telredor, Orebor Harborage + ["0.44:0.67:0.38:0.50:0.42:0.37"] = 152, -- Shattrath, Telredor, Toshley's Station + ["0.44:0.67:0.38:0.50:0.32:0.34"] = 175, -- Shattrath, Telredor, Sylvanaar + ["0.44:0.67:0.38:0.50:0.42:0.37:0.42:0.28"] = 205, -- Shattrath, Telredor, Toshley's Station, Evergrove + ["0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 235, -- Shattrath, Telredor, Toshley's Station, Area 52 + ["0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 301, -- Shattrath, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 284, -- Shattrath, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 235, -- Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.44:0.67:0.65:0.58:0.75:0.50"] = 165, -- Shattrath, Honor Hold, Shatter Point + ["0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 195, -- Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.44:0.67:0.38:0.50:0.32:0.34:0.58:0.27:0.72:0.28"] = 359, -- Shattrath, Telredor, Sylvanaar, Area 52, Cosmowrench + ["0.44:0.67:0.65:0.58:0.52:0.51"] = 185, -- Shattrath, Honor Hold, Temple of Telhamat + ["0.44:0.67:0.38:0.50:0.32:0.34:0.63:0.18"] = 329, -- Shattrath, Telredor, Sylvanaar, The Stormspire + ["0.44:0.67:0.38:0.50:0.32:0.34:0.58:0.27"] = 294, -- Shattrath, Telredor, Sylvanaar, Area 52 + ["0.44:0.67:0.38:0.50:0.32:0.34:0.42:0.28"] = 226, -- Shattrath, Telredor, Sylvanaar, Evergrove + ["0.44:0.67:0.38:0.50:0.32:0.34:0.63:0.18:0.72:0.28"] = 398, -- Shattrath, Telredor, Sylvanaar, The Stormspire, Cosmowrench + + -- Alliance: Sylvanaar (Blade's Edge Mountains) + ["0.32:0.34:0.38:0.50:0.27:0.74"] = 207, -- Sylvanaar, Telredor, Telaar + ["0.32:0.34:0.38:0.50:0.44:0.67"] = 179, -- Sylvanaar, Telredor, Shattrath + ["0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77"] = 255, -- Sylvanaar, Telredor, Shattrath, Allerian Stronghold + ["0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 332, -- Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58"] = 251, -- Sylvanaar, Telredor, Temple of Telhamat, Honor Hold + ["0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 312, -- Sylvanaar, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.32:0.34:0.38:0.50:0.52:0.51"] = 164, -- Sylvanaar, Telredor, Temple of Telhamat + ["0.32:0.34:0.38:0.50"] = 82, -- Sylvanaar, Telredor + ["0.32:0.34:0.27:0.44"] = 76, -- Sylvanaar, Orebor Harborage + ["0.32:0.34:0.42:0.37"] = 57, -- Sylvanaar, Toshley's Station + ["0.32:0.34:0.42:0.28"] = 51, -- Sylvanaar, Evergrove + ["0.32:0.34:0.58:0.27"] = 119, -- Sylvanaar, Area 52 + ["0.32:0.34:0.63:0.18"] = 155, -- Sylvanaar, The Stormspire + ["0.32:0.34:0.58:0.27:0.72:0.28"] = 185, -- Sylvanaar, Area 52, Cosmowrench + ["0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 373, -- Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 305, -- Sylvanaar, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 413, -- Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.32:0.34:0.38:0.50:0.44:0.67:0.65:0.58"] = 289, -- Sylvanaar, Telredor, Shattrath, Honor Hold + + -- Alliance: Telaar (Nagrand) + ["0.27:0.74:0.44:0.67"] = 88, -- Telaar, Shattrath + ["0.27:0.74:0.55:0.77"] = 122, -- Telaar, Allerian Stronghold + ["0.27:0.74:0.55:0.77:0.69:0.85"] = 200, -- Telaar, Allerian Stronghold, Wildhammer Stronghold + ["0.27:0.74:0.44:0.67:0.65:0.58:0.79:0.55"] = 260, -- Telaar, Shattrath, Honor Hold, Hellfire Peninsula + ["0.27:0.74:0.44:0.67:0.65:0.58"] = 199, -- Telaar, Shattrath, Honor Hold + ["0.27:0.74:0.38:0.50:0.52:0.51"] = 208, -- Telaar, Telredor, Temple of Telhamat + ["0.27:0.74:0.38:0.50"] = 126, -- Telaar, Telredor + ["0.27:0.74:0.38:0.50:0.27:0.44"] = 189, -- Telaar, Telredor, Orebor Harborage + ["0.27:0.74:0.38:0.50:0.42:0.37"] = 195, -- Telaar, Telredor, Toshley's Station + ["0.27:0.74:0.38:0.50:0.32:0.34"] = 217, -- Telaar, Telredor, Sylvanaar + ["0.27:0.74:0.38:0.50:0.42:0.37:0.42:0.28"] = 248, -- Telaar, Telredor, Toshley's Station, Evergrove + ["0.27:0.74:0.38:0.50:0.42:0.37:0.58:0.27"] = 280, -- Telaar, Telredor, Toshley's Station, Area 52 + ["0.27:0.74:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 344, -- Telaar, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.27:0.74:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 327, -- Telaar, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.27:0.74:0.55:0.77:0.69:0.85:0.81:0.77"] = 281, -- Telaar, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.27:0.74:0.44:0.67:0.65:0.58:0.75:0.50"] = 253, -- Telaar, Shattrath, Honor Hold, Shatter Point + ["0.27:0.74:0.55:0.77:0.69:0.85:0.78:0.85"] = 241, -- Telaar, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.27:0.74:0.38:0.50:0.32:0.34:0.42:0.28"] = 269, -- Telaar, Telredor, Sylvanaar, Evergrove + ["0.27:0.74:0.38:0.50:0.32:0.34:0.58:0.27"] = 336, -- Telaar, Telredor, Sylvanaar, Area 52 + ["0.27:0.74:0.44:0.67:0.65:0.58:0.52:0.51"] = 273, -- Telaar, Shattrath, Honor Hold, Temple of Telhamat + ["0.27:0.74:0.38:0.50:0.32:0.34:0.58:0.27:0.72:0.28"] = 402, -- Telaar, Telredor, Sylvanaar, Area 52, Cosmowrench + ["0.27:0.74:0.38:0.50:0.52:0.51:0.65:0.58"] = 295, -- Telaar, Telredor, Temple of Telhamat, Honor Hold + + -- Alliance: Telredor (Zangarmarsh) + ["0.38:0.50:0.27:0.74"] = 125, -- Telredor, Telaar + ["0.38:0.50:0.44:0.67"] = 97, -- Telredor, Shattrath + ["0.38:0.50:0.44:0.67:0.55:0.77"] = 172, -- Telredor, Shattrath, Allerian Stronghold + ["0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 250, -- Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.38:0.50:0.52:0.51:0.65:0.58"] = 169, -- Telredor, Temple of Telhamat, Honor Hold + ["0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 230, -- Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.38:0.50:0.52:0.51"] = 82, -- Telredor, Temple of Telhamat + ["0.38:0.50:0.27:0.44"] = 63, -- Telredor, Orebor Harborage + ["0.38:0.50:0.32:0.34"] = 91, -- Telredor, Sylvanaar + ["0.38:0.50:0.42:0.37"] = 69, -- Telredor, Toshley's Station + ["0.38:0.50:0.42:0.37:0.42:0.28"] = 121, -- Telredor, Toshley's Station, Evergrove + ["0.38:0.50:0.42:0.37:0.58:0.27"] = 153, -- Telredor, Toshley's Station, Area 52 + ["0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 219, -- Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 200, -- Telredor, Toshley's Station, Area 52, The Stormspire + ["0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 331, -- Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 223, -- Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 292, -- Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.38:0.50:0.32:0.34:0.58:0.27:0.72:0.28"] = 276, -- Telredor, Sylvanaar, Area 52, Cosmowrench + ["0.38:0.50:0.32:0.34:0.42:0.28"] = 142, -- Telredor, Sylvanaar, Evergrove + ["0.38:0.50:0.44:0.67:0.65:0.58"] = 208, -- Telredor, Shattrath, Honor Hold + ["0.38:0.50:0.52:0.51:0.65:0.58:0.55:0.77"] = 284, -- Telredor, Temple of Telhamat, Honor Hold, Allerian Stronghold + ["0.38:0.50:0.32:0.34:0.63:0.18"] = 245, -- Telredor, Sylvanaar, The Stormspire + ["0.38:0.50:0.32:0.34:0.58:0.27"] = 210, -- Telredor, Sylvanaar, Area 52 + + -- Alliance: Temple of Telhamat (Hellfire Peninsula) + ["0.52:0.51:0.38:0.50:0.27:0.74"] = 206, -- Temple of Telhamat, Telredor, Telaar + ["0.52:0.51:0.38:0.50:0.44:0.67"] = 178, -- Temple of Telhamat, Telredor, Shattrath + ["0.52:0.51:0.65:0.58:0.55:0.77"] = 203, -- Temple of Telhamat, Honor Hold, Allerian Stronghold + ["0.52:0.51:0.65:0.58:0.55:0.77:0.69:0.85"] = 281, -- Temple of Telhamat, Honor Hold, Allerian Stronghold, Wildhammer Stronghold + ["0.52:0.51:0.65:0.58"] = 88, -- Temple of Telhamat, Honor Hold + ["0.52:0.51:0.65:0.58:0.79:0.55"] = 149, -- Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.52:0.51:0.38:0.50"] = 81, -- Temple of Telhamat, Telredor + ["0.52:0.51:0.38:0.50:0.27:0.44"] = 144, -- Temple of Telhamat, Telredor, Orebor Harborage + ["0.52:0.51:0.38:0.50:0.42:0.37"] = 150, -- Temple of Telhamat, Telredor, Toshley's Station + ["0.52:0.51:0.38:0.50:0.32:0.34"] = 172, -- Temple of Telhamat, Telredor, Sylvanaar + ["0.52:0.51:0.38:0.50:0.42:0.37:0.42:0.28"] = 203, -- Temple of Telhamat, Telredor, Toshley's Station, Evergrove + ["0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27"] = 233, -- Temple of Telhamat, Telredor, Toshley's Station, Area 52 + ["0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 280, -- Temple of Telhamat, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.52:0.51:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 298, -- Temple of Telhamat, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.52:0.51:0.65:0.58:0.75:0.50"] = 142, -- Temple of Telhamat, Honor Hold, Shatter Point + ["0.52:0.51:0.65:0.58:0.55:0.77:0.69:0.85:0.81:0.77"] = 362, -- Temple of Telhamat, Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.52:0.51:0.65:0.58:0.55:0.77:0.69:0.85:0.78:0.85"] = 323, -- Temple of Telhamat, Honor Hold, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.52:0.51:0.65:0.58:0.44:0.67"] = 204, -- Temple of Telhamat, Honor Hold, Shattrath + ["0.52:0.51:0.38:0.50:0.32:0.34:0.42:0.28"] = 223, -- Temple of Telhamat, Telredor, Sylvanaar, Evergrove + ["0.52:0.51:0.65:0.58:0.44:0.67:0.27:0.74"] = 292, -- Tempel von Telhamat, Ehrenfeste, Shattrath, Telaar + ["0.52:0.51:0.38:0.50:0.32:0.34:0.58:0.27"] = 291, -- Temple of Telhamat, Telredor, Sylvanaar, Area 52 + + -- Alliance: The Stormspire (Netherstorm) + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.27:0.74"] = 341, -- The Stormspire, Area 52, Toshley's Station, Telredor, Telaar + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67"] = 315, -- The Stormspire, Area 52, Toshley's Station, Telredor, Shattrath + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77"] = 390, -- The Stormspire, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 467, -- The Stormspire, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58"] = 386, -- The Stormspire, Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 448, -- The Stormspire, Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51"] = 302, -- The Stormspire, Area 52, Toshley's Station, Telredor, Temple of Telhamat + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50"] = 220, -- The Stormspire, Area 52, Toshley's Station, Telredor + ["0.63:0.18:0.32:0.34:0.27:0.44"] = 230, -- The Stormspire, Sylvanaar, Orebor Harborage + ["0.63:0.18:0.58:0.27:0.42:0.37"] = 146, -- The Stormspire, Area 52, Toshley's Station + ["0.63:0.18:0.32:0.34"] = 154, -- The Stormspire, Sylvanaar + ["0.63:0.18:0.58:0.27:0.42:0.28"] = 132, -- The Stormspire, Area 52, Evergrove + ["0.63:0.18:0.58:0.27"] = 53, -- The Stormspire, Area 52 + ["0.63:0.18:0.72:0.28"] = 69, -- The Stormspire, Cosmowrench + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 440, -- The Stormspire, Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 549, -- The Stormspire, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 509, -- The Stormspire, Area 52, Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.63:0.18:0.32:0.34:0.38:0.50:0.44:0.67"] = 332, -- The Stormspire, Sylvanaar, Telredor, Shattrath + ["0.63:0.18:0.32:0.34:0.38:0.50"] = 236, -- The Stormspire, Sylvanaar, Telredor + ["0.63:0.18:0.32:0.34:0.38:0.50:0.27:0.74"] = 360, -- The Stormspire, Sylvanaar, Telredor, Telaar + ["0.63:0.18:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 485, -- The Stormspire, Sylvanaar, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.63:0.18:0.32:0.34:0.38:0.50:0.52:0.51:0.65:0.58"] = 404, -- The Stormspire, Sylvanaar, Telredor, Temple of Telhamat, Honor Hold + ["0.63:0.18:0.32:0.34:0.38:0.50:0.44:0.67:0.55:0.77"] = 407, -- The Stormspire, Sylvanaar, Telredor, Shattrath, Allerian Stronghold + ["0.63:0.18:0.32:0.34:0.38:0.50:0.52:0.51"] = 317, -- The Stormspire, Sylvanaar, Telredor, Temple of Telhamat + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.55:0.77"] = 502, -- The Stormspire, Area 52, Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Allerian Stronghold + ["0.63:0.18:0.58:0.27:0.42:0.37:0.38:0.50:0.44:0.67:0.65:0.58"] = 426, -- The Stormspire, Area 52, Toshley's Station, Telredor, Shattrath, Honor Hold + + -- Alliance: Toshley's Station (Blade's Edge Mountains) + ["0.42:0.37:0.38:0.50:0.27:0.74"] = 197, -- Toshley's Station, Telredor, Telaar (was 265, changed to 197 by kaungmo@gmail.com and Thomas Jespersen) + ["0.42:0.37:0.38:0.50:0.44:0.67"] = 170, -- Toshley's Station, Telredor, Shattrath + ["0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77"] = 245, -- Toshley's Station, Telredor, Shattrath, Allerian Stronghold + ["0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85"] = 321, -- Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold + ["0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.79:0.55"] = 302, -- Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Hellfire Peninsula + ["0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58"] = 241, -- Toshley's Station, Telredor, Temple of Telhamat, Honor Hold + ["0.42:0.37:0.38:0.50:0.52:0.51"] = 154, -- Toshley's Station, Telredor, Temple of Telhamat + ["0.42:0.37:0.38:0.50"] = 73, -- Toshley's Station, Telredor + ["0.42:0.37:0.32:0.34:0.27:0.44"] = 134, -- Toshley's Station, Sylvanaar, Orebor Harborage + ["0.42:0.37:0.32:0.34"] = 60, -- Toshley's Station, Sylvanaar + ["0.42:0.37:0.42:0.28"] = 53, -- Toshley's Station, Evergrove + ["0.42:0.37:0.58:0.27"] = 84, -- Toshley's Station, Area 52 + ["0.42:0.37:0.58:0.27:0.63:0.18"] = 132, -- Toshley's Station, Area 52, The Stormspire + ["0.42:0.37:0.58:0.27:0.72:0.28"] = 150, -- Toshley's Station, Area 52, Cosmowrench + ["0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.81:0.77"] = 403, -- Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Altar of Sha'tar + ["0.42:0.37:0.38:0.50:0.52:0.51:0.65:0.58:0.75:0.50"] = 295, -- Toshley's Station, Telredor, Temple of Telhamat, Honor Hold, Shatter Point + ["0.42:0.37:0.38:0.50:0.44:0.67:0.55:0.77:0.69:0.85:0.78:0.85"] = 364, -- Toshley's Station, Telredor, Shattrath, Allerian Stronghold, Wildhammer Stronghold, Sanctum of the Stars + ["0.42:0.37:0.38:0.50:0.27:0.74:0.55:0.77"] = 318, -- Toshley's Station, Telredor, Telaar, Allerian Stronghold + ["0.42:0.37:0.38:0.50:0.44:0.67:0.65:0.58"] = 280, -- Toshley's Station, Telredor, Shattrath, Honor Hold + + -- Alliance: Wildhammer Stronghold (Shadowmoon Valley) + ["0.69:0.85:0.55:0.77:0.27:0.74"] = 249, -- Wildhammer Stronghold, Allerian Stronghold, Telaar + ["0.69:0.85:0.55:0.77:0.44:0.67"] = 174, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath + ["0.69:0.85:0.55:0.77"] = 101, -- Wildhammer Stronghold, Allerian Stronghold + ["0.69:0.85:0.55:0.77:0.65:0.58"] = 196, -- Wildhammer Stronghold, Allerian Stronghold, Honor Hold + ["0.69:0.85:0.55:0.77:0.65:0.58:0.79:0.55"] = 256, -- Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Hellfire Peninsula + ["0.69:0.85:0.55:0.77:0.65:0.58:0.52:0.51"] = 270, -- Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Temple of Telhamat + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50"] = 257, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.27:0.44"] = 320, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Orebor Harborage + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37"] = 326, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34"] = 348, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.42:0.28"] = 379, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Evergrove + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27"] = 409, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52 + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.72:0.28"] = 475, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, Cosmowrench + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.42:0.37:0.58:0.27:0.63:0.18"] = 457, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Toshley's Station, Area 52, The Stormspire + ["0.69:0.85:0.81:0.77"] = 84, -- Wildhammer Stronghold, Altar of Sha'tar + ["0.69:0.85:0.55:0.77:0.65:0.58:0.75:0.50"] = 250, -- Wildhammer Stronghold, Allerian Stronghold, Honor Hold, Shatter Point + ["0.69:0.85:0.78:0.85"] = 43, -- Wildhammer Stronghold, Sanctum of the Stars + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.63:0.18"] = 503, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar, The Stormspire + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.42:0.28"] = 399, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Evergrove + ["0.69:0.85:0.55:0.77:0.44:0.67:0.38:0.50:0.32:0.34:0.58:0.27"] = 467, -- Wildhammer Stronghold, Allerian Stronghold, Shattrath, Telredor, Sylvanaar, Area 52 + + }, + + -- Alliance: Northrend + [113] = { + + ---------------------------------------------------------------------- + -- Alliance: Borean Tundra + ---------------------------------------------------------------------- + + -- Alliance: Borean Tundra: Amber Ledge + ["0.17:0.53:0.12:0.53"] = 25, -- Amber Ledge, Transitus Shield + ["0.17:0.53:0.21:0.49"] = 24, -- Amber Ledge, Fizzcrank Airstrip + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38"] = 194, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran + ["0.17:0.53:0.21:0.49:0.24:0.40"] = 65, -- Amber Ledge, Fizzcrank Airstrip, River's Heart + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36"] = 209, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60"] = 316, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 320, -- Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71"] = 267, -- Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54"] = 239, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 278, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.17:0.53:0.22:0.61"] = 45, -- Amber Ledge, Valiance Keep + ["0.17:0.53:0.21:0.49:0.29:0.57"] = 66, -- Amber Ledge, Fizzcrank Airstrip, Unu'pe + ["0.17:0.53:0.21:0.49:0.42:0.53"] = 112, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest + ["0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43"] = 154, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp + ["0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46"] = 164, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67"] = 273, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 293, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 300, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40"] = 273, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.17:0.53:0.22:0.61:0.42:0.53"] = 140, -- Amber Ledge, Valiance Keep, Stars' Rest + ["0.17:0.53:0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38"] = 233, -- Amber Ledge, Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 318, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 346, -- Amber Ledge, Valiance Keep, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.60:0.52"] = 201, -- Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Wintergarde Keep + ["0.17:0.53:0.21:0.49:0.42:0.53:0.54:0.52"] = 171, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.69:0.42"] = 276, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Light's Breach + ["0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58"] = 145, -- Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki + ["0.17:0.53:0.22:0.61:0.42:0.53:0.54:0.52:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19:0.72:0.29"] = 436, -- Amber Ledge, Valiance Keep, Stars' Rest, Wyrmrest Temple, Dalaran, The Argent Vanguard, Frosthold, Ulduar, Dun Nifflelem + ["0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38"] = 207, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran + ["0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54"] = 267, -- Amber Ledge, Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52"] = 221, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep + ["0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.52:0.38"] = 226, -- Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Dalaran + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42"] = 247, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Light's Breach + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58"] = 164, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki + ["0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67"] = 291, -- Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Westguard Keep + ["0.17:0.53:0.22:0.61:0.42:0.53:0.54:0.52"] = 198, -- Amber Ledge, Valiance Keep, Stars' Rest, Wyrmrest Temple + ["0.17:0.53:0.21:0.49:0.18:0.40"] = 74, -- Amber Ledge, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52"] = 192, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep + ["0.17:0.53:0.21:0.49:0.42:0.53:0.54:0.52:0.52:0.38"] = 234, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple, Dalaran + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.52:0.34"] = 264, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Dalaran, Crusaders' Pinnacle + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71"] = 287, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Kamagua + ["0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28"] = 123, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise + ["0.17:0.53:0.22:0.61:0.29:0.57"] = 86, -- Amber Ledge, Valiance Keep, Unu'pe + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67"] = 301, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Westguard Keep + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42"] = 231, -- Bernsteinflöz, Landebahn Kurbelzisch, Sternenruh, Feste Wintergarde, Schwarze Wacht + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46"] = 321, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 336, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43:0.28:0.28"] = 264, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, Death's Rise + ["0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.72:0.29"] = 304, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, K3, Dun Nifflelem + ["0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 313, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43:0.52:0.34"] = 226, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, Crusaders' Pinnacle + ["0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34:0.38:0.21"] = 308, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.62:0.36"] = 225, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, K3 + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 292, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, K3, Dun Nifflelem + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.52:0.34"] = 213, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, Crusaders' Pinnacle + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.59:0.43"] = 222, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, Windrunner's Overlook + ["0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.57:0.21:0.64:0.19"] = 294, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise, Bouldercrag's Refuge, Ulduar + ["0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.57:0.21"] = 265, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise, Bouldercrag's Refuge + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54"] = 268, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38"] = 245, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Dalaran + ["0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.38:0.21"] = 184, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise, The Shadow Vault + ["0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.76:0.67"] = 300, -- Amber Ledge, Valiance Keep, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.49:0.21"] = 235, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise, Argent Tournament Grounds + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33"] = 236, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold + ["0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.49:0.21"] = 270, -- Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, Argent Tournament Grounds + ["0.17:0.53:0.21:0.49:0.42:0.53:0.49:0.58"] = 157, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Moa'ki + ["0.17:0.53:0.21:0.49:0.42:0.53:0.49:0.58:0.74:0.71"] = 279, -- Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Moa'ki, Kamagua + ["0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33"] = 248, -- Bernsteinflöz, Landebahn Kurbelzisch, Sternenruh, Feste Fordragon, Dalaran, Die Argentumvorhut, Eisfestung + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.54:0.52"] = 197, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wyrmrest Temple + ["0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.24:0.40"] = 378, -- Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Dalaran, River's Heart + + -- Alliance: Borean Tundra: Fizzcrank Airstrip + ["0.21:0.49:0.17:0.53"] = 45, -- Fizzcrank Airstrip, Amber Ledge + ["0.21:0.49:0.17:0.53:0.12:0.53"] = 81, -- Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.21:0.49:0.22:0.61"] = 71, -- Fizzcrank Airstrip, Valiance Keep + ["0.21:0.49:0.29:0.57"] = 66, -- Fizzcrank Airstrip, Unu'pe + ["0.21:0.49:0.24:0.40:0.52:0.38"] = 257, -- Fizzcrank Airstrip, River's Heart, Dalaran + ["0.21:0.49:0.24:0.40"] = 64, -- Fizzcrank Airstrip, River's Heart + ["0.21:0.49:0.24:0.40:0.28:0.28"] = 149, -- Fizzcrank Airstrip, River's Heart, Death's Rise + ["0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33"] = 318, -- Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold + ["0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 446, -- Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60"] = 438, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.21:0.49:0.42:0.53"] = 133, -- Fizzcrank Airstrip, Stars' Rest (david kwon, Tyler Theurer and Mark Nodson reported 71) (Hindenburg, Teri Frietze and Leatrix reported 133) + ["0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67"] = 374, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.21:0.49:0.42:0.53:0.54:0.52"] = 219, -- Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple + ["0.21:0.49:0.42:0.53:0.60:0.52"] = 254, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep + ["0.21:0.49:0.29:0.57:0.49:0.58:0.52:0.38"] = 304, -- Landebahn Kurbelzisch, Unu'pe, Moa'ki, Dalaran + ["0.21:0.49:0.29:0.57:0.49:0.58"] = 183, -- Fizzcrank Airstrip, Unu'pe, Moa'ki + ["0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71"] = 366, -- Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua + ["0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38"] = 276, -- Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran + ["0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54"] = 325, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.60"] = 458, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.21:0.49:0.18:0.40"] = 77, -- Fizzcrank Airstrip, Nesingwary Base Camp + ["0.21:0.49:0.29:0.57:0.49:0.58:0.60:0.52"] = 267, -- Fizzcrank Airstrip, Unu'pe, Moa'ki, Wintergarde Keep + ["0.21:0.49:0.42:0.53:0.60:0.52:0.59:0.43:0.52:0.38"] = 365, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.21:0.49:0.24:0.40:0.52:0.38:0.49:0.58"] = 406, -- Fizzcrank Airstrip, River's Heart, Dalaran, Moa'ki + ["0.21:0.49:0.42:0.53:0.60:0.52:0.59:0.43"] = 318, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Windrunner's Overlook + ["0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 415, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 405, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 443, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.21:0.49:0.42:0.53:0.54:0.52:0.52:0.38"] = 315, -- Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple, Dalaran + ["0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42"] = 311, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch + ["0.21:0.49:0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 402, -- Fizzcrank Airstrip, River's Heart, Dalaran, K3, Dun Nifflelem + ["0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42"] = 336, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Light's Breach + ["0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 383, -- Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.21:0.49:0.24:0.40:0.52:0.38:0.62:0.36"] = 302, -- Fizzcrank Airstrip, River's Heart, Dalaran, K3 + ["0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67"] = 403, -- Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Westguard Keep + ["0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 434, -- Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.21:0.49:0.42:0.53:0.46:0.46"] = 211, -- Fizzcrank Airstrip, Stars' Rest, Fordragon Hold + ["0.21:0.49:0.24:0.40:0.28:0.28:0.38:0.21"] = 242, -- Fizzcrank Airstrip, River's Heart, Death's Rise, The Shadow Vault + ["0.21:0.49:0.42:0.53:0.41:0.43:0.52:0.38"] = 286, -- Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, Dalaran + ["0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 486, -- Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36"] = 322, -- Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, K3 + ["0.21:0.49:0.42:0.53:0.41:0.43"] = 196, -- Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp + ["0.21:0.49:0.42:0.53:0.41:0.43:0.28:0.28"] = 361, -- Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, Death's Rise + ["0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36"] = 299, -- Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard + ["0.21:0.49:0.42:0.53:0.41:0.43:0.38:0.21"] = 356, -- Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, The Shadow Vault + ["0.21:0.49:0.42:0.53:0.49:0.58:0.74:0.71:0.88:0.72"] = 464, -- Fizzcrank Airstrip, Stars' Rest, Moa'ki, Kamagua, Valgarde Port + ["0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42:0.72:0.40"] = 378, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Light's Breach, The Argent Stand + ["0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 415, -- Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.21:0.49:0.24:0.40:0.52:0.38:0.52:0.34"] = 285, -- Fizzcrank Airstrip, River's Heart, Dalaran, Crusaders' Pinnacle + ["0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40"] = 375, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.21:0.49:0.42:0.53:0.49:0.58"] = 201, -- Fizzcrank Airstrip, Stars' Rest, Moa'ki + ["0.21:0.49:0.24:0.40:0.52:0.38:0.59:0.43"] = 298, -- Fizzcrank Airstrip, River's Heart, Dalaran, Windrunner's Overlook + ["0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 468, -- Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36"] = 279, -- Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard + ["0.21:0.49:0.24:0.40:0.28:0.28:0.49:0.21"] = 318, -- Fizzcrank Airstrip, River's Heart, Death's Rise, Argent Tournament Grounds + ["0.21:0.49:0.24:0.40:0.28:0.28:0.57:0.21:0.64:0.19"] = 407, -- Fizzcrank Airstrip, River's Heart, Death's Rise, Bouldercrag's Refuge, Ulduar + ["0.21:0.49:0.24:0.40:0.28:0.28:0.57:0.21"] = 363, -- Fizzcrank Airstrip, River's Heart, Death's Rise, Bouldercrag's Refuge + ["0.21:0.49:0.42:0.53:0.49:0.58:0.52:0.38"] = 322, -- Fizzcrank Airstrip, Stars' Rest, Moa'ki, Dalaran + + -- Alliance: Borean Tundra: Transitus Shield (Coldarra) + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40"] = 95, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart + ["0.12:0.53:0.17:0.53"] = 30, -- Transitus Shield, Amber Ledge (niels lowik reported 49) + ["0.12:0.53:0.17:0.53:0.21:0.49"] = 53, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip + ["0.12:0.53:0.17:0.53:0.22:0.61"] = 74, -- Transitus Shield, Amber Ledge, Valiance Keep + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38"] = 224, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57"] = 96, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46"] = 193, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58"] = 174, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 349, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28"] = 151, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60"] = 344, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67"] = 301, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71"] = 296, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 369, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53"] = 140, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52"] = 248, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Wintergarde Keep + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57"] = 115, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53"] = 169, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52"] = 221, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58"] = 193, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54"] = 269, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 396, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.60"] = 357, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38"] = 274, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Dalaran + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67"] = 321, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Westguard Keep + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52"] = 250, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46"] = 350, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 375, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38"] = 235, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 350, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.54:0.52:0.52:0.38"] = 262, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple, Dalaran + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.54:0.52"] = 198, -- Transitusschild, Bernsteinflöz, Landebahn Kurbelzisch, Sternenruh, Wyrmruhtempel + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.54:0.52:0.52:0.38"] = 290, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Wyrmrest Temple, Dalaran + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60:0.88:0.72"] = 393, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.52:0.38"] = 254, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Dalaran + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.54:0.52"] = 226, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wyrmrest Temple + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 347, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54"] = 296, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.12:0.53:0.17:0.53:0.21:0.49:0.18:0.40"] = 103, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.60:0.52"] = 230, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Wintergarde Keep + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42"] = 276, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Light's Breach + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38"] = 262, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.72:0.29"] = 333, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, K3, Dun Nifflelem + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.49:0.58"] = 214, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Moa'ki + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29:0.64:0.19"] = 376, -- Маскировочный щит, Янтарная гряда, Взлетная полоса Выкрутеня, Слияние рек, Даларан, К-3, Дун Ниффелем, Ульдуар + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.59:0.43:0.52:0.38"] = 323, -- Transitusschild, Bernsteinflöz, Valianzfeste, Sternenruh, Feste Wintergarde, Windläufers Warte, Dalaran + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67"] = 330, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Westguard Keep + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 328, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 320, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, K3, Dun Nifflelem + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43"] = 183, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.54:0.52:0.64:0.42:0.69:0.42:0.73:0.54:0.76:0.67:0.88:0.72"] = 454, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple, Ebon Watch, Light's Breach, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 322, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.54:0.52"] = 227, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Wyrmrest Temple + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 342, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36"] = 238, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 364, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40"] = 302, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.62:0.36"] = 254, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, K3 + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.62:0.36"] = 286, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, K3 + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 328, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.59:0.43"] = 264, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Windrunner's Overlook + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.49:0.58:0.52:0.38"] = 266, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Moa'ki, Dalaran + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43:0.38:0.21"] = 289, -- Transitusschild, Bernsteinflöz, Landebahn Kurbelzisch, Sternenruh, Valianzlager, Das Schattengewölbe + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42"] = 260, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36"] = 252, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36"] = 267, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, K3 + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43:0.28:0.28"] = 293, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, Death's Rise + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.57:0.21"] = 294, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise, Bouldercrag's Refuge + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43:0.52:0.34"] = 256, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, Crusaders' Pinnacle + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.72:0.29"] = 359, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, K3, Dun Nifflelem + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33"] = 264, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67:0.73:0.54"] = 370, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Westguard Keep, Amberpine Lodge + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.57:0.21:0.64:0.19"] = 323, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise, Bouldercrag's Refuge, Ulduar + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33"] = 277, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.49:0.58"] = 186, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Moa'ki + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.38:0.21"] = 213, -- Маскировочный щит, Янтарная гряда, Взлетная полоса Выкрутеня, Слияние рек, Уступ Смерти, Мрачный Свод + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 463, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.41:0.43:0.52:0.38"] = 243, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Valiance Landing Camp, Dalaran + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.52:0.34"] = 242, -- Escudo de Tránsito, El Saliente Ámbar, Pista de Aterrizaje de Palanqueta, Corazón del Río, Dalaran, Pináculo de los Cruzados + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.72"] = 376, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36"] = 293, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, K3 + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34:0.38:0.21"] = 337, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.24:0.40"] = 407, -- Transitusschild, Bernsteinflöz, Valianzfeste, Unu'pe, Moa'ki, Dalaran, Flussnabel + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.56:0.36"] = 289, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Dalaran, The Argent Vanguard + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.41:0.43:0.38:0.21"] = 318, -- Transitus Shield, Amber Ledge, Valiance Keep, Stars' Rest, Valiance Landing Camp, The Shadow Vault + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 307, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.28:0.28:0.49:0.21"] = 264, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Death's Rise, Argent Tournament Grounds + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.54:0.52:0.64:0.42:0.69:0.42:0.73:0.54:0.76:0.67"] = 408, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple, Ebon Watch, Light's Breach, Amberpine Lodge, Westguard Keep + ["0.12:0.53:0.17:0.53:0.22:0.61:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40"] = 329, -- Transitusschild, Bernsteinflöz, Valianzfeste, Sternenruh, Feste Wintergarde, Schwarze Wacht, Argentumwache + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.59:0.43"] = 251, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, Windrunner's Overlook + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 358, -- Transitus Shield, Amber Ledge, Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.12:0.53:0.17:0.53:0.21:0.49:0.29:0.57:0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 360, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Unu'pe, Moa'ki, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.12:0.53:0.17:0.53:0.21:0.49:0.24:0.40:0.52:0.38:0.49:0.21"] = 299, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, River's Heart, Dalaran, Argent Tournament Grounds + ["0.12:0.53:0.17:0.53:0.21:0.49:0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34:0.28:0.28"] = 366, -- Transitus Shield, Amber Ledge, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.12:0.53:0.17:0.53:0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67"] = 340, -- Transitusschild, Bernsteinflöz, Valianzfeste, Unu'pe, Moa'ki, Kamagua, Westwacht + + -- Alliance: Borean Tundra: Unu'pe + ["0.29:0.57:0.22:0.61"] = 60, -- Unu'pe, Valiance Keep + ["0.29:0.57:0.42:0.53"] = 98, -- Unu'pe, Stars' Rest + ["0.29:0.57:0.49:0.58:0.52:0.38"] = 240, -- Unu'pe, Moa'ki, Dalaran + ["0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 382, -- Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.29:0.57:0.21:0.49"] = 79, -- Unu'pe, Fizzcrank Airstrip + ["0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54:0.88:0.60"] = 387, -- Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.29:0.57:0.49:0.58:0.74:0.71"] = 302, -- Unu'pe, Moa'ki, Kamagua + ["0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54"] = 273, -- Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge + ["0.29:0.57:0.49:0.58"] = 118, -- Unu'pe, Moa'ki + ["0.29:0.57:0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33"] = 300, -- Unu'pe, Moa'ki, Dalaran, The Argent Vanguard, Frosthold + ["0.29:0.57:0.22:0.61:0.17:0.53:0.12:0.53"] = 158, -- Unu'pe, Valiance Keep, Amber Ledge, Transitus Shield + ["0.29:0.57:0.22:0.61:0.17:0.53"] = 122, -- Unu'pe, Valiance Keep, Amber Ledge + ["0.29:0.57:0.21:0.49:0.24:0.40"] = 142, -- Unu'pe, Fizzcrank Airstrip, River's Heart + ["0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67"] = 323, -- Unu'pe, Moa'ki, Wintergarde Keep, Westguard Keep + ["0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46"] = 353, -- Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 364, -- Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.29:0.57:0.49:0.58:0.60:0.52"] = 202, -- Unu'pe, Moa'ki, Wintergarde Keep + ["0.29:0.57:0.42:0.53:0.60:0.52"] = 218, -- Unu'pe, Stars' Rest, Wintergarde Keep + ["0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67"] = 338, -- Unu'pe, Moa'ki, Kamagua, Westguard Keep + ["0.29:0.57:0.42:0.53:0.60:0.52:0.76:0.67"] = 338, -- Unu'pe, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.29:0.57:0.42:0.53:0.46:0.46"] = 175, -- Unu'pe, Stars' Rest, Fordragon Hold + ["0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 422, -- Unu'pe, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.29:0.57:0.49:0.58:0.52:0.38:0.62:0.36:0.57:0.33"] = 326, -- Unu'pe, Moa'ki, Dalaran, K3, Frosthold + ["0.29:0.57:0.49:0.58:0.54:0.52"] = 166, -- Unu'pe, Moa'ki, Wyrmruhtempel + ["0.29:0.57:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 407, -- Unu'pe, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.29:0.57:0.42:0.53:0.54:0.52"] = 184, -- Unu'pe, Stars' Rest, Wyrmrest Temple + ["0.29:0.57:0.42:0.53:0.46:0.46:0.52:0.38"] = 241, -- Unu'pe, Stars' Rest, Fordragon Hold, Dalaran + ["0.29:0.57:0.49:0.58:0.60:0.52:0.69:0.42"] = 285, -- Unu'pe, Moa'ki, Wintergarde Keep, Light's Breach + ["0.29:0.57:0.49:0.58:0.52:0.38:0.62:0.36:0.72:0.29"] = 383, -- Unu'pe, Moa'ki, Dalaran, K3, Dun Nifflelem + ["0.29:0.57:0.49:0.58:0.52:0.38:0.62:0.36"] = 284, -- Unu'pe, Moa'ki, Dalaran, K3 + ["0.29:0.57:0.42:0.53:0.54:0.52:0.52:0.38"] = 281, -- Unu'pe, Stars' Rest, Wyrmrest Temple, Dalaran + ["0.29:0.57:0.42:0.53:0.41:0.43:0.24:0.40"] = 296, -- Unu'pe, Stars' Rest, Valiance Landing Camp, River's Heart + ["0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.72"] = 391, -- Unu'pe, Moa'ki, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.60"] = 406, -- Unu'pe, Moa'ki, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.29:0.57:0.42:0.53:0.41:0.43"] = 161, -- Unu'pe, Stars' Rest, Valiance Landing Camp + ["0.29:0.57:0.49:0.58:0.52:0.38:0.56:0.36"] = 262, -- Unu'pe, Moa'ki, Dalaran, The Argent Vanguard + ["0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40"] = 323, -- Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.29:0.57:0.49:0.58:0.52:0.38:0.52:0.34"] = 267, -- Unu'pe, Moa'ki, Dalaran, Crusaders' Pinnacle + ["0.29:0.57:0.49:0.58:0.60:0.52:0.59:0.43"] = 267, -- Unu'pe, Moa'ki, Wintergarde Keep, Windrunner's Overlook + ["0.29:0.57:0.42:0.53:0.41:0.43:0.52:0.34"] = 270, -- Unu'pe, Stars' Rest, Valiance Landing Camp, Crusaders' Pinnacle + ["0.29:0.57:0.21:0.49:0.18:0.40"] = 155, -- Unu'pe, Piste d'atterrissage de Spumelevier, Camp de base de Nesingwary + ["0.29:0.57:0.49:0.58:0.52:0.38:0.24:0.40"] = 439, -- Unu'pe, Moa'ki, Dalaran, River's Heart + ["0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 417, -- Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.29:0.57:0.21:0.49:0.24:0.40:0.28:0.28"] = 227, -- Unu'pe, Fizzcrank Airstrip, River's Heart, Death's Rise + ["0.29:0.57:0.42:0.53:0.60:0.52:0.76:0.67:0.74:0.71"] = 388, -- Unu'pe, Stars' Rest, Wintergarde Keep, Westguard Keep, Kamagua + ["0.29:0.57:0.42:0.53:0.41:0.43:0.38:0.21"] = 321, -- Unu'pe, Stars' Rest, Valiance Landing Camp, The Shadow Vault + ["0.29:0.57:0.42:0.53:0.41:0.43:0.52:0.38"] = 251, -- Unu'pe, Stars' Rest, Valiance Landing Camp, Dalaran + ["0.29:0.57:0.49:0.58:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38"] = 368, -- Unu'pe, Moa'ki, Feste Wintergarde, Lichtbresche, Argentumwache, Zim'Torga + ["0.29:0.57:0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 364, -- Unu'pe, Moa'ki, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.29:0.57:0.49:0.58:0.52:0.38:0.49:0.21"] = 353, -- Unu'pe, Moa'ki, Dalaran, Argent Tournament Grounds + ["0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42"] = 260, -- Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch + ["0.29:0.57:0.21:0.49:0.24:0.40:0.28:0.28:0.38:0.21"] = 320, -- Unu'pe, Landebahn Kurbelzisch, Flussnabel, Todesanhöhe, Das Schattengewölbe + + -- Alliance: Borean Tundra: Valiance Keep + ["0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71"] = 365, -- Valiance Keep, Unu'pe, Moa'ki, Kamagua + ["0.22:0.61:0.29:0.57"] = 65, -- Valiance Keep, Unu'pe + ["0.22:0.61:0.21:0.49"] = 76, -- Valiance Keep, Fizzcrank Airstrip + ["0.22:0.61:0.17:0.53:0.12:0.53"] = 99, -- Valiance Keep, Amber Ledge, Transitus Shield + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38"] = 285, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran + ["0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 445, -- Valiance Keep, Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54:0.88:0.60"] = 450, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.22:0.61:0.21:0.49:0.24:0.40"] = 137, -- Valiance Keep, Fizzcrank Airstrip, River's Heart (Orlando Escamilla reported 153) + ["0.22:0.61:0.17:0.53"] = 64, -- Valiance Keep, Amber Ledge + ["0.22:0.61:0.42:0.53"] = 146, -- Valiance Keep, Stars' Rest + ["0.22:0.61:0.21:0.49:0.24:0.40:0.28:0.28"] = 223, -- Valiance Keep, Fizzcrank Airstrip, River's Heart, Death's Rise + ["0.22:0.61:0.29:0.57:0.49:0.58"] = 181, -- Valiance Keep, Unu'pe, Moa'ki + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54"] = 337, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge + ["0.22:0.61:0.29:0.57:0.49:0.58:0.54:0.52"] = 230, -- Valiance Keep, Unu'pe, Moa'ki, Wyrmrest Temple + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52"] = 266, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep + ["0.22:0.61:0.42:0.53:0.41:0.43"] = 208, -- Valiance Keep, Stars' Rest, Valiance Landing Camp + ["0.22:0.61:0.42:0.53:0.46:0.46"] = 220, -- Valiance Keep, Stars' Rest, Fordragon Hold + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 411, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67"] = 386, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Westguard Keep + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46"] = 417, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 427, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 481, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.22:0.61:0.42:0.53:0.60:0.52"] = 265, -- Valiance Keep, Stars' Rest, Wintergarde Keep + ["0.22:0.61:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 454, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.22:0.61:0.42:0.53:0.54:0.52:0.52:0.38"] = 328, -- Valiance Keep, Stars' Rest, Wyrmrest Temple, Dalaran + ["0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 416, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.22:0.61:0.42:0.53:0.54:0.52"] = 231, -- Valiance Keep, Stars' Rest, Wyrmrest Temple + ["0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38"] = 303, -- Valiance Keep, Unu'pe, Moa'ki, Dalaran + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.59:0.43"] = 330, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Windrunner's Overlook + ["0.22:0.61:0.42:0.53:0.60:0.52:0.69:0.42"] = 347, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Light's Breach + ["0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67"] = 401, -- Valiance Keep, Unu'pe, Moa'ki, Kamagua, Westguard Keep + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.72"] = 455, -- Valianzfeste, Unu'pe, Moa'ki, Feste Wintergarde, Westwacht, Hafen von Valgarde + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.69:0.42"] = 348, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Light's Breach + ["0.22:0.61:0.42:0.53:0.60:0.52:0.76:0.67"] = 385, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.22:0.61:0.42:0.53:0.49:0.58"] = 213, -- Valiance Keep, Stars' Rest, Moa'ki + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40"] = 386, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.56:0.36"] = 324, -- Valiance Keep, Unu'pe, Moa'ki, Dalaran, The Argent Vanguard + ["0.22:0.61:0.21:0.49:0.24:0.40:0.52:0.38"] = 331, -- Valiance Keep, Fizzcrank Airstrip, River's Heart, Dalaran + ["0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46:0.78:0.38"] = 488, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, Zim'Torga + ["0.22:0.61:0.21:0.49:0.18:0.40"] = 151, -- Valiance Keep, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42"] = 323, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch + ["0.22:0.61:0.42:0.53:0.49:0.58:0.74:0.71"] = 397, -- Valiance Keep, Stars' Rest, Moa'ki, Kamagua + ["0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54"] = 336, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60:0.88:0.72"] = 523, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60"] = 450, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 485, -- Valiance Keep, Unu'pe, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.22:0.61:0.42:0.53:0.46:0.46:0.64:0.42:0.59:0.43"] = 371, -- Valiance Keep, Stars' Rest, Fordragon Hold, Ebon Watch, Windrunner's Overlook + ["0.22:0.61:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40"] = 386, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.22:0.61:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46:0.78:0.38:0.64:0.19:0.57:0.21"] = 690, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.22:0.61:0.42:0.53:0.60:0.52:0.76:0.67:0.74:0.71"] = 435, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Westguard Keep, Kamagua + ["0.22:0.61:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 426, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36"] = 308, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard + ["0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.62:0.36"] = 347, -- Valianzfeste, Unu'pe, Moa'ki, Dalaran, K3 + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.72:0.29"] = 432, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, K3, Dun Nifflelem + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.24:0.40:0.18:0.40"] = 521, -- Valianzfeste, Sternenruh, Feste Fordragon, Dalaran, Flussnabel, Nesingwarys Basislager + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36"] = 331, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, K3 + ["0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.24:0.40:0.18:0.40"] = 537, -- Valiance Keep, Unu'pe, Moa'ki, Dalaran, River's Heart, Nesingwary Base Camp + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.69:0.42:0.72:0.40"] = 390, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Light's Breach, The Argent Stand + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34"] = 315, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33"] = 347, -- Valianzfeste, Sternenruh, Feste Fordragon, Dalaran, Die Argentumvorhut, Eisfestung + ["0.22:0.61:0.42:0.53:0.54:0.52:0.64:0.42"] = 337, -- Valiance Keep, Stars' Rest, Wyrmrest Temple, Ebon Watch + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 581, -- Donjon de la Bravoure, Unu'pe, Moa'ki, Donjon de Garde-hiver, Guet d'Ébène, Le séjour d'Argent, Zim'Torga, Ulduar + ["0.22:0.61:0.42:0.53:0.60:0.52:0.64:0.42"] = 322, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Ebon Watch + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34:0.28:0.28"] = 481, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.22:0.61:0.42:0.53:0.41:0.43:0.38:0.21"] = 368, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, The Shadow Vault + ["0.22:0.61:0.42:0.53:0.41:0.43:0.52:0.38"] = 298, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, Dalaran + ["0.22:0.61:0.42:0.53:0.41:0.43:0.52:0.34"] = 317, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, Crusaders' Pinnacle + ["0.22:0.61:0.21:0.49:0.24:0.40:0.28:0.28:0.38:0.21"] = 316, -- Valiance Keep, Fizzcrank Airstrip, River's Heart, Death's Rise, The Shadow Vault + ["0.22:0.61:0.42:0.53:0.60:0.52:0.59:0.43:0.52:0.38"] = 377, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.22:0.61:0.42:0.53:0.41:0.43:0.28:0.28"] = 374, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, Death's Rise + ["0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33"] = 363, -- Valiance Keep, Unu'pe, Moa'ki, Dalaran, The Argent Vanguard, Frosthold + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 443, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 512, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.22:0.61:0.29:0.57:0.49:0.58:0.74:0.71:0.76:0.67:0.73:0.54"] = 476, -- Valiance Keep, Unu'pe, Moa'ki, Kamagua, Westguard Keep, Amberpine Lodge + ["0.22:0.61:0.42:0.53:0.60:0.52:0.64:0.42:0.62:0.36"] = 363, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Ebon Watch, K3 + ["0.22:0.61:0.42:0.53:0.41:0.43:0.52:0.38:0.62:0.36"] = 345, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, Dalaran, K3 + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.24:0.40"] = 487, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, River's Heart + ["0.22:0.61:0.42:0.53:0.41:0.43:0.52:0.38:0.56:0.36:0.57:0.33"] = 360, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, Dalaran, The Argent Vanguard, Frosthold + ["0.22:0.61:0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 511, -- Valiance Keep, Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.52:0.34"] = 330, -- Valiance Keep, Unu'pe, Moa'ki, Dalaran, Crusaders' Pinnacle + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.60"] = 470, -- Valianzfeste, Unu'pe, Moa'ki, Feste Wintergarde, Westwacht, Fort Wildervar + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34:0.38:0.21"] = 436, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.22:0.61:0.29:0.57:0.49:0.58:0.52:0.38:0.52:0.34:0.38:0.21"] = 452, -- Valiance Keep, Unu'pe, Moa'ki, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46:0.72:0.40"] = 498, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, The Argent Stand + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.49:0.21"] = 400, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, Argent Tournament Grounds + ["0.22:0.61:0.21:0.49:0.24:0.40:0.28:0.28:0.49:0.21"] = 392, -- Valiance Keep, Fizzcrank Airstrip, River's Heart, Death's Rise, Argent Tournament Grounds + ["0.22:0.61:0.42:0.53:0.41:0.43:0.24:0.40:0.18:0.40"] = 378, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, River's Heart, Nesingwary Base Camp + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.49:0.21:0.57:0.21"] = 447, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge + ["0.22:0.61:0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.57:0.33:0.64:0.19"] = 471, -- Valiance Keep, Stars' Rest, Fordragon Hold, Dalaran, K3, Frosthold, Ulduar + ["0.22:0.61:0.21:0.49:0.24:0.40:0.28:0.28:0.57:0.21:0.64:0.19"] = 481, -- Valiance Keep, Fizzcrank Airstrip, River's Heart, Death's Rise, Bouldercrag's Refuge, Ulduar + ["0.22:0.61:0.29:0.57:0.49:0.58:0.54:0.52:0.64:0.42:0.69:0.42"] = 379, -- Valiance Keep, Unu'pe, Moa'ki, Wyrmrest Temple, Ebon Watch, Light's Breach + ["0.22:0.61:0.42:0.53:0.54:0.52:0.52:0.38:0.49:0.21"] = 442, -- Valiance Keep, Stars' Rest, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.22:0.61:0.29:0.57:0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.83:0.46"] = 457, -- Valiance Keep, Unu'pe, Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.22:0.61:0.42:0.53:0.41:0.43:0.52:0.34:0.49:0.21"] = 414, -- Valiance Keep, Stars' Rest, Valiance Landing Camp, Crusaders' Pinnacle, Argent Tournament Grounds + ["0.22:0.61:0.21:0.49:0.24:0.40:0.41:0.43:0.46:0.46"] = 328, -- Valiance Keep, Fizzcrank Airstrip, River's Heart, Valiance Landing Camp, Fordragon Hold + + ---------------------------------------------------------------------- + -- Alliance: Crystalsong Forest + ---------------------------------------------------------------------- + + -- Alliance: Crystalsong Forest: Windrunner's Overlook + ["0.59:0.43:0.64:0.42"] = 46, -- Windrunner's Overlook, Ebon Watch + ["0.59:0.43:0.62:0.36"] = 47, -- Windrunner's Overlook, K3 + ["0.59:0.43:0.52:0.38"] = 48, -- Windrunner's Overlook, Dalaran + ["0.59:0.43:0.60:0.52"] = 77, -- Windrunner's Overlook, Wintergarde Keep + ["0.59:0.43:0.60:0.52:0.54:0.52"] = 124, -- Windrunner's Overlook, Wintergarde Keep, Wyrmrest Temple + ["0.59:0.43:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 390, -- Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.59:0.43:0.60:0.52:0.49:0.58"] = 169, -- Windrunner's Overlook, Wintergarde Keep, Moa'ki + ["0.59:0.43:0.62:0.36:0.57:0.33"] = 90, -- Windrunner's Overlook, K3, Frosthold + ["0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 246, -- Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Kamagua + ["0.59:0.43:0.60:0.52:0.76:0.67"] = 197, -- Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 266, -- Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.59:0.43:0.60:0.52:0.42:0.53:0.29:0.57"] = 281, -- Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.59:0.43:0.60:0.52:0.42:0.53"] = 185, -- Windrunner's Overlook, Wintergarde Keep, Stars' Rest + ["0.59:0.43:0.60:0.52:0.73:0.54"] = 147, -- Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.59:0.43:0.52:0.38:0.56:0.36"] = 70, -- Windrunner's Overlook, Dalaran, L'avant-garde d'Argent, The Argent Vanguard + ["0.59:0.43:0.60:0.52:0.73:0.54:0.83:0.46"] = 227, -- Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.59:0.43:0.60:0.52:0.42:0.53:0.22:0.61"] = 311, -- Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.59:0.43:0.60:0.52:0.69:0.42"] = 159, -- Windrunner's Overlook, Wintergarde Keep, Light's Breach + ["0.59:0.43:0.60:0.52:0.42:0.53:0.21:0.49"] = 310, -- Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.59:0.43:0.52:0.38:0.46:0.46"] = 136, -- Windrunner's Overlook, Dalaran, Fordragon Hold + ["0.59:0.43:0.60:0.52:0.49:0.58:0.29:0.57"] = 300, -- Windrunner's Overlook, Wintergarde Keep, Moa'ki, Unu'pe + ["0.59:0.43:0.52:0.38:0.24:0.40"] = 248, -- Windrunner's Overlook, Dalaran, River's Heart + ["0.59:0.43:0.52:0.38:0.52:0.34"] = 75, -- Windrunner's Overlook, Dalaran, Crusaders' Pinnacle + ["0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60"] = 262, -- Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.59:0.43:0.52:0.38:0.24:0.40:0.18:0.40"] = 282, -- Windrunner's Overlook, Dalaran, River's Heart, Nesingwary Base Camp + ["0.59:0.43:0.52:0.38:0.41:0.43"] = 150, -- Windrunner's Overlook, Dalaran, Valiance Landing Camp + ["0.59:0.43:0.64:0.42:0.69:0.42"] = 91, -- Windrunner's Overlook, Ebon Watch, Light's Breach + ["0.59:0.43:0.64:0.42:0.72:0.40:0.83:0.46"] = 181, -- Windrunner's Overlook, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.59:0.43:0.64:0.42:0.72:0.40"] = 110, -- Windrunner's Overlook, Ebon Watch, The Argent Stand + ["0.59:0.43:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 204, -- Windrunner's Overlook, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.59:0.43:0.62:0.36:0.57:0.33:0.57:0.21"] = 155, -- Windrunner's Overlook, K3, Frosthold, Bouldercrag's Refuge + ["0.59:0.43:0.64:0.42:0.72:0.40:0.78:0.38"] = 150, -- Windrunner's Overlook, Ebon Watch, The Argent Stand, Zim'Torga + ["0.59:0.43:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 265, -- Windläufers Warte, Schwarze Wacht, Argentumwache, Westfallbrigade, Fort Wildervar + ["0.59:0.43:0.52:0.38:0.52:0.34:0.28:0.28"] = 242, -- Windrunner's Overlook, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.59:0.43:0.62:0.36:0.57:0.33:0.64:0.19"] = 186, -- Windrunner's Overlook, K3, Frosthold, Ulduar + ["0.59:0.43:0.52:0.38:0.52:0.34:0.38:0.21"] = 198, -- Windrunner's Overlook, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.59:0.43:0.62:0.36:0.72:0.29"] = 148, -- Windrunner's Overlook, K3, Dun Nifflelem + ["0.59:0.43:0.52:0.38:0.56:0.36:0.57:0.33"] = 109, -- Windrunner's Overlook, Dalaran, The Argent Vanguard, Frosthold + ["0.59:0.43:0.64:0.42:0.46:0.46"] = 157, -- Windrunner's Overlook, Ebon Watch, Fordragon Hold + ["0.59:0.43:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 354, -- Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.59:0.43:0.60:0.52:0.69:0.42:0.72:0.40"] = 202, -- Windläufers Warte, Feste Wintergarde, Lichtbresche, Argentumwache + ["0.59:0.43:0.52:0.38:0.41:0.43:0.28:0.28"] = 315, -- Windrunner's Overlook, Dalaran, Valiance Landing Camp, Death's Rise + ["0.59:0.43:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 205, -- Windrunner's Overlook, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.59:0.43:0.52:0.38:0.49:0.21"] = 162, -- Windrunner's Overlook, Dalaran, Argent Tournament Grounds + ["0.59:0.43:0.52:0.38:0.24:0.40:0.21:0.49:0.22:0.61"] = 379, -- Windrunner's Overlook, Dalaran, River's Heart, Fizzcrank Airstrip, Valiance Keep + ["0.59:0.43:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49"] = 335, -- Windläufers Warte, Dalaran, Feste Fordragon, Sternenruh, Landebahn Kurbelzisch + ["0.59:0.43:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 410, -- Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.59:0.43:0.52:0.38:0.56:0.36:0.28:0.28"] = 293, -- Windrunner's Overlook, Dalaran, The Argent Vanguard, Death's Rise + ["0.59:0.43:0.64:0.42:0.69:0.42:0.73:0.54:0.76:0.67"] = 257, -- Windläufers Warte, Schwarze Wacht, Lichtbresche, Ammertannhütte, Westwacht + + ---------------------------------------------------------------------- + -- Alliance: Dalaran + ---------------------------------------------------------------------- + + -- Alliance: Dalaran + ["0.52:0.38:0.54:0.52"] = 122, -- Dalaran, Wyrmrest Temple + ["0.52:0.38:0.59:0.43:0.60:0.52"] = 128, -- Dalaran, Windrunner's Overlook, Wintergarde Keep (tm4psycko@yahoo.com reported 97) + ["0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 317, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port (Michael Khan reported 348) + ["0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 199, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 301, -- Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 185, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67"] = 248, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.52:0.38:0.24:0.40"] = 212, -- Dalaran, River's Heart + ["0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 216, -- Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 298, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Kamagua + ["0.52:0.38:0.46:0.46:0.42:0.53"] = 174, -- Dalaran, Fordragon Hold, Stars' Rest (RJ Graves reported 135) + ["0.52:0.38:0.49:0.58"] = 160, -- Dalaran, Moa'ki + ["0.52:0.38:0.41:0.43"] = 115, -- Dalaran, Valiance Landing Camp + ["0.52:0.38:0.59:0.43"] = 53, -- Dalaran, Windrunner's Overlook + ["0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 270, -- Dalaran, Fordragon Hold, Stars' Rest, Unu'pe + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 239, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.38:0.56:0.36:0.57:0.33"] = 72, -- Dalaran, The Argent Vanguard, Frosthold + ["0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 302, -- Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.52:0.38:0.62:0.36"] = 55, -- Dalaran, K3 + ["0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 353, -- Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53"] = 317, -- Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.52:0.38:0.24:0.40:0.21:0.49"] = 274, -- Dalaran, River's Heart, Fizzcrank Airstrip + ["0.52:0.38:0.46:0.46"] = 100, -- Dalaran, Fordragon Hold + ["0.52:0.38:0.52:0.34:0.28:0.28"] = 206, -- Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.52:0.38:0.64:0.42"] = 82, -- Dalaran, Ebon Watch + ["0.52:0.38:0.64:0.42:0.72:0.40"] = 145, -- Dalaran, Ebon Watch, The Argent Stand + ["0.52:0.38:0.64:0.42:0.69:0.42"] = 126, -- Dalaran, Ebon Watch, Light's Breach (Florian Mein reported 85) + ["0.52:0.38:0.49:0.21"] = 123, -- Dalaran, Argent Tournament Grounds + ["0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 136, -- Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.52:0.38:0.54:0.52:0.42:0.53:0.29:0.57"] = 282, -- Dalaran, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.52:0.38:0.49:0.58:0.29:0.57"] = 288, -- Dalaran, Moa'ki, Unu'pe + ["0.52:0.38:0.54:0.52:0.42:0.53:0.22:0.61"] = 313, -- Dalaran, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.83:0.46"] = 280, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.52:0.38:0.64:0.42:0.60:0.52:0.73:0.54"] = 214, -- Dalaran, Ebon Watch, Wintergarde Keep, Amberpine Lodge + ["0.52:0.38:0.49:0.58:0.74:0.71:0.88:0.72"] = 421, -- Dalaran, Moa'ki, Kamagua, Valgarde Port + ["0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53"] = 343, -- Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.52:0.38:0.54:0.52:0.60:0.52"] = 169, -- Dalaran, Wyrmrest Temple, Wintergarde Keep + ["0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.72"] = 358, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49"] = 299, -- Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip + ["0.52:0.38:0.46:0.46:0.60:0.52:0.76:0.67"] = 307, -- Dalaran, Fordragon Hold, Wintergarde Keep, Westguard Keep + ["0.52:0.38:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 391, -- Dalaran, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.38:0.49:0.58:0.29:0.57:0.21:0.49"] = 367, -- Dalaran, Moa'ki, Unu'pe, Fizzcrank Airstrip + ["0.52:0.38:0.49:0.58:0.29:0.57:0.22:0.61"] = 348, -- Dalaran, Moa'ki, Unu'pe, Valiance Keep + ["0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 240, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.52:0.38:0.49:0.58:0.74:0.71"] = 341, -- Dalaran, Moa'ki, Kamagua + ["0.52:0.38:0.54:0.52:0.42:0.53"] = 187, -- Dalaran, Wyrmrest Temple, Stars' Rest + ["0.52:0.38:0.49:0.58:0.74:0.71:0.76:0.67"] = 377, -- Dalaran, Moa'ki, Kamagua, Westguard Keep + ["0.52:0.38:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 355, -- Dalaran, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.52:0.38:0.49:0.58:0.42:0.53"] = 212, -- Dalaran, Moa'ki, Stars' Rest + ["0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67"] = 289, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep + ["0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54"] = 209, -- Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.52:0.38:0.62:0.36:0.72:0.29"] = 156, -- Dalaran, K3, Dun Nifflelem + ["0.52:0.38:0.49:0.58:0.74:0.71:0.76:0.67:0.73:0.54:0.83:0.46"] = 535, -- Dalaran, Moa'ki, Kamagua, Westguard Keep, Amberpine Lodge, Westfall Brigade + ["0.52:0.38:0.49:0.58:0.74:0.71:0.76:0.67:0.73:0.54"] = 452, -- Dalaran, Moa'ki, Kamagua, Westguard Keep, Amberpine Lodge, Westfall Brigade + ["0.52:0.38:0.49:0.58:0.60:0.52"] = 242, -- Dalaran, Moa'ki, Wintergarde Keep + ["0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 379, -- Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.38:0.49:0.58:0.60:0.52:0.73:0.54"] = 313, -- Dalaran, Moa'ki, Wintergarde Keep, Westfall Brigade + ["0.52:0.38:0.64:0.42:0.60:0.52"] = 142, -- Dalaran, Ebon Watch, Wintergarde Keep + ["0.52:0.38:0.54:0.52:0.60:0.52:0.69:0.42"] = 251, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Light's Breach + ["0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54:0.83:0.46"] = 292, -- Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge, Westfall Brigade + ["0.52:0.38:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53:0.12:0.53"] = 445, -- Dalaran, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge, Transitus Shield + ["0.52:0.38:0.49:0.58:0.42:0.53:0.21:0.49"] = 337, -- Dalaran, Moa'ki, Stars' Rest, Fizzcrank Airstrip + ["0.52:0.38:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 375, -- Dalaran, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge + ["0.52:0.38:0.49:0.58:0.60:0.52:0.69:0.42"] = 324, -- Dalaran, Moa'ki, Wintergarde Keep, Light's Breach + ["0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54:0.88:0.60"] = 354, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.52:0.38:0.46:0.46:0.60:0.52"] = 187, -- Dalaran, Fordragon Hold, Wintergarde Keep + ["0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54:0.83:0.46"] = 320, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.52:0.38:0.54:0.52:0.42:0.53:0.21:0.49"] = 312, -- Dalaran, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.52:0.38:0.62:0.36:0.72:0.29:0.64:0.19"] = 239, -- Dalaran, K3, Dun Nifflelem, Ulduar + ["0.52:0.38:0.24:0.40:0.18:0.40"] = 247, -- Dalaran, River's Heart, Nesingwary Base Camp + ["0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.60"] = 373, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.52:0.38:0.49:0.58:0.60:0.52:0.76:0.67"] = 362, -- Dalaran, Moa'ki, Wintergarde Keep, Westguard Keep + ["0.52:0.38:0.49:0.58:0.42:0.53:0.22:0.61:0.17:0.53"] = 402, -- Dalaran, Moa'ki, Stars' Rest, Valiance Keep, Amber Ledge + ["0.52:0.38:0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.60"] = 446, -- Dalaran, Moa'ki, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.52:0.38:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 462, -- Dalaran, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 332, -- Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.74:0.71"] = 339, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Kamagua + ["0.52:0.38:0.59:0.43:0.60:0.52:0.42:0.53"] = 237, -- Dalaran, Windläufers Warte, Feste Wintergarde, Sternenruh + ["0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53"] = 363, -- Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge + ["0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.60"] = 332, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.52:0.38:0.52:0.34"] = 40, -- Dalaran, Crusaders' Pinnacle + ["0.52:0.38:0.64:0.42:0.60:0.52:0.73:0.54:0.88:0.60"] = 328, -- Dalaran, Ebon Watch, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.83:0.46:0.78:0.38"] = 352, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, Zim'Torga + ["0.52:0.38:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53"] = 410, -- Dalaran, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge + ["0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 399, -- Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.52:0.38:0.64:0.42:0.60:0.52:0.73:0.54:0.83:0.46"] = 294, -- Dalaran, Ebon Watch, Wintergarde Keep, Amberpine Lodge, Westfall Brigade (Maik Fischer reported 213) + ["0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67"] = 263, -- Dalaran, Schwarze Wacht, Feste Wintergarde, Westwacht + ["0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54:0.83:0.46:0.72:0.40"] = 402, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, The Argent Stand + ["0.52:0.38:0.49:0.58:0.42:0.53:0.22:0.61"] = 340, -- Dalaran, Moa'ki, Stars' Rest, Valiance Keep + ["0.52:0.38:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46"] = 393, -- Dalaran, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 168, -- Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.52:0.38:0.46:0.46:0.60:0.52:0.76:0.67:0.88:0.72"] = 376, -- Dalaran, Fordragon Hold, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.52:0.38:0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53"] = 381, -- Dalaran, Moa'ki, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.52:0.38:0.24:0.40:0.21:0.49:0.42:0.53"] = 405, -- Dalaran, River's Heart, Fizzcrank Airstrip, Stars' Rest + ["0.52:0.38:0.59:0.43:0.60:0.52:0.69:0.42"] = 211, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Light's Breach + ["0.52:0.38:0.56:0.36"] = 33, -- Dalaran, The Argent Vanguard + ["0.52:0.38:0.46:0.46:0.60:0.52:0.73:0.54"] = 258, -- Dalaran, Fordragon Hold, Wintergarde Keep, Amberpine Lodge + ["0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60"] = 313, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.52:0.38:0.49:0.58:0.60:0.52:0.73:0.54:0.88:0.60"] = 427, -- Dalaran, Moa'ki, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54:0.76:0.67"] = 292, -- Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge, Westguard Keep + ["0.52:0.38:0.46:0.46:0.60:0.52:0.73:0.54:0.83:0.46"] = 338, -- Dalaran, Feste Fordragon, Feste Wintergarde, Ammertannhütte, Westfallbrigade + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 339, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar + ["0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54:0.76:0.67:0.88:0.72"] = 360, -- Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.52:0.38:0.62:0.36:0.57:0.33"] = 98, -- Dalaran, K3, Frosthold + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 270, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.52:0.38:0.62:0.36:0.57:0.33:0.64:0.19"] = 195, -- Dalaran, K3, Frosthold, Ulduar + ["0.52:0.38:0.59:0.43:0.60:0.52:0.42:0.53:0.29:0.57"] = 333, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.52:0.38:0.46:0.46:0.60:0.52:0.76:0.67:0.74:0.71"] = 356, -- Dalaran, Fordragon Hold, Wintergarde Keep, Westguard Keep, Kamagua + ["0.52:0.38:0.46:0.46:0.60:0.52:0.69:0.42"] = 270, -- Dalaran, Fordragon Hold, Wintergarde Keep, Light's Breach + ["0.52:0.38:0.54:0.52:0.60:0.52:0.69:0.42:0.72:0.40"] = 294, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Light's Breach, The Argent Stand + ["0.52:0.38:0.54:0.52:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38"] = 335, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Light's Breach, The Argent Stand, Zim'Torga + ["0.52:0.38:0.24:0.40:0.28:0.28"] = 296, -- Dalaran, River's Heart, Death's Rise + ["0.52:0.38:0.62:0.36:0.57:0.33:0.57:0.21"] = 162, -- Dalaran, K3, Frosthold, Bouldercrag's Refuge + ["0.52:0.38:0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 417, -- Dalaran, Moa'ki, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.38:0.64:0.42:0.60:0.52:0.42:0.53"] = 251, -- Dalaran, Ebon Watch, Wintergarde Keep, Stars' Rest + ["0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54:0.88:0.60"] = 325, -- Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.52:0.38:0.59:0.43:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 347, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.38:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 411, -- Dalaran, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.52:0.38:0.64:0.42:0.60:0.52:0.42:0.53:0.22:0.61"] = 378, -- Dalaran, Ebon Watch, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.52:0.38:0.41:0.43:0.42:0.53"] = 195, -- Dalaran, Valiance Landing Camp, Stars' Rest + ["0.52:0.38:0.41:0.43:0.28:0.28"] = 281, -- Dalaran, Valiance Landing Camp, Death's Rise + ["0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 312, -- Dalaran, Schwarze Wacht, Feste Wintergarde, Westwacht, Kamagua + ["0.52:0.38:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46:0.72:0.40"] = 474, -- Dalaran, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, The Argent Stand + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38:0.72:0.40"] = 296, -- Dalaran, K3, Dun Nifflelem, Zim'Torga, The Argent Stand + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38:0.82:0.31"] = 297, -- Dalaran, K3, Dun Nifflelem, Zim'Torga, Gundrak + ["0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60:0.88:0.72"] = 387, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.52:0.38:0.41:0.43:0.42:0.53:0.21:0.49"] = 322, -- Dalaran, Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38"] = 244, -- Dalaran, K3, Dun Nifflelem, Zim'Torga + ["0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19:0.72:0.29"] = 272, -- Dalaran, The Argent Vanguard, Frosthold, Ulduar, Dun Nifflelem + ["0.52:0.38:0.54:0.52:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 388, -- Dalaran, Wyrmruhtempel, Feste Wintergarde, Lichtbresche, Argentumwache, Zim'Torga, Gundrak + ["0.52:0.38:0.59:0.43:0.60:0.52:0.69:0.42:0.72:0.40"] = 253, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Light's Breach, The Argent Stand + ["0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54:0.76:0.67:0.74:0.71"] = 343, -- Dalaran, Schwarze Wacht, Lichtbresche, Ammertannhütte, Westwacht, Kamagua + ["0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19:0.78:0.38"] = 321, -- Dalaran, Die Argentumvorhut, Eisfestung, Ulduar, Zim'Torga + ["0.52:0.38:0.52:0.34:0.38:0.21"] = 163, -- Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.52:0.38:0.56:0.36:0.38:0.21"] = 179, -- Dalaran, The Argent Vanguard, The Shadow Vault + ["0.52:0.38:0.52:0.34:0.57:0.21:0.64:0.19"] = 327, -- Dalaran, Crusaders' Pinnacle, Bouldercrag's Refuge, Ulduar + ["0.52:0.38:0.41:0.43:0.42:0.53:0.22:0.61"] = 325, -- Dalaran, Valiance Landing Camp, Stars' Rest, Valiance Keep + ["0.52:0.38:0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46:0.78:0.38"] = 466, -- Dalaran, Moa'ki, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, Zim'Torga + ["0.52:0.38:0.41:0.43:0.42:0.53:0.29:0.57"] = 293, -- Dalaran, Valiance Landing Camp, Stars' Rest, Unu'pe + ["0.52:0.38:0.52:0.34:0.57:0.21"] = 283, -- Dalaran, Crusaders' Pinnacle, Bouldercrag's Refuge + ["0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60:0.88:0.72"] = 374, -- Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.52:0.38:0.49:0.58:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 460, -- Dalaran, Moa'ki, Wintergarde Keep, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.38:0.24:0.40:0.21:0.49:0.22:0.61"] = 343, -- Dalaran, River's Heart, Fizzcrank Airstrip, Valiance Keep + ["0.52:0.38:0.56:0.36:0.28:0.28"] = 257, -- Dalaran, Die Argentumvorhut, Todesanhöhe + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21:0.38:0.21"] = 500, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.52:0.38:0.62:0.36:0.57:0.33:0.57:0.21:0.38:0.21"] = 276, -- Dalaran, K3, Frosthold, Bouldercrag's Refuge, The Shadow Vault + ["0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54:0.88:0.60:0.88:0.72"] = 428, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38:0.83:0.46"] = 299, -- Dalaran, K3, Dun Nifflelem, Zim'Torga, Westfall Brigade + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 387, -- Dalaran, Schwarze Wacht, Argentumwache, Zim'Torga, Ulduar, Bergfels' Zuflucht + ["0.52:0.38:0.24:0.40:0.21:0.49:0.29:0.57"] = 337, -- Dalaran, River's Heart, Fizzcrank Airstrip, Unu'pe + ["0.52:0.38:0.56:0.36:0.57:0.21:0.64:0.19"] = 345, -- Dalaran, The Argent Vanguard, Bouldercrag's Refuge, Ulduar + ["0.52:0.38:0.46:0.46:0.60:0.52:0.76:0.67:0.88:0.60"] = 391, -- Dalaran, Fordragon Hold, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.52:0.38:0.41:0.43:0.57:0.21:0.64:0.19:0.72:0.29"] = 544, -- Dalaran, Valianzlager, Bergfels' Zuflucht, Ulduar, Dun Niffelem + ["0.52:0.38:0.49:0.58:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 438, -- Dalaran, Moa'ki, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.52:0.38:0.46:0.46:0.60:0.52:0.73:0.54:0.88:0.60"] = 372, -- Dalaran, Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54"] = 403, -- Dalaran, K3, Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge + ["0.52:0.38:0.54:0.52:0.60:0.52:0.69:0.42:0.72:0.40:0.83:0.46"] = 365, -- Dalaran, Wyrmruhtempel, Feste Wintergarde, Lichtbresche, Argentumwache, Westfallbrigade + ["0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19:0.78:0.38:0.82:0.31"] = 374, -- Dalaran, L'avant-garde d'Argent, Fort du Givre, Ulduar, Zim'Torga, Gundrak + ["0.52:0.38:0.59:0.43:0.60:0.52:0.42:0.53:0.22:0.61"] = 363, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.52:0.38:0.59:0.43:0.60:0.52:0.42:0.53:0.21:0.49"] = 362, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.52:0.38:0.41:0.43:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 402, -- Dalaran, Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.38:0.56:0.36:0.57:0.21"] = 300, -- Dalaran, The Argent Vanguard, Bouldercrag's Refuge + ["0.52:0.38:0.59:0.43:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 461, -- Dalaran, Windläufers Warte, Feste Wintergarde, Sternenruh, Valianzfeste, Bernsteinflöz, Transitusschild + ["0.52:0.38:0.24:0.40:0.28:0.28:0.38:0.21"] = 390, -- Dalaran, River's Heart, Death's Rise, The Shadow Vault + ["0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.60"] = 346, -- Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.52:0.38:0.41:0.43:0.42:0.53:0.22:0.61:0.17:0.53"] = 387, -- Dalaran, Valiance Landing Camp, Stars' Rest, Valiance Keep, Amber Ledge + ["0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54:0.88:0.60:0.88:0.72"] = 398, -- Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.52:0.38:0.41:0.43:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 506, -- Dalaran, Valiance Landing Camp, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.52:0.38:0.46:0.46:0.60:0.52:0.69:0.42:0.72:0.40"] = 312, -- Dalaran, Fordragon Hold, Wintergarde Keep, Light's Breach, The Argent Stand + ["0.52:0.38:0.54:0.52:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 488, -- Dalaran, Wyrmrest Temple, Wintergarde Keep, Light's Breach, The Argent Stand, Zim'Torga, Ulduar + ["0.52:0.38:0.49:0.21:0.57:0.21"] = 171, -- Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge + ["0.52:0.38:0.49:0.21:0.57:0.21:0.64:0.19"] = 214, -- Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar + ["0.52:0.38:0.62:0.36:0.72:0.29:0.64:0.19:0.57:0.21"] = 287, -- Dalaran, K3, Dun Niffelem, Ulduar, Bergfels' Zuflucht + ["0.52:0.38:0.49:0.21:0.38:0.21"] = 207, -- Dalaran, Argent Tournament Grounds, The Shadow Vault + ["0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.83:0.46:0.72:0.40"] = 361, -- Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, The Argent Stand + ["0.52:0.38:0.49:0.21:0.28:0.28"] = 284, -- Dalaran, Argent Tournament Grounds, Death's Rise + + ---------------------------------------------------------------------- + -- Alliance: Dragonblight + ---------------------------------------------------------------------- + + -- Alliance: Dragonblight: Fordragon Hold + ["0.46:0.46:0.42:0.53"] = 74, -- Fordragon Hold, Stars' Rest + ["0.46:0.46:0.54:0.52:0.49:0.58"] = 118, -- Fordragon Hold, Wyrmrest Temple, Moa'ki + ["0.46:0.46:0.54:0.52"] = 65, -- Fordragon Hold, Wyrmrest Temple + ["0.46:0.46:0.52:0.38:0.59:0.43"] = 109, -- Fordragon Hold, Dalaran, Windrunner's Overlook + ["0.46:0.46:0.52:0.38"] = 66, -- Fordragon Hold, Dalaran + ["0.46:0.46:0.60:0.52"] = 88, -- Fordragon Hold, Wintergarde Keep + ["0.46:0.46:0.42:0.53:0.22:0.61"] = 202, -- Fordragon Hold, Stars' Rest, Valiance Keep + ["0.46:0.46:0.60:0.52:0.76:0.67:0.88:0.72"] = 276, -- Fordragon Hold, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.46:0.46:0.60:0.52:0.76:0.67:0.74:0.71"] = 257, -- Fordragon Hold, Wintergarde Keep, Westguard Keep, Kamagua + ["0.46:0.46:0.42:0.53:0.29:0.57"] = 171, -- Fordragon Hold, Stars' Rest, Unu'pe + ["0.46:0.46:0.60:0.52:0.76:0.67"] = 208, -- Fordragon Hold, Wintergarde Keep, Westguard Keep + ["0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53"] = 243, -- Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.46:0.46:0.60:0.52:0.49:0.58"] = 180, -- Fordragon Hold, Wintergarde Keep, Moa'ki + ["0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 279, -- Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.46:0.46:0.42:0.53:0.21:0.49:0.24:0.40"] = 262, -- Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.46:0.46:0.60:0.52:0.73:0.54"] = 159, -- Fordragon Hold, Wintergarde Keep, Amberpine Lodge + ["0.46:0.46:0.42:0.53:0.21:0.49"] = 200, -- Fordragon Hold, Stars' Rest, Fizzcrank Airstrip + ["0.46:0.46:0.64:0.42:0.69:0.42"] = 163, -- Fordragon Hold, Ebon Watch, Light's Breach + ["0.46:0.46:0.60:0.52:0.69:0.42"] = 170, -- Fordragon Hold, Wintergarde Keep, Light's Breach + ["0.46:0.46:0.52:0.38:0.52:0.34"] = 95, -- Fordragon Hold, Dalaran, Crusaders' Pinnacle + ["0.46:0.46:0.52:0.38:0.62:0.36"] = 112, -- Fordragon Hold, Dalaran, K3 + ["0.46:0.46:0.60:0.52:0.73:0.54:0.83:0.46"] = 239, -- Feste Fordragon, Feste Wintergarde, Ammertannhütte, Westfallbrigade + ["0.46:0.46:0.52:0.38:0.62:0.36:0.72:0.29"] = 212, -- Fordragon Hold, Dalaran, K3, Dun Nifflelem + ["0.46:0.46:0.64:0.42:0.72:0.40"] = 183, -- Fordragon Hold, Ebon Watch, The Argent Stand + ["0.46:0.46:0.41:0.43"] = 60, -- Fordragon Hold, Valiance Landing Camp + ["0.46:0.46:0.52:0.38:0.56:0.36"] = 90, -- Fordragon Hold, Dalaran, The Argent Vanguard + ["0.46:0.46:0.54:0.52:0.49:0.58:0.74:0.71:0.88:0.72"] = 381, -- Fordragon Hold, Wyrmrest Temple, Moa'ki, Kamagua, Valgarde Port + ["0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33"] = 128, -- Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold + ["0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 299, -- Feste Fordragon, Sternenruh, Valianzfeste, Bernsteinflöz, Transitusschild + ["0.46:0.46:0.60:0.52:0.59:0.43"] = 152, -- Fordragon Hold, Wintergarde Keep, Windrunner's Overlook + ["0.46:0.46:0.42:0.53:0.21:0.49:0.18:0.40"] = 275, -- Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.46:0.46:0.52:0.38:0.52:0.34:0.28:0.28"] = 263, -- Fordragon Hold, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 193, -- Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.46:0.46:0.60:0.52:0.73:0.54:0.88:0.60"] = 273, -- Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.46:0.46:0.42:0.53:0.49:0.58"] = 142, -- Fordragon Hold, Stars' Rest, Moa'ki + ["0.46:0.46:0.41:0.43:0.24:0.40"] = 196, -- Fordragon Hold, Valiance Landing Camp, River's Heart + ["0.46:0.46:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 277, -- Крепость Фордрагона, Черная застава, Серебряная застава, Зим'Торга, Гундрак + ["0.46:0.46:0.64:0.42"] = 119, -- Fordragon Hold, Ebon Watch + ["0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 225, -- Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.46:0.46:0.52:0.38:0.52:0.34:0.38:0.21"] = 218, -- Fordragon Hold, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.46:0.46:0.64:0.42:0.72:0.40:0.78:0.38"] = 223, -- Fordragon Hold, Ebon Watch, The Argent Stand, Zim'Torga + ["0.46:0.46:0.64:0.42:0.72:0.40:0.83:0.46"] = 253, -- Fordragon Hold, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.46:0.46:0.60:0.52:0.69:0.42:0.72:0.40"] = 212, -- Feste Fordragon, Feste Wintergarde, Lichtbresche, Argentumwache + ["0.46:0.46:0.41:0.43:0.24:0.40:0.18:0.40"] = 231, -- Fordragon Hold, Valiance Landing Camp, River's Heart, Nesingwary Base Camp + ["0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53"] = 264, -- Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge + ["0.46:0.46:0.54:0.52:0.49:0.58:0.74:0.71:0.76:0.67"] = 337, -- Fordragon Hold, Wyrmrest Temple, Moa'ki, Kamagua, Westguard Keep + ["0.46:0.46:0.41:0.43:0.57:0.21"] = 341, -- Fordragon Hold, Valiance Landing Camp, Bouldercrag's Refuge + ["0.46:0.46:0.52:0.38:0.49:0.21"] = 181, -- Fordragon Hold, Dalaran, Argent Tournament Grounds + ["0.46:0.46:0.41:0.43:0.38:0.21"] = 220, -- Fordragon Hold, Valiance Landing Camp, The Shadow Vault + ["0.46:0.46:0.41:0.43:0.28:0.28"] = 226, -- Fordragon Hold, Valiance Landing Camp, Death's Rise + + -- Alliance: Dragonblight: Moa'ki + ["0.49:0.58:0.42:0.53"] = 55, -- Moa'ki, Stars' Rest + ["0.49:0.58:0.42:0.53:0.41:0.43"] = 118, -- Moa'ki, Stars' Rest, Valiance Landing Camp + ["0.49:0.58:0.52:0.38"] = 123, -- Moa'ki, Dalaran + ["0.49:0.58:0.54:0.52"] = 49, -- Moa'ki, Wyrmrest Temple + ["0.49:0.58:0.60:0.52"] = 86, -- Moa'ki, Wintergarde Keep + ["0.49:0.58:0.54:0.52:0.46:0.46"] = 106, -- Moa'ki, Wyrmrest Temple, Fordragon Hold + ["0.49:0.58:0.60:0.52:0.76:0.67"] = 205, -- Moa'ki, Wintergarde Keep, Westguard Keep + ["0.49:0.58:0.74:0.71:0.88:0.72"] = 265, -- Moa'ki, Kamagua, Valgarde Port + ["0.49:0.58:0.29:0.57"] = 133, -- Moa'ki, Unu'pe + ["0.49:0.58:0.74:0.71"] = 185, -- Moa'ki, Kamagua + ["0.49:0.58:0.60:0.52:0.73:0.54:0.88:0.60"] = 271, -- Moa'ki, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.49:0.58:0.42:0.53:0.22:0.61"] = 184, -- Moa'ki, Stars' Rest, Valiance Keep + ["0.49:0.58:0.60:0.52:0.59:0.43"] = 150, -- Moa'ki, Wintergarde Keep, Windrunner's Overlook + ["0.49:0.58:0.74:0.71:0.76:0.67"] = 221, -- Moa'ki, Kamagua, Westguard Keep + ["0.49:0.58:0.42:0.53:0.21:0.49"] = 181, -- Moa'ki, Stars' Rest, Fizzcrank Airstrip + ["0.49:0.58:0.60:0.52:0.73:0.54:0.88:0.60:0.88:0.72"] = 344, -- Moa'ki, Wintergarde Keep, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.49:0.58:0.60:0.52:0.73:0.54"] = 156, -- Moa'ki, Wintergarde Keep, Amberpine Lodge + ["0.49:0.58:0.29:0.57:0.21:0.49"] = 211, -- Moa'ki, Unu'pe, Fizzcrank Airstrip + ["0.49:0.58:0.29:0.57:0.22:0.61"] = 191, -- Moa'ki, Unu'pe, Valiance Keep + ["0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.72"] = 274, -- Moa'ki, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.49:0.58:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 281, -- Moa'ki, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 305, -- Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.49:0.58:0.42:0.53:0.22:0.61:0.17:0.53"] = 245, -- Moa'ki, Stars' Rest, Valiance Keep, Amber Ledge + ["0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 260, -- Moa'ki, Sternenruh, Landebahn Kurbelzisch, Bernsteinflöz, Transitusschild + ["0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53"] = 224, -- Moa'ki, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.49:0.58:0.60:0.52:0.76:0.67:0.88:0.60"] = 290, -- Moa'ki, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 300, -- Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.49:0.58:0.42:0.53:0.46:0.46"] = 133, -- Moa'ki, Stars' Rest, Fordragon Hold + ["0.49:0.58:0.52:0.38:0.62:0.36:0.72:0.29"] = 267, -- Moa'ki, Dalaran, K3, Dun Nifflelem + ["0.49:0.58:0.52:0.38:0.52:0.34"] = 150, -- Moa'ki, Dalaran, Crusaders' Pinnacle + ["0.49:0.58:0.42:0.53:0.21:0.49:0.24:0.40"] = 243, -- Moa'ki, Repos des étoiles, Piste d'atterrissage de Spumelevier, Le Cœur du fleuve + ["0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53:0.12:0.53"] = 290, -- Moa'ki, Unu'pe, Valiance Keep, Amber Ledge, Transitus Shield + ["0.49:0.58:0.60:0.52:0.69:0.42"] = 168, -- Moa'ki, Feste Wintergarde, Lichtbresche + ["0.49:0.58:0.60:0.52:0.73:0.54:0.83:0.46"] = 236, -- Moa'ki, Feste Wintergarde, Ammertannhütte, Westfallbrigade + ["0.49:0.58:0.60:0.52:0.64:0.42"] = 143, -- Moa'ki, Feste Wintergarde, Schwarze Wacht + ["0.49:0.58:0.42:0.53:0.21:0.49:0.18:0.40"] = 256, -- Moa'ki, Repos des étoiles, Piste d'atterrissage de Spumelevier, Camp de base de Nesingwary + ["0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40"] = 206, -- Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.49:0.58:0.52:0.38:0.62:0.36"] = 167, -- Moa'ki, Dalaran, K3 + ["0.49:0.58:0.52:0.38:0.64:0.42:0.69:0.42"] = 233, -- Moa'ki, Dalaran, Ebon Watch, Light's Breach + ["0.49:0.58:0.52:0.38:0.56:0.36"] = 145, -- Moa'ki, Dalaran, The Argent Vanguard + ["0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 280, -- Moa'ki, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.49:0.58:0.42:0.53:0.41:0.43:0.24:0.40"] = 254, -- Moa'ki, Stars' Rest, Valiance Landing Camp, River's Heart + ["0.49:0.58:0.42:0.53:0.41:0.43:0.38:0.21"] = 279, -- Moa'ki, Sternenruh, Valianzlager, Das Schattengewölbe + ["0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33"] = 183, -- Moa'ki, Dalaran, The Argent Vanguard, Frosthold + ["0.49:0.58:0.42:0.53:0.41:0.43:0.28:0.28"] = 284, -- Moa'ki, Stars' Rest, Valiance Landing Camp, Death's Rise + ["0.49:0.58:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 246, -- Moa'ki, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.49:0.58:0.52:0.38:0.52:0.34:0.28:0.28"] = 317, -- Moa'ki, Dalaran, Kreuzfahrerturm, Todesanhöhe + ["0.49:0.58:0.52:0.38:0.24:0.40"] = 322, -- Moa'ki, Dalaran, River's Heart + ["0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 248, -- Moa'ki, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.49:0.58:0.60:0.52:0.69:0.42:0.72:0.40"] = 210, -- Moa'ki, Feste Wintergarde, Lichtbresche, Argentumwache + ["0.49:0.58:0.52:0.38:0.49:0.21"] = 237, -- Moa'ki, Dalaran, Argent Tournament Grounds + ["0.49:0.58:0.54:0.52:0.64:0.42:0.72:0.40:0.83:0.46"] = 288, -- Moa'ki, Wyrmrest Temple, Ebon Watch, The Argent Stand, Westfall Brigade + + -- Alliance: Dragonblight: Stars' Rest + ["0.42:0.53:0.49:0.58"] = 72, -- Stars' Rest, Moa'ki + ["0.42:0.53:0.46:0.46"] = 82, -- Stars' Rest, Fordragon Hold + ["0.42:0.53:0.41:0.43"] = 67, -- Stars' Rest, Valiance Landing Camp + ["0.42:0.53:0.54:0.52"] = 90, -- Stars' Rest, Wyrmrest Temple + ["0.42:0.53:0.60:0.52"] = 125, -- Stars' Rest, Wintergarde Keep + ["0.42:0.53:0.46:0.46:0.52:0.38"] = 147, -- Stars' Rest, Fordragon Hold, Dalaran + ["0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36"] = 170, -- Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard + ["0.42:0.53:0.29:0.57"] = 100, -- Stars' Rest, Unu'pe + ["0.42:0.53:0.60:0.52:0.59:0.43"] = 189, -- Stars' Rest, Wintergarde Keep, Windrunner's Overlook + ["0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 313, -- Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36"] = 193, -- Stars' Rest, Fordragon Hold, Dalaran, K3 + ["0.42:0.53:0.49:0.58:0.74:0.71"] = 254, -- Stars' Rest, Moa'ki, Kamagua + ["0.42:0.53:0.22:0.61"] = 133, -- Stars' Rest, Valiance Keep + ["0.42:0.53:0.21:0.49:0.17:0.53"] = 172, -- Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.42:0.53:0.21:0.49"] = 129, -- Stars' Rest, Fizzcrank Airstrip + ["0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 209, -- Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.42:0.53:0.22:0.61:0.17:0.53"] = 194, -- Stars' Rest, Valiance Keep, Amber Ledge + ["0.42:0.53:0.49:0.58:0.74:0.71:0.88:0.72"] = 334, -- Stars' Rest, Moa'ki, Kamagua, Valgarde Port + ["0.42:0.53:0.49:0.58:0.74:0.71:0.76:0.67"] = 291, -- Stars' Rest, Moa'ki, Kamagua, Westguard Keep + ["0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60:0.88:0.72"] = 382, -- Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.42:0.53:0.60:0.52:0.76:0.67"] = 245, -- Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 230, -- Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.42:0.53:0.60:0.52:0.73:0.54"] = 195, -- Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 276, -- Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.42:0.53:0.60:0.52:0.64:0.42"] = 182, -- Stars' Rest, Wintergarde Keep, Ebon Watch + ["0.42:0.53:0.60:0.52:0.59:0.43:0.52:0.38"] = 236, -- Stars' Rest, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.42:0.53:0.54:0.52:0.52:0.38"] = 186, -- Stars' Rest, Wyrmrest Temple, Dalaran + ["0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.60"] = 329, -- Stars' Rest, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.42:0.53:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 375, -- Stars' Rest, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.42:0.53:0.60:0.52:0.76:0.67:0.74:0.71"] = 294, -- Stars' Rest, Wintergarde Keep, Westguard Keep, Kamagua + ["0.42:0.53:0.60:0.52:0.69:0.42"] = 207, -- Stars' Rest, Wintergarde Keep, Light's Breach + ["0.42:0.53:0.49:0.58:0.52:0.38"] = 193, -- Stars' Rest, Moa'ki, Dalaran + ["0.42:0.53:0.54:0.52:0.64:0.42:0.72:0.40"] = 258, -- Stars' Rest, Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.42:0.53:0.60:0.52:0.69:0.42:0.72:0.40"] = 249, -- Stars' Rest, Wintergarde Keep, Light's Breach, The Argent Stand + ["0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 339, -- Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60"] = 310, -- Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 286, -- Repos des étoiles, Donjon de Garde-hiver, Guet d'Ébène, Le séjour d'Argent, Zim'Torga + ["0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34"] = 176, -- Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle + ["0.42:0.53:0.46:0.46:0.52:0.38:0.24:0.40:0.18:0.40"] = 383, -- Stars' Rest, Fordragon Hold, Dalaran, River's Heart, Nesingwary Base Camp + ["0.42:0.53:0.60:0.52:0.64:0.42:0.52:0.38"] = 249, -- Stars' Rest, Wintergarde Keep, Ebon Watch, Dalaran + ["0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40"] = 245, -- Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46:0.78:0.38"] = 348, -- Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, Zim'Torga + ["0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.57:0.33"] = 236, -- Stars' Rest, Fordragon Hold, Dalaran, K3, Frosthold + ["0.42:0.53:0.41:0.43:0.52:0.38"] = 157, -- Sternenruh, Valianzlager, Dalaran + ["0.42:0.53:0.41:0.43:0.28:0.28"] = 232, -- Stars' Rest, Valiance Landing Camp, Death's Rise + ["0.42:0.53:0.21:0.49:0.18:0.40"] = 204, -- Sternenruh, Landebahn Kurbelzisch, Nesingwarys Basislager + ["0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.72:0.29"] = 293, -- Stars' Rest, Fordragon Hold, Dalaran, K3, Dun Nifflelem + ["0.42:0.53:0.21:0.49:0.24:0.40"] = 191, -- Repos des étoiles, Piste d'atterrissage de Spumelevier, Le Cœur du fleuve + ["0.42:0.53:0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 439, -- Stars' Rest, Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar + ["0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 273, -- Sternenruh, Feste Fordragon, Dalaran, Die Argentumvorhut, Eisfestung, Bergfels' Zuflucht + ["0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 305, -- Покой Звезд, Крепость Фордрагона, Даларан, Оплот Серебряного Авангарда, Ледяная крепость, Ульдуар + ["0.42:0.53:0.49:0.58:0.74:0.71:0.76:0.67:0.73:0.54:0.83:0.46:0.72:0.40"] = 530, -- Stars' Rest, Moa'ki, Kamagua, Westguard Keep, Amberpine Lodge, Westfall Brigade, The Argent Stand + ["0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.38:0.21"] = 317, -- Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.42:0.53:0.46:0.46:0.52:0.38:0.56:0.36:0.57:0.33"] = 209, -- Stars' Rest, Fordragon Hold, Dalaran, The Argent Vanguard, Frosthold + ["0.42:0.53:0.41:0.43:0.38:0.21"] = 227, -- Stars' Rest, Valiance Landing Camp, The Shadow Vault + ["0.42:0.53:0.41:0.43:0.24:0.40"] = 203, -- Sternenruh, Valianzlager, Flussnabel + ["0.42:0.53:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60:0.83:0.46"] = 471, -- Stars' Rest, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar, Westfall Brigade + ["0.42:0.53:0.60:0.52:0.64:0.42:0.62:0.36:0.72:0.29"] = 322, -- Stars' Rest, Wintergarde Keep, Ebon Watch, K3, Dun Nifflelem + ["0.42:0.53:0.46:0.46:0.52:0.38:0.52:0.34:0.38:0.21"] = 298, -- Stars' Rest, Fordragon Hold, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.42:0.53:0.41:0.43:0.52:0.34"] = 176, -- Stars' Rest, Valiance Landing Camp, Crusaders' Pinnacle + ["0.42:0.53:0.21:0.49:0.24:0.40:0.28:0.28"] = 277, -- Stars' Rest, Fizzcrank Airstrip, River's Heart, Death's Rise + ["0.42:0.53:0.41:0.43:0.52:0.38:0.62:0.36"] = 203, -- Stars' Rest, Valiance Landing Camp, Dalaran, K3 + ["0.42:0.53:0.46:0.46:0.52:0.38:0.62:0.36:0.57:0.33:0.64:0.19"] = 333, -- Stars' Rest, Fordragon Hold, Dalaran, K3, Frosthold, Ulduar + ["0.42:0.53:0.60:0.52:0.64:0.42:0.62:0.36"] = 222, -- Stars' Rest, Wintergarde Keep, Ebon Watch, K3 + ["0.42:0.53:0.54:0.52:0.52:0.38:0.56:0.36"] = 208, -- Stars' Rest, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.42:0.53:0.54:0.52:0.52:0.38:0.56:0.36:0.57:0.33"] = 246, -- Stars' Rest, Wyrmrest Temple, Dalaran, The Argent Vanguard, Frosthold + ["0.42:0.53:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38"] = 290, -- Stars' Rest, Wintergarde Keep, Light's Breach, The Argent Stand, Zim'Torga + ["0.42:0.53:0.46:0.46:0.52:0.38:0.49:0.21"] = 262, -- Sternenruh, Feste Fordragon, Dalaran, Argentumturnierplatz + ["0.42:0.53:0.46:0.46:0.52:0.38:0.59:0.43"] = 189, -- Sternenruh, Feste Fordragon, Dalaran, Windläufers Warte + + -- Alliance: Dragonblight: Wintergarde Keep + ["0.60:0.52:0.54:0.52"] = 55, -- Wintergarde Keep, Wyrmrest Temple + ["0.60:0.52:0.59:0.43:0.52:0.38"] = 119, -- Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.60:0.52:0.49:0.58"] = 99, -- Wintergarde Keep, Moa'ki + ["0.60:0.52:0.42:0.53"] = 115, -- Wintergarde Keep, Stars' Rest + ["0.60:0.52:0.46:0.46"] = 96, -- Wintergarde Keep, Fordragon Hold + ["0.60:0.52:0.46:0.46:0.41:0.43"] = 156, -- Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.60:0.52:0.69:0.42"] = 89, -- Wintergarde Keep, Light's Breach + ["0.60:0.52:0.73:0.54"] = 77, -- Wintergarde Keep, Amberpine Lodge + ["0.60:0.52:0.76:0.67:0.88:0.72"] = 195, -- Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 168, -- Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga + ["0.60:0.52:0.42:0.53:0.29:0.57"] = 211, -- Wintergarde Keep, Stars' Rest, Unu'pe + ["0.60:0.52:0.59:0.43"] = 72, -- Wintergarde Keep, Windrunner's Overlook + ["0.60:0.52:0.64:0.42:0.62:0.36:0.57:0.33"] = 148, -- Wintergarde Keep, Ebon Watch, K3, Frosthold + ["0.60:0.52:0.64:0.42:0.62:0.36"] = 105, -- Wintergarde Keep, Ebon Watch, K3 + ["0.60:0.52:0.73:0.54:0.88:0.60"] = 191, -- Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.60:0.52:0.42:0.53:0.22:0.61"] = 242, -- Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.60:0.52:0.76:0.67"] = 126, -- Wintergarde Keep, Westguard Keep + ["0.60:0.52:0.64:0.42"] = 64, -- Wintergarde Keep, Ebon Watch + ["0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 284, -- Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.60:0.52:0.76:0.67:0.88:0.60"] = 210, -- Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.60:0.52:0.54:0.52:0.52:0.38"] = 147, -- Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.60:0.52:0.42:0.53:0.21:0.49"] = 240, -- Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.60:0.52:0.76:0.67:0.74:0.71"] = 176, -- Wintergarde Keep, Westguard Keep, Kamagua + ["0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 320, -- Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 339, -- Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.60:0.52:0.49:0.58:0.52:0.38"] = 220, -- Wintergarde Keep, Moa'ki, Dalaran + ["0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 304, -- Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge + ["0.60:0.52:0.64:0.42:0.52:0.38"] = 132, -- Wintergarde Keep, Ebon Watch, Dalaran + ["0.60:0.52:0.49:0.58:0.74:0.71"] = 282, -- Wintergarde Keep, Moa'ki, Kamagua + ["0.60:0.52:0.49:0.58:0.29:0.57:0.22:0.61"] = 289, -- Wintergarde Keep, Moa'ki, Unu'pe, Valiance Keep + ["0.60:0.52:0.64:0.42:0.72:0.40"] = 128, -- Feste Wintergarde, Schwarze Wacht, Argentumwache + ["0.60:0.52:0.46:0.46:0.52:0.38"] = 162, -- Wintergarde Keep, Fordragon Hold, Dalaran + ["0.60:0.52:0.73:0.54:0.83:0.46"] = 158, -- Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.60:0.52:0.64:0.42:0.62:0.36:0.72:0.29:0.64:0.19"] = 289, -- Wintergarde Keep, Ebon Watch, K3, Dun Nifflelem, Ulduar + ["0.60:0.52:0.64:0.42:0.62:0.36:0.72:0.29"] = 205, -- Крепость Стражей Зимы, Черная застава, К-3, Дун Ниффелем + ["0.60:0.52:0.69:0.42:0.72:0.40"] = 132, -- Feste Wintergarde, Lichtbresche, Argentumwache + ["0.60:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 316, -- Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 303, -- Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.60:0.52:0.49:0.58:0.74:0.71:0.88:0.72"] = 362, -- Wintergarde Keep, Moa'ki, Kamagua, Valgarde Port + ["0.60:0.52:0.59:0.43:0.52:0.38:0.52:0.34:0.38:0.21"] = 268, -- Wintergarde Keep, Windrunner's Overlook, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.60:0.52:0.46:0.46:0.41:0.43:0.24:0.40"] = 292, -- Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, River's Heart + ["0.60:0.52:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 280, -- Wintergarde Keep, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.60:0.52:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 299, -- Wintergarde Keep, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.60:0.52:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 244, -- Wintergarde Keep, Ebon Watch, K3, Frosthold, Ulduar + ["0.60:0.52:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 212, -- Wintergarde Keep, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.60:0.52:0.59:0.43:0.52:0.38:0.56:0.36"] = 140, -- Feste Wintergarde, Windläufers Warte, Dalaran, Die Argentumvorhut + ["0.60:0.52:0.46:0.46:0.41:0.43:0.28:0.28"] = 321, -- Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, Death's Rise + ["0.60:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 221, -- Wintergarde Keep, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.60:0.52:0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 298, -- Wintergarde Keep, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.60:0.52:0.69:0.42:0.72:0.40:0.83:0.46"] = 202, -- Feste Wintergarde, Lichtbresche, Argentumwache, Westfallbrigade + ["0.60:0.52:0.64:0.42:0.52:0.38:0.56:0.36"] = 152, -- Wintergarde Keep, Ebon Watch, Dalaran, The Argent Vanguard + ["0.60:0.52:0.59:0.43:0.52:0.38:0.52:0.34"] = 145, -- Wintergarde Keep, Windrunner's Overlook, Dalaran, Crusaders' Pinnacle + ["0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38"] = 172, -- Wintergarde Keep, Light's Breach, The Argent Stand, Zim'Torga + ["0.60:0.52:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 324, -- Wintergarde Keep, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.60:0.52:0.54:0.52:0.52:0.38:0.56:0.36"] = 169, -- Wintergarde Keep, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.60:0.52:0.59:0.43:0.52:0.38:0.56:0.36:0.57:0.33"] = 179, -- Wintergarde Keep, Windrunner's Overlook, Dalaran, The Argent Vanguard, Frosthold + ["0.60:0.52:0.42:0.53:0.41:0.43:0.52:0.38"] = 268, -- Wintergarde Keep, Stars' Rest, Valiance Landing Camp, Dalaran + ["0.60:0.52:0.64:0.42:0.52:0.38:0.52:0.34"] = 157, -- Wintergarde Keep, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.60:0.52:0.59:0.43:0.52:0.38:0.49:0.21"] = 232, -- Wintergarde Keep, Windrunner's Overlook, Dalaran, Argent Tournament Grounds + ["0.60:0.52:0.64:0.42:0.52:0.38:0.49:0.21"] = 244, -- Wintergarde Keep, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.60:0.52:0.54:0.52:0.52:0.38:0.49:0.21:0.38:0.21"] = 345, -- 溫特加德要塞,龍骨荒野, 龍眠神殿,龍骨荒野, 達拉然, 銀白聯賽場地,寒冰皇冠, 暗影穹殿,寒冰皇冠 + ["0.60:0.52:0.54:0.52:0.52:0.38:0.52:0.34"] = 175, -- Wintergarde Keep, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle + ["0.60:0.52:0.49:0.58:0.29:0.57"] = 230, -- Wintergarde Keep, Moa'ki, Unu'pe + ["0.60:0.52:0.54:0.52:0.52:0.38:0.49:0.21"] = 261, -- Wintergarde Keep, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.60:0.52:0.54:0.52:0.52:0.38:0.62:0.36:0.57:0.33"] = 234, -- Wintergarde Keep, Wyrmrest Temple, Dalaran, K3, Frosthold + ["0.60:0.52:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 283, -- Wintergarde Keep, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + + -- Alliance: Dragonblight: Wyrmrest Temple + ["0.54:0.52:0.60:0.52"] = 36, -- Wyrmrest Temple, Wintergarde Keep + ["0.54:0.52:0.60:0.52:0.59:0.43"] = 78, -- Wyrmrest Temple, Wintergarde Keep, Windrunner's Overlook + ["0.54:0.52:0.46:0.46"] = 39, -- Wyrmrest Temple, Fordragon Hold (Jack O'Donnell reported 58) + ["0.54:0.52:0.49:0.58"] = 36, -- Wyrmrest Temple, Moa'ki + ["0.54:0.52:0.42:0.53"] = 45, -- Wyrmrest Temple, Stars' Rest + ["0.54:0.52:0.52:0.38"] = 65, -- Wyrmrest Temple, Dalaran + ["0.54:0.52:0.42:0.53:0.29:0.57"] = 109, -- Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.54:0.52:0.46:0.46:0.41:0.43"] = 79, -- Wyrmrest Temple, Fordragon Hold, Valiance Landing Camp + ["0.54:0.52:0.42:0.53:0.22:0.61"] = 129, -- Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 157, -- Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.54:0.52:0.49:0.58:0.74:0.71:0.88:0.72"] = 212, -- Wyrmrest Temple, Moa'ki, Kamagua, Valgarde Port + ["0.54:0.52:0.60:0.52:0.76:0.67"] = 114, -- Wyrmrest Temple, Wintergarde Keep, Westguard Keep + ["0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.72"] = 160, -- Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.54:0.52:0.60:0.52:0.73:0.54"] = 82, -- Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 181, -- Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.54:0.52:0.60:0.52:0.69:0.42"] = 89, -- Wyrmrest Temple, Wintergarde Keep, Light's Breach + ["0.54:0.52:0.60:0.52:0.73:0.54:0.83:0.46"] = 136, -- Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.54:0.52:0.42:0.53:0.21:0.49"] = 129, -- Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 170, -- Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge + ["0.54:0.52:0.64:0.42"] = 71, -- Wyrmrest Temple, Ebon Watch + ["0.54:0.52:0.60:0.52:0.73:0.54:0.88:0.60"] = 158, -- Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 194, -- Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.54:0.52:0.64:0.42:0.62:0.36:0.72:0.29:0.64:0.19"] = 220, -- Wyrmrest Temple, Ebon Watch, K3, Dun Nifflelem, Ulduar + ["0.54:0.52:0.52:0.38:0.52:0.34"] = 83, -- Wyrmrest Temple, Dalaran, Crusaders' Pinnacle + ["0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 140, -- Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga + ["0.54:0.52:0.49:0.58:0.74:0.71:0.76:0.67"] = 183, -- Wyrmrest Temple, Moa'ki, Kamagua, Westguard Keep + ["0.54:0.52:0.60:0.52:0.76:0.67:0.74:0.71"] = 148, -- Wyrmruhtempel, Feste Wintergarde, Westwacht, Kamagua + ["0.54:0.52:0.46:0.46:0.41:0.43:0.24:0.40"] = 169, -- Wyrmruhtempel, Feste Fordragon, Valianzlager, Flussnabel + ["0.54:0.52:0.64:0.42:0.62:0.36"] = 98, -- Wyrmrest Temple, Ebon Watch, K3 + ["0.54:0.52:0.64:0.42:0.72:0.40"] = 114, -- Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.54:0.52:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 148, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.54:0.52:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 170, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.54:0.52:0.64:0.42:0.62:0.36:0.72:0.29"] = 165, -- Wyrmrest Temple, Ebon Watch, K3, Dun Nifflelem + ["0.54:0.52:0.52:0.38:0.62:0.36:0.72:0.29"] = 161, -- Wyrmrest Temple, Dalaran, K3, Dun Nifflelem + ["0.54:0.52:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 191, -- Wyrmrest Temple, Ebon Watch, K3, Frosthold, Ulduar + ["0.54:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 170, -- Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.54:0.52:0.52:0.38:0.56:0.36"] = 79, -- Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.54:0.52:0.60:0.52:0.73:0.54:0.83:0.46:0.72:0.40"] = 189, -- Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge, Westfall Brigade, The Argent Stand + ["0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 176, -- Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.54:0.52:0.49:0.58:0.74:0.71"] = 158, -- Wyrmruhtempel, Moa'ki, Kamagua + ["0.54:0.52:0.46:0.46:0.41:0.43:0.28:0.28"] = 189, -- Wyrmrest Temple, Fordragon Hold, Valiance Landing Camp, Death's Rise + ["0.54:0.52:0.52:0.38:0.56:0.36:0.57:0.33"] = 106, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, Frosthold + ["0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 275, -- Temple du Repos du ver, Guet d'Ébène, Le séjour d'Argent, Zim'Torga, Ulduar, Refuge de Rochecombe + ["0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.60"] = 170, -- Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.54:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 178, -- Храм Драконьего Покоя, Покой Звезд, Взлетная полоса Выкрутеня, Лагерь Эрнестуэя + ["0.54:0.52:0.52:0.38:0.52:0.34:0.28:0.28"] = 195, -- Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 165, -- Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.54:0.52:0.64:0.42:0.72:0.40:0.83:0.46"] = 161, -- Templo do Repouso das Serpes, Posto Ébano, Fortaleza Argêntea, Brigada do Cerro Oeste + ["0.54:0.52:0.42:0.53:0.41:0.43"] = 86, -- Wyrmrest Temple, Stars' Rest, Valiance Landing Camp + ["0.54:0.52:0.52:0.38:0.62:0.36:0.57:0.33:0.57:0.21"] = 166, -- Wyrmrest Temple, Dalaran, K3, Frosthold, Bouldercrag's Refuge + ["0.54:0.52:0.52:0.38:0.62:0.36"] = 95, -- Wyrmrest Temple, Dalaran, K3 + ["0.54:0.52:0.52:0.38:0.24:0.40"] = 198, -- Wyrmrest Temple, Dalaran, River's Heart + ["0.54:0.52:0.52:0.38:0.56:0.36:0.38:0.21"] = 178, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.54:0.52:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 169, -- Wyrmrest Temple, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.54:0.52:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38"] = 145, -- Wyrmruhtempel, Feste Wintergarde, Lichtbresche, Argentumwache, Zim'Torga + ["0.54:0.52:0.52:0.38:0.52:0.34:0.57:0.21"] = 246, -- Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, Bouldercrag's Refuge + ["0.54:0.52:0.64:0.42:0.69:0.42:0.73:0.54"] = 157, -- Wyrmrest Temple, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.54:0.52:0.52:0.38:0.49:0.21"] = 141, -- Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.54:0.52:0.52:0.38:0.49:0.21:0.38:0.21"] = 197, -- Wyrmrest Temple, Dalaran, Argent Tournament Grounds, The Shadow Vault + ["0.54:0.52:0.52:0.38:0.24:0.40:0.21:0.49:0.22:0.61"] = 286, -- Wyrmrest Temple, Dalaran, River's Heart, Fizzcrank Airstrip, Valiance Keep + ["0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 197, -- Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.54:0.52:0.64:0.42:0.69:0.42"] = 101, -- Wyrmrest Temple, Ebon Watch, Light's Breach + ["0.54:0.52:0.60:0.52:0.69:0.42:0.72:0.40"] = 118, -- Wyrmruhtempel, Feste Wintergarde, Lichtbresche, Argentumwache + ["0.54:0.52:0.42:0.53:0.41:0.43:0.24:0.40"] = 177, -- Wyrmrest Temple, Stars' Rest, Valiance Landing Camp, River's Heart + + ---------------------------------------------------------------------- + -- Alliance: Grizzly Hills + ---------------------------------------------------------------------- + + -- Alliance: Grizzly Hills: Amberpine Lodge + ["0.73:0.54:0.76:0.67"] = 84, -- Amberpine Lodge, Westguard Keep + ["0.73:0.54:0.76:0.67:0.74:0.71"] = 134, -- Amberpine Lodge, Westguard Keep, Kamagua + ["0.73:0.54:0.76:0.67:0.88:0.72"] = 152, -- Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.73:0.54:0.88:0.60"] = 117, -- Amberpine Lodge, Fort Wildervar + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 173, -- Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.73:0.54:0.83:0.46"] = 84, -- Amberpine Lodge, Westfall Brigade + ["0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38"] = 150, -- Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga + ["0.73:0.54:0.60:0.52:0.42:0.53:0.22:0.61"] = 318, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33"] = 189, -- Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold + ["0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 396, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.73:0.54:0.60:0.52:0.42:0.53"] = 190, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest (Anita H. reported 70) + ["0.73:0.54:0.60:0.52:0.49:0.58"] = 175, -- Amberpine Lodge, Wintergarde Keep, Moa'ki + ["0.73:0.54:0.60:0.52"] = 82, -- Amberpine Lodge, Wintergarde Keep + ["0.73:0.54:0.60:0.52:0.54:0.52"] = 131, -- Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple + ["0.73:0.54:0.69:0.42:0.64:0.42:0.46:0.46:0.42:0.53:0.21:0.49"] = 415, -- Amberpine Lodge, Light's Breach, Ebon Watch, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip + ["0.73:0.54:0.69:0.42"] = 67, -- Amberpine Lodge, Light's Breach + ["0.73:0.54:0.76:0.67:0.74:0.71:0.49:0.58"] = 328, -- Amberpine Lodge, Westguard Keep, Kamagua, Moa'ki + ["0.73:0.54:0.88:0.60:0.88:0.72"] = 190, -- Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.73:0.54:0.69:0.42:0.72:0.40"] = 109, -- Amberpine Lodge, Light's Breach, The Argent Stand + ["0.73:0.54:0.60:0.52:0.64:0.42"] = 140, -- Amberpine Lodge, Wintergarde Keep, Ebon Watch + ["0.73:0.54:0.60:0.52:0.42:0.53:0.29:0.57"] = 287, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.73:0.54:0.60:0.52:0.46:0.46"] = 172, -- Amberpine Lodge, Wintergarde Keep, Fordragon Hold + ["0.73:0.54:0.60:0.52:0.59:0.43"] = 147, -- Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook + ["0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38"] = 223, -- Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.73:0.54:0.69:0.42:0.64:0.42"] = 106, -- Amberpine Lodge, Light's Breach, Ebon Watch + ["0.73:0.54:0.83:0.46:0.78:0.38:0.82:0.31"] = 209, -- Amberpine Lodge, Westfall Brigade, Zim'Torga, Gundrak + ["0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49"] = 316, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38"] = 194, -- Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.73:0.54:0.60:0.52:0.64:0.42:0.52:0.38"] = 207, -- Amberpine Lodge, Wintergarde Keep, Ebon Watch, Dalaran + ["0.73:0.54:0.60:0.52:0.49:0.58:0.29:0.57:0.21:0.49"] = 384, -- Amberpine Lodge, Wintergarde Keep, Moa'ki, Unu'pe, Fizzcrank Airstrip + ["0.73:0.54:0.76:0.67:0.74:0.71:0.49:0.58:0.54:0.52"] = 376, -- Amberpine Lodge, Westguard Keep, Kamagua, Moa'ki, Wyrmrest Temple + ["0.73:0.54:0.60:0.52:0.49:0.58:0.52:0.38"] = 296, -- Amberpine Lodge, Wintergarde Keep, Moa'ki, Dalaran + ["0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36"] = 146, -- Amberpine Lodge, Light's Breach, Ebon Watch, K3 + ["0.73:0.54:0.83:0.46:0.72:0.40"] = 166, -- Amberpine Lodge, Westfall Brigade, The Argent Stand + ["0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 234, -- Gîte Ambrepin, La Brèche de Lumière, Le séjour d'Argent, Zim'Torga, Dun Nifflelem + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 370, -- Ammertannhütte, Lichtbresche, Schwarze Wacht, Dalaran, Flussnabel + ["0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 203, -- Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 359, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.73:0.54:0.83:0.46:0.78:0.38"] = 156, -- Ammertannhütte, Westfallbrigade, Zim'Torga + ["0.73:0.54:0.76:0.67:0.74:0.71:0.49:0.58:0.42:0.53"] = 382, -- Amberpine Lodge, Westguard Keep, Kamagua, Moa'ki, Stars' Rest + ["0.73:0.54:0.60:0.52:0.59:0.43:0.62:0.36"] = 193, -- Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, K3 + ["0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 391, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.73:0.54:0.60:0.52:0.49:0.58:0.29:0.57:0.22:0.61"] = 365, -- Amberpine Lodge, Wintergarde Keep, Moa'ki, Unu'pe, Valiance Keep + ["0.73:0.54:0.60:0.52:0.46:0.46:0.52:0.38"] = 237, -- Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Dalaran + ["0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43:0.24:0.40"] = 368, -- Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, River's Heart + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 198, -- Gîte Ambrepin, La Brèche de Lumière, Guet d'Ébène, Dalaran, Cime des Croisés + ["0.73:0.54:0.69:0.42:0.64:0.42:0.59:0.43"] = 139, -- Amberpine Lodge, Light's Breach, Ebon Watch, Windrunner's Overlook + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 193, -- Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.73:0.54:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 415, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 303, -- Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Ulduar + ["0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 379, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43"] = 231, -- Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.73:0.54:0.69:0.42:0.64:0.42:0.46:0.46"] = 216, -- Amberpine Lodge, Light's Breach, Ebon Watch, Fordragon Hold + ["0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 286, -- Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Ulduar + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 320, -- Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.73:0.54:0.76:0.67:0.74:0.71:0.49:0.58:0.52:0.38"] = 450, -- Amberpine Lodge, Westguard Keep, Kamagua, Moa'ki, Dalaran + ["0.73:0.54:0.60:0.52:0.49:0.58:0.74:0.71"] = 358, -- Amberpine Lodge, Wintergarde Keep, Moa'ki, Kamagua + ["0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 253, -- Ammertannhütte, Lichtbresche, Schwarze Wacht, K3, Eisfestung, Bergfels' Zuflucht + ["0.73:0.54:0.60:0.52:0.64:0.42:0.62:0.36"] = 180, -- Amberpine Lodge, Wintergarde Keep, Ebon Watch, K3 + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 365, -- Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 232, -- Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.73:0.54:0.60:0.52:0.42:0.53:0.41:0.43:0.52:0.38"] = 344, -- Amberpine Lodge, Wintergarde Keep, Stars' Rest, Valiance Landing Camp, Dalaran + ["0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 285, -- Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.73:0.54:0.60:0.52:0.64:0.42:0.52:0.38:0.49:0.21"] = 319, -- Amberpine Lodge, Wintergarde Keep, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.73:0.54:0.60:0.52:0.59:0.43:0.62:0.36:0.57:0.33:0.57:0.21"] = 300, -- Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, K3, Frosthold, Bouldercrag's Refuge + ["0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38:0.52:0.34"] = 221, -- Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran, Crusaders' Pinnacle + ["0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38:0.49:0.21"] = 307, -- Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran, Argent Tournament Grounds + ["0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43:0.28:0.28"] = 397, -- Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, Death's Rise + ["0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38:0.62:0.36"] = 267, -- Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran, K3 + ["0.73:0.54:0.69:0.42:0.64:0.42:0.54:0.52"] = 196, -- Amberpine Lodge, Light's Breach, Ebon Watch, Wyrmrest Temple + ["0.73:0.54:0.60:0.52:0.59:0.43:0.62:0.36:0.57:0.33"] = 236, -- Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, K3, Frosthold + + -- Alliance: Grizzly Hills: Westfall Brigade + ["0.83:0.46:0.73:0.54"] = 79, -- Westfall Brigade, Amberpine Lodge + ["0.83:0.46:0.78:0.38"] = 73, -- Westfall Brigade, Zim'Torga + ["0.83:0.46:0.72:0.40"] = 82, -- Westfall Brigade, The Argent Stand + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38"] = 201, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran + ["0.83:0.46:0.88:0.60"] = 85, -- Westfall Brigade, Fort Wildervar + ["0.83:0.46:0.78:0.38:0.64:0.19:0.57:0.21"] = 275, -- Westfall Brigade, Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.83:0.46:0.73:0.54:0.76:0.67"] = 162, -- Westfall Brigade, Amberpine Lodge, Westguard Keep + ["0.83:0.46:0.88:0.60:0.88:0.72"] = 159, -- Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.83:0.46:0.73:0.54:0.76:0.67:0.74:0.71"] = 211, -- Westfall Brigade, Amberpine Lodge, Westguard Keep, Kamagua + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.22:0.61"] = 394, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.29:0.57"] = 363, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 472, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 436, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53"] = 266, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest + ["0.83:0.46:0.88:0.60:0.76:0.67"] = 165, -- Westfall Brigade, Fort Wildervar, Westguard Keep + ["0.83:0.46:0.73:0.54:0.60:0.52"] = 159, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep + ["0.83:0.46:0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38"] = 299, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.83:0.46:0.88:0.60:0.76:0.67:0.60:0.52:0.42:0.53"] = 424, -- Westfall Brigade, Fort Wildervar, Westguard Keep, Wintergarde Keep, Stars' Rest + ["0.83:0.46:0.73:0.54:0.69:0.42"] = 144, -- Westfall Brigade, Amberpine Lodge, Light's Breach + ["0.83:0.46:0.73:0.54:0.60:0.52:0.64:0.42"] = 216, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Ebon Watch + ["0.83:0.46:0.72:0.40:0.69:0.42"] = 106, -- Westfall Brigade, The Argent Stand, Light's Breach + ["0.83:0.46:0.73:0.54:0.76:0.67:0.88:0.72"] = 230, -- Westfall Brigade, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.83:0.46:0.73:0.54:0.69:0.42:0.64:0.42"] = 183, -- Westfall Brigade, Amberpine Lodge, Light's Breach, Ebon Watch + ["0.83:0.46:0.73:0.54:0.60:0.52:0.54:0.52"] = 207, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple + ["0.83:0.46:0.73:0.54:0.60:0.52:0.64:0.42:0.52:0.38"] = 283, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Ebon Watch, Dalaran + ["0.83:0.46:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 250, -- Westfall Brigade, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.83:0.46:0.73:0.54:0.60:0.52:0.49:0.58:0.52:0.38:0.62:0.36"] = 416, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Moa'ki, Dalaran, K3 + ["0.83:0.46:0.72:0.40:0.64:0.42:0.62:0.36"] = 174, -- Westfall Brigade, The Argent Stand, Ebon Watch, K3 + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 456, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge + ["0.83:0.46:0.73:0.54:0.60:0.52:0.49:0.58:0.52:0.38"] = 372, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Moa'ki, Dalaran + ["0.83:0.46:0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38"] = 270, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.83:0.46:0.88:0.60:0.76:0.67:0.60:0.52"] = 316, -- Westfall Brigade, Fort Wildervar, Westguard Keep, Wintergarde Keep + ["0.83:0.46:0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38:0.62:0.36"] = 344, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran, K3 + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49"] = 393, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.83:0.46:0.72:0.40:0.64:0.42"] = 134, -- Westfall Brigade, The Argent Stand, Ebon Watch + ["0.83:0.46:0.73:0.54:0.60:0.52:0.49:0.58"] = 252, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Moa'ki + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 399, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 226, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.83:0.46:0.73:0.54:0.60:0.52:0.46:0.46:0.52:0.38"] = 313, -- Westfallbrigade, Ammertannhütte, Feste Wintergarde, Feste Fordragon, Dalaran + ["0.83:0.46:0.78:0.38:0.82:0.31"] = 126, -- Westfallbrigade, Zim'Torga, Gundrak + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 221, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 454, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.83:0.46:0.78:0.38:0.64:0.19"] = 227, -- Westfall Brigade, Zim'Torga, Ulduar + ["0.83:0.46:0.78:0.38:0.72:0.29"] = 158, -- Westfall Brigade, Zim'Torga, Dun Nifflelem + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 434, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.83:0.46:0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 281, -- Westfall Brigade, The Argent Stand, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.83:0.46:0.73:0.54:0.60:0.52:0.59:0.43"] = 223, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook + ["0.83:0.46:0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43"] = 308, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.83:0.46:0.72:0.40:0.64:0.42:0.46:0.46:0.41:0.43:0.28:0.28"] = 469, -- Westfallbrigade, Argentumwache, Schwarze Wacht, Feste Fordragon, Valianzlager, Todesanhöhe + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 349, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.83:0.46:0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33"] = 217, -- Westfall Brigade, The Argent Stand, Ebon Watch, K3, Frosthold + ["0.83:0.46:0.73:0.54:0.60:0.52:0.46:0.46"] = 249, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Fordragon Hold + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 368, -- Westfallbrigade, Argentumwache, Schwarze Wacht, Dalaran, Die Argentumvorhut, Das Schattengewölbe + ["0.83:0.46:0.72:0.40:0.64:0.42:0.46:0.46"] = 244, -- Westfall Brigade, The Argent Stand, Ebon Watch, Fordragon Hold + ["0.83:0.46:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 447, -- Westfall Brigade, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.83:0.46:0.72:0.40:0.64:0.42:0.46:0.46:0.41:0.43"] = 304, -- Westfall Brigade, The Argent Stand, Ebon Watch, Fordragon Hold, Valiance Landing Camp + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 394, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.83:0.46:0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52:0.52:0.38"] = 328, -- Westfallbrigade, Argentumwache, Lichtbresche, Feste Wintergarde, Wyrmruhtempel, Dalaran + ["0.83:0.46:0.72:0.40:0.69:0.42:0.60:0.52"] = 188, -- Westfallbrigade, Argentumwache, Lichtbresche, Feste Wintergarde + ["0.83:0.46:0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58"] = 408, -- Westfall Brigade, Fort Wildervar, Westguard Keep, Kamagua, Moa'ki + ["0.83:0.46:0.72:0.40:0.64:0.42:0.59:0.43"] = 167, -- Westfall Brigade, The Argent Stand, Ebon Watch, Windrunner's Overlook + ["0.83:0.46:0.73:0.54:0.60:0.52:0.59:0.43:0.62:0.36"] = 269, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, K3 + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.21"] = 313, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.83:0.46:0.78:0.38:0.64:0.19:0.57:0.21:0.49:0.21"] = 335, -- Westfall Brigade, Zim'Torga, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.83:0.46:0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38:0.52:0.34"] = 297, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran, Crusaders' Pinnacle + ["0.83:0.46:0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38:0.49:0.21"] = 413, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.83:0.46:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 362, -- Westfall Brigade, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.83:0.46:0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38:0.49:0.21"] = 384, -- Westfallbrigade, Ammertannhütte, Feste Wintergarde, Windläufers Warte, Dalaran, Argentumturnierplatz + ["0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 467, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.83:0.46:0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43:0.24:0.40"] = 444, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, River's Heart + ["0.83:0.46:0.73:0.54:0.60:0.52:0.64:0.42:0.62:0.36"] = 256, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Ebon Watch, K3 + ["0.83:0.46:0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38:0.56:0.36"] = 292, -- Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran, The Argent Vanguard + ["0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 325, -- Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.83:0.46:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.72:0.29"] = 323, -- Westfall Brigade, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Dun Nifflelem + ["0.83:0.46:0.88:0.60:0.88:0.72:0.74:0.71"] = 253, -- Westfall Brigade, Fort Wildervar, Valgarde Port, Kamagua + + ---------------------------------------------------------------------- + -- Alliance: Howling Fjord + ---------------------------------------------------------------------- + + -- Alliance: Howling Fjord: Fort Wildervar + ["0.88:0.60:0.83:0.46"] = 98, -- Fort Wildervar, Westfall Brigade + ["0.88:0.60:0.88:0.72"] = 74, -- Fort Wildervar, Valgarde Port + ["0.88:0.60:0.76:0.67"] = 81, -- Fort Wildervar, Westguard Keep + ["0.88:0.60:0.76:0.67:0.74:0.71"] = 130, -- Fort Wildervar, Westguard Keep, Kamagua + ["0.88:0.60:0.73:0.54"] = 97, -- Fort Wildervar, Amberpine Lodge + ["0.88:0.60:0.83:0.46:0.78:0.38"] = 170, -- Fort Wildervar, Westfall Brigade, Zim'Torga + ["0.88:0.60:0.83:0.46:0.78:0.38:0.82:0.31"] = 223, -- Fort Wildervar, Westfall Brigade, Zim'Torga, Gundrak + ["0.88:0.60:0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43:0.24:0.40"] = 463, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, River's Heart + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 267, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.88:0.60:0.83:0.46:0.72:0.40"] = 179, -- Fort Wildervar, Westfall Brigade, The Argent Stand + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49"] = 412, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 491, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 455, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53:0.22:0.61"] = 413, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.88:0.60:0.73:0.54:0.60:0.52:0.49:0.58"] = 270, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Moa'ki + ["0.88:0.60:0.73:0.54:0.69:0.42"] = 162, -- Fort Wildervar, Amberpine Lodge, Light's Breach + ["0.88:0.60:0.73:0.54:0.60:0.52"] = 178, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36"] = 241, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, K3 + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42"] = 201, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53:0.29:0.57"] = 382, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.88:0.60:0.76:0.67:0.60:0.52"] = 230, -- Fort Wildervar, Westguard Keep, Wintergarde Keep + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58"] = 324, -- Fort Wildervar, Westguard Keep, Kamagua, Moa'ki + ["0.88:0.60:0.73:0.54:0.60:0.52:0.54:0.52"] = 225, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61"] = 514, -- Fort Wildervar, Westguard Keep, Kamagua, Moa'ki, Unu'pe, Valiance Keep + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58:0.42:0.53"] = 378, -- Fort Wildervar, Westguard Keep, Kamagua, Moa'ki, Stars' Rest + ["0.88:0.60:0.76:0.67:0.60:0.52:0.42:0.53"] = 339, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Stars' Rest + ["0.88:0.60:0.76:0.67:0.60:0.52:0.46:0.46:0.52:0.38"] = 386, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Fordragon Hold, Dalaran + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58:0.52:0.38"] = 445, -- Fort Wildervar, Westwacht, Kamagua, Moa'ki, Dalaran + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53"] = 286, -- Fort Wildervar, Ammertannhütte, Feste Wintergarde, Sternenruh + ["0.88:0.60:0.76:0.67:0.60:0.52:0.42:0.53:0.29:0.57"] = 435, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33"] = 284, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold + ["0.88:0.60:0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38"] = 371, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.88:0.60:0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61"] = 466, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.88:0.60:0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38"] = 318, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.88:0.60:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 298, -- Fort Wildervar, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.88:0.60:0.83:0.46:0.78:0.38:0.72:0.29"] = 254, -- Fort Wildervar, Westfallbrigade, Zim'Torga, Dun Niffelem + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 460, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.88:0.60:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38"] = 245, -- Fort Wildervar, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga + ["0.88:0.60:0.73:0.54:0.60:0.52:0.46:0.46"] = 267, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Fordragon Hold + ["0.88:0.60:0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49"] = 464, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.88:0.60:0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38"] = 289, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58:0.54:0.52"] = 372, -- Fort Wildervar, Westguard Keep, Kamagua, Moa'ki, Wyrmrest Temple + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53:0.12:0.53"] = 612, -- Fort Wildervar, Westguard Keep, Kamagua, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge, Transitus Shield + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.59:0.43"] = 234, -- Fort Wildervar, Ammertannhütte, Lichtbresche, Schwarze Wacht, Windläufers Warte + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 416, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 381, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Ulduar + ["0.88:0.60:0.73:0.54:0.69:0.42:0.72:0.40"] = 205, -- Fort Wildervar, Amberpine Lodge, Light's Breach, The Argent Stand + ["0.88:0.60:0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43"] = 327, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58:0.42:0.53:0.22:0.61"] = 506, -- Fort Wildervar, Westwacht, Kamagua, Moa'ki, Sternenruh, Valianzfeste + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 293, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.88:0.60:0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.58"] = 444, -- Fort Wildervar, Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran, Moa'ki + ["0.88:0.60:0.83:0.46:0.72:0.40:0.64:0.42:0.46:0.46"] = 342, -- Fort Wildervar, Westfall Brigade, The Argent Stand, Ebon Watch, Fordragon Hold + ["0.88:0.60:0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38"] = 342, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.88:0.60:0.73:0.54:0.60:0.52:0.49:0.58:0.52:0.38"] = 391, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Moa'ki, Dalaran + ["0.88:0.60:0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38:0.41:0.43"] = 444, -- Fort Wildervar, Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran, Valiance Landing Camp + ["0.88:0.60:0.76:0.67:0.74:0.71:0.49:0.58:0.54:0.52:0.64:0.42"] = 476, -- Fort Wildervar, Westguard Keep, Kamagua, Moa'ki, Wyrmrest Temple, Ebon Watch + ["0.88:0.60:0.73:0.54:0.60:0.52:0.64:0.42:0.52:0.38"] = 302, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Ebon Watch, Dalaran + ["0.88:0.60:0.73:0.54:0.60:0.52:0.64:0.42"] = 235, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Ebon Watch + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 473, -- Fort Wildervar, Ammertannhütte, Feste Wintergarde, Sternenruh, Landebahn Kurbelzisch, Flussnabel + ["0.88:0.60:0.83:0.46:0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33"] = 314, -- Fort Wildervar, Westfall Brigade, The Argent Stand, Ebon Watch, K3, Frosthold + ["0.88:0.60:0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38:0.56:0.36"] = 311, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook, Dalaran, The Argent Vanguard + ["0.88:0.60:0.73:0.54:0.60:0.52:0.64:0.42:0.62:0.36"] = 276, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Ebon Watch, K3 + ["0.88:0.60:0.73:0.54:0.60:0.52:0.59:0.43"] = 242, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Windrunner's Overlook + ["0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 487, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 327, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 288, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 465, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 348, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.88:0.60:0.73:0.54:0.60:0.52:0.46:0.46:0.41:0.43:0.28:0.28"] = 492, -- Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, Death's Rise + ["0.88:0.60:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 330, -- Fort Wildervar, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 380, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.88:0.60:0.83:0.46:0.78:0.38:0.64:0.19"] = 324, -- Fort Wildervar, Westfall Brigade, Zim'Torga, Ulduar + ["0.88:0.60:0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.21"] = 411, -- Fort Wildervar, Westfallbrigade, Argentumwache, Schwarze Wacht, Dalaran, Argentumturnierplatz + ["0.88:0.60:0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38:0.49:0.21"] = 432, -- Fort Wildervar, Ammertannhütte, Feste Wintergarde, Wyrmruhtempel, Dalaran, Argentumturnierplatz + ["0.88:0.60:0.73:0.54:0.60:0.52:0.59:0.43:0.52:0.38:0.49:0.21"] = 403, -- Fort Wildervar, Ammertannhütte, Feste Wintergarde, Windläufers Warte, Dalaran, Argentumturnierplatz + ["0.88:0.60:0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38"] = 298, -- Fort Wildervar, Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran + ["0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 435, -- Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + + -- Alliance: Howling Fjord: Kamagua + ["0.74:0.71:0.76:0.67"] = 37, -- Kamagua, Westguard Keep + ["0.74:0.71:0.88:0.72"] = 81, -- Kamagua, Valgarde Port + ["0.74:0.71:0.76:0.67:0.88:0.60"] = 121, -- Kamagua, Westguard Keep, Fort Wildervar + ["0.74:0.71:0.76:0.67:0.73:0.54"] = 112, -- Kamagua, Westguard Keep, Amberpine Lodge + ["0.74:0.71:0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 455, -- Kamagua, Moa'ki, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.74:0.71:0.76:0.67:0.60:0.52:0.54:0.52"] = 236, -- Kamagua, Westguard Keep, Wintergarde Keep, Wyrmrest Temple + ["0.74:0.71:0.49:0.58:0.29:0.57"] = 327, -- Kamagua, Moa'ki, Unu'pe + ["0.74:0.71:0.49:0.58:0.42:0.53:0.22:0.61"] = 377, -- Kamagua, Moa'ki, Stars' Rest, Valiance Keep + ["0.74:0.71:0.49:0.58"] = 195, -- Kamagua, Moa'ki + ["0.74:0.71:0.76:0.67:0.60:0.52"] = 188, -- Kamagua, Westguard Keep, Wintergarde Keep + ["0.74:0.71:0.76:0.67:0.73:0.54:0.83:0.46"] = 195, -- Kamagua, Westguard Keep, Amberpine Lodge, Westfall Brigade + ["0.74:0.71:0.49:0.58:0.42:0.53"] = 249, -- Kamagua, Moa'ki, Stars' Rest + ["0.74:0.71:0.76:0.67:0.60:0.52:0.46:0.46"] = 277, -- Kamagua, Westguard Keep, Wintergarde Keep, Fordragon Hold + ["0.74:0.71:0.49:0.58:0.42:0.53:0.41:0.43"] = 312, -- Kamagua, Moa'ki, Stars' Rest, Valiance Landing Camp + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38"] = 260, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.59:0.43"] = 249, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Windrunner's Overlook + ["0.74:0.71:0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53"] = 418, -- Kamagua, Moa'ki, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.74:0.71:0.49:0.58:0.29:0.57:0.21:0.49"] = 405, -- Kamagua, Moa'ki, Unu'pe, Fizzcrank Airstrip + ["0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61"] = 386, -- Kamagua, Moa'ki, Unu'pe, Valiance Keep + ["0.74:0.71:0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61"] = 423, -- Kamagua, Westwacht, Feste Wintergarde, Sternenruh, Valianzfeste + ["0.74:0.71:0.49:0.58:0.52:0.38"] = 317, -- Kamagua, Moa'ki, Dalaran + ["0.74:0.71:0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38"] = 299, -- Kamagua, Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.74:0.71:0.49:0.58:0.42:0.53:0.21:0.49"] = 375, -- Kamagua, Moa'ki, Stars' Rest, Fizzcrank Airstrip + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 345, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 282, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.72:0.29"] = 356, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Dun Nifflelem + ["0.74:0.71:0.49:0.58:0.54:0.52"] = 243, -- Kamagua, Moa'ki, Wyrmrest Temple + ["0.74:0.71:0.49:0.58:0.42:0.53:0.21:0.49:0.24:0.40"] = 437, -- Kamagua, Moa'ki, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.74:0.71:0.49:0.58:0.60:0.52:0.73:0.54"] = 350, -- Kamagua, Moa'ki, Wintergarde Keep, Amberpine Lodge + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40"] = 219, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand + ["0.74:0.71:0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38"] = 328, -- Kamagua, Westguard Keep, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42"] = 177, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42"] = 216, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch + ["0.74:0.71:0.49:0.58:0.52:0.38:0.56:0.36:0.57:0.33"] = 377, -- Kamagua, Moa'ki, Dalaran, The Argent Vanguard, Frosthold + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 475, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36"] = 256, -- Kamagua, Westwacht, Ammertannhütte, Lichtbresche, Schwarze Wacht, K3 + ["0.74:0.71:0.76:0.67:0.60:0.52:0.64:0.42:0.62:0.36:0.57:0.33"] = 328, -- Kamagua, Westguard Keep, Wintergarde Keep, Ebon Watch, K3, Frosthold + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33"] = 298, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold + ["0.74:0.71:0.49:0.58:0.42:0.53:0.41:0.43:0.24:0.40"] = 448, -- Kamagua, Moa'ki, Stars' Rest, Valiance Landing Camp, River's Heart + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 313, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.74:0.71:0.49:0.58:0.42:0.53:0.41:0.43:0.28:0.28"] = 477, -- Kamagua, Moa'ki, Stars' Rest, Valiance Landing Camp, Death's Rise + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 431, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 396, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Ulduar + ["0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53"] = 448, -- Kamagua, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 462, -- Kamagua, Westwacht, Ammertannhütte, Lichtbresche, Argentumwache, Zim'Torga, Ulduar, Bergfels' Zuflucht + ["0.74:0.71:0.49:0.58:0.60:0.52"] = 279, -- Kamagua, Moa'ki, Wintergarde Keep + ["0.74:0.71:0.76:0.67:0.60:0.52:0.64:0.42:0.62:0.36:0.72:0.29"] = 385, -- Kamagua, Westguard Keep, Wintergarde Keep, Ebon Watch, K3, Dun Nifflelem + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 304, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 308, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 363, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.74:0.71:0.76:0.67:0.60:0.52:0.59:0.43"] = 252, -- Kamagua, Westguard Keep, Wintergarde Keep, Windrunner's Overlook + ["0.74:0.71:0.49:0.58:0.42:0.53:0.21:0.49:0.18:0.40"] = 450, -- Kamagua, Moa'ki, Sternenruh, Landebahn Kurbelzisch, Nesingwarys Basislager + ["0.74:0.71:0.76:0.67:0.60:0.52:0.46:0.46:0.52:0.38"] = 343, -- Kamagua, Westguard Keep, Wintergarde Keep, Fordragon Hold, Dalaran + ["0.74:0.71:0.49:0.58:0.52:0.38:0.62:0.36"] = 360, -- Kamagua, Moa'ki, Dalaran, K3 + ["0.74:0.71:0.76:0.67:0.60:0.52:0.64:0.42"] = 245, -- Kamagua, Westguard Keep, Wintergarde Keep, Ebon Watch + ["0.74:0.71:0.76:0.67:0.60:0.52:0.64:0.42:0.62:0.36"] = 285, -- Kamagua, Westguard Keep, Wintergarde Keep, Ebon Watch, K3 + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 342, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.74:0.71:0.49:0.58:0.52:0.38:0.59:0.43"] = 357, -- Kamagua, Moa'ki, Dalaran, Windrunner's Overlook + ["0.74:0.71:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 396, -- Kamagua, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.74:0.71:0.49:0.58:0.42:0.53:0.22:0.61:0.17:0.53"] = 439, -- Kamagua, Moa'ki, Stars' Rest, Valiance Keep, Amber Ledge + ["0.74:0.71:0.76:0.67:0.60:0.52:0.42:0.53:0.29:0.57"] = 392, -- Kamagua, Westguard Keep, Wintergarde Keep, Stars' Rest, Unu'pe + + -- Alliance: Howling Fjord: Valgarde Port, Howling Fjord + ["0.88:0.72:0.88:0.60"] = 71, -- Valgarde Port, Fort Wildervar + ["0.88:0.72:0.76:0.67"] = 70, -- Valgarde Port, Westguard Keep + ["0.88:0.72:0.74:0.71"] = 96, -- Valgarde Port, Kamagua + ["0.88:0.72:0.76:0.67:0.73:0.54"] = 144, -- Valgarde Port, Westguard Keep, Amberpine Lodge + ["0.88:0.72:0.88:0.60:0.83:0.46"] = 168, -- Valgarde Port, Fort Wildervar, Westfall Brigade + ["0.88:0.72:0.74:0.71:0.49:0.58"] = 290, -- Valgarde Port, Kamagua, Moa'ki + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61"] = 455, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 315, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.88:0.72:0.88:0.60:0.83:0.46:0.78:0.38"] = 241, -- Valgarde Port, Fort Wildervar, Westfall Brigade, Zim'Torga + ["0.88:0.72:0.88:0.60:0.83:0.46:0.72:0.40"] = 249, -- Valgarde Port, Fort Wildervar, Westfall Brigade, The Argent Stand + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33"] = 332, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold + ["0.88:0.72:0.74:0.71:0.49:0.58:0.29:0.57"] = 421, -- Valgarde Port, Kamagua, Moa'ki, Unu'pe + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53"] = 329, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 534, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49"] = 454, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 498, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.88:0.72:0.76:0.67:0.60:0.52"] = 220, -- Valgarde Port, Westguard Keep, Wintergarde Keep + ["0.88:0.72:0.76:0.67:0.60:0.52:0.54:0.52"] = 268, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Wyrmrest Temple + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42"] = 211, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach + ["0.88:0.72:0.88:0.60:0.83:0.46:0.78:0.38:0.82:0.31"] = 294, -- Valgarde Port, Fort Wildervar, Westfall Brigade, Zim'Torga, Gundrak + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42"] = 249, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36"] = 289, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3 + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.59:0.43"] = 282, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Windrunner's Overlook + ["0.88:0.72:0.76:0.67:0.60:0.52:0.46:0.46"] = 310, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Fordragon Hold + ["0.88:0.72:0.76:0.67:0.60:0.52:0.46:0.46:0.41:0.43"] = 369, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.88:0.72:0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61"] = 481, -- Valgarde Port, Kamagua, Moa'ki, Unu'pe, Valiance Keep + ["0.88:0.72:0.88:0.60:0.73:0.54:0.60:0.52:0.42:0.53"] = 356, -- Valgarde Port, Fort Wildervar, Amberpine Lodge, Wintergarde Keep, Stars' Rest + ["0.88:0.72:0.88:0.60:0.83:0.46:0.72:0.40:0.64:0.42"] = 301, -- Valgarde Port, Fort Wildervar, Westfall Brigade, The Argent Stand, Ebon Watch + ["0.88:0.72:0.76:0.67:0.60:0.52:0.49:0.58"] = 313, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Moa'ki + ["0.88:0.72:0.76:0.67:0.73:0.54:0.83:0.46"] = 228, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Westfall Brigade + ["0.88:0.72:0.74:0.71:0.49:0.58:0.29:0.57:0.21:0.49:0.17:0.53:0.12:0.53"] = 580, -- Valgarde Port, Kamagua, Moa'ki, Unu'pe, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.88:0.72:0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38"] = 332, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.88:0.72:0.74:0.71:0.49:0.58:0.29:0.57:0.21:0.49"] = 501, -- Valgarde Port, Kamagua, Moa'ki, Unu'pe, Fizzcrank Airstrip + ["0.88:0.72:0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38"] = 361, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.88:0.72:0.74:0.71:0.49:0.58:0.52:0.38"] = 412, -- Valgarde Port, Kamagua, Moa'ki, Dalaran + ["0.88:0.72:0.76:0.67:0.60:0.52:0.46:0.46:0.52:0.38"] = 375, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Fordragon Hold, Dalaran + ["0.88:0.72:0.74:0.71:0.49:0.58:0.42:0.53:0.22:0.61"] = 472, -- Valgarde Port, Kamagua, Moa'ki, Stars' Rest, Valiance Keep + ["0.88:0.72:0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53:0.12:0.53"] = 579, -- Valgarde Port, Kamagua, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge, Transitus Shield + ["0.88:0.72:0.76:0.67:0.60:0.52:0.59:0.43:0.62:0.36:0.57:0.33:0.64:0.19"] = 470, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Windrunner's Overlook, K3, Frosthold, Ulduar + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.41:0.43"] = 391, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Landing Camp + ["0.88:0.72:0.76:0.67:0.60:0.52:0.69:0.42"] = 303, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Light's Breach + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 513, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 516, -- Port-Valgarde, Donjon de la Garde de l'ouest, Donjon de Garde-hiver, Repos des étoiles, Piste d'atterrissage de Spumelevier, Le Cœur du fleuve + ["0.88:0.72:0.88:0.60:0.73:0.54"] = 167, -- Valgarde Port, Fort Wildervar, Amberpine Lodge + ["0.88:0.72:0.76:0.67:0.60:0.52:0.59:0.43"] = 285, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Windrunner's Overlook + ["0.88:0.72:0.74:0.71:0.49:0.58:0.60:0.52"] = 375, -- Hafen von Valgarde, Kamagua, Moa'ki, Feste Wintergarde + ["0.88:0.72:0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 364, -- Port-Valgarde, Fort Hardivar, Gîte Ambrepin, La Brèche de Lumière, Guet d'Ébène, Dalaran, Cime des Croisés + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 530, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.88:0.72:0.88:0.60:0.83:0.46:0.78:0.38:0.72:0.29"] = 325, -- Valgarde Port, Fort Wildervar, Westfall Brigade, Zim'Torga, Dun Nifflelem + ["0.88:0.72:0.74:0.71:0.49:0.58:0.42:0.53"] = 344, -- Hafen von Valgarde, Kamagua, Moa'ki, Sternenruh + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 518, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 337, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.88:0.72:0.76:0.67:0.60:0.52:0.46:0.46:0.41:0.43:0.24:0.40"] = 506, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, River's Heart + ["0.88:0.72:0.88:0.60:0.83:0.46:0.78:0.38:0.64:0.19"] = 394, -- Port-Valgarde, Fort Hardivar, Brigade de la marche de l'Ouest, Zim'Torga, Ulduar + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 610, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.88:0.72:0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36"] = 311, -- Valgarde Port, Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, K3 + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40"] = 253, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.29:0.57"] = 425, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.88:0.72:0.76:0.67:0.60:0.52:0.64:0.42:0.52:0.38"] = 345, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Ebon Watch, Dalaran + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 396, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 429, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Ulduar + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 347, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 483, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.88:0.72:0.74:0.71:0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 549, -- Valgarde Port, Kamagua, Moa'ki, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.88:0.72:0.76:0.67:0.60:0.52:0.64:0.42:0.52:0.38:0.24:0.40"] = 543, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Ebon Watch, Dalaran, River's Heart + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 342, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.88:0.72:0.76:0.67:0.60:0.52:0.59:0.43:0.62:0.36"] = 330, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Windrunner's Overlook, K3 + ["0.88:0.72:0.88:0.60:0.83:0.46:0.72:0.40:0.64:0.42:0.52:0.38"] = 368, -- Valgarde Port, Fort Wildervar, Westfall Brigade, The Argent Stand, Ebon Watch, Dalaran + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 508, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 378, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 446, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Ulduar + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 553, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.88:0.72:0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53"] = 543, -- Valgarde Port, Kamagua, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 464, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.88:0.72:0.76:0.67:0.60:0.52:0.64:0.42"] = 278, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Ebon Watch + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21:0.38:0.21"] = 509, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge, The Shadow Vault + ["0.88:0.72:0.76:0.67:0.60:0.52:0.64:0.42:0.62:0.36"] = 318, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Ebon Watch, K3 + ["0.88:0.72:0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38:0.56:0.36"] = 382, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.88:0.72:0.74:0.71:0.49:0.58:0.54:0.52"] = 338, -- Valgarde Port, Kamagua, Moa'ki, Wyrmrest Temple + ["0.88:0.72:0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38:0.62:0.36"] = 405, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Wyrmrest Temple, Dalaran, K3 + ["0.88:0.72:0.76:0.67:0.60:0.52:0.64:0.42:0.72:0.40"] = 342, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Ebon Watch, The Argent Stand + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 375, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.88:0.72:0.76:0.67:0.60:0.52:0.42:0.53:0.41:0.43:0.52:0.38"] = 482, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Landing Camp, Dalaran + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 428, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.88:0.72:0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 451, -- Valgarde Port, Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.88:0.72:0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38:0.41:0.43"] = 434, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran, Valiance Landing Camp + ["0.88:0.72:0.76:0.67:0.60:0.52:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 458, -- Valgarde Port, Westguard Keep, Wintergarde Keep, Ebon Watch, K3, Frosthold, Ulduar + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 549, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.88:0.72:0.76:0.67:0.60:0.52:0.49:0.58:0.52:0.38"] = 434, -- Port-Valgarde, Donjon de la Garde de l'ouest, Donjon de Garde-hiver, Moa'ki, Dalaran + ["0.88:0.72:0.88:0.60:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 338, -- Valgarde Port, Fort Wildervar, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38"] = 293, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 658, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.88:0.72:0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.46:0.46"] = 359, -- Valgarde Port, Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Fordragon Hold + + -- Alliance: Howling Fjord: Westguard Keep + ["0.76:0.67:0.74:0.71"] = 52, -- Westguard Keep, Kamagua + ["0.76:0.67:0.88:0.72"] = 70, -- Westguard Keep, Valgarde Port + ["0.76:0.67:0.88:0.60"] = 86, -- Westguard Keep, Fort Wildervar + ["0.76:0.67:0.73:0.54"] = 77, -- Westguard Keep, Amberpine Lodge + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 248, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36"] = 222, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3 + ["0.76:0.67:0.60:0.52:0.42:0.53:0.29:0.57"] = 357, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.76:0.67:0.60:0.52:0.42:0.53"] = 260, -- Westguard Keep, Wintergarde Keep, Stars' Rest + ["0.76:0.67:0.73:0.54:0.83:0.46"] = 160, -- Westguard Keep, Amberpine Lodge, Westfall Brigade + ["0.76:0.67:0.60:0.52"] = 152, -- Westguard Keep, Wintergarde Keep + ["0.76:0.67:0.60:0.52:0.54:0.52"] = 200, -- Westguard Keep, Wintergarde Keep, Wyrmrest Temple + ["0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40"] = 186, -- Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand + ["0.76:0.67:0.73:0.54:0.69:0.42"] = 143, -- Westguard Keep, Amberpine Lodge, Light's Breach + ["0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38"] = 226, -- Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42"] = 182, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch + ["0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61"] = 387, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 429, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 465, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49"] = 385, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.76:0.67:0.60:0.52:0.46:0.46:0.41:0.43:0.24:0.40"] = 437, -- Westguard Keep, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, River's Heart + ["0.76:0.67:0.74:0.71:0.49:0.58:0.29:0.57"] = 377, -- Westguard Keep, Kamagua, Moa'ki, Unu'pe + ["0.76:0.67:0.74:0.71:0.49:0.58"] = 246, -- Westguard Keep, Kamagua, Moa'ki + ["0.76:0.67:0.60:0.52:0.49:0.58:0.29:0.57"] = 375, -- Westguard Keep, Wintergarde Keep, Moa'ki, Unu'pe + ["0.76:0.67:0.74:0.71:0.49:0.58:0.52:0.38"] = 368, -- Westguard Keep, Kamagua, Moa'ki, Dalaran + ["0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38"] = 292, -- Westwacht, Feste Wintergarde, Wyrmruhtempel, Dalaran + ["0.76:0.67:0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53:0.12:0.53"] = 535, -- Westguard Keep, Kamagua, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge, Transitus Shield + ["0.76:0.67:0.74:0.71:0.49:0.58:0.42:0.53"] = 300, -- Westguard Keep, Kamagua, Moa'ki, Stars' Rest + ["0.76:0.67:0.74:0.71:0.49:0.58:0.42:0.53:0.22:0.61"] = 428, -- Westguard Keep, Kamagua, Moa'ki, Stars' Rest, Valiance Keep + ["0.76:0.67:0.60:0.52:0.49:0.58"] = 244, -- Westguard Keep, Wintergarde Keep, Moa'ki + ["0.76:0.67:0.60:0.52:0.46:0.46"] = 242, -- Westguard Keep, Wintergarde Keep, Fordragon Hold + ["0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 311, -- Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.76:0.67:0.60:0.52:0.64:0.42:0.52:0.38"] = 276, -- Westguard Keep, Wintergarde Keep, Ebon Watch, Dalaran + ["0.76:0.67:0.74:0.71:0.49:0.58:0.29:0.57:0.21:0.49"] = 456, -- Westguard Keep, Kamagua, Moa'ki, Unu'pe, Fizzcrank Airstrip + ["0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38"] = 264, -- Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.76:0.67:0.74:0.71:0.49:0.58:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 525, -- Westguard Keep, Kamagua, Moa'ki, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.76:0.67:0.60:0.52:0.46:0.46:0.52:0.38"] = 307, -- Westguard Keep, Wintergarde Keep, Fordragon Hold, Dalaran + ["0.76:0.67:0.60:0.52:0.49:0.58:0.52:0.38"] = 366, -- Westguard Keep, Wintergarde Keep, Moa'ki, Dalaran + ["0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 448, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.76:0.67:0.60:0.52:0.69:0.42"] = 235, -- Westwacht, Feste Wintergarde, Lichtbresche + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 269, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.76:0.67:0.60:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 461, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 279, -- Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.76:0.67:0.74:0.71:0.49:0.58:0.29:0.57:0.22:0.61"] = 437, -- Westguard Keep, Kamagua, Moa'ki, Unu'pe, Valiance Keep + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 362, -- Westwacht, Ammertannhütte, Lichtbresche, Schwarze Wacht, K3, Eisfestung, Ulduar + ["0.76:0.67:0.60:0.52:0.46:0.46:0.41:0.43:0.28:0.28"] = 467, -- Westguard Keep, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, Death's Rise + ["0.76:0.67:0.74:0.71:0.49:0.58:0.42:0.53:0.21:0.49:0.17:0.53"] = 469, -- Westguard Keep, Kamagua, Moa'ki, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33"] = 264, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold + ["0.76:0.67:0.73:0.54:0.83:0.46:0.78:0.38:0.72:0.29"] = 317, -- Westguard Keep, Amberpine Lodge, Westfall Brigade, Zim'Torga, Dun Nifflelem + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.59:0.43"] = 215, -- Westwacht, Ammertannhütte, Lichtbresche, Schwarze Wacht, Windläufers Warte + ["0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38:0.56:0.36"] = 285, -- Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran, The Argent Vanguard + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 274, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.76:0.67:0.88:0.60:0.83:0.46"] = 183, -- Westguard Keep, Fort Wildervar, Westfall Brigade + ["0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 417, -- Westguard Keep, Wintergarde Keep, Wyrmrest Temple, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 446, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 397, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 416, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.76:0.67:0.60:0.52:0.46:0.46:0.41:0.43"] = 302, -- Westguard Keep, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.76:0.67:0.60:0.52:0.54:0.52:0.52:0.38:0.52:0.34"] = 320, -- Westguard Keep, Wintergarde Keep, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle + ["0.76:0.67:0.60:0.52:0.64:0.42:0.62:0.36:0.72:0.29"] = 349, -- Westguard Keep, Wintergarde Keep, Ebon Watch, K3, Dun Nifflelem + ["0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 485, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.76:0.67:0.73:0.54:0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 379, -- Westguard Keep, Amberpine Lodge, Light's Breach, The Argent Stand, Zim'Torga, Ulduar + ["0.76:0.67:0.74:0.71:0.49:0.58:0.54:0.52"] = 294, -- Westguard Keep, Kamagua, Moa'ki, Wyrmrest Temple + ["0.76:0.67:0.60:0.52:0.59:0.43"] = 217, -- Westwacht, Feste Wintergarde, Windläufers Warte + ["0.76:0.67:0.60:0.52:0.42:0.53:0.41:0.43"] = 323, -- Westguard Keep, Wintergarde Keep, Stars' Rest, Valiance Landing Camp + ["0.76:0.67:0.74:0.71:0.49:0.58:0.52:0.38:0.62:0.36"] = 411, -- Westguard Keep, Kamagua, Moa'ki, Dalaran, K3 + ["0.76:0.67:0.74:0.71:0.49:0.58:0.29:0.57:0.21:0.49:0.17:0.53:0.12:0.53"] = 536, -- Westguard Keep, Kamagua, Moa'ki, Unu'pe, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.76:0.67:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 449, -- Donjon de la Garde de l'ouest, Donjon de Garde-hiver, Repos des étoiles, Donjon de la Bravoure, Escarpement d'Ambre + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 308, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 329, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 361, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38:0.52:0.34:0.38:0.21"] = 413, -- Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.76:0.67:0.60:0.52:0.64:0.42:0.62:0.36"] = 249, -- Westguard Keep, Wintergarde Keep, Ebon Watch, K3 + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.62:0.36:0.72:0.29"] = 322, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, K3, Dun Nifflelem + ["0.76:0.67:0.60:0.52:0.59:0.43:0.52:0.38:0.49:0.21"] = 377, -- Westguard Keep, Wintergarde Keep, Windrunner's Overlook, Dalaran, Argent Tournament Grounds + ["0.76:0.67:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 441, -- Westguard Keep, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + + ---------------------------------------------------------------------- + -- Alliance: Icecrown + ---------------------------------------------------------------------- + + -- Alliance: Icecrown: Argent Tournament Grounds + ["0.49:0.21:0.52:0.34:0.41:0.43"] = 179, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp + ["0.49:0.21:0.52:0.38"] = 141, -- Argent Tournament Grounds, Dalaran + ["0.49:0.21:0.52:0.34"] = 73, -- Argent Tournament Grounds, Crusaders' Pinnacle + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.83:0.46"] = 304, -- Argentumturnierplatz, Bergfels' Zuflucht, Ulduar, Zim'Torga, Westfallbrigade + ["0.49:0.21:0.38:0.21"] = 88, -- Argent Tournament Grounds, The Shadow Vault + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43"] = 178, -- Argentumturnierplatz, Kreuzfahrerturm, Die Argentumvorhut, Dalaran, Windläufers Warte + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 323, -- Argentumturnierplatz, Kreuzfahrerturm, Die Argentumvorhut, Dalaran, Windläufers Warte, Feste Wintergarde, Ammertannhütte + ["0.49:0.21:0.52:0.34:0.56:0.36"] = 106, -- Argentumturnierplatz, Kreuzfahrerturm, Die Argentumvorhut + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42"] = 266, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Light's Breach + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42"] = 203, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch + ["0.49:0.21:0.57:0.21"] = 51, -- Argent Tournament Grounds, Bouldercrag's Refuge + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 422, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Kamagua + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 441, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.49:0.21:0.28:0.28:0.24:0.40"] = 282, -- Argentumturnierplatz, Todesanhöhe, Flussnabel + ["0.49:0.21:0.57:0.21:0.57:0.33"] = 130, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold + ["0.49:0.21:0.28:0.28"] = 166, -- Argent Tournament Grounds, Death's Rise + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54"] = 330, -- Argentumturnierplatz, Kreuzfahrerturm, Die Argentumvorhut, Dalaran, Schwarze Wacht, Lichtbresche, Ammertannhütte + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54"] = 349, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.49:0.21:0.57:0.21:0.64:0.19"] = 96, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar + ["0.49:0.21:0.28:0.28:0.24:0.40:0.21:0.49"] = 343, -- Argent Tournament Grounds, Death's Rise, River's Heart, Fizzcrank Airstrip + ["0.49:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53"] = 387, -- Argent Tournament Grounds, Death's Rise, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.49:0.21:0.57:0.21:0.57:0.33:0.56:0.36"] = 163, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, The Argent Vanguard + ["0.49:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 423, -- Argent Tournament Grounds, Death's Rise, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.49:0.21:0.28:0.28:0.18:0.40"] = 283, -- Argent Tournament Grounds, Death's Rise, Nesingwary Base Camp + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 247, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67"] = 372, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.83:0.46:0.88:0.60"] = 389, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga, Westfall Brigade, Fort Wildervar + ["0.49:0.21:0.57:0.21:0.64:0.19:0.72:0.29"] = 199, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Dun Nifflelem + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.54:0.52"] = 246, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.49:0.21:0.52:0.34:0.41:0.43:0.42:0.53"] = 259, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36:0.72:0.29"] = 278, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3, Dun Nifflelem + ["0.49:0.21:0.52:0.38:0.24:0.40"] = 340, -- Argentumturnierplatz, Dalaran, Flussnabel + ["0.49:0.21:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 340, -- Argentumturnierplatz, Dalaran, Schwarze Wacht, Argentumwache, Westfallbrigade + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60:0.88:0.72"] = 495, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.83:0.46:0.88:0.60:0.88:0.72"] = 463, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.82:0.31"] = 302, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga, Gundrak + ["0.49:0.21:0.52:0.38:0.46:0.46"] = 228, -- Argent Tournament Grounds, Dalaran, Fordragon Hold + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36"] = 178, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3 + ["0.49:0.21:0.52:0.34:0.41:0.43:0.42:0.53:0.29:0.57"] = 357, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest, Unu'pe + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.49:0.58"] = 285, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Moa'ki + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 395, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Unu'pe + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38"] = 249, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 266, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52"] = 264, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep + ["0.49:0.21:0.52:0.34:0.41:0.43:0.42:0.53:0.22:0.61"] = 390, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest, Valiance Keep + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67"] = 383, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 433, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.49:0.21:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 507, -- Argent Tournament Grounds, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.49:0.21:0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 398, -- Argent Tournament Grounds, Dalaran, Fordragon Hold, Stars' Rest, Unu'pe + ["0.49:0.21:0.52:0.34:0.41:0.43:0.46:0.46"] = 228, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, Fordragon Hold + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40"] = 285, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, The Argent Stand + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52"] = 252, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.49:0.21:0.52:0.38:0.59:0.43"] = 180, -- Argent Tournament Grounds, Dalaran, Windrunner's Overlook + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40:0.83:0.46"] = 355, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.49:0.21:0.52:0.34:0.41:0.43:0.24:0.40"] = 316, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, River's Heart + ["0.49:0.21:0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.72"] = 486, -- Argent Tournament Grounds, Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 336, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.49:0.21:0.52:0.34:0.56:0.36:0.57:0.33:0.64:0.19"] = 242, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Frosthold, Ulduar + ["0.49:0.21:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 326, -- Argent Tournament Grounds, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.49:0.21:0.52:0.38:0.56:0.36:0.57:0.33"] = 200, -- Argentumturnierplatz, Dalaran, Die Argentumvorhut, Eisfestung + ["0.49:0.21:0.41:0.43:0.42:0.53:0.29:0.57"] = 406, -- Argent Tournament Grounds, Valiance Landing Camp, Stars' Rest, Unu'pe + ["0.49:0.21:0.52:0.38:0.46:0.46:0.42:0.53"] = 302, -- Argent Tournament Grounds, Dalaran, Fordragon Hold, Stars' Rest + ["0.49:0.21:0.52:0.38:0.59:0.43:0.60:0.52"] = 255, -- Argent Tournament Grounds, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 281, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40"] = 336, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, River's Heart + ["0.49:0.21:0.52:0.38:0.41:0.43"] = 241, -- Argent Tournament Grounds, Dalaran, Valiance Landing Camp + ["0.49:0.21:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 425, -- Argent Tournament Grounds, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.49:0.21:0.52:0.38:0.49:0.58"] = 288, -- Argentumturnierplatz, Dalaran, Moa'ki + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53"] = 298, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest + ["0.49:0.21:0.52:0.34:0.41:0.43:0.24:0.40:0.18:0.40"] = 350, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, River's Heart, Nesingwary Base Camp + ["0.49:0.21:0.52:0.38:0.24:0.40:0.21:0.49"] = 401, -- Argent Tournament Grounds, Dalaran, River's Heart, Fizzcrank Airstrip + ["0.49:0.21:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53"] = 445, -- Argent Tournament Grounds, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.49:0.21:0.41:0.43"] = 228, -- Argent Tournament Grounds, Valiance Landing Camp + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46"] = 225, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52"] = 282, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wintergarde Keep + ["0.49:0.21:0.52:0.38:0.56:0.36"] = 162, -- Argent Tournament Grounds, Dalaran, The Argent Vanguard + ["0.49:0.21:0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 369, -- Argent Tournament Grounds, Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.49:0.21:0.41:0.43:0.42:0.53"] = 308, -- Argent Tournament Grounds, Valiance Landing Camp, Stars' Rest + ["0.49:0.21:0.52:0.38:0.64:0.42:0.69:0.42"] = 250, -- Argent Tournament Grounds, Dalaran, Ebon Watch, Light's Breach + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 422, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.49:0.21:0.52:0.38:0.54:0.52:0.42:0.53"] = 316, -- Argent Tournament Grounds, Dalaran, Wyrmrest Temple, Stars' Rest + ["0.49:0.21:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 429, -- Argent Tournament Grounds, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 307, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.83:0.46"] = 403, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.49:0.21:0.52:0.34:0.41:0.43:0.24:0.40:0.21:0.49"] = 377, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, River's Heart, Fizzcrank Airstrip + ["0.49:0.21:0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42"] = 222, -- Argent Tournament Grounds, Bouldercrag's Refuge, Frosthold, K3, Ebon Watch + ["0.49:0.21:0.52:0.34:0.41:0.43:0.24:0.40:0.21:0.49:0.17:0.53"] = 420, -- Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.49:0.21:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67"] = 376, -- Argent Tournament Grounds, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.49:0.21:0.52:0.38:0.41:0.43:0.28:0.28"] = 407, -- Argent Tournament Grounds, Dalaran, Valiance Landing Camp, Death's Rise + ["0.49:0.21:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 425, -- Argent Tournament Grounds, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Kamagua + ["0.49:0.21:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 444, -- Argent Tournament Grounds, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.49:0.21:0.52:0.38:0.54:0.52"] = 250, -- Argent Tournament Grounds, Dalaran, Wyrmrest Temple + ["0.49:0.21:0.52:0.38:0.24:0.40:0.18:0.40"] = 374, -- Argent Tournament Grounds, Dalaran, River's Heart, Nesingwary Base Camp + ["0.49:0.21:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 481, -- Argent Tournament Grounds, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 478, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.49:0.21:0.52:0.38:0.62:0.36:0.72:0.29"] = 285, -- Argent Tournament Grounds, Dalaran, K3, Dun Nifflelem + ["0.49:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.29:0.57"] = 407, -- Argent Tournament Grounds, Death's Rise, River's Heart, Fizzcrank Airstrip, Unu'pe + ["0.49:0.21:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53"] = 491, -- Argent Tournament Grounds, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge + ["0.49:0.21:0.52:0.38:0.64:0.42:0.60:0.52:0.73:0.54:0.83:0.46"] = 418, -- Argent Tournament Grounds, Dalaran, Ebon Watch, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + + -- Alliance: Icecrown: Crusaders' Pinnacle + ["0.52:0.34:0.56:0.36:0.52:0.38:0.54:0.52"] = 174, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.52:0.34:0.56:0.36"] = 33, -- Crusaders' Pinnacle, The Argent Vanguard + ["0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 208, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.52:0.34:0.56:0.36:0.57:0.33"] = 72, -- Crusaders' Pinnacle, The Argent Vanguard, Frosthold + ["0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40"] = 264, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, River's Heart + ["0.52:0.34:0.52:0.38:0.54:0.52"] = 182, -- Crusaders' Pinnacle, Dalaran, Wyrmrest Temple + ["0.52:0.34:0.56:0.36:0.57:0.33:0.64:0.19"] = 169, -- Crusaders' Pinnacle, The Argent Vanguard, Frosthold, Ulduar + ["0.52:0.34:0.28:0.28"] = 168, -- Crusaders' Pinnacle, Death's Rise + ["0.52:0.34:0.52:0.38"] = 71, -- Kreuzfahrerturm, Dalaran + ["0.52:0.34:0.56:0.36:0.57:0.33:0.57:0.21"] = 137, -- Crusaders' Pinnacle, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 380, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54"] = 258, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.52:0.34:0.56:0.36:0.52:0.38:0.49:0.58"] = 212, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Moa'ki + ["0.52:0.34:0.41:0.43"] = 107, -- Crusaders' Pinnacle, Valiance Landing Camp + ["0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53"] = 226, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest + ["0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46"] = 152, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 174, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 287, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 431, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67"] = 300, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.52:0.34:0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53:0.22:0.61"] = 366, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52"] = 179, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36"] = 108, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3 + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 193, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.52:0.34:0.52:0.38:0.62:0.36:0.72:0.29"] = 216, -- 十字軍之巔,寒冰皇冠, 達拉然, K3,風暴群山, 丹尼弗蘭,風暴群山 + ["0.52:0.34:0.38:0.21"] = 124, -- Kreuzfahrerturm, Das Schattengewölbe + ["0.52:0.34:0.41:0.43:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 394, -- Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.34:0.41:0.43:0.42:0.53:0.29:0.57"] = 285, -- Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest, Unu'pe + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52"] = 191, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep + ["0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 250, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.52:0.34:0.41:0.43:0.42:0.53:0.22:0.61"] = 317, -- Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest, Valiance Keep + ["0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49"] = 326, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip + ["0.52:0.34:0.41:0.43:0.24:0.40"] = 243, -- Crusaders' Pinnacle, Valiance Landing Camp, River's Heart + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 234, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 349, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Kamagua + ["0.52:0.34:0.41:0.43:0.42:0.53:0.21:0.49"] = 314, -- Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip + ["0.52:0.34:0.41:0.43:0.42:0.53"] = 187, -- Crusaders' Pinnacle, Valiance Landing Camp, Stars' Rest + ["0.52:0.34:0.41:0.43:0.24:0.40:0.21:0.49"] = 304, -- Crusaders' Pinnacle, Valiance Landing Camp, River's Heart, Fizzcrank Airstrip + ["0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 354, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.52:0.34:0.41:0.43:0.24:0.40:0.18:0.40"] = 277, -- Kreuzfahrerturm, Valianzlager, Flussnabel, Nesingwarys Basislager + ["0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 405, -- Kreuzfahrerturm, Die Argentumvorhut, Dalaran, Flussnabel, Landebahn Kurbelzisch, Bernsteinflöz, Transitusschild + ["0.52:0.34:0.41:0.43:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 384, -- Crusaders' Pinnacle, Valiance Landing Camp, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 264, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42"] = 130, -- Вершина Рыцарей, Оплот Серебряного Авангарда, Даларан, Черная застава + ["0.52:0.34:0.41:0.43:0.24:0.40:0.21:0.49:0.17:0.53"] = 347, -- Crusaders' Pinnacle, Valiance Landing Camp, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 368, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43"] = 105, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook + ["0.52:0.34:0.52:0.38:0.59:0.43:0.60:0.52"] = 187, -- Crusaders' Pinnacle, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60"] = 364, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.52:0.34:0.41:0.43:0.46:0.46"] = 155, -- Crusaders' Pinnacle, Valiance Landing Camp, Fordragon Hold + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 349, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 322, -- Kreuzfahrerturm, Die Argentumvorhut, Dalaran, Feste Fordragon, Sternenruh, Unu'pe + ["0.52:0.34:0.49:0.21"] = 97, -- Crusaders' Pinnacle, Argent Tournament Grounds + ["0.52:0.34:0.52:0.38:0.24:0.40"] = 271, -- Crusaders' Pinnacle, Dalaran, River's Heart + ["0.52:0.34:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 272, -- Crusaders' Pinnacle, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.52:0.34:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 258, -- Crusaders' Pinnacle, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + + -- Alliance: Icecrown: Death's Rise + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38"] = 238, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran + ["0.28:0.28:0.41:0.43:0.46:0.46"] = 222, -- Death's Rise, Valiance Landing Camp, Fordragon Hold + ["0.28:0.28:0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67:0.88:0.72"] = 497, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.28:0.28:0.41:0.43"] = 173, -- Death's Rise, Valiance Landing Camp + ["0.28:0.28:0.24:0.40"] = 118, -- Death's Rise, River's Heart + ["0.28:0.28:0.24:0.40:0.21:0.49"] = 178, -- Death's Rise, River's Heart, Fizzcrank Airstrip + ["0.28:0.28:0.41:0.43:0.52:0.38:0.62:0.36"] = 309, -- Death's Rise, Valiance Landing Camp, Dalaran, K3 + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 382, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.28:0.28:0.24:0.40:0.21:0.49:0.42:0.53"] = 310, -- 死亡高崗,寒冰皇冠, 大河之心,休拉薩盆地, 嘶軸簡易機場,北風凍原, 繁星之眠,龍骨荒野 + ["0.28:0.28:0.41:0.43:0.42:0.53:0.54:0.52"] = 341, -- Cime de la Mort, Terrain d'atterrissage de la Bravoure, Repos des étoiles, Temple du Repos du ver + ["0.28:0.28:0.52:0.34:0.56:0.36:0.57:0.33"] = 246, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Frosthold + ["0.28:0.28:0.24:0.40:0.52:0.38"] = 310, -- Death's Rise, River's Heart, Dalaran + ["0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 259, -- Уступ Смерти, Слияние рек, Взлетная полоса Выкрутеня, Янтарная гряда, Маскировочный щит + ["0.28:0.28:0.41:0.43:0.52:0.38:0.56:0.36"] = 286, -- Death's Rise, Valiance Landing Camp, Dalaran, The Argent Vanguard + ["0.28:0.28:0.41:0.43:0.52:0.38"] = 263, -- Death's Rise, Valiance Landing Camp, Dalaran + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36"] = 282, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3 + ["0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53"] = 222, -- Death's Rise, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.28:0.28:0.52:0.34"] = 174, -- Death's Rise, Crusaders' Pinnacle + ["0.28:0.28:0.52:0.34:0.56:0.36"] = 207, -- Todesanhöhe, Kreuzfahrerturm, Die Argentumvorhut + ["0.28:0.28:0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67"] = 428, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Westguard Keep + ["0.28:0.28:0.52:0.34:0.56:0.36:0.57:0.33:0.57:0.21"] = 311, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.28:0.28:0.18:0.40"] = 118, -- Death's Rise, Nesingwary Base Camp + ["0.28:0.28:0.41:0.43:0.46:0.46:0.54:0.52"] = 286, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Wyrmrest Temple + ["0.28:0.28:0.52:0.34:0.56:0.36:0.57:0.33:0.64:0.19"] = 343, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Frosthold, Ulduar + ["0.28:0.28:0.38:0.21"] = 94, -- Death's Rise, The Shadow Vault + ["0.28:0.28:0.24:0.40:0.21:0.49:0.22:0.61"] = 248, -- Death's Rise, River's Heart, Fizzcrank Airstrip, Valiance Keep + ["0.28:0.28:0.57:0.21"] = 215, -- Death's Rise, Bouldercrag's Refuge + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49"] = 525, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 605, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.28:0.28:0.24:0.40:0.21:0.49:0.29:0.57"] = 243, -- Death's Rise, River's Heart, Fizzcrank Airstrip, Unu'pe + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60"] = 538, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.54:0.52"] = 363, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Wyrmrest Temple (StraightEdgeRik reported time may be incorrect) + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.46:0.46"] = 327, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Fordragon Hold + ["0.28:0.28:0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54:0.88:0.60"] = 493, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.28:0.28:0.57:0.21:0.64:0.19:0.72:0.29"] = 363, -- Death's Rise, Bouldercrag's Refuge, Ulduar, Dun Nifflelem + ["0.28:0.28:0.57:0.21:0.64:0.19:0.78:0.38:0.82:0.31"] = 465, -- Death's Rise, Bouldercrag's Refuge, Ulduar, Zim'Torga, Gundrak + ["0.28:0.28:0.41:0.43:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 460, -- Death's Rise, Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.28:0.28:0.57:0.21:0.64:0.19"] = 259, -- Уступ Смерти, Приют Глыбоскала, Ульдуар + ["0.28:0.28:0.41:0.43:0.46:0.46:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 645, -- Todesanhöhe, Valianzlager, Feste Fordragon, Schwarze Wacht, Argentumwache, Zim'Torga, Ulduar, Bergfels' Zuflucht + ["0.28:0.28:0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67:0.74:0.71"] = 478, -- Todesanhöhe, Valianzlager, Feste Fordragon, Feste Wintergarde, Westwacht, Kamagua + ["0.28:0.28:0.56:0.36:0.52:0.38"] = 259, -- Todesanhöhe, Die Argentumvorhut, Dalaran + ["0.28:0.28:0.52:0.34:0.52:0.38"] = 246, -- Death's Rise, Crusaders' Pinnacle, Dalaran + ["0.28:0.28:0.56:0.36"] = 228, -- Death's Rise, The Argent Vanguard + ["0.28:0.28:0.41:0.43:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 389, -- Todesanhöhe, Valianzlager, Dalaran, Die Argentumvorhut, Eisfestung, Bergfels' Zuflucht + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42"] = 304, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch + ["0.28:0.28:0.41:0.43:0.42:0.53:0.21:0.49"] = 380, -- Death's Rise, Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip + ["0.28:0.28:0.57:0.21:0.64:0.19:0.78:0.38"] = 412, -- Death's Rise, Bouldercrag's Refuge, Ulduar, Zim'Torga + ["0.28:0.28:0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54"] = 379, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Amberpine Lodge + ["0.28:0.28:0.41:0.43:0.42:0.53:0.49:0.58"] = 322, -- Death's Rise, Valiance Landing Camp, Stars' Rest, Moa'ki + ["0.28:0.28:0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54:0.83:0.46"] = 459, -- Todesanhöhe, Valianzlager, Feste Fordragon, Feste Wintergarde, Ammertannhütte, Westfallbrigade + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 348, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.28:0.28:0.41:0.43:0.52:0.38:0.56:0.36:0.57:0.33"] = 325, -- Death's Rise, Valiance Landing Camp, Dalaran, The Argent Vanguard, Frosthold + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 438, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.28:0.28:0.41:0.43:0.46:0.46:0.60:0.52"] = 308, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 368, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.28:0.28:0.41:0.43:0.42:0.53"] = 253, -- Death's Rise, Valiance Landing Camp, Stars' Rest + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43"] = 278, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52"] = 353, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.28:0.28:0.41:0.43:0.46:0.46:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 497, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.28:0.28:0.52:0.34:0.52:0.38:0.64:0.42"] = 312, -- Death's Rise, Crusaders' Pinnacle, Dalaran, Ebon Watch + ["0.28:0.28:0.56:0.36:0.52:0.38:0.62:0.36"] = 303, -- Todesanhöhe, Die Argentumvorhut, Dalaran, K3 + ["0.28:0.28:0.41:0.43:0.46:0.46:0.64:0.42:0.72:0.40:0.78:0.38"] = 444, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Ebon Watch, The Argent Stand, Zim'Torga + ["0.28:0.28:0.41:0.43:0.46:0.46:0.64:0.42:0.72:0.40"] = 403, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Ebon Watch, The Argent Stand + ["0.28:0.28:0.41:0.43:0.46:0.46:0.64:0.42:0.69:0.42"] = 384, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Ebon Watch, Light's Breach + ["0.28:0.28:0.41:0.43:0.46:0.46:0.64:0.42"] = 340, -- Death's Rise, Valiance Landing Camp, Fordragon Hold, Ebon Watch + ["0.28:0.28:0.41:0.43:0.52:0.38:0.59:0.43"] = 305, -- Death's Rise, Valiance Landing Camp, Dalaran, Windrunner's Overlook + ["0.28:0.28:0.41:0.43:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 421, -- Death's Rise, Valiance Landing Camp, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.28:0.28:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 481, -- Death's Rise, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.28:0.28:0.49:0.21"] = 170, -- Death's Rise, Argent Tournament Grounds + ["0.28:0.28:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 445, -- Death's Rise, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.28:0.28:0.52:0.34:0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 474, -- Death's Rise, Crusaders' Pinnacle, Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.28:0.28:0.24:0.40:0.52:0.38:0.62:0.36"] = 355, -- Death's Rise, River's Heart, Dalaran, K3 + ["0.28:0.28:0.56:0.36:0.57:0.33"] = 267, -- Death's Rise, The Argent Vanguard, Frosthold + ["0.28:0.28:0.56:0.36:0.52:0.38:0.59:0.43"] = 299, -- Death's Rise, The Argent Vanguard, Dalaran, Windrunner's Overlook + ["0.28:0.28:0.49:0.21:0.52:0.38"] = 306, -- Death's Rise, Argent Tournament Grounds, Dalaran + ["0.28:0.28:0.24:0.40:0.21:0.49:0.29:0.57:0.49:0.58"] = 360, -- Death's Rise, River's Heart, Fizzcrank Airstrip, Unu'pe, Moa'ki + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67"] = 474, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + + -- Alliance: Icecrown: The Argent Vanguard + ["0.56:0.36:0.57:0.33"] = 40, -- The Argent Vanguard, Frosthold + ["0.56:0.36:0.52:0.38"] = 33, -- The Argent Vanguard, Dalaran + ["0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52"] = 148, -- The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.56:0.36:0.52:0.38:0.24:0.40"] = 232, -- The Argent Vanguard, Dalaran, River's Heart + ["0.56:0.36:0.52:0.38:0.62:0.36"] = 77, -- The Argent Vanguard, Dalaran, K3 + ["0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49"] = 294, -- The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 162, -- The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.56:0.36:0.52:0.38:0.54:0.52"] = 142, -- The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.56:0.36:0.52:0.38:0.46:0.46:0.60:0.52:0.73:0.54"] = 278, -- The Argent Vanguard, Dalaran, Fordragon Hold, Wintergarde Keep, Amberpine Lodge + ["0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49"] = 320, -- The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip + ["0.56:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 261, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53"] = 208, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest + ["0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 329, -- The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.56:0.36:0.52:0.38:0.64:0.42"] = 98, -- 은빛십자군 선봉기지 (얼음왕관), 달라란, 칠흑의 감시초소 (줄드락), 칠흑의 감시초소 (줄드락) + ["0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 321, -- The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 348, -- The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 177, -- The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.56:0.36:0.52:0.34:0.28:0.28"] = 195, -- The Argent Vanguard, Crusaders' Pinnacle, Death's Rise + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 142, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 255, -- Die Argentumvorhut, Dalaran, Schwarze Wacht, Argentumwache, Zim'Torga, Gundrak + ["0.56:0.36:0.57:0.33:0.64:0.19"] = 138, -- The Argent Vanguard, Frosthold, Ulduar + ["0.56:0.36:0.52:0.38:0.24:0.40:0.28:0.28"] = 317, -- The Argent Vanguard, Dalaran, River's Heart, Death's Rise + ["0.56:0.36:0.52:0.38:0.46:0.46"] = 121, -- The Argent Vanguard, Dalaran, Fordragon Hold + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 202, -- Die Argentumvorhut, Dalaran, Schwarze Wacht, Argentumwache, Zim'Torga + ["0.56:0.36:0.57:0.33:0.57:0.21"] = 105, -- The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 373, -- Оплот Серебряного Авангарда, Даларан, Слияние рек, Взлетная полоса Выкрутеня, Янтарная гряда, Маскировочный щит + ["0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53"] = 363, -- The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.56:0.36:0.52:0.34"] = 28, -- Die Argentumvorhut, Kreuzfahrerturm + ["0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53"] = 194, -- The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest + ["0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67"] = 268, -- The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.56:0.36:0.52:0.38:0.49:0.58:0.42:0.53:0.22:0.61"] = 361, -- The Argent Vanguard, Dalaran, Moa'ki, Stars' Rest, Valiance Keep + ["0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67"] = 279, -- The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.56:0.36:0.52:0.34:0.41:0.43"] = 134, -- The Argent Vanguard, Crusaders' Pinnacle, Valiance Landing Camp + ["0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 431, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.56:0.36:0.52:0.38:0.41:0.43:0.28:0.28"] = 300, -- The Argent Vanguard, Dalaran, Valiance Landing Camp, Death's Rise + ["0.56:0.36:0.52:0.38:0.49:0.58"] = 180, -- Die Argentumvorhut, Dalaran, Moa'ki + ["0.56:0.36:0.52:0.38:0.59:0.43"] = 73, -- The Argent Vanguard, Dalaran, Windrunner's Overlook + ["0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 337, -- Die Argentumvorhut, Dalaran, Windläufers Warte, Feste Wintergarde, Westwacht, Hafen von Valgarde + ["0.56:0.36:0.38:0.21"] = 148, -- The Argent Vanguard, The Shadow Vault + ["0.56:0.36:0.52:0.38:0.41:0.43"] = 134, -- The Argent Vanguard, Dalaran, Valiance Landing Camp + ["0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 399, -- The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.56:0.36:0.28:0.28"] = 225, -- The Argent Vanguard, Death's Rise + ["0.56:0.36:0.52:0.38:0.49:0.58:0.42:0.53:0.22:0.61:0.17:0.53"] = 422, -- Die Argentumvorhut, Dalaran, Moa'ki, Sternenruh, Valianzfeste, Bernsteinflöz + ["0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53:0.29:0.57"] = 303, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53"] = 337, -- The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52"] = 159, -- Die Argentumvorhut, Dalaran, Schwarze Wacht, Feste Wintergarde + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 287, -- The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.56:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.69:0.42"] = 273, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Wintergarde Keep, Light's Breach + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54"] = 226, -- Оплот Серебряного Авангарда, Даларан, Черная застава, Разлом Света, Приют Янтарной Сосны + ["0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 318, -- The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Kamagua + ["0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 219, -- The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 420, -- The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 291, -- The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Unu'pe + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 317, -- The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54:0.88:0.60"] = 342, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.56:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 267, -- The Argent Vanguard, Dalaran, River's Heart, Nesingwary Base Camp + ["0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60"] = 332, -- The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53:0.21:0.49"] = 332, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.56:0.36:0.52:0.34:0.49:0.21"] = 124, -- Die Argentumvorhut, Kreuzfahrerturm, Argentumturnierplatz + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 232, -- The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.56:0.36:0.52:0.38:0.49:0.21"] = 146, -- The Argent Vanguard, Dalaran, Argent Tournament Grounds + ["0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38:0.83:0.46"] = 321, -- The Argent Vanguard, Dalaran, K3, Dun Nifflelem, Zim'Torga, Westfall Brigade + ["0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.83:0.46"] = 299, -- The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.56:0.36:0.52:0.38:0.49:0.21:0.57:0.21"] = 194, -- The Argent Vanguard, Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge + + -- Alliance: Icecrown: The Shadow Vault + ["0.38:0.21:0.52:0.38"] = 166, -- The Shadow Vault, Dalaran (Jay Anderson and Владимир Зорг reported 231, Brenda Adams, Eduard Wollbaum and yannick@reutershahn.com reported 214, Terry Fear, Frank Thrasaric, Michael Ulvær, Brenda Adams, Thomas Burns, Jamie Erving, Alexander Götz, Mava, trash can, Brenda Adams again and Jeff S Higgins repored 191 while Brenda Adams, Steven Bannister, Darrin Pearson, Toby Harris, James Rhee and Leatrix reported 166) + ["0.38:0.21:0.46:0.46:0.60:0.52"] = 277, -- The Shadow Vault, Fordragon Hold, Wintergarde Keep + ["0.38:0.21:0.52:0.38:0.64:0.42:0.72:0.40"] = 295, -- Das Schattengewölbe, Dalaran, Schwarze Wacht, Argentumwache + ["0.38:0.21:0.28:0.28"] = 78, -- The Shadow Vault, Death's Rise + ["0.38:0.21:0.64:0.19:0.78:0.38"] = 319, -- Das Schattengewölbe, Ulduar, Zim'Torga + ["0.38:0.21:0.41:0.43"] = 141, -- The Shadow Vault, Valiance Landing Camp + ["0.38:0.21:0.52:0.38:0.62:0.36:0.72:0.29"] = 311, -- The Shadow Vault, Dalaran, K3, Dun Nifflelem (Barbara Dominguez and Robin Nyzell reported 311, was 336) + ["0.38:0.21:0.46:0.46:0.60:0.52:0.76:0.67:0.88:0.72"] = 465, -- The Shadow Vault, Fordragon Hold, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.38:0.21:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 335, -- The Shadow Vault, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.38:0.21:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 456, -- The Shadow Vault, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.38:0.21:0.52:0.34"] = 121, -- The Shadow Vault, Crusaders' Pinnacle + ["0.38:0.21:0.57:0.21"] = 122, -- The Shadow Vault, Bouldercrag's Refuge + ["0.38:0.21:0.64:0.19:0.72:0.29"] = 270, -- The Shadow Vault, Ulduar, Dun Nifflelem + ["0.38:0.21:0.42:0.53:0.49:0.58"] = 290, -- The Shadow Vault, Stars' Rest, Moa'ki + ["0.38:0.21:0.24:0.40"] = 194, -- The Shadow Vault, River's Heart + ["0.38:0.21:0.57:0.33"] = 174, -- The Shadow Vault, Frosthold + ["0.38:0.21:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 507, -- The Shadow Vault, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.38:0.21:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60"] = 466, -- The Shadow Vault, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.38:0.21:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 533, -- The Shadow Vault, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.38:0.21:0.52:0.38:0.24:0.40"] = 366, -- The Shadow Vault, Dalaran, River's Heart + ["0.38:0.21:0.18:0.40"] = 196, -- Das Schattengewölbe, Nesingwarys Basislager + ["0.38:0.21:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 428, -- The Shadow Vault, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.38:0.21:0.64:0.19"] = 167, -- Das Schattengewölbe, Ulduar + ["0.38:0.21:0.46:0.46:0.54:0.52"] = 255, -- Das Schattengewölbe, Feste Fordragon, Wyrmruhtempel + ["0.38:0.21:0.64:0.19:0.78:0.38:0.82:0.31"] = 373, -- The Shadow Vault, Ulduar, Zim'Torga, Gundrak + ["0.38:0.21:0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54"] = 359, -- The Shadow Vault, Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.38:0.21:0.24:0.40:0.21:0.49"] = 256, -- The Shadow Vault, River's Heart, Fizzcrank Airstrip + ["0.38:0.21:0.24:0.40:0.21:0.49:0.17:0.53"] = 299, -- The Shadow Vault, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.38:0.21:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 389, -- The Shadow Vault, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.38:0.21:0.52:0.38:0.59:0.43:0.60:0.52"] = 281, -- The Shadow Vault, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.38:0.21:0.52:0.38:0.46:0.46"] = 254, -- The Shadow Vault, Dalaran, Fordragon Hold + ["0.38:0.21:0.52:0.38:0.62:0.36"] = 210, -- The Shadow Vault, Dalaran, K3 + ["0.38:0.21:0.52:0.38:0.54:0.52"] = 276, -- The Shadow Vault, Dalaran, Wyrmrest Temple + ["0.38:0.21:0.56:0.36"] = 135, -- The Shadow Vault, The Argent Vanguard + ["0.38:0.21:0.46:0.46:0.60:0.52:0.73:0.54"] = 347, -- The Shadow Vault, Fordragon Hold, Wintergarde Keep, Amberpine Lodge + ["0.38:0.21:0.64:0.19:0.78:0.38:0.83:0.46:0.88:0.60"] = 460, -- The Shadow Vault, Ulduar, Zim'Torga, Westfall Brigade, Fort Wildervar + ["0.38:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67"] = 473, -- The Shadow Vault, Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.38:0.21:0.52:0.38:0.46:0.46:0.42:0.53"] = 328, -- The Shadow Vault, Dalaran, Fordragon Hold, Stars' Rest + ["0.38:0.21:0.52:0.38:0.59:0.43"] = 206, -- The Shadow Vault, Dalaran, Windrunner's Overlook + ["0.38:0.21:0.46:0.46"] = 190, -- The Shadow Vault, Fordragon Hold + ["0.38:0.21:0.52:0.38:0.64:0.42"] = 232, -- The Shadow Vault, Dalaran, Ebon Watch + ["0.38:0.21:0.42:0.53"] = 221, -- The Shadow Vault, Stars' Rest + ["0.38:0.21:0.42:0.53:0.22:0.61"] = 351, -- The Shadow Vault, Stars' Rest, Valiance Keep + ["0.38:0.21:0.24:0.40:0.21:0.49:0.22:0.61"] = 325, -- The Shadow Vault, River's Heart, Fizzcrank Airstrip, Valiance Keep + ["0.38:0.21:0.42:0.53:0.29:0.57"] = 319, -- The Shadow Vault, Stars' Rest, Unu'pe + ["0.38:0.21:0.46:0.46:0.60:0.52:0.76:0.67"] = 397, -- Das Schattengewölbe, Feste Fordragon, Feste Wintergarde, Westwacht + ["0.38:0.21:0.42:0.53:0.21:0.49:0.17:0.53"] = 392, -- The Shadow Vault, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.38:0.21:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 451, -- Das Schattengewölbe, Dalaran, Windläufers Warte, Feste Wintergarde, Westwacht, Kamagua + ["0.38:0.21:0.46:0.46:0.60:0.52:0.76:0.67:0.74:0.71"] = 446, -- Das Schattengewölbe, Feste Fordragon, Feste Wintergarde, Westwacht, Kamagua + ["0.38:0.21:0.64:0.19:0.78:0.38:0.83:0.46"] = 375, -- The Shadow Vault, Ulduar, Zim'Torga, Westfall Brigade + ["0.38:0.21:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 336, -- The Shadow Vault, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.38:0.21:0.24:0.40:0.21:0.49:0.29:0.57"] = 320, -- The Shadow Vault, River's Heart, Fizzcrank Airstrip, Unu'pe + ["0.38:0.21:0.52:0.38:0.49:0.58"] = 339, -- The Shadow Vault, Dalaran, Moa'ki + ["0.38:0.21:0.52:0.38:0.64:0.42:0.69:0.42"] = 276, -- The Shadow Vault, Dalaran, Ebon Watch, Light's Breach + ["0.38:0.21:0.57:0.33:0.62:0.36:0.52:0.38"] = 319, -- Das Schattengewölbe, Eisfestung, K3, Dalaran + ["0.38:0.21:0.46:0.46:0.60:0.52:0.73:0.54:0.83:0.46"] = 428, -- The Shadow Vault, Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.38:0.21:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 421, -- The Shadow Vault, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.38:0.21:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 470, -- The Shadow Vault, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.38:0.21:0.49:0.21"] = 78, -- The Shadow Vault, Argent Tournament Grounds + ["0.38:0.21:0.52:0.38:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 615, -- The Shadow Vault, Dalaran, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.38:0.21:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 366, -- The Shadow Vault, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + + ---------------------------------------------------------------------- + -- Alliance: Sholazar Basin + ---------------------------------------------------------------------- + + -- Alliance: Sholazar Basin: Nesingwary Base Camp + ["0.18:0.40:0.21:0.49:0.42:0.53"] = 315, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest + ["0.18:0.40:0.21:0.49:0.42:0.53:0.60:0.52"] = 495, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep + ["0.18:0.40:0.24:0.40"] = 77, -- Nesingwary Base Camp, River's Heart + ["0.18:0.40:0.24:0.40:0.52:0.38"] = 364, -- Nesingwary Base Camp, River's Heart, Dalaran + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 620, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.18:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54"] = 601, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.18:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42"] = 618, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Light's Breach + ["0.18:0.40:0.21:0.49:0.22:0.61"] = 221, -- Nesingwarys Basislager, Landebahn Kurbelzisch, Valianzfeste + ["0.18:0.40:0.24:0.40:0.52:0.38:0.62:0.36"] = 432, -- Nesingwary Base Camp, River's Heart, Dalaran, K3 + ["0.18:0.40:0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 581, -- Nesingwary Base Camp, River's Heart, Dalaran, K3, Dun Nifflelem + ["0.18:0.40:0.21:0.49"] = 117, -- Nesingwary Base Camp, Fizzcrank Airstrip + ["0.18:0.40:0.24:0.40:0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.72"] = 885, -- Nesingwary Base Camp, River's Heart, Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.18:0.40:0.21:0.49:0.29:0.57:0.49:0.58"] = 389, -- Nesingwary Base Camp, Fizzcrank Airstrip, Unu'pe, Moa'ki + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42"] = 465, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch + ["0.18:0.40:0.24:0.40:0.41:0.43"] = 287, -- Nesingwary Base Camp, River's Heart, Valiance Landing Camp + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 700, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40"] = 560, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand + ["0.18:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 236, -- Nesingwary Base Camp, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.18:0.40:0.24:0.40:0.41:0.43:0.42:0.53:0.49:0.58"] = 510, -- Camp de base de Nesingwary, Le Cœur du fleuve, Terrain d'atterrissage de la Bravoure, Repos des étoiles, Moa'ki + ["0.18:0.40:0.21:0.49:0.29:0.57"] = 213, -- Nesingwary Base Camp, Fizzcrank Airstrip, Unu'pe + ["0.18:0.40:0.21:0.49:0.42:0.53:0.54:0.52"] = 443, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple + ["0.18:0.40:0.21:0.49:0.29:0.57:0.49:0.58:0.60:0.52"] = 515, -- Nesingwary Base Camp, Fizzcrank Airstrip, Unu'pe, Moa'ki, Wintergarde Keep + ["0.18:0.40:0.28:0.28"] = 137, -- Nesingwary Base Camp, Death's Rise + ["0.18:0.40:0.21:0.49:0.17:0.53"] = 182, -- Nesingwary Base Camp, Fizzcrank Airstrip, Amber Ledge + ["0.18:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60"] = 772, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.18:0.40:0.24:0.40:0.52:0.38:0.62:0.36:0.57:0.33"] = 495, -- Nesingwary Base Camp, River's Heart, Dalaran, K3, Frosthold + ["0.18:0.40:0.24:0.40:0.52:0.38:0.56:0.36"] = 397, -- Nesingwary Base Camp, River's Heart, Dalaran, The Argent Vanguard + ["0.18:0.40:0.24:0.40:0.52:0.38:0.49:0.58"] = 587, -- Nesingwary Base Camp, River's Heart, Dalaran, Moa'ki + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 747, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.18:0.40:0.24:0.40:0.52:0.38:0.52:0.34"] = 406, -- Nesingwary Base Camp, River's Heart, Dalaran, Crusaders' Pinnacle + ["0.18:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67"] = 675, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.18:0.40:0.28:0.28:0.38:0.21"] = 277, -- Nesingwarys Basislager, Todesanhöhe, Das Schattengewölbe + ["0.18:0.40:0.28:0.28:0.57:0.21"] = 458, -- Nesingwarys Basislager, Todesanhöhe, Bergfels' Zuflucht + ["0.18:0.40:0.21:0.49:0.42:0.53:0.46:0.46"] = 430, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold + ["0.18:0.40:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33"] = 455, -- Nesingwary Base Camp, River's Heart, Dalaran, The Argent Vanguard, Frosthold + ["0.18:0.40:0.24:0.40:0.41:0.43:0.46:0.46"] = 360, -- Nesingwary Base Camp, River's Heart, Valiance Landing Camp, Fordragon Hold + ["0.18:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 778, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.18:0.40:0.21:0.49:0.42:0.53:0.49:0.58:0.74:0.71"] = 690, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Moa'ki, Kamagua + ["0.18:0.40:0.24:0.40:0.52:0.38:0.59:0.43"] = 426, -- Nesingwary Base Camp, River's Heart, Dalaran, Windrunner's Overlook + ["0.18:0.40:0.21:0.49:0.42:0.53:0.49:0.58"] = 416, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Moa'ki + ["0.18:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 722, -- Nesingwary Base Camp, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.18:0.40:0.28:0.28:0.49:0.21"] = 391, -- Nesingwary Base Camp, Death's Rise, Argent Tournament Grounds + ["0.18:0.40:0.28:0.28:0.52:0.34"] = 398, -- Nesingwary Base Camp, Death's Rise, Crusaders' Pinnacle + ["0.18:0.40:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 783, -- Nesingwary Base Camp, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 665, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.18:0.40:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71"] = 664, -- Nesingwary Base Camp, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42"] = 531, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, Light's Breach + ["0.18:0.40:0.28:0.28:0.57:0.21:0.64:0.19"] = 524, -- Nesingwary Base Camp, Death's Rise, Bouldercrag's Refuge, Ulduar + ["0.18:0.40:0.24:0.40:0.52:0.38:0.49:0.21"] = 534, -- Nesingwary Base Camp, River's Heart, Dalaran, Argent Tournament Grounds + ["0.18:0.40:0.24:0.40:0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 708, -- Nesingwary Base Camp, River's Heart, Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.18:0.40:0.24:0.40:0.52:0.38:0.49:0.21:0.57:0.21:0.64:0.19"] = 672, -- Nesingwary Base Camp, River's Heart, Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar + ["0.18:0.40:0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 600, -- Nesingwary Base Camp, River's Heart, Dalaran, The Argent Vanguard, Frosthold, Ulduar + + -- Alliance: Sholazar Basin: River's Heart + ["0.24:0.40:0.21:0.49"] = 104, -- River's Heart, Fizzcrank Airstrip + ["0.24:0.40:0.52:0.38"] = 302, -- River's Heart, Dalaran (davepringle46@yahoo.co.uk reported 336) + ["0.24:0.40:0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54:0.88:0.60"] = 705, -- River's Heart, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.24:0.40:0.52:0.38:0.56:0.36"] = 335, -- River's Heart, Dalaran, The Argent Vanguard + ["0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 223, -- River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.24:0.40:0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67:0.88:0.72"] = 711, -- River's Heart, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.24:0.40:0.41:0.43"] = 225, -- River's Heart, Valiance Landing Camp + ["0.24:0.40:0.21:0.49:0.22:0.61"] = 208, -- River's Heart, Fizzcrank Airstrip, Valiance Keep + ["0.24:0.40:0.21:0.49:0.17:0.53"] = 169, -- River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.24:0.40:0.28:0.28"] = 141, -- River's Heart, Death's Rise + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 604, -- River's Heart, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.24:0.40:0.18:0.40"] = 65, -- River's Heart, Nesingwary Base Camp + ["0.24:0.40:0.52:0.38:0.62:0.36"] = 370, -- River's Heart, Dalaran, K3 + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40"] = 498, -- River's Heart, Dalaran, Ebon Watch, The Argent Stand + ["0.24:0.40:0.52:0.38:0.64:0.42"] = 402, -- River's Heart, Dalaran, Ebon Watch + ["0.24:0.40:0.21:0.49:0.29:0.57"] = 199, -- River's Heart, Fizzcrank Airstrip, Unu'pe + ["0.24:0.40:0.21:0.49:0.42:0.53"] = 302, -- River's Heart, Fizzcrank Airstrip, Stars' Rest + ["0.24:0.40:0.52:0.38:0.46:0.46:0.60:0.52:0.69:0.42"] = 689, -- River's Heart, Dalaran, Fordragon Hold, Wintergarde Keep, Light's Breach + ["0.24:0.40:0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67"] = 608, -- River's Heart, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Westguard Keep + ["0.24:0.40:0.52:0.38:0.54:0.52:0.42:0.53"] = 566, -- River's Heart, Dalaran, Wyrmrest Temple, Stars' Rest + ["0.24:0.40:0.21:0.49:0.42:0.53:0.54:0.52"] = 430, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Wyrmrest Temple + ["0.24:0.40:0.52:0.38:0.54:0.52"] = 468, -- River's Heart, Dalaran, Wyrmrest Temple + ["0.24:0.40:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71"] = 651, -- River's Heart, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54"] = 589, -- Flussnabel, Landebahn Kurbelzisch, Sternenruh, Feste Wintergarde, Ammertannhütte + ["0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 520, -- River's Heart, Dalaran, K3, Dun Nifflelem + ["0.24:0.40:0.21:0.49:0.29:0.57:0.49:0.58"] = 376, -- River's Heart, Fizzcrank Airstrip, Unu'pe, Moa'ki + ["0.24:0.40:0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54"] = 534, -- 강의 심장부 (숄라자르 분지), 용맹의 주둔지 (겨울손아귀 호수), 폴드라곤 요새 (용의 안식처), 윈터가드 성채 (용의 안식처), 호박빛소나무 오두막 (회색 구릉지), 호박빛소나무 오두막 (회색 구릉지) + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.64:0.42:0.62:0.36"] = 629, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Ebon Watch, K3 + ["0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33"] = 393, -- River's Heart, Dalaran, The Argent Vanguard, Frosthold + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54"] = 594, -- Flussnabel, Dalaran, Schwarze Wacht, Lichtbresche, Ammertannhütte + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42"] = 469, -- River's Heart, Dalaran, Ebon Watch, Light's Breach + ["0.24:0.40:0.52:0.38:0.59:0.43"] = 363, -- River's Heart, Dalaran, Windrunner's Overlook + ["0.24:0.40:0.21:0.49:0.42:0.53:0.46:0.46"] = 417, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Fordragon Hold + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67"] = 663, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 559, -- River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 639, -- River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.76:0.67:0.88:0.72"] = 766, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 538, -- River's Heart, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.24:0.40:0.21:0.49:0.42:0.53:0.49:0.58"] = 403, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Moa'ki + ["0.24:0.40:0.41:0.43:0.46:0.46"] = 298, -- River's Heart, Valiance Landing Camp, Fordragon Hold + ["0.24:0.40:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 490, -- River's Heart, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.88:0.60"] = 760, -- Flussnabel, Landebahn Kurbelzisch, Sternenruh, Feste Wintergarde, Ammertannhütte, Fort Wildervar + ["0.24:0.40:0.52:0.38:0.52:0.34"] = 344, -- River's Heart, Dalaran, Crusaders' Pinnacle + ["0.24:0.40:0.28:0.28:0.38:0.21"] = 280, -- River's Heart, Death's Rise, The Shadow Vault + ["0.24:0.40:0.41:0.43:0.42:0.53:0.49:0.58:0.74:0.71"] = 723, -- River's Heart, Valiance Landing Camp, Stars' Rest, Moa'ki, Kamagua + ["0.24:0.40:0.41:0.43:0.46:0.46:0.54:0.52"] = 395, -- River's Heart, Valiance Landing Camp, Fordragon Hold, Wyrmrest Temple + ["0.24:0.40:0.28:0.28:0.57:0.21:0.64:0.19"] = 528, -- Слияние рек, Уступ Смерти, Приют Глыбоскала, Ульдуар + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 789, -- River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar + ["0.24:0.40:0.41:0.43:0.46:0.46:0.60:0.52"] = 428, -- River's Heart, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep + ["0.24:0.40:0.28:0.28:0.57:0.21"] = 461, -- River's Heart, Death's Rise, Bouldercrag's Refuge + ["0.24:0.40:0.52:0.38:0.49:0.58"] = 525, -- River's Heart, Dalaran, Moa'ki + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52"] = 482, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep + ["0.24:0.40:0.41:0.43:0.42:0.53:0.49:0.58"] = 448, -- River's Heart, Valiance Landing Camp, Stars' Rest, Moa'ki + ["0.24:0.40:0.52:0.38:0.62:0.36:0.57:0.33"] = 434, -- River's Heart, Dalaran, K3, Frosthold + ["0.24:0.40:0.21:0.49:0.42:0.53:0.49:0.58:0.74:0.71"] = 678, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Moa'ki, Kamagua + ["0.24:0.40:0.21:0.49:0.29:0.57:0.49:0.58:0.74:0.71:0.88:0.72"] = 771, -- River's Heart, Fizzcrank Airstrip, Unu'pe, Moa'ki, Kamagua, Valgarde Port + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42:0.72:0.40"] = 670, -- Flussnabel, Landebahn Kurbelzisch, Sternenruh, Feste Wintergarde, Lichtbresche, Argentumwache + ["0.24:0.40:0.52:0.38:0.46:0.46"] = 435, -- River's Heart, Dalaran, Fordragon Hold + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.73:0.54:0.83:0.46"] = 709, -- Flussnabel, Landebahn Kurbelzisch, Sternenruh, Feste Wintergarde, Ammertannhütte, Westfallbrigade + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38"] = 730, -- Flussnabel, Landebahn Kurbelzisch, Sternenruh, Feste Wintergarde, Lichtbresche, Argentumwache, Zim'Torga + ["0.24:0.40:0.41:0.43:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 686, -- River's Heart, Valiance Landing Camp, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.24:0.40:0.21:0.49:0.29:0.57:0.49:0.58:0.60:0.52"] = 503, -- River's Heart, Fizzcrank Airstrip, Unu'pe, Moa'ki, Wintergarde Keep + ["0.24:0.40:0.28:0.28:0.49:0.21"] = 394, -- River's Heart, Death's Rise, Argent Tournament Grounds + ["0.24:0.40:0.52:0.38:0.49:0.21"] = 473, -- River's Heart, Dalaran, Argent Tournament Grounds + ["0.24:0.40:0.41:0.43:0.38:0.21"] = 466, -- River's Heart, Valiance Landing Camp, The Shadow Vault + ["0.24:0.40:0.52:0.38:0.62:0.36:0.57:0.33:0.57:0.21"] = 531, -- River's Heart, Dalaran, K3, Frosthold, Bouldercrag's Refuge + ["0.24:0.40:0.21:0.49:0.42:0.53:0.60:0.52:0.69:0.42"] = 606, -- River's Heart, Fizzcrank Airstrip, Stars' Rest, Wintergarde Keep, Light's Breach + ["0.24:0.40:0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54:0.83:0.46"] = 655, -- River's Heart, Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.24:0.40:0.52:0.38:0.49:0.58:0.74:0.71"] = 797, -- River's Heart, Dalaran, Moa'ki, Kamagua + ["0.24:0.40:0.52:0.38:0.54:0.52:0.42:0.53:0.29:0.57"] = 709, -- River's Heart, Dalaran, Wyrmrest Temple, Stars' Rest, Unu'pe + + ---------------------------------------------------------------------- + -- Alliance: The Storm Peaks + ---------------------------------------------------------------------- + + -- Alliance: The Storm Peaks: Bouldercrag's Refuge + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38"] = 143, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran + ["0.57:0.21:0.64:0.19"] = 44, -- Bouldercrag's Refuge, Ulduar + ["0.57:0.21:0.57:0.33:0.62:0.36"] = 127, -- Bouldercrag's Refuge, Frosthold, K3 + ["0.57:0.21:0.57:0.33"] = 80, -- Bouldercrag's Refuge, Frosthold + ["0.57:0.21:0.49:0.21:0.52:0.34:0.28:0.28"] = 297, -- Bouldercrag's Refuge, Argent Tournament Grounds, Crusaders' Pinnacle, Death's Rise + ["0.57:0.21:0.64:0.19:0.78:0.38:0.82:0.31"] = 251, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, Gundrak + ["0.57:0.21:0.64:0.19:0.72:0.29"] = 149, -- Bouldercrag's Refuge, Ulduar, Dun Nifflelem + ["0.57:0.21:0.64:0.19:0.72:0.29:0.62:0.36:0.52:0.38"] = 306, -- Bouldercrag's Refuge, Ulduar, Dun Nifflelem, K3, Dalaran + ["0.57:0.21:0.57:0.33:0.56:0.36"] = 112, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 401, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Unu'pe + ["0.57:0.21:0.57:0.33:0.62:0.36:0.52:0.38"] = 198, -- Bouldercrag's Refuge, Frosthold, K3, Dalaran + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42"] = 215, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Light's Breach + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46"] = 231, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold + ["0.57:0.21:0.64:0.19:0.78:0.38:0.83:0.46:0.88:0.60"] = 338, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, Westfall Brigade, Fort Wildervar + ["0.57:0.21:0.57:0.33:0.62:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 585, -- Bouldercrag's Refuge, Frosthold, K3, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.57:0.21:0.57:0.33:0.62:0.36:0.72:0.29"] = 227, -- Bergfels' Zuflucht, Eisfestung, K3, Dun Niffelem + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60:0.88:0.72"] = 463, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.34"] = 139, -- Bergfels' Zuflucht, Eisfestung, Die Argentumvorhut, Kreuzfahrerturm + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 454, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.34:0.28:0.28"] = 305, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Death's Rise + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54"] = 299, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.57:0.21:0.57:0.33:0.62:0.36:0.52:0.38:0.24:0.40"] = 399, -- Bouldercrag's Refuge, Frosthold, K3, Dalaran, River's Heart + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52"] = 261, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wyrmrest Temple + ["0.57:0.21:0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 567, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.57:0.21:0.28:0.28"] = 191, -- Bouldercrag's Refuge, Death's Rise + ["0.57:0.21:0.38:0.21"] = 114, -- Bouldercrag's Refuge, The Shadow Vault + ["0.57:0.21:0.56:0.36:0.52:0.38"] = 278, -- Bergfels' Zuflucht, Die Argentumvorhut, Dalaran + ["0.57:0.21:0.28:0.28:0.24:0.40"] = 307, -- Bouldercrag's Refuge, Death's Rise, River's Heart + ["0.57:0.21:0.64:0.19:0.78:0.38"] = 198, -- Bouldercrag's Refuge, Ulduar, Zim'Torga + ["0.57:0.21:0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36"] = 342, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, K3 + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 377, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, River's Heart, Nesingwary Base Camp + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42"] = 171, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch + ["0.57:0.21:0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 601, -- Bergfels' Zuflucht, Ulduar, Zim'Torga, Argentumwache, Schwarze Wacht, Dalaran, Flussnabel, Nesingwarys Basislager + ["0.57:0.21:0.64:0.19:0.78:0.38:0.83:0.46"] = 253, -- Bergfels' Zuflucht, Ulduar, Zim'Torga, Westfallbrigade + ["0.57:0.21:0.64:0.19:0.78:0.38:0.72:0.40"] = 250, -- Bergfels' Zuflucht, Ulduar, Zim'Torga, Argentumwache + ["0.57:0.21:0.28:0.28:0.18:0.40"] = 308, -- Bouldercrag's Refuge, Death's Rise, Nesingwary Base Camp + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40"] = 343, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, River's Heart + ["0.57:0.21:0.64:0.19:0.78:0.38:0.83:0.46:0.88:0.60:0.88:0.72"] = 412, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40"] = 234, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, The Argent Stand + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43"] = 183, -- Bergfels' Zuflucht, Eisfestung, Die Argentumvorhut, Dalaran, Windläufers Warte + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.34:0.41:0.43"] = 244, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Valiance Landing Camp + ["0.57:0.21:0.57:0.33:0.62:0.36:0.59:0.43"] = 181, -- Bouldercrag's Refuge, Frosthold, K3, Windrunner's Overlook + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 510, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 433, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.57:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.22:0.61"] = 438, -- 布德克拉格庇护所,风暴峭壁, 死亡高地,冰冠冰川, 河流之心,索拉查盆地, 菲兹兰克机场,北风苔原, 无畏要塞,北风苔原 + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 401, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.41:0.43"] = 245, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Valiance Landing Camp + ["0.57:0.21:0.41:0.43"] = 253, -- Bouldercrag's Refuge, Valiance Landing Camp + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 420, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52"] = 232, -- Bergfels' Zuflucht, Eisfestung, K3, Schwarze Wacht, Feste Wintergarde + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53"] = 305, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.49:0.58"] = 291, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Moa'ki + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 531, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.57:0.21:0.52:0.34"] = 234, -- Bergfels' Zuflucht, Kreuzfahrerturm + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53"] = 327, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest + ["0.57:0.21:0.56:0.36:0.52:0.38:0.62:0.36"] = 323, -- Bouldercrag's Refuge, The Argent Vanguard, Dalaran, K3 + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53:0.22:0.61"] = 445, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.57:0.21:0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 369, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54:0.88:0.60"] = 414, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.57:0.21:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67"] = 352, -- Bouldercrag's Refuge, Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.41:0.43:0.28:0.28"] = 411, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Valiance Landing Camp, Death's Rise + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49"] = 404, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53"] = 448, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 484, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.57:0.21:0.49:0.21:0.52:0.34"] = 131, -- Bouldercrag's Refuge, Argent Tournament Grounds, Crusaders' Pinnacle + ["0.57:0.21:0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.74:0.71"] = 490, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Kamagua + ["0.57:0.21:0.49:0.21"] = 61, -- Bouldercrag's Refuge, Argent Tournament Grounds + ["0.57:0.21:0.57:0.33:0.62:0.36:0.72:0.29:0.78:0.38"] = 316, -- Bouldercrag's Refuge, Frosthold, K3, Dun Nifflelem, Zim'Torga + ["0.57:0.21:0.49:0.21:0.52:0.34:0.41:0.43"] = 236, -- Bouldercrag's Refuge, Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp + ["0.57:0.21:0.28:0.28:0.24:0.40:0.21:0.49"] = 368, -- Bouldercrag's Refuge, Death's Rise, River's Heart, Fizzcrank Airstrip + ["0.57:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53"] = 412, -- Bouldercrag's Refuge, Death's Rise, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.57:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 448, -- Bouldercrag's Refuge, Death's Rise, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.57:0.21:0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52"] = 253, -- Bouldercrag's Refuge, Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.57:0.21:0.49:0.21:0.52:0.38"] = 197, -- Bouldercrag's Refuge, Argent Tournament Grounds, Dalaran + ["0.57:0.21:0.49:0.21:0.52:0.38:0.62:0.36:0.72:0.29"] = 341, -- Bouldercrag's Refuge, Argent Tournament Grounds, Dalaran, K3, Dun Nifflelem + + -- Alliance: The Storm Peaks: Dun Nifflelem + ["0.72:0.29:0.64:0.19:0.57:0.21"] = 133, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge + ["0.72:0.29:0.62:0.36"] = 88, -- Dun Nifflelem, K3 + ["0.72:0.29:0.62:0.36:0.52:0.38:0.24:0.40"] = 359, -- Dun Nifflelem, K3, Dalaran, River's Heart + ["0.72:0.29:0.62:0.36:0.57:0.33"] = 131, -- Dun Nifflelem, K3, Frosthold + ["0.72:0.29:0.62:0.36:0.52:0.38"] = 159, -- Dun Nifflelem, K3, Dalaran + ["0.72:0.29:0.62:0.36:0.57:0.33:0.56:0.36"] = 164, -- Dun Nifflelem, K3, Frosthold, The Argent Vanguard + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 261, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 384, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53"] = 288, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest + ["0.72:0.29:0.62:0.36:0.57:0.33:0.57:0.21"] = 195, -- Dun Nifflelem, K3, Frosthold, Bouldercrag's Refuge + ["0.72:0.29:0.62:0.36:0.52:0.38:0.52:0.34"] = 187, -- Дун Ниффелем, К-3, Даларан, Вершина Рыцарей + ["0.72:0.29:0.78:0.38:0.83:0.46:0.88:0.60"] = 230, -- Dun Nifflelem, Zim'Torga, Westfall Brigade, Fort Wildervar + ["0.72:0.29:0.62:0.36:0.64:0.42:0.60:0.52"] = 193, -- Dun Nifflelem, K3, Ebon Watch, Wintergarde Keep + ["0.72:0.29:0.64:0.19"] = 85, -- Dun Nifflelem, Ulduar + ["0.72:0.29:0.62:0.36:0.57:0.33:0.56:0.36:0.52:0.34:0.28:0.28"] = 358, -- Dun Nifflelem, K3, Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Death's Rise + ["0.72:0.29:0.62:0.36:0.57:0.33:0.56:0.36:0.52:0.34"] = 190, -- Dun Nifflelem, K3, Frosthold, The Argent Vanguard, Crusaders' Pinnacle + ["0.72:0.29:0.62:0.36:0.59:0.43:0.60:0.52:0.54:0.52"] = 264, -- Dun Nifflelem, K3, Windrunner's Overlook, Wintergarde Keep, Wyrmrest Temple + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52"] = 222, -- Dun Niffelem, K3, Schwarze Wacht, Wyrmruhtempel + ["0.72:0.29:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67:0.74:0.71"] = 356, -- Dun Niffelem, Zim'Torga, Westfallbrigade, Ammertannhütte, Westwacht, Kamagua + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 459, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 493, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.72:0.29:0.78:0.38:0.83:0.46:0.73:0.54"] = 224, -- Dun Nifflelem, Zim'Torga, Westfall Brigade, Amberpine Lodge + ["0.72:0.29:0.78:0.38:0.83:0.46:0.88:0.60:0.88:0.72"] = 303, -- Dun Nifflelem, Zim'Torga, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.72:0.29:0.62:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 395, -- Dun Nifflelem, K3, Dalaran, River's Heart, Nesingwary Base Camp + ["0.72:0.29:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67"] = 306, -- Dun Nifflelem, Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep + ["0.72:0.29:0.62:0.36:0.52:0.38:0.41:0.43"] = 263, -- Dun Nifflelem, K3, Dalaran, Valiance Landing Camp + ["0.72:0.29:0.62:0.36:0.52:0.38:0.24:0.40:0.28:0.28"] = 444, -- 丹尼芬雷,风暴峭壁, K3,风暴峭壁, 达拉然, 河流之心,索拉查盆地, 死亡高地,冰冠冰川 + ["0.72:0.29:0.78:0.38:0.72:0.40"] = 142, -- Dun Nifflelem, Zim'Torga, The Argent Stand + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 413, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.72:0.29:0.62:0.36:0.64:0.42:0.46:0.46"] = 242, -- Dun Nifflelem, K3, Ebon Watch, Fordragon Hold + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58"] = 275, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 415, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 287, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.72:0.29:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 363, -- Dun Nifflelem, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.72:0.29:0.78:0.38:0.82:0.31"] = 143, -- Dun Nifflelem, Zim'Torga, Gundrak + ["0.72:0.29:0.78:0.38"] = 89, -- Dun Nifflelem, Zim'Torga + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 281, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.72:0.29:0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54"] = 260, -- Dun Niffelem, K3, Schwarze Wacht, Lichtbresche, Ammertannhütte + ["0.72:0.29:0.62:0.36:0.52:0.38:0.54:0.52"] = 270, -- Dun Niffelem, K3, Dalaran, Wyrmruhtempel + ["0.72:0.29:0.64:0.19:0.57:0.21:0.38:0.21"] = 246, -- Dun Niffelem, Ulduar, Bergfels' Zuflucht, Das Schattengewölbe + ["0.72:0.29:0.64:0.19:0.57:0.21:0.28:0.28"] = 323, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge, Death's Rise + ["0.72:0.29:0.62:0.36:0.57:0.33:0.57:0.21:0.38:0.21"] = 309, -- Dun Nifflelem, K3, Frosthold, Bouldercrag's Refuge, The Shadow Vault + ["0.72:0.29:0.62:0.36:0.64:0.42"] = 131, -- Dun Nifflelem, K3, Guet d'Ébène + ["0.72:0.29:0.62:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 388, -- Dun Nifflelem, K3, Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.72:0.29:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67"] = 312, -- Dun Nifflelem, K3, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.72:0.29:0.62:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 501, -- Dun Nifflelem, K3, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42"] = 165, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach + ["0.72:0.29:0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38"] = 251, -- Dun Nifflelem, Ulduar, Frosthold, The Argent Vanguard, Dalaran + ["0.72:0.29:0.78:0.38:0.83:0.46"] = 146, -- Dun Nifflelem, Zim'Torga, Westfall Brigade + ["0.72:0.29:0.62:0.36:0.52:0.38:0.52:0.34:0.38:0.21"] = 310, -- Dun Nifflelem, K3, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 512, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54"] = 248, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge + ["0.72:0.29:0.62:0.36:0.59:0.43:0.60:0.52:0.49:0.58"] = 309, -- Dun Nifflelem, K3, Windrunner's Overlook, Wintergarde Keep, Moa'ki + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 456, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.72:0.29:0.62:0.36:0.59:0.43"] = 141, -- Dun Nifflelem, K3, Windrunner's Overlook + ["0.72:0.29:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 381, -- Dun Nifflelem, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.88:0.60"] = 364, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 409, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 477, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge + ["0.72:0.29:0.62:0.36:0.64:0.42:0.60:0.52:0.73:0.54:0.88:0.60"] = 378, -- Dun Nifflelem, K3, Ebon Watch, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.72:0.29:0.62:0.36:0.57:0.33:0.56:0.36:0.38:0.21"] = 311, -- Dun Nifflelem, K3, Frosthold, The Argent Vanguard, The Shadow Vault + ["0.72:0.29:0.62:0.36:0.52:0.38:0.46:0.46"] = 248, -- Dun Nifflelem, K3, Dalaran, Fordragon Hold + ["0.72:0.29:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67:0.88:0.72"] = 374, -- Dun Nifflelem, Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.72:0.29:0.64:0.19:0.57:0.33"] = 187, -- Dun Nifflelem, Ulduar, Frosthold + ["0.72:0.29:0.62:0.36:0.52:0.38:0.56:0.36"] = 181, -- Dun Nifflelem, K3, Dalaran, The Argent Vanguard + ["0.72:0.29:0.62:0.36:0.52:0.38:0.56:0.36:0.38:0.21"] = 328, -- Dun Nifflelem, K3, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 284, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.72:0.29:0.62:0.36:0.64:0.42:0.60:0.52:0.73:0.54"] = 263, -- Dun Nifflelem, K3, Ebon Watch, Wintergarde Keep, Amberpine Lodge + ["0.72:0.29:0.62:0.36:0.52:0.38:0.41:0.43:0.28:0.28"] = 428, -- Dun Niffelem, K3, Dalaran, Valianzlager, Todesanhöhe + ["0.72:0.29:0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40"] = 451, -- Dun Nifflelem, Ulduar, Frosthold, The Argent Vanguard, Dalaran, River's Heart + ["0.72:0.29:0.62:0.36:0.59:0.43:0.60:0.52"] = 216, -- Dun Nifflelem, K3, Windrunner's Overlook, Wintergarde Keep + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58:0.74:0.71:0.88:0.72"] = 537, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Moa'ki, Kamagua, Valgarde Port + ["0.72:0.29:0.64:0.19:0.57:0.33:0.56:0.36:0.38:0.21"] = 367, -- Dun Nifflelem, Ulduar, Frosthold, The Argent Vanguard, The Shadow Vault + ["0.72:0.29:0.62:0.36:0.64:0.42:0.69:0.42"] = 176, -- Dun Nifflelem, K3, Ebon Watch, Light's Breach + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.74:0.71"] = 381, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Kamagua + ["0.72:0.29:0.64:0.19:0.57:0.21:0.49:0.21"] = 193, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.72:0.29:0.62:0.36:0.57:0.33:0.57:0.21:0.49:0.21"] = 256, -- Dun Nifflelem, K3, Frosthold, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.72:0.29:0.62:0.36:0.52:0.38:0.49:0.21"] = 273, -- Dun Nifflelem, K3, Dalaran, Argent Tournament Grounds + ["0.72:0.29:0.62:0.36:0.52:0.38:0.49:0.58"] = 308, -- Dun Nifflelem, K3, Dalaran, Moa'ki + + -- Alliance: The Storm Peaks: Frosthold + ["0.57:0.33:0.56:0.36:0.52:0.34"] = 61, -- Frosthold, The Argent Vanguard, Crusaders' Pinnacle + ["0.57:0.33:0.62:0.36"] = 49, -- Frosthold, K3 + ["0.57:0.33:0.56:0.36:0.52:0.38"] = 64, -- Frosthold, The Argent Vanguard, Dalaran + ["0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53"] = 369, -- Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 323, -- Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Unu'pe + ["0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49"] = 326, -- Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip + ["0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67"] = 273, -- Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.57:0.33:0.57:0.21"] = 65, -- Frosthold, Bouldercrag's Refuge + ["0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 250, -- Frosthold, K3, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 354, -- Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.57:0.33:0.64:0.19:0.72:0.29"] = 201, -- Frosthold, Ulduar, Dun Nifflelem + ["0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40"] = 156, -- Frosthold, K3, Ebon Watch, The Argent Stand + ["0.57:0.33:0.62:0.36:0.72:0.29"] = 149, -- Frosthold, K3, Dun Nifflelem + ["0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 374, -- Frosthold, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40"] = 264, -- Frosthold, The Argent Vanguard, Dalaran, River's Heart + ["0.57:0.33:0.62:0.36:0.52:0.38"] = 120, -- Frosthold, K3, Dalaran + ["0.57:0.33:0.56:0.36"] = 34, -- Fort du Givre, L'avant-garde d'Argent, L'avant-garde d'Argent + ["0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53:0.29:0.57"] = 336, -- Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.57:0.33:0.62:0.36:0.52:0.38:0.24:0.40"] = 320, -- Frosthold, K3, Dalaran, River's Heart + ["0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52"] = 183, -- 冰霜堡,风暴峭壁, K3,风暴峭壁, 黑锋哨站,祖达克, 龙眠神殿,龙骨荒野 + ["0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54"] = 220, -- Frosthold, K3, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53"] = 226, -- Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest + ["0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40:0.78:0.38"] = 196, -- Frosthold, K3, Ebon Watch, The Argent Stand, Zim'Torga + ["0.57:0.33:0.64:0.19"] = 98, -- Frosthold, Ulduar + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49"] = 352, -- Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip + ["0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 342, -- Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 375, -- Frosthold, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.57:0.33:0.56:0.36:0.52:0.34:0.28:0.28"] = 228, -- Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Death's Rise + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46"] = 153, -- Eisfestung, Die Argentumvorhut, Dalaran, Feste Fordragon + ["0.57:0.33:0.62:0.36:0.59:0.43"] = 102, -- Frosthold, K3, Windrunner's Overlook + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 288, -- Frosthold, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 264, -- Frosthold, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.57:0.33:0.56:0.36:0.52:0.38:0.49:0.58"] = 212, -- Frosthold, The Argent Vanguard, Dalaran, Moa'ki + ["0.57:0.33:0.62:0.36:0.64:0.42"] = 93, -- Frosthold, K3, Ebon Watch + ["0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42"] = 137, -- Frosthold, K3, Ebon Watch, Light's Breach + ["0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 405, -- Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 293, -- Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple, Wintergarde Keep, Amberpine Lodge + ["0.57:0.33:0.56:0.36:0.52:0.38:0.41:0.43"] = 167, -- Frosthold, The Argent Vanguard, Dalaran, Valiance Landing Camp + ["0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 454, -- Frosthold, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.72"] = 411, -- Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.57:0.33:0.57:0.21:0.38:0.21"] = 178, -- Frosthold, Bouldercrag's Refuge, The Shadow Vault + ["0.57:0.33:0.56:0.36:0.38:0.21"] = 180, -- Eisfestung, Die Argentumvorhut, Das Schattengewölbe + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 432, -- Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.57:0.33:0.56:0.36:0.52:0.34:0.41:0.43"] = 166, -- Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Valiance Landing Camp + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 452, -- Eisfestung, Die Argentumvorhut, Dalaran, Feste Fordragon, Sternenruh, Valianzfeste, Bernsteinflöz, Transitusschild + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 361, -- Frosthold, The Argent Vanguard, Dalaran, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 323, -- Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 312, -- Frosthold, K3, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53"] = 395, -- Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54:0.88:0.60"] = 336, -- Frosthold, K3, Ebon Watch, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52"] = 153, -- Frosthold, K3, Ebon Watch, Wintergarde Keep + ["0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 299, -- Frosthold, The Argent Vanguard, Dalaran, River's Heart, Nesingwary Base Camp + ["0.57:0.33:0.64:0.19:0.78:0.38:0.82:0.31"] = 304, -- Frosthold, Ulduar, Zim'Torga, Gundrak + ["0.57:0.33:0.62:0.36:0.64:0.42:0.72:0.40:0.83:0.46"] = 226, -- Frosthold, K3, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52"] = 174, -- Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42:0.60:0.52:0.76:0.67"] = 311, -- Eisfestung, Die Argentumvorhut, Dalaran, Schwarze Wacht, Feste Wintergarde, Westwacht + ["0.57:0.33:0.62:0.36:0.59:0.43:0.60:0.52:0.73:0.54"] = 248, -- Eisfestung, K3, Windläufers Warte, Feste Wintergarde, Ammertannhütte + ["0.57:0.33:0.56:0.36:0.28:0.28"] = 257, -- Frosthold, The Argent Vanguard, Death's Rise + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 234, -- Frosthold, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42"] = 130, -- Frosthold, The Argent Vanguard, Dalaran, Ebon Watch + ["0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52"] = 180, -- Frosthold, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep + ["0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54"] = 251, -- Frosthold, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.73:0.54:0.88:0.60"] = 365, -- Frosthold, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67"] = 300, -- Frosthold, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.74:0.71"] = 350, -- Frosthold, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Kamagua + ["0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 369, -- Frosthold, The Argent Vanguard, Dalaran, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.57:0.33:0.56:0.36:0.52:0.38:0.59:0.43"] = 105, -- Frosthold, The Argent Vanguard, Dalaran, Windrunner's Overlook + ["0.57:0.33:0.56:0.36:0.52:0.38:0.41:0.43:0.28:0.28"] = 332, -- Frosthold, The Argent Vanguard, Dalaran, Valiance Landing Camp, Death's Rise + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 194, -- Frosthold, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.57:0.33:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 174, -- Frosthold, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.57:0.33:0.57:0.21:0.49:0.21"] = 126, -- Frosthold, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.57:0.33:0.62:0.36:0.52:0.38:0.41:0.43"] = 223, -- Frosthold, K3, Dalaran, Valiance Landing Camp + ["0.57:0.33:0.62:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.72"] = 467, -- Frosthold, K3, Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.57:0.33:0.57:0.21:0.49:0.21:0.52:0.38"] = 262, -- Frosthold, Bouldercrag's Refuge, Argent Tournament Grounds, Dalaran + ["0.57:0.33:0.56:0.36:0.52:0.34:0.49:0.21"] = 156, -- Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Argent Tournament Grounds + ["0.57:0.33:0.57:0.21:0.28:0.28"] = 255, -- Frosthold, Bouldercrag's Refuge, Death's Rise + ["0.57:0.33:0.62:0.36:0.59:0.43:0.60:0.52:0.69:0.42:0.72:0.40"] = 302, -- Frosthold, K3, Windrunner's Overlook, Wintergarde Keep, Light's Breach, The Argent Stand + + -- Alliance: The Storm Peaks: K3 + ["0.62:0.36:0.57:0.33"] = 43, -- K3, Frosthold + ["0.62:0.36:0.64:0.42"] = 44, -- K3, Ebon Watch + ["0.62:0.36:0.59:0.43"] = 54, -- K3, Windrunner's Overlook + ["0.62:0.36:0.52:0.38"] = 72, -- K3, Dalaran + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 327, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.62:0.36:0.57:0.33:0.56:0.36"] = 77, -- K3, Frosthold, The Argent Vanguard + ["0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54"] = 172, -- K3, Ebon Watch, Light's Breach, Amberpine Lodge + ["0.62:0.36:0.64:0.42:0.60:0.52"] = 105, -- K3, Ebon Watch, Wintergarde Keep + ["0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67"] = 225, -- K3, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 293, -- K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.62:0.36:0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 263, -- K3, Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.62:0.36:0.59:0.43:0.60:0.52:0.42:0.53:0.22:0.61"] = 364, -- K3, Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.62:0.36:0.64:0.42:0.69:0.42"] = 88, -- K3, Ebon Watch, Light's Breach + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53"] = 201, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest + ["0.62:0.36:0.59:0.43:0.60:0.52:0.76:0.67"] = 249, -- K3, Windrunner's Overlook, Wintergarde Keep, Westguard Keep + ["0.62:0.36:0.52:0.38:0.49:0.58"] = 220, -- K3, Dalaran, Moa'ki + ["0.62:0.36:0.52:0.38:0.49:0.58:0.29:0.57"] = 349, -- K3, Dalaran, Moa'ki, Unu'pe + ["0.62:0.36:0.64:0.42:0.72:0.40:0.83:0.46"] = 178, -- K3, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.62:0.36:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 201, -- K3, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.62:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 308, -- K3, Dalaran, Le Cœur du fleuve, Camp de base de Nesingwary + ["0.62:0.36:0.64:0.42:0.54:0.52"] = 134, -- K3, Ebon Watch, Wyrmrest Temple + ["0.62:0.36:0.57:0.33:0.64:0.19"] = 140, -- K3, Frosthold, Ulduar + ["0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58"] = 187, -- K3, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.62:0.36:0.52:0.38:0.56:0.36"] = 94, -- K3, Dalaran, The Argent Vanguard + ["0.62:0.36:0.72:0.29"] = 101, -- K3, Dun Nifflelem + ["0.62:0.36:0.64:0.42:0.72:0.40"] = 107, -- K3, Ebon Watch, The Argent Stand + ["0.62:0.36:0.52:0.38:0.54:0.52"] = 182, -- K3, Dalaran, Wyrmrest Temple + ["0.62:0.36:0.52:0.38:0.24:0.40"] = 272, -- K3, Dalaran, River's Heart + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 325, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.62:0.36:0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42"] = 266, -- K3, Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach + ["0.62:0.36:0.64:0.42:0.72:0.40:0.78:0.38"] = 148, -- K3, Ebon Watch, The Argent Stand, Zim'Torga + ["0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 274, -- K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.62:0.36:0.57:0.33:0.57:0.21"] = 108, -- K3, Frosthold, Bouldercrag's Refuge + ["0.62:0.36:0.57:0.33:0.56:0.36:0.52:0.34"] = 103, -- K3, Frosthold, The Argent Vanguard, Crusaders' Pinnacle + ["0.62:0.36:0.57:0.33:0.56:0.36:0.52:0.34:0.28:0.28"] = 270, -- K3, Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Death's Rise + ["0.62:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.73:0.54"] = 301, -- K3, Dalaran, Wyrmruhtempel, Feste Wintergarde, Ammertannhütte + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 297, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 405, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.62:0.36:0.64:0.42:0.46:0.46"] = 155, -- K3, Ebon Watch, Fordragon Hold + ["0.62:0.36:0.59:0.43:0.60:0.52:0.76:0.67:0.88:0.72"] = 318, -- K3, Windrunner's Overlook, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.62:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67"] = 351, -- K3, Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep + ["0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54:0.88:0.60"] = 287, -- K3, Ebon Watch, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.62:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 439, -- K3, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 389, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge + ["0.62:0.36:0.59:0.43:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 406, -- K3, Windrunner's Overlook, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.62:0.36:0.57:0.33:0.57:0.21:0.38:0.21"] = 221, -- K3, Frosthold, Bouldercrag's Refuge, The Shadow Vault + ["0.62:0.36:0.64:0.42:0.69:0.42:0.73:0.54:0.76:0.67"] = 254, -- K3, Ebon Watch, Light's Breach, Amberpine Lodge, Westguard Keep + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 368, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 425, -- K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.62:0.36:0.52:0.38:0.41:0.43"] = 175, -- K3, Dalaran, Valiance Landing Camp + ["0.62:0.36:0.52:0.38:0.46:0.46:0.42:0.53"] = 235, -- K3, Dalaran, Fordragon Hold, Stars' Rest + ["0.62:0.36:0.59:0.43:0.60:0.52:0.69:0.42:0.72:0.40:0.78:0.38"] = 294, -- K3, Windrunner's Overlook, Wintergarde Keep, Light's Breach, The Argent Stand, Zim'Torga + ["0.62:0.36:0.59:0.43:0.60:0.52:0.42:0.53"] = 237, -- K3, Windrunner's Overlook, Wintergarde Keep, Stars' Rest + ["0.62:0.36:0.57:0.33:0.64:0.19:0.78:0.38:0.82:0.31"] = 346, -- K3, Frosthold, Ulduar, Zim'Torga, Gundrak + ["0.62:0.36:0.52:0.38:0.46:0.46"] = 161, -- K3, Dalaran, Fordragon Hold + ["0.62:0.36:0.59:0.43:0.60:0.52:0.73:0.54"] = 200, -- K3, Windrunner's Overlook, Wintergarde Keep, Amberpine Lodge + ["0.62:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 362, -- K3, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.62:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 460, -- K3, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.62:0.36:0.52:0.38:0.52:0.34:0.38:0.21"] = 223, -- K3, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58:0.74:0.71:0.88:0.72"] = 450, -- K3, Ebon Watch, Wyrmrest Temple, Moa'ki, Kamagua, Valgarde Port + ["0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58:0.74:0.71:0.76:0.67:0.88:0.60"] = 491, -- K3, Ebon Watch, Wyrmrest Temple, Moa'ki, Kamagua, Westguard Keep, Fort Wildervar + ["0.62:0.36:0.57:0.33:0.64:0.19:0.78:0.38:0.83:0.46"] = 349, -- K3, Frosthold, Ulduar, Zim'Torga, Westfall Brigade + ["0.62:0.36:0.52:0.38:0.52:0.34"] = 100, -- K3, Dalaran, Crusaders' Pinnacle + ["0.62:0.36:0.64:0.42:0.60:0.52:0.73:0.54:0.88:0.60"] = 290, -- K3, Ebon Watch, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.62:0.36:0.64:0.42:0.60:0.52:0.73:0.54"] = 176, -- K3, Ebon Watch, Wintergarde Keep, Amberpine Lodge + ["0.62:0.36:0.57:0.33:0.57:0.21:0.28:0.28"] = 298, -- K3, Eisfestung, Bergfels' Zuflucht, Todesanhöhe + ["0.62:0.36:0.52:0.38:0.41:0.43:0.28:0.28"] = 340, -- K3, Dalaran, Valiance Landing Camp, Death's Rise + ["0.62:0.36:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 349, -- K3, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.62:0.36:0.57:0.33:0.57:0.21:0.49:0.21"] = 168, -- K3, Frosthold, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.62:0.36:0.52:0.38:0.49:0.21"] = 186, -- K3, Dalaran, Argentumturnierplatz + ["0.62:0.36:0.52:0.38:0.56:0.36:0.28:0.28"] = 317, -- K3, Dalaran, The Argent Vanguard, Death's Rise + ["0.62:0.36:0.52:0.38:0.49:0.21:0.57:0.21:0.64:0.19"] = 277, -- K3, Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar + ["0.62:0.36:0.72:0.29:0.78:0.38:0.83:0.46"] = 245, -- K3, Dun Nifflelem, Zim'Torga, Westfall Brigade + ["0.62:0.36:0.64:0.42:0.60:0.52:0.73:0.54:0.83:0.46"] = 257, -- K3, Ebon Watch, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.62:0.36:0.59:0.43:0.60:0.52"] = 129, -- K3, Windrunner's Overlook, Wintergarde Keep + + -- Alliance: The Storm Peaks: Ulduar + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38"] = 167, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran + ["0.64:0.19:0.72:0.29"] = 104, -- Ulduar, Dun Nifflelem + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52"] = 312, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.34"] = 163, -- Ulduar, Frosthold, The Argent Vanguard, Crusaders' Pinnacle + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 325, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.64:0.19:0.78:0.38:0.83:0.46"] = 210, -- Ulduar, Zim'Torga, Westfall Brigade + ["0.64:0.19:0.57:0.33:0.56:0.36"] = 136, -- Ulduar, Frosthold, The Argent Vanguard + ["0.64:0.19:0.78:0.38"] = 154, -- Ulduar, Zim'Torga + ["0.64:0.19:0.72:0.29:0.62:0.36:0.52:0.38"] = 262, -- Ulduar, Dun Niffelem, K3, Dalaran + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 447, -- Ulduar, Frosthold, K3, Ebon Watch, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52"] = 256, -- Ulduar, Fort du Givre, K3, Guet d'Ébène, Donjon de Garde-hiver, Donjon de Garde-hiver + ["0.64:0.19:0.57:0.33"] = 103, -- Ulduar, Frosthold + ["0.64:0.19:0.57:0.33:0.62:0.36"] = 151, -- Ulduar, Eisfestung, K3 + ["0.64:0.19:0.78:0.38:0.82:0.31"] = 207, -- Ulduar, Zim'Torga, Gundrak + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.88:0.72"] = 463, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.64:0.19:0.78:0.38:0.83:0.46:0.88:0.60:0.88:0.72"] = 367, -- Ulduar, Zim'Torga, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.41:0.43"] = 270, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Valiance Landing Camp + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36"] = 298, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, K3 + ["0.64:0.19:0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.42:0.53"] = 391, -- Ульдуар, Дун Ниффелем, К-3, Черная застава, Храм Драконьего Покоя, Покой Звезд + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42"] = 229, -- Ulduar, Zim'Torga, Argentumwache, Lichtbresche + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42"] = 258, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 554, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 346, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.64:0.19:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67"] = 370, -- Ulduar, Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep + ["0.64:0.19:0.57:0.21"] = 48, -- Ulduar, Bouldercrag's Refuge + ["0.64:0.19:0.78:0.38:0.72:0.40"] = 206, -- Ulduar, Zim'Torga, Le séjour d'Argent + ["0.64:0.19:0.57:0.33:0.62:0.36:0.52:0.38"] = 222, -- Ulduar, Eisfestung, K3, Dalaran + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42:0.69:0.42"] = 239, -- Ulduar, Frosthold, K3, Ebon Watch, Light's Breach + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 508, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40"] = 367, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, River's Heart + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 444, -- Ulduar, Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 401, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, River's Heart, Nesingwary Base Camp + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53"] = 329, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46"] = 256, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52"] = 277, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52:0.42:0.53:0.22:0.61"] = 469, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42"] = 195, -- Ulduar, Frosthold, K3, Ebon Watch + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 348, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.64:0.19:0.57:0.21:0.28:0.28"] = 239, -- Ulduar, Bouldercrag's Refuge, Death's Rise + ["0.64:0.19:0.57:0.21:0.38:0.21"] = 162, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.64:0.19:0.78:0.38:0.83:0.46:0.88:0.60"] = 295, -- Ulduar, Zim'Torga, Westfall Brigade, Fort Wildervar + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42:0.54:0.52"] = 286, -- Ulduar, Frosthold, K3, Ebon Watch, Wyrmrest Temple + ["0.64:0.19:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67:0.74:0.71"] = 420, -- Ulduar, Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep, Kamagua + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 533, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.64:0.19:0.57:0.33:0.62:0.36:0.59:0.43"] = 205, -- Ulduar, Frosthold, K3, Windrunner's Overlook + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.54:0.52:0.60:0.52:0.76:0.67:0.88:0.72"] = 513, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Wyrmrest Temple, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.34:0.41:0.43"] = 269, -- Ulduar, Frosthold, The Argent Vanguard, Crusaders' Pinnacle, Valiance Landing Camp + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.21:0.49:0.17:0.53"] = 497, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 425, -- Ulduar, Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.29:0.57"] = 425, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Unu'pe + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53"] = 471, -- Ulduar, Eisfestung, Die Argentumvorhut, Dalaran, Flussnabel, Landebahn Kurbelzisch, Bernsteinflöz + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.49:0.58"] = 315, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Moa'ki + ["0.64:0.19:0.57:0.21:0.56:0.36:0.52:0.38"] = 326, -- Ulduar, Bouldercrag's Refuge, The Argent Vanguard, Dalaran + ["0.64:0.19:0.57:0.21:0.56:0.36"] = 296, -- Ulduar, Bouldercrag's Refuge, The Argent Vanguard + ["0.64:0.19:0.57:0.21:0.28:0.28:0.24:0.40"] = 356, -- Ulduar, Bouldercrag's Refuge, Death's Rise, River's Heart + ["0.64:0.19:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67:0.88:0.72"] = 438, -- Ulduar, Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.64:0.19:0.72:0.29:0.62:0.36:0.52:0.38:0.56:0.36"] = 285, -- Ulduar, Dun Nifflelem, K3, Dalaran, The Argent Vanguard + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.24:0.40:0.21:0.49"] = 428, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, River's Heart, Fizzcrank Airstrip + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.46:0.46:0.42:0.53:0.22:0.61"] = 456, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Fordragon Hold, Stars' Rest, Valiance Keep + ["0.64:0.19:0.57:0.33:0.62:0.36:0.64:0.42:0.60:0.52:0.76:0.67"] = 375, -- Ulduar, Frosthold, K3, Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38:0.41:0.43:0.28:0.28"] = 435, -- Ulduar, Frosthold, The Argent Vanguard, Dalaran, Valiance Landing Camp, Death's Rise + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.88:0.60"] = 427, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.64:0.19:0.72:0.29:0.62:0.36:0.64:0.42:0.72:0.40"] = 298, -- Ulduar, Dun Nifflelem, K3, Ebon Watch, The Argent Stand + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.49:0.58"] = 404, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Moa'ki + ["0.64:0.19:0.72:0.29:0.62:0.36"] = 191, -- Ulduar, Dun Nifflelem, K3 + ["0.64:0.19:0.57:0.21:0.49:0.21"] = 109, -- Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.64:0.19:0.57:0.33:0.62:0.36:0.52:0.38:0.24:0.40"] = 422, -- Ulduar, Frosthold, K3, Dalaran, River's Heart + ["0.64:0.19:0.57:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 496, -- Ulduar, Bouldercrag's Refuge, Death's Rise, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.64:0.19:0.57:0.21:0.28:0.28:0.18:0.40"] = 356, -- Ulduar, Bouldercrag's Refuge, Death's Rise, Nesingwary Base Camp + ["0.64:0.19:0.57:0.21:0.28:0.28:0.24:0.40:0.21:0.49"] = 416, -- Ulduar, Bouldercrag's Refuge, Death's Rise, River's Heart, Fizzcrank Airstrip + ["0.64:0.19:0.57:0.21:0.28:0.28:0.24:0.40:0.21:0.49:0.17:0.53"] = 460, -- Ulduar, Bouldercrag's Refuge, Death's Rise, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.64:0.19:0.72:0.29:0.62:0.36:0.64:0.42:0.60:0.52"] = 296, -- Ulduar, Dun Nifflelem, K3, Ebon Watch, Wintergarde Keep + ["0.64:0.19:0.57:0.21:0.49:0.21:0.52:0.34:0.41:0.43:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 561, -- Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds, Crusaders' Pinnacle, Valiance Landing Camp, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + + ---------------------------------------------------------------------- + -- Alliance: Wintergrasp + ---------------------------------------------------------------------- + + -- Alliance: Wintergrasp: Valiance Landing Camp + ["0.41:0.43:0.46:0.46"] = 49, -- Valiance Landing Camp, Fordragon Hold + ["0.41:0.43:0.46:0.46:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 325, -- Valiance Landing Camp, Fordragon Hold, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67:0.88:0.72"] = 325, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.41:0.43:0.46:0.46:0.64:0.42:0.69:0.42"] = 212, -- Valiance Landing Camp, Fordragon Hold, Ebon Watch, Light's Breach + ["0.41:0.43:0.24:0.40"] = 137, -- Valiance Landing Camp, River's Heart + ["0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54:0.88:0.60"] = 321, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.41:0.43:0.42:0.53"] = 81, -- Valiance Landing Camp, Stars' Rest + ["0.41:0.43:0.46:0.46:0.60:0.52"] = 136, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep + ["0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67:0.74:0.71"] = 306, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Westguard Keep, Kamagua + ["0.41:0.43:0.46:0.46:0.60:0.52:0.76:0.67"] = 256, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Westguard Keep + ["0.41:0.43:0.24:0.40:0.21:0.49:0.17:0.53"] = 241, -- Valiance Landing Camp, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.41:0.43:0.52:0.38"] = 91, -- Valiance Landing Camp, Dalaran + ["0.41:0.43:0.46:0.46:0.54:0.52"] = 114, -- Terrain d'atterrissage de la Bravoure, Bastion Fordragon, Temple du Repos du ver + ["0.41:0.43:0.52:0.38:0.56:0.36:0.57:0.33:0.64:0.19"] = 250, -- Valiance Landing Camp, Dalaran, The Argent Vanguard, Frosthold, Ulduar + ["0.41:0.43:0.42:0.53:0.49:0.58"] = 150, -- Valiance Landing Camp, Stars' Rest, Moa'ki + ["0.41:0.43:0.52:0.34"] = 110, -- Valiance Landing Camp, Crusaders' Pinnacle + ["0.41:0.43:0.42:0.53:0.29:0.57"] = 178, -- Valiance Landing Camp, Stars' Rest, Unu'pe + ["0.41:0.43:0.46:0.46:0.64:0.42:0.72:0.40:0.78:0.38"] = 272, -- Valiance Landing Camp, Fordragon Hold, Ebon Watch, The Argent Stand, Zim'Torga + ["0.41:0.43:0.42:0.53:0.49:0.58:0.74:0.71"] = 333, -- Valiance Landing Camp, Stars' Rest, Moa'ki, Kamagua + ["0.41:0.43:0.52:0.38:0.62:0.36:0.72:0.29"] = 237, -- Valiance Landing Camp, Dalaran, K3, Dun Nifflelem + ["0.41:0.43:0.42:0.53:0.22:0.61"] = 211, -- Valianzlager, Sternenruh, Valianzfeste + ["0.41:0.43:0.28:0.28"] = 166, -- Valiance Landing Camp, Death's Rise + ["0.41:0.43:0.24:0.40:0.21:0.49"] = 198, -- Valiance Landing Camp, River's Heart, Fizzcrank Airstrip + ["0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54"] = 207, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Amberpine Lodge + ["0.41:0.43:0.52:0.38:0.56:0.36"] = 114, -- Valiance Landing Camp, Dalaran, The Argent Vanguard + ["0.41:0.43:0.52:0.38:0.62:0.36:0.57:0.33"] = 180, -- Valiance Landing Camp, Dalaran, K3, Frosthold + ["0.41:0.43:0.52:0.38:0.62:0.36"] = 137, -- Valiance Landing Camp, Dalaran, K3 + ["0.41:0.43:0.24:0.40:0.18:0.40"] = 171, -- Valianzlager, Flussnabel, Nesingwarys Basislager + ["0.41:0.43:0.38:0.21"] = 161, -- Valiance Landing Camp, The Shadow Vault + ["0.41:0.43:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 287, -- Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.41:0.43:0.52:0.38:0.56:0.36:0.57:0.33"] = 153, -- Valiance Landing Camp, Dalaran, The Argent Vanguard, Frosthold + ["0.41:0.43:0.52:0.38:0.64:0.42"] = 159, -- Valianzlager, Dalaran, Schwarze Wacht + ["0.41:0.43:0.52:0.38:0.56:0.36:0.57:0.33:0.57:0.21"] = 217, -- Valiance Landing Camp, Dalaran, The Argent Vanguard, Frosthold, Bouldercrag's Refuge + ["0.41:0.43:0.46:0.46:0.64:0.42"] = 168, -- Valiance Landing Camp, Fordragon Hold, Ebon Watch + ["0.41:0.43:0.52:0.38:0.49:0.58:0.29:0.57:0.21:0.49"] = 448, -- Valiance Landing Camp, Dalaran, Moa'ki, Unu'pe, Fizzcrank Airstrip + ["0.41:0.43:0.52:0.38:0.49:0.58:0.74:0.71:0.76:0.67:0.73:0.54"] = 533, -- Valiance Landing Camp, Dalaran, Moa'ki, Kamagua, Westguard Keep, Amberpine Lodge + ["0.41:0.43:0.42:0.53:0.22:0.61:0.17:0.53"] = 273, -- Valiance Landing Camp, Stars' Rest, Valiance Keep, Amber Ledge + ["0.41:0.43:0.46:0.46:0.64:0.42:0.72:0.40"] = 232, -- Valiance Landing Camp, Fordragon Hold, Ebon Watch, The Argent Stand + ["0.41:0.43:0.42:0.53:0.21:0.49"] = 208, -- Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip + ["0.41:0.43:0.24:0.40:0.21:0.49:0.17:0.53:0.12:0.53"] = 278, -- Valiance Landing Camp, River's Heart, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.41:0.43:0.42:0.53:0.21:0.49:0.17:0.53"] = 251, -- Valiance Landing Camp, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.41:0.43:0.52:0.38:0.59:0.43"] = 133, -- Valiance Landing Camp, Dalaran, Windrunner's Overlook + ["0.41:0.43:0.46:0.46:0.60:0.52:0.69:0.42"] = 219, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Light's Breach + ["0.41:0.43:0.42:0.53:0.60:0.52:0.73:0.54"] = 274, -- Valiance Landing Camp, Stars' Rest, Wintergarde Keep, Amberpine Lodge + ["0.41:0.43:0.24:0.40:0.21:0.49:0.22:0.61"] = 267, -- Valiance Landing Camp, River's Heart, Fizzcrank Airstrip, Valiance Keep + ["0.41:0.43:0.52:0.38:0.64:0.42:0.72:0.40:0.83:0.46"] = 293, -- Valiance Landing Camp, Dalaran, Ebon Watch, The Argent Stand, Westfall Brigade + ["0.41:0.43:0.46:0.46:0.60:0.52:0.73:0.54:0.83:0.46"] = 287, -- Valiance Landing Camp, Fordragon Hold, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.41:0.43:0.52:0.34:0.49:0.21"] = 206, -- Valiance Landing Camp, Crusaders' Pinnacle, Argent Tournament Grounds + ["0.41:0.43:0.42:0.53:0.60:0.52:0.76:0.67"] = 323, -- Valiance Landing Camp, Stars' Rest, Wintergarde Keep, Westguard Keep + ["0.41:0.43:0.52:0.38:0.49:0.21"] = 206, -- Valiance Landing Camp, Dalaran, Argent Tournament Grounds + ["0.41:0.43:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 263, -- Valiance Landing Camp, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.41:0.43:0.52:0.38:0.64:0.42:0.69:0.42:0.73:0.54"] = 287, -- Valiance Landing Camp, Dalaran, Ebon Watch, Light's Breach, Amberpine Lodge + + ---------------------------------------------------------------------- + -- Alliance: Zul'Drak + ---------------------------------------------------------------------- + + -- Alliance: Zul'Drak: Ebon Watch + ["0.64:0.42:0.69:0.42"] = 45, -- Ebon Watch, Light's Breach + ["0.64:0.42:0.59:0.43"] = 34, -- Ebon Watch, Windrunner's Overlook + ["0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 284, -- Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.64:0.42:0.60:0.52"] = 62, -- Ebon Watch, Wintergarde Keep + ["0.64:0.42:0.52:0.38"] = 68, -- Ebon Watch, Dalaran + ["0.64:0.42:0.72:0.40:0.83:0.46"] = 135, -- Ebon Watch, The Argent Stand, Westfall Brigade + ["0.64:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 251, -- Ebon Watch, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.64:0.42:0.72:0.40"] = 64, -- Ebon Watch, The Argent Stand + ["0.64:0.42:0.60:0.52:0.76:0.67:0.74:0.71"] = 232, -- Ebon Watch, Wintergarde Keep, Westguard Keep, Kamagua + ["0.64:0.42:0.54:0.52"] = 92, -- Ebon Watch, Wyrmrest Temple + ["0.64:0.42:0.54:0.52:0.42:0.53"] = 158, -- Ebon Watch, Wyrmrest Temple, Stars' Rest + ["0.64:0.42:0.60:0.52:0.49:0.58"] = 154, -- Ebon Watch, Wintergarde Keep, Moa'ki + ["0.64:0.42:0.52:0.38:0.56:0.36"] = 89, -- Ebon Watch, Dalaran, The Argent Vanguard + ["0.64:0.42:0.72:0.40:0.78:0.38"] = 105, -- Ebon Watch, The Argent Stand, Zim'Torga + ["0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 282, -- Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.64:0.42:0.46:0.46"] = 112, -- Ebon Watch, Fordragon Hold + ["0.64:0.42:0.46:0.46:0.42:0.53"] = 185, -- Ebon Watch, Fordragon Hold, Stars' Rest + ["0.64:0.42:0.60:0.52:0.73:0.54"] = 133, -- Ebon Watch, Wintergarde Keep, Amberpine Lodge + ["0.64:0.42:0.60:0.52:0.73:0.54:0.83:0.46"] = 213, -- Ebon Watch, Wintergarde Keep, Amberpine Lodge, Westfall Brigade + ["0.64:0.42:0.69:0.42:0.73:0.54"] = 129, -- Ebon Watch, Light's Breach, Amberpine Lodge + ["0.64:0.42:0.54:0.52:0.49:0.58"] = 144, -- Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.64:0.42:0.60:0.52:0.73:0.54:0.88:0.60"] = 247, -- Ebon Watch, Wintergarde Keep, Amberpine Lodge, Fort Wildervar + ["0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 382, -- Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.64:0.42:0.60:0.52:0.76:0.67"] = 182, -- Ebon Watch, Wintergarde Keep, Westguard Keep + ["0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 158, -- Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.64:0.42:0.52:0.38:0.52:0.34"] = 94, -- Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 362, -- Guet d'Ébène, Temple du Repos du ver, Repos des étoiles, Piste d'atterrissage de Spumelevier, Escarpement d'Ambre, Bouclier Transitus + ["0.64:0.42:0.52:0.38:0.24:0.40"] = 266, -- Ebon Watch, Dalaran, River's Heart + ["0.64:0.42:0.60:0.52:0.42:0.53:0.22:0.61"] = 297, -- Ebon Watch, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.64:0.42:0.62:0.36"] = 40, -- Ebon Watch, K3 + ["0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 254, -- Ebon Watch, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 261, -- Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.64:0.42:0.69:0.42:0.73:0.54:0.88:0.60"] = 244, -- Ebon Watch, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.64:0.42:0.62:0.36:0.72:0.29"] = 141, -- Ebon Watch, K3, Dun Nifflelem + ["0.64:0.42:0.62:0.36:0.57:0.33"] = 84, -- Ebon Watch, K3, Frosthold + ["0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 326, -- Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.64:0.42:0.46:0.46:0.41:0.43"] = 171, -- Ebon Watch, Fordragon Hold, Valiance Landing Camp + ["0.64:0.42:0.52:0.38:0.49:0.58:0.29:0.57"] = 343, -- Ebon Watch, Dalaran, Moa'ki, Unu'pe + ["0.64:0.42:0.60:0.52:0.42:0.53"] = 170, -- Ebon Watch, Wintergarde Keep, Stars' Rest + ["0.64:0.42:0.72:0.40:0.83:0.46:0.88:0.60"] = 220, -- Ebon Watch, The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 216, -- Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.64:0.42:0.46:0.46:0.41:0.43:0.28:0.28"] = 337, -- Schwarze Wacht, Feste Fordragon, Valianzlager, Todesanhöhe + ["0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 346, -- Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge + ["0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 180, -- Ebon Watch, K3, Frosthold, Ulduar + ["0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 148, -- Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.64:0.42:0.54:0.52:0.49:0.58:0.74:0.71:0.88:0.72"] = 407, -- Ebon Watch, Wyrmrest Temple, Moa'ki, Kamagua, Valgarde Port + ["0.64:0.42:0.60:0.52:0.42:0.53:0.29:0.57"] = 266, -- Ebon Watch, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.64:0.42:0.54:0.52:0.49:0.58:0.74:0.71"] = 327, -- Ebon Watch, Wyrmrest Temple, Moa'ki, Kamagua + ["0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 300, -- Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 258, -- Ebon Watch, The Argent Stand, Zim'Torga, Ulduar + ["0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 127, -- Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.64:0.42:0.52:0.38:0.49:0.21"] = 181, -- Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 190, -- Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.64:0.42:0.52:0.38:0.41:0.43"] = 168, -- Ebon Watch, Dalaran, Valiance Landing Camp + ["0.64:0.42:0.69:0.42:0.73:0.54:0.83:0.46"] = 212, -- Ebon Watch, Light's Breach, Amberpine Lodge, Westfall Brigade + ["0.64:0.42:0.52:0.38:0.56:0.36:0.28:0.28"] = 312, -- Ebon Watch, Dalaran, The Argent Vanguard, Death's Rise + ["0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 236, -- Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + + -- Alliance: Zul'Drak: Gundrak + ["0.82:0.31:0.78:0.38"] = 56, -- Gundrak, Zim'Torga + ["0.82:0.31:0.78:0.38:0.72:0.40"] = 109, -- Gundrak, Zim'Torga, The Argent Stand + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 228, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42"] = 132, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.59:0.43"] = 194, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Windrunner's Overlook + ["0.82:0.31:0.78:0.38:0.83:0.46:0.88:0.60:0.88:0.72"] = 270, -- Gundrak, Zim'Torga, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.82:0.31:0.78:0.38:0.83:0.46:0.88:0.60"] = 197, -- Gundrak, Zim'Torga, Westfall Brigade, Fort Wildervar + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42"] = 161, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52"] = 214, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54"] = 215, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge + ["0.82:0.31:0.78:0.38:0.83:0.46"] = 112, -- Gundrak, Zim'Torga, Westfall Brigade + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 461, -- Gundrak, Zim'Torga, Le séjour d'Argent, Guet d'Ébène, Dalaran, Le Cœur du fleuve, Camp de base de Nesingwary + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 442, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52:0.52:0.38"] = 354, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54"] = 190, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 522, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 425, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53"] = 317, -- Gundrak, Zim'Torga, Argentumwache, Schwarze Wacht, Wyrmruhtempel, Sternenruh + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 251, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.82:0.31:0.78:0.38:0.64:0.19"] = 210, -- Gundrak, Zim'Torga, Ulduar + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 511, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 249, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33"] = 243, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, K3, Frosthold + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 443, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.60:0.52"] = 270, -- Gundrak, Zim'Torga, Westfallbrigade, Ammertannhütte, Feste Wintergarde + ["0.82:0.31:0.78:0.38:0.72:0.29:0.62:0.36:0.57:0.33:0.56:0.36:0.52:0.34"] = 330, -- Gundrak, Zim'Torga, Dun Niffelem, K3, Eisfestung, Die Argentumvorhut, Kreuzfahrerturm + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.46:0.46"] = 271, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Fordragon Hold + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67"] = 297, -- Gundrak, Zim'Torga, Argentumwache, Lichtbresche, Ammertannhütte, Westwacht + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.69:0.42"] = 255, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge, Light's Breach + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 485, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36"] = 201, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, K3 + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53"] = 322, -- Gundrak, Zim'Torga, Argentumwache, Lichtbresche, Feste Wintergarde, Sternenruh + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67"] = 273, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep + ["0.82:0.31:0.78:0.38:0.72:0.29"] = 141, -- Gundrak, Zim'Torga, Dun Nifflelem + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58"] = 304, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 253, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.74:0.71"] = 347, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Kamagua + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67:0.74:0.71"] = 322, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep, Kamagua + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.88:0.60"] = 330, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 420, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.82:0.31:0.78:0.38:0.64:0.19:0.57:0.21"] = 258, -- Gundrak, Zim'Torga, Ulduar, Bergfels' Zuflucht + ["0.82:0.31:0.78:0.38:0.64:0.19:0.57:0.33:0.56:0.36:0.52:0.38"] = 376, -- Gundrak, Zim'Torga, Ulduar, Frosthold, The Argent Vanguard, Dalaran + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 541, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.22:0.61"] = 449, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53"] = 378, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.46:0.46:0.41:0.43"] = 331, -- Гундрак, Зим'Торга, Серебряная застава, Черная застава, Крепость Фордрагона, Лагерь Отваги + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.69:0.42:0.64:0.42:0.52:0.38"] = 361, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge, Light's Breach, Ebon Watch, Dalaran + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 412, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.88:0.72"] = 366, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.82:0.31:0.78:0.38:0.64:0.19:0.57:0.21:0.38:0.21"] = 371, -- Gundrak, Zim'Torga, Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52:0.52:0.38:0.56:0.36:0.57:0.33"] = 415, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Wyrmrest Temple, Dalaran, The Argent Vanguard, Frosthold + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52"] = 261, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Wyrmrest Temple + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 376, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.49:0.58"] = 306, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Moa'ki + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 308, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.46:0.46:0.41:0.43"] = 363, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.59:0.43:0.52:0.38"] = 325, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49"] = 503, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.82:0.31:0.78:0.38:0.83:0.46:0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38"] = 410, -- Gundrak, Zim'Torga, Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.82:0.31:0.78:0.38:0.64:0.19:0.57:0.21:0.49:0.21"] = 318, -- Gundrak, Zim'Torga, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 510, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.59:0.43:0.62:0.36:0.57:0.33"] = 367, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Windrunner's Overlook, K3, Frosthold + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.21"] = 340, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Argent Tournament Grounds + + -- Alliance: Zul'Drak: Light's Breach + ["0.69:0.42:0.72:0.40"] = 44, -- Light's Breach, The Argent Stand + ["0.69:0.42:0.64:0.42"] = 40, -- Light's Breach, Ebon Watch + ["0.69:0.42:0.64:0.42:0.52:0.38"] = 107, -- Light's Breach, Ebon Watch, Dalaran + ["0.69:0.42:0.72:0.40:0.78:0.38"] = 85, -- Light's Breach, The Argent Stand, Zim'Torga + ["0.69:0.42:0.73:0.54"] = 84, -- Light's Breach, Amberpine Lodge + ["0.69:0.42:0.72:0.40:0.83:0.46"] = 114, -- Light's Breach, The Argent Stand, Westfall Brigade + ["0.69:0.42:0.73:0.54:0.76:0.67:0.88:0.72"] = 236, -- Light's Breach, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.69:0.42:0.73:0.54:0.76:0.67:0.74:0.71"] = 218, -- Light's Breach, Amberpine Lodge, Westguard Keep, Kamagua + ["0.69:0.42:0.73:0.54:0.76:0.67"] = 167, -- Light's Breach, Amberpine Lodge, Westguard Keep + ["0.69:0.42:0.73:0.54:0.88:0.60"] = 200, -- Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.69:0.42:0.64:0.42:0.54:0.52"] = 131, -- Light's Breach, Ebon Watch, Wyrmrest Temple + ["0.69:0.42:0.60:0.52:0.42:0.53"] = 192, -- Light's Breach, Wintergarde Keep, Stars' Rest + ["0.69:0.42:0.60:0.52:0.42:0.53:0.29:0.57"] = 288, -- Light's Breach, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.69:0.42:0.60:0.52"] = 84, -- Light's Breach, Wintergarde Keep + ["0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 138, -- Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.69:0.42:0.60:0.52:0.46:0.46"] = 173, -- Lichtbresche, Feste Wintergarde, Feste Fordragon + ["0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49"] = 317, -- Light's Breach, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.69:0.42:0.60:0.52:0.54:0.52"] = 131, -- Light's Breach, Wintergarde Keep, Wyrmrest Temple + ["0.69:0.42:0.73:0.54:0.83:0.46"] = 167, -- Light's Breach, Amberpine Lodge, Westfall Brigade + ["0.69:0.42:0.64:0.42:0.54:0.52:0.49:0.58"] = 183, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.69:0.42:0.60:0.52:0.49:0.58"] = 176, -- Light's Breach, Wintergarde Keep, Moa'ki + ["0.69:0.42:0.60:0.52:0.54:0.52:0.52:0.38"] = 223, -- Light's Breach, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 323, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.69:0.42:0.60:0.52:0.49:0.58:0.52:0.38"] = 297, -- Lichtbresche, Feste Wintergarde, Moa'ki, Dalaran + ["0.69:0.42:0.60:0.52:0.59:0.43:0.52:0.38"] = 194, -- Light's Breach, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.69:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 272, -- Light's Breach, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.69:0.42:0.73:0.54:0.88:0.60:0.88:0.72"] = 273, -- Light's Breach, Amberpine Lodge, Fort Wildervar, Valgarde Port + ["0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 293, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53"] = 196, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest + ["0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 380, -- Light's Breach, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.69:0.42:0.60:0.52:0.42:0.53:0.22:0.61"] = 319, -- Light's Breach, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53:0.12:0.53"] = 420, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge, Transitus Shield + ["0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 128, -- Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 305, -- Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 133, -- Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.69:0.42:0.60:0.52:0.76:0.67"] = 203, -- Lichtbresche, Feste Wintergarde, Westwacht + ["0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 360, -- Lichtbresche, Feste Wintergarde, Sternenruh, Landebahn Kurbelzisch, Bernsteinflöz + ["0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 396, -- Lichtbresche, Feste Wintergarde, Sternenruh, Landebahn Kurbelzisch, Bernsteinflöz, Transitusschild + ["0.69:0.42:0.60:0.52:0.46:0.46:0.52:0.38"] = 238, -- Light's Breach, Wintergarde Keep, Fordragon Hold, Dalaran + ["0.69:0.42:0.64:0.42:0.59:0.43"] = 74, -- Light's Breach, Ebon Watch, Windrunner's Overlook + ["0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 169, -- Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.69:0.42:0.72:0.40:0.83:0.46:0.88:0.60:0.88:0.72"] = 273, -- Light's Breach, The Argent Stand, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.69:0.42:0.64:0.42:0.46:0.46"] = 151, -- Light's Breach, Ebon Watch, Fordragon Hold + ["0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.64:0.19"] = 220, -- Light's Breach, Ebon Watch, K3, Frosthold, Ulduar + ["0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 322, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 401, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.69:0.42:0.60:0.52:0.54:0.52:0.52:0.38:0.62:0.36"] = 268, -- Light's Breach, Wintergarde Keep, Wyrmrest Temple, Dalaran, K3 + ["0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 300, -- Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.69:0.42:0.64:0.42:0.62:0.36"] = 80, -- Light's Breach, Ebon Watch, K3 + ["0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 255, -- Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 274, -- Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 188, -- Light's Breach, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 340, -- Light's Breach, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.69:0.42:0.60:0.52:0.59:0.43:0.62:0.36"] = 194, -- Light's Breach, Wintergarde Keep, Windrunner's Overlook, K3 + ["0.69:0.42:0.64:0.42:0.62:0.36:0.57:0.33"] = 123, -- Light's Breach, Ebon Watch, K3, Frosthold + ["0.69:0.42:0.64:0.42:0.46:0.46:0.41:0.43"] = 211, -- Lichtbresche, Schwarze Wacht, Feste Fordragon, Valianzlager + ["0.69:0.42:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 365, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49:0.18:0.40"] = 393, -- Light's Breach, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, Nesingwary Base Camp + ["0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.21:0.49:0.17:0.53"] = 410, -- Light's Breach, Ebon Watch, Dalaran, River's Heart, Fizzcrank Airstrip, Amber Ledge + ["0.69:0.42:0.64:0.42:0.46:0.46:0.41:0.43:0.28:0.28"] = 376, -- Light's Breach, Ebon Watch, Fordragon Hold, Valiance Landing Camp, Death's Rise + ["0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 167, -- Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 220, -- Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.69:0.42:0.60:0.52:0.59:0.43:0.62:0.36:0.57:0.33:0.57:0.21"] = 301, -- Light's Breach, Wintergarde Keep, Windrunner's Overlook, K3, Frosthold, Bouldercrag's Refuge + ["0.69:0.42:0.60:0.52:0.59:0.43:0.62:0.36:0.72:0.29"] = 294, -- Lichtbresche, Feste Wintergarde, Windläufers Warte, K3, Dun Niffelem + ["0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21:0.38:0.21"] = 304, -- Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds, The Shadow Vault + ["0.69:0.42:0.60:0.52:0.59:0.43:0.52:0.38:0.49:0.21"] = 308, -- Light's Breach, Wintergarde Keep, Windrunner's Overlook, Dalaran, Argent Tournament Grounds + ["0.69:0.42:0.60:0.52:0.76:0.67:0.88:0.60"] = 288, -- Light's Breach, Wintergarde Keep, Westguard Keep, Fort Wildervar + ["0.69:0.42:0.60:0.52:0.46:0.46:0.41:0.43"] = 232, -- Light's Breach, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp + ["0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29:0.62:0.36"] = 256, -- Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem, K3 + + -- Alliance: Zul'Drak: The Argent Stand + ["0.72:0.40:0.78:0.38"] = 42, -- The Argent Stand, Zim'Torga + ["0.72:0.40:0.69:0.42"] = 25, -- The Argent Stand, Light's Breach + ["0.72:0.40:0.64:0.42"] = 53, -- The Argent Stand, Ebon Watch + ["0.72:0.40:0.64:0.42:0.52:0.38"] = 121, -- The Argent Stand, Ebon Watch, Dalaran + ["0.72:0.40:0.78:0.38:0.82:0.31"] = 95, -- The Argent Stand, Zim'Torga, Gundrak + ["0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 141, -- The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67"] = 191, -- The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep + ["0.72:0.40:0.83:0.46:0.88:0.60:0.88:0.72"] = 230, -- The Argent Stand, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 336, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.72:0.40:0.83:0.46"] = 72, -- The Argent Stand, Westfall Brigade + ["0.72:0.40:0.69:0.42:0.60:0.52"] = 107, -- The Argent Stand, Light's Breach, Wintergarde Keep + ["0.72:0.40:0.69:0.42:0.73:0.54"] = 107, -- The Argent Stand, Light's Breach, Amberpine Lodge + ["0.72:0.40:0.83:0.46:0.73:0.54:0.60:0.52:0.54:0.52:0.52:0.38"] = 370, -- The Argent Stand, Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52"] = 154, -- The Argent Stand, Light's Breach, Wintergarde Keep, Wyrmrest Temple + ["0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53"] = 215, -- The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest + ["0.72:0.40:0.64:0.42:0.54:0.52"] = 144, -- The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52:0.52:0.38"] = 247, -- The Argent Stand, Light's Breach, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.22:0.61"] = 342, -- The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.72:0.40:0.83:0.46:0.73:0.54"] = 150, -- The Argent Stand, Westfall Brigade, Amberpine Lodge + ["0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 317, -- The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 398, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep, Amber Ledge + ["0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49"] = 340, -- The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.72:0.40:0.64:0.42:0.46:0.46"] = 164, -- Argentumwache, Schwarze Wacht, Feste Fordragon + ["0.72:0.40:0.69:0.42:0.60:0.52:0.59:0.43:0.52:0.38"] = 218, -- The Argent Stand, Light's Breach, Wintergarde Keep, Windrunner's Overlook, Dalaran + ["0.72:0.40:0.64:0.42:0.60:0.52:0.73:0.54"] = 185, -- The Argent Stand, Ebon Watch, Wintergarde Keep, Amberpine Lodge + ["0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.74:0.71"] = 240, -- The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Kamagua + ["0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 353, -- The Argent Stand, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 146, -- The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53"] = 210, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest + ["0.72:0.40:0.64:0.42:0.62:0.36"] = 94, -- The Argent Stand, Ebon Watch, K3 + ["0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.22:0.61:0.17:0.53"] = 404, -- The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Valiance Keep, Amber Ledge + ["0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33:0.57:0.21"] = 201, -- The Argent Stand, Ebon Watch, K3, Frosthold, Bouldercrag's Refuge + ["0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.29:0.57"] = 311, -- The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Unu'pe + ["0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58"] = 196, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.88:0.72"] = 258, -- The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.72:0.40:0.78:0.38:0.72:0.29"] = 127, -- The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.72:0.40:0.64:0.42:0.46:0.46:0.41:0.43"] = 223, -- The Argent Stand, Ebon Watch, Fordragon Hold, Valiance Landing Camp + ["0.72:0.40:0.64:0.42:0.59:0.43"] = 87, -- The Argent Stand, Ebon Watch, Windrunner's Overlook + ["0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 414, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 335, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.72:0.40:0.69:0.42:0.60:0.52:0.49:0.58:0.29:0.57:0.22:0.61:0.17:0.53"] = 452, -- The Argent Stand, Light's Breach, Wintergarde Keep, Moa'ki, Unu'pe, Valiance Keep, Amber Ledge + ["0.72:0.40:0.83:0.46:0.88:0.60"] = 157, -- The Argent Stand, Westfall Brigade, Fort Wildervar + ["0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 313, -- The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 288, -- The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.72:0.40:0.78:0.38:0.64:0.19"] = 195, -- The Argent Stand, Zim'Torga, Ulduar + ["0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 305, -- Argentumwache, Schwarze Wacht, Wyrmruhtempel, Sternenruh, Unu'pe + ["0.72:0.40:0.64:0.42:0.46:0.46:0.41:0.43:0.28:0.28"] = 389, -- Argentumwache, Schwarze Wacht, Feste Fordragon, Valianzlager, Todesanhöhe + ["0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 269, -- The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 243, -- Argentumwache, Zim'Torga, Ulduar, Bergfels' Zuflucht + ["0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 377, -- Argentumwache, Schwarze Wacht, Wyrmruhtempel, Sternenruh, Landebahn Kurbelzisch, Bernsteinflöz + ["0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33"] = 136, -- The Argent Stand, Ebon Watch, K3, Frosthold + ["0.72:0.40:0.69:0.42:0.73:0.54:0.88:0.60"] = 223, -- The Argent Stand, Light's Breach, Amberpine Lodge, Fort Wildervar + ["0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58:0.74:0.71:0.88:0.72"] = 459, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki, Kamagua, Valgarde Port + ["0.72:0.40:0.69:0.42:0.60:0.52:0.46:0.46"] = 196, -- Argentumwache, Lichtbresche, Feste Wintergarde, Feste Fordragon + ["0.72:0.40:0.69:0.42:0.60:0.52:0.49:0.58"] = 199, -- Argentumwache, Lichtbresche, Feste Wintergarde, Moa'ki + ["0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 402, -- Argentumwache, Lichtbresche, Feste Wintergarde, Sternenruh, Landebahn Kurbelzisch, Flussnabel + ["0.72:0.40:0.69:0.42:0.60:0.52:0.76:0.67:0.88:0.72"] = 295, -- The Argent Stand, Light's Breach, Wintergarde Keep, Westguard Keep, Valgarde Port + ["0.72:0.40:0.69:0.42:0.60:0.52:0.46:0.46:0.41:0.43:0.38:0.21"] = 416, -- The Argent Stand, Light's Breach, Wintergarde Keep, Fordragon Hold, Valiance Landing Camp, The Shadow Vault + ["0.72:0.40:0.64:0.42:0.62:0.36:0.72:0.29"] = 193, -- The Argent Stand, Ebon Watch, K3, Dun Nifflelem + ["0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.21"] = 233, -- The Argent Stand, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.58:0.42:0.53"] = 319, -- The Argent Stand, Ebon Watch, Dalaran, Moa'ki, Stars' Rest + ["0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.28:0.28"] = 364, -- The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard, Death's Rise + + -- Alliance: Zul'Drak: Zim'Torga + ["0.78:0.38:0.83:0.46"] = 56, -- Zim'Torga, Westfall Brigade + ["0.78:0.38:0.83:0.46:0.88:0.60"] = 142, -- Zim'Torga, Westfall Brigade, Fort Wildervar + ["0.78:0.38:0.82:0.31"] = 54, -- Zim'Torga, Gundrak + ["0.78:0.38:0.83:0.46:0.88:0.60:0.88:0.72"] = 215, -- Zim'Torga, Westfall Brigade, Fort Wildervar, Valgarde Port + ["0.78:0.38:0.72:0.40"] = 54, -- Zim'Torga, The Argent Stand + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 173, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.22:0.61"] = 388, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Valiance Keep + ["0.78:0.38:0.83:0.46:0.73:0.54"] = 135, -- Zim'Torga, Westfall Brigade, Amberpine Lodge + ["0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67"] = 217, -- Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52"] = 159, -- Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep + ["0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67:0.74:0.71"] = 268, -- Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep, Kamagua + ["0.78:0.38:0.72:0.40:0.69:0.42"] = 77, -- Zim'Torga, The Argent Stand, Light's Breach + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.29:0.57"] = 357, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Unu'pe + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53:0.12:0.53"] = 466, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge, Transitus Shield + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49:0.17:0.53"] = 430, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip, Amber Ledge + ["0.78:0.38:0.83:0.46:0.73:0.54:0.60:0.52"] = 214, -- Zim'Torga, Westfall Brigade, Amberpine Lodge, Wintergarde Keep + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53"] = 266, -- Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.49:0.58"] = 251, -- Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Moa'ki + ["0.78:0.38:0.72:0.40:0.64:0.42"] = 106, -- Zim'Torga, The Argent Stand, Ebon Watch + ["0.78:0.38:0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 510, -- Zim'Torga, Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip, River's Heart + ["0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36"] = 146, -- Zim'Torga, The Argent Stand, Ebon Watch, K3 + ["0.78:0.38:0.64:0.19"] = 154, -- Zim'Torga, Ulduar + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 196, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53:0.21:0.49"] = 386, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest, Fizzcrank Airstrip + ["0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54"] = 159, -- Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge + ["0.78:0.38:0.72:0.29"] = 85, -- Зим'Торга, Дун Ниффелем + ["0.78:0.38:0.64:0.19:0.57:0.33"] = 257, -- Zim'Torga, Ulduar, Frosthold + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52:0.52:0.38"] = 299, -- Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Wyrmrest Temple, Dalaran + ["0.78:0.38:0.83:0.46:0.73:0.54:0.76:0.67:0.88:0.72"] = 286, -- Zim'Torga, Westfall Brigade, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 370, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49"] = 392, -- Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Fizzcrank Airstrip + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 405, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.74:0.71"] = 292, -- Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Kamagua + ["0.78:0.38:0.83:0.46:0.73:0.54:0.60:0.52:0.42:0.53"] = 323, -- Zim'Torga, Westfall Brigade, Amberpine Lodge, Wintergarde Keep, Stars' Rest + ["0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.88:0.60"] = 275, -- Zim'Torga, Argentumwache, Lichtbresche, Ammertannhütte, Fort Wildervar + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 365, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.78:0.38:0.83:0.46:0.73:0.54:0.69:0.42"] = 200, -- Zim'Torga, Westfall Brigade, Amberpine Lodge, Light's Breach + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.42:0.53"] = 262, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Stars' Rest + ["0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67:0.88:0.72"] = 311, -- Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep, Valgarde Port + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58"] = 248, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.22:0.61"] = 394, -- Zim'Torga, The Argent Stand, Light's Breach, Wintergarde Keep, Stars' Rest, Valiance Keep + ["0.78:0.38:0.72:0.40:0.64:0.42:0.46:0.46"] = 216, -- Zim'Torga, The Argent Stand, Ebon Watch, Fordragon Hold + ["0.78:0.38:0.72:0.29:0.62:0.36:0.52:0.38"] = 243, -- Зим'Торга, Дун Ниффелем, К-3, Даларан + ["0.78:0.38:0.64:0.19:0.57:0.21"] = 202, -- Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.78:0.38:0.72:0.40:0.64:0.42:0.59:0.43"] = 138, -- Zim'Torga, The Argent Stand, Ebon Watch, Windrunner's Overlook + ["0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36:0.57:0.33"] = 188, -- Zim'Torga, The Argent Stand, Ebon Watch, K3, Frosthold + ["0.78:0.38:0.64:0.19:0.57:0.21:0.38:0.21"] = 316, -- Zim'Torga, Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 198, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.78:0.38:0.72:0.40:0.69:0.42:0.73:0.54:0.76:0.67"] = 242, -- Zim'Torga, The Argent Stand, Light's Breach, Amberpine Lodge, Westguard Keep + ["0.78:0.38:0.72:0.40:0.64:0.42:0.46:0.46:0.41:0.43"] = 275, -- Zim'Torga, The Argent Stand, Ebon Watch, Fordragon Hold, Valiance Landing Camp + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.29:0.57"] = 363, -- Zim'Torga, Argentumwache, Lichtbresche, Feste Wintergarde, Sternenruh, Unu'pe + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.54:0.52"] = 206, -- Zim'Torga, Argentumwache, Lichtbresche, Feste Wintergarde, Wyrmruhtempel + ["0.78:0.38:0.72:0.40:0.69:0.42:0.60:0.52:0.42:0.53:0.21:0.49:0.24:0.40"] = 455, -- Zim'Torga, Argentumwache, Lichtbresche, Feste Wintergarde, Sternenruh, Landebahn Kurbelzisch, Flussnabel + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 193, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.78:0.38:0.72:0.40:0.64:0.42:0.46:0.46:0.41:0.43:0.28:0.28"] = 441, -- Zim'Torga, The Argent Stand, Ebon Watch, Fordragon Hold, Valiance Landing Camp, Death's Rise + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.57:0.33"] = 232, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard, Frosthold + ["0.78:0.38:0.64:0.19:0.57:0.21:0.49:0.21"] = 263, -- Zim'Torga, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.21"] = 285, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Argent Tournament Grounds + + }, + + } + + end diff --git a/Leatrix_Plus_Flight_Horde.lua b/Leatrix_Plus_Flight_Horde.lua new file mode 100644 index 0000000..94c2b52 --- /dev/null +++ b/Leatrix_Plus_Flight_Horde.lua @@ -0,0 +1,4368 @@ + + ---------------------------------------------------------------------- + -- Leatrix Plus Flight Horde + ---------------------------------------------------------------------- + + local void, Leatrix_Plus = ... + local L = Leatrix_Plus.L + + -- Function to load flight data (load-on-demand) + function Leatrix_Plus:LoadFlightDataHorde() + + Leatrix_Plus["FlightData"]["Horde"] = { + + ---------------------------------------------------------------------- + -- Horde + ---------------------------------------------------------------------- + + -- Horde: Eastern Kingdoms + [1415] = { + + -- Horde: Acherus (Eastern Plaguelands) + ["0.62:0.34:0.61:0.35:0.61:0.28:0.58:0.06"] = 392, -- Acherus: The Ebon Hold, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.62:0.34:0.61:0.35:0.58:0.25:0.59:0.19"] = 234, -- Acherus: The Ebon Hold, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.62:0.34:0.61:0.35:0.58:0.25"] = 169, -- Acherus: The Ebon Hold, Light's Hope Chapel, Tranquillien + ["0.62:0.34:0.61:0.35:0.61:0.28"] = 145, -- Acherus: The Ebon Hold, Light's Hope Chapel, Zul'Aman + ["0.62:0.34:0.61:0.35"] = 52, -- Acherus: The Ebon Hold, Light's Hope Chapel + ["0.62:0.34:0.61:0.35:0.51:0.36"] = 147, -- Acherus: The Ebon Hold, Light's Hope Chapel, Thondoril River + ["0.62:0.34:0.61:0.35:0.51:0.36:0.45:0.37"] = 223, -- Acherus: The Ebon Hold, Light's Hope Chapel, Thondoril River, The Bulwark + ["0.62:0.34:0.61:0.35:0.51:0.36:0.42:0.37"] = 307, -- Acherus: The Ebon Hold, Light's Hope Chapel, Thondoril River, Undercity + ["0.62:0.34:0.61:0.35:0.51:0.36:0.46:0.43:0.37:0.41"] = 350, -- Acherus: The Ebon Hold, Light's Hope Chapel, Thondoril River, Tarren Mill, The Sepulcher + ["0.62:0.34:0.61:0.35:0.51:0.36:0.46:0.43"] = 247, -- Acherus: The Ebon Hold, Light's Hope Chapel, Thondoril River, Tarren Mill + ["0.62:0.34:0.61:0.35:0.59:0.45:0.55:0.46"] = 282, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Hammerfall + ["0.62:0.34:0.61:0.35:0.59:0.45"] = 189, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village + ["0.62:0.34:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.46:0.65"] = 595, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Thorium Point + ["0.62:0.34:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 540, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath + ["0.62:0.34:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.50:0.69"] = 606, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Flame Crest + ["0.62:0.34:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 763, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.62:0.34:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 777, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.62:0.34:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 836, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.62:0.34:0.61:0.35:0.42:0.37"] = 310, -- Acherus: The Ebon Hold, Light's Hope Chapel, Undercity + ["0.62:0.34:0.61:0.35:0.42:0.37:0.37:0.41"] = 345, -- Acherus: The Ebon Hold, Light's Hope Chapel, Undercity, The Sepulcher + ["0.62:0.34:0.61:0.35:0.59:0.45:0.46:0.43"] = 348, -- Acherus: The Ebon Hold, Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.62:0.34:0.61:0.35:0.42:0.37:0.45:0.37"] = 328, -- Acherus: The Ebon Hold, Light's Hope Chapel, Undercity, The Bulwark + ["0.62:0.34:0.61:0.35:0.58:0.25:0.59:0.19:0.58:0.06"] = 417, -- Acherus: The Ebon Hold, Light's Hope Chapel, Tranquillien, Silvermoon City, Shattered Sun Staging Area + + -- Horde: Booty Bay (Stranglethorn Vale) + ["0.41:0.93:0.42:0.86"] = 75, -- Booty Bay, Grom'gol + ["0.41:0.93:0.54:0.79"] = 240, -- Booty Bay, Stonard + ["0.41:0.93:0.42:0.86:0.50:0.69"] = 273, -- Booty Bay, Grom'gol, Flame Crest + ["0.41:0.93:0.50:0.66"] = 315, -- Booty Bay, Kargath + ["0.41:0.93:0.42:0.86:0.50:0.69:0.46:0.65"] = 304, -- Booty Bay, Grom'gol, Flame Crest, Thorium Point + ["0.41:0.93:0.50:0.66:0.55:0.46:0.46:0.43:0.37:0.41"] = 789, -- Booty Bay, Kargath, Hammerfall, Tarren Mill, The Sepulcher + ["0.41:0.93:0.50:0.66:0.42:0.37"] = 811, -- Booty Bay, Kargath, Undercity + ["0.41:0.93:0.50:0.66:0.55:0.46:0.46:0.43"] = 692, -- Booty Bay, Kargath, Hammerfall, Tarren Mill + ["0.41:0.93:0.50:0.66:0.55:0.46"] = 576, -- Booty Bay, Kargath, Hammerfall + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45"] = 665, -- Booty Bay, Kargath, Hammerfall, Revantusk Village + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35"] = 804, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25"] = 920, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 986, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28"] = 897, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 1145, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.41:0.93:0.50:0.66:0.42:0.37:0.61:0.35"] = 1000, -- Booty Bay, Kargath, Undercity, Light's Hope Chapel + ["0.41:0.93:0.50:0.66:0.46:0.65"] = 370, -- Booty Bay, Kargath, Thorium Point + ["0.41:0.93:0.50:0.66:0.50:0.69"] = 381, -- Booty Bay, Kargath, Flame Crest + ["0.41:0.93:0.50:0.66:0.55:0.46:0.46:0.43:0.45:0.37"] = 760, -- Booty Bay, Kargath, Hammerfall, Tarren Mill, The Bulwark + ["0.41:0.93:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36"] = 792, -- Booty Bay, Kargath, Hammerfall, Tarren Mill, Thondroril River + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.62:0.34"] = 864, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.41:0.93:0.50:0.66:0.42:0.37:0.46:0.43"] = 881, -- Booty Bay, Kargath, Undercity, Tarren Mill + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19:0.58:0.06"] = 1169, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City, Shattered Sun Staging Area + ["0.41:0.93:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36:0.61:0.35:0.61:0.28:0.58:0.06"] = 1228, -- Booty Bay, Kargath, Hammerfall, Tarren Mill, Thondoril River, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.41:0.93:0.50:0.66:0.42:0.37:0.61:0.35:0.61:0.28:0.58:0.06"] = 1339, -- Beutebucht, Kargath, Unterstadt, Kapelle des hoffnungsvollen Lichts, Zul'Aman, Sammelpunkt der Zerschmetterten Sonne + ["0.41:0.93:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06:0.59:0.19"] = 1311, -- Booty Bay, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area, Silvermoon City + ["0.41:0.93:0.50:0.66:0.42:0.37:0.61:0.35:0.58:0.25:0.59:0.19:0.58:0.06"] = 1365, -- Booty Bay, Kargath, Undercity, Light's Hope Chapel, Tranquillien, Silvermoon City, Shattered Sun Staging Area + ["0.41:0.93:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36:0.61:0.35"] = 887, -- Booty Bay, Kargath, Hammerfall, Tarren Mill, Thondoril River, Light's Hope Chapel + ["0.41:0.93:0.50:0.66:0.42:0.37:0.59:0.45"] = 1019, -- Booty Bay, Kargath, Undercity, Revantusk Village + ["0.41:0.93:0.50:0.66:0.42:0.37:0.37:0.41"] = 845, -- Booty Bay, Kargath, Undercity, The Sepulcher + + -- Horde: Flame Crest (Burning Steppes) + ["0.50:0.69:0.42:0.86:0.41:0.93"] = 284, -- Flame Crest, Grom'gol, Booty Bay + ["0.50:0.69:0.42:0.86"] = 207, -- Flame Crest, Grom'gol + ["0.50:0.69:0.54:0.79"] = 192, -- Flame Crest, Stonard + ["0.50:0.69:0.50:0.66"] = 81, -- Flame Crest, Kargath + ["0.50:0.69:0.46:0.65"] = 62, -- Flame Crest, Thorium Point + ["0.50:0.69:0.50:0.66:0.55:0.46:0.46:0.43:0.37:0.41"] = 557, -- Flame Crest, Kargath, Hammerfall, Tarren Mill, The Sepulcher + ["0.50:0.69:0.50:0.66:0.42:0.37"] = 578, -- Flame Crest, Kargath, Undercity + ["0.50:0.69:0.50:0.66:0.55:0.46:0.46:0.43"] = 458, -- Flame Crest, Kargath, Hammerfall, Tarren Mill + ["0.50:0.69:0.50:0.66:0.55:0.46"] = 343, -- Flame Crest, Kargath, Hammerfall + ["0.50:0.69:0.50:0.66:0.55:0.46:0.59:0.45"] = 433, -- Flame Crest, Kargath, Hammerfall, Revantusk Village + ["0.50:0.69:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35"] = 571, -- Flame Crest, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel + ["0.50:0.69:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25"] = 687, -- Flame Crest, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.50:0.69:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 754, -- Flame Crest, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.50:0.69:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 912, -- Flame Crest, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.50:0.69:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28"] = 665, -- Flame Crest, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.50:0.69:0.50:0.66:0.41:0.93"] = 378, -- Flame Crest, Kargath, Booty Bay + ["0.50:0.69:0.50:0.66:0.55:0.46:0.46:0.43:0.45:0.37"] = 527, -- Flame Crest, Kargath, Hammerfall, Tarren Mill, The Bulwark + ["0.50:0.69:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36"] = 559, -- Flame Crest, Kargath, Hammerfall, Tarren Mill, Thondroril River + ["0.50:0.69:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.62:0.34"] = 632, -- Flame Crest, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.50:0.69:0.50:0.66:0.42:0.37:0.46:0.43"] = 645, -- Flame Crest, Kargath, Undercity, Tarren Mill + ["0.50:0.69:0.50:0.66:0.42:0.37:0.61:0.35"] = 767, -- Flame Crest, Kargath, Undercity, Light's Hope Chapel + ["0.50:0.69:0.54:0.79:0.41:0.93"] = 282, -- Flame Crest, Stonard, Booty Bay + + -- Horde: Grom'gol (Stranglethorn Vale) + ["0.42:0.86:0.41:0.93"] = 78, -- Grom'gol, Booty Bay + ["0.42:0.86:0.54:0.79"] = 173, -- Grom'gol, Stonard + ["0.42:0.86:0.50:0.69"] = 198, -- Grom'gol, Flame Crest + ["0.42:0.86:0.50:0.66"] = 246, -- Grom'gol, Kargath + ["0.42:0.86:0.50:0.69:0.46:0.65"] = 230, -- Grom'gol, Flame Crest, Thorium Point + ["0.42:0.86:0.50:0.66:0.55:0.46:0.46:0.43:0.37:0.41"] = 722, -- Grom'gol, Kargath, Hammerfall, Tarren Mill, The Sepulcher + ["0.42:0.86:0.50:0.66:0.42:0.37"] = 743, -- Grom'gol, Kargath, Undercity + ["0.42:0.86:0.50:0.66:0.55:0.46:0.46:0.43"] = 624, -- Grom'gol, Kargath, Hammerfall, Tarren Mill + ["0.42:0.86:0.50:0.66:0.55:0.46"] = 508, -- Grom'gol, Kargath, Hammerfall + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45"] = 597, -- Grom'gol, Kargath, Hammerfall, Revantusk Village + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35"] = 736, -- Grom'gol, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25"] = 851, -- Grom'gol, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 918, -- Grom'gol, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.42:0.86:0.50:0.66:0.46:0.65"] = 302, -- Grom'gol, Kargath, Thorium Point + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28"] = 829, -- Grom'gol, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 1077, -- Grom'gol, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.42:0.86:0.50:0.66:0.55:0.46:0.46:0.43:0.45:0.37"] = 692, -- Grom'gol, Kargath, Hammerfall, Tarren Mill, The Bulwark + ["0.42:0.86:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36"] = 724, -- Grom'gol, Kargath, Hammerfall, Tarren Mill, Thondroril River + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.62:0.34"] = 797, -- Grom'gol, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.42:0.86:0.50:0.66:0.42:0.37:0.46:0.43"] = 810, -- Grom'gol, Kargath, Undercity, Tarren Mill + ["0.42:0.86:0.50:0.66:0.42:0.37:0.59:0.45"] = 952, -- Grom'gol, Kargath, Undercity, Revantusk Village + ["0.42:0.86:0.50:0.66:0.42:0.37:0.61:0.35:0.61:0.28:0.58:0.06"] = 1271, -- Grom'gol, Kargath, Undercity, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.42:0.86:0.50:0.66:0.42:0.37:0.37:0.41"] = 778, -- Grom'gol, Kargath, Undercity, The Sepulcher + ["0.42:0.86:0.50:0.66:0.42:0.37:0.61:0.35:0.61:0.28:0.58:0.06:0.59:0.19"] = 1435, -- Grom'gol, Kargath, Undercity, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area, Silvermoon City + ["0.42:0.86:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06:0.59:0.19"] = 1246, -- Grom'gol, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area, Silvermoon City + + -- Horde: Hammerfall (Arathi Highlands) + ["0.55:0.46:0.50:0.66:0.41:0.93"] = 556, -- Hammerfall, Kargath, Booty Bay + ["0.55:0.46:0.50:0.66:0.42:0.86"] = 497, -- Hammerfall, Kargath, Grom'gol + ["0.55:0.46:0.50:0.66:0.54:0.79"] = 482, -- Hammerfall, Kargath, Stonard + ["0.55:0.46:0.50:0.66:0.50:0.69"] = 326, -- Hammerfall, Kargath, Flame Crest + ["0.55:0.46:0.50:0.66"] = 259, -- Hammerfall, Kargath + ["0.55:0.46:0.50:0.66:0.46:0.65"] = 315, -- Hammerfall, Kargath, Thorium Point + ["0.55:0.46:0.59:0.45"] = 91, -- Hammerfall, Revantusk Village + ["0.55:0.46:0.59:0.45:0.61:0.35"] = 229, -- Hammerfall, Revantusk Village, Light's Hope Chapel + ["0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25"] = 345, -- Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 411, -- Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.55:0.46:0.42:0.37"] = 259, -- Hammerfall, Undercity + ["0.55:0.46:0.46:0.43"] = 117, -- Hammerfall, Tarren Mill + ["0.55:0.46:0.46:0.43:0.37:0.41"] = 215, -- Hammerfall, Tarren Mill, The Sepulcher + ["0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28"] = 322, -- Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.55:0.46:0.46:0.43:0.42:0.37:0.61:0.35:0.61:0.28"] = 532, -- Hammerfall, Tarren Mill, Undercity, Light's Hope Chapel, Zul'Aman + ["0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 571, -- Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.55:0.46:0.46:0.43:0.42:0.37:0.61:0.35"] = 441, -- Hammerfall, Tarren Mill, Undercity, Light's Hope Chapel + ["0.55:0.46:0.46:0.43:0.45:0.37"] = 185, -- Hammerfall, Tarren Mill, The Bulwark + ["0.55:0.46:0.46:0.43:0.51:0.36"] = 217, -- Hammerfall, Tarren Mill, Thondroril River + ["0.55:0.46:0.59:0.45:0.61:0.35:0.62:0.34"] = 290, -- Hammerfall, Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.55:0.46:0.46:0.43:0.51:0.36:0.61:0.35:0.58:0.25:0.59:0.19"] = 497, -- Hammerfall, Tarren Mill, Thondoril River, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.55:0.46:0.46:0.43:0.51:0.36:0.61:0.35:0.58:0.25"] = 428, -- Hammerfall, Tarren Mill, Thondoril River, Light's Hope Chapel, Tranquillien + + -- Horde: Kargath (Badlands) + ["0.50:0.66:0.41:0.93"] = 298, -- Kargath, Booty Bay + ["0.50:0.66:0.42:0.86"] = 239, -- Kargath, Grom'gol + ["0.50:0.66:0.54:0.79"] = 225, -- Kargath, Stonard + ["0.50:0.66:0.50:0.69"] = 68, -- Kargath, Flame Crest + ["0.50:0.66:0.46:0.65"] = 56, -- Kargath, Thorium Point + ["0.50:0.66:0.55:0.46:0.46:0.43:0.37:0.41"] = 477, -- Kargath, Hammerfall, Tarren Mill, The Sepulcher + ["0.50:0.66:0.42:0.37"] = 498, -- Kargath, Undercity (Ashton reported 344) + ["0.50:0.66:0.55:0.46:0.46:0.43"] = 379, -- Kargath, Hammerfall, Tarren Mill + ["0.50:0.66:0.55:0.46"] = 263, -- Kargath, Hammerfall + ["0.50:0.66:0.55:0.46:0.59:0.45"] = 353, -- Kargath, Hammerfall, Revantusk Village + ["0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35"] = 490, -- Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel + ["0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25"] = 606, -- Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 673, -- Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28"] = 585, -- Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 832, -- Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.50:0.66:0.42:0.37:0.61:0.35"] = 686, -- Kargath, Undercity, Light's Hope Chapel + ["0.50:0.66:0.42:0.37:0.61:0.35:0.58:0.25:0.59:0.19"] = 870, -- Kargath, Undercity, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.50:0.66:0.42:0.37:0.37:0.41"] = 532, -- Kargath, Undercity, The Sepulcher + ["0.50:0.66:0.42:0.37:0.46:0.43"] = 565, -- Kargath, Undercity, Tarren Mill + ["0.50:0.66:0.55:0.46:0.46:0.43:0.45:0.37"] = 447, -- Kargath, Hammerfall, Tarren Mill, The Bulwark + ["0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36"] = 479, -- Kargath, Hammerfall, Tarren Mill, Thondoril River + ["0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.62:0.34"] = 551, -- Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.50:0.66:0.42:0.37:0.51:0.36"] = 582, -- Kargath, Undercity, Thondoril River + ["0.50:0.66:0.42:0.37:0.45:0.37"] = 517, -- Kargath, Undercity, The Bulwark + ["0.50:0.66:0.42:0.37:0.59:0.45"] = 706, -- Kargath, Undercity, Revantusk Village + ["0.50:0.66:0.42:0.37:0.51:0.36:0.61:0.35"] = 677, -- Kargath, Undercity, Thondoril River, Light's Hope Chapel + + -- Horde: Light's Hope Chapel (Eastern Plaguelands) + ["0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 789, -- Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 730, -- Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 716, -- Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.50:0.69"] = 560, -- Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Flame Crest + ["0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 492, -- Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath + ["0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.46:0.65"] = 548, -- Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Thorium Point + ["0.61:0.35:0.59:0.45:0.55:0.46"] = 234, -- Light's Hope Chapel, Revantusk Village, Hammerfall + ["0.61:0.35:0.59:0.45"] = 141, -- Light's Hope Chapel, Revantusk Village + ["0.61:0.35:0.58:0.25"] = 118, -- Light's Hope Chapel, Tranquillien + ["0.61:0.35:0.58:0.25:0.59:0.19"] = 186, -- Light's Hope Chapel, Tranquillien, Silvermoon City (was 184, changed to 190 by GurnsyTV on CurseForge, changed to 186 by Jon Kipp Lauesen) + ["0.61:0.35:0.59:0.45:0.46:0.43"] = 301, -- Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.61:0.35:0.42:0.37"] = 262, -- Light's Hope Chapel, Undercity + ["0.61:0.35:0.42:0.37:0.37:0.41"] = 294, -- Light's Hope Chapel, Undercity, The Sepulcher + ["0.61:0.35:0.42:0.37:0.46:0.43"] = 326, -- Light's Hope Chapel, Undercity, Tarren Mill + ["0.61:0.35:0.42:0.37:0.46:0.43:0.55:0.46"] = 444, -- Light's Hope Chapel, Undercity, Tarren Mill, Hammerfall (was 262, changed by B R) + ["0.61:0.35:0.61:0.28"] = 98, -- Light's Hope Chapel, Zul'Aman + ["0.61:0.35:0.42:0.37:0.50:0.66"] = 673, -- Light's Hope Chapel, Undercity, Kargath + ["0.61:0.35:0.61:0.28:0.58:0.06"] = 344, -- Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.61:0.35:0.42:0.37:0.50:0.66:0.42:0.86"] = 911, -- Light's Hope Chapel, Undercity, Kargath, Grom'gol + ["0.61:0.35:0.42:0.37:0.50:0.66:0.50:0.69"] = 740, -- Light's Hope Chapel, Undercity, Kargath, Flame Crest + ["0.61:0.35:0.58:0.25:0.59:0.19:0.58:0.06"] = 368, -- Light's Hope Chapel, Tranquillien, Silvermoon City, Shattered Sun Staging Area + ["0.61:0.35:0.42:0.37:0.50:0.66:0.46:0.65"] = 729, -- Light's Hope Chapel, Undercity, Kargath, Thorium Point + ["0.61:0.35:0.42:0.37:0.50:0.66:0.41:0.93"] = 970, -- Light's Hope Chapel, Undercity, Kargath, Booty Bay + ["0.61:0.35:0.42:0.37:0.50:0.66:0.54:0.79"] = 896, -- Light's Hope Chapel, Undercity, Kargath, Stonard + ["0.61:0.35:0.42:0.37:0.45:0.37"] = 280, -- Light's Hope Chapel, Undercity, The Bulwark + ["0.61:0.35:0.51:0.36:0.45:0.37"] = 174, -- Light's Hope Chapel, Thondroril River, The Bulwark + ["0.61:0.35:0.51:0.36"] = 99, -- Light's Hope Chapel, Thondroril River + ["0.61:0.35:0.62:0.34"] = 65, -- Light's Hope Chapel, Acherus: The Ebon Hold + ["0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.46:0.65"] = 629, -- Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall, Kargath, Thorium Point + ["0.61:0.35:0.51:0.36:0.46:0.43:0.37:0.41"] = 302, -- Light's Hope Chapel, Thondoril River, Tarren Mill, The Sepulcher + ["0.61:0.35:0.51:0.36:0.42:0.37:0.50:0.66"] = 677, -- Light's Hope Chapel, Thondoril River, Undercity, Kargath + ["0.61:0.35:0.51:0.36:0.46:0.43"] = 198, -- Light's Hope Chapel, Thondoril River, Tarren Mill + ["0.61:0.35:0.61:0.28:0.58:0.06:0.59:0.19"] = 509, -- Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area, Silvermoon City + ["0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46"] = 316, -- Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall + ["0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.41:0.93"] = 871, -- Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall, Kargath, Booty Bay + ["0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.54:0.79"] = 798, -- Часовня Последней Надежды, Река Тондрорил, Мельница Таррен, Павший Молот, Каргат, Каменор + ["0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.50:0.69"] = 641, -- Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall, Kargath, Flame Crest + + -- Horde: Revantusk Village (The Hinterlands) + ["0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 648, -- Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 589, -- Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 575, -- Revantusk Village, Hammerfall, Kargath, Stonard + ["0.59:0.45:0.55:0.46:0.50:0.66:0.50:0.69"] = 419, -- Revantusk Village, Hammerfall, Kargath, Flame Crest + ["0.59:0.45:0.55:0.46:0.50:0.66"] = 351, -- Revantusk Village, Hammerfall, Kargath + ["0.59:0.45:0.55:0.46:0.50:0.66:0.46:0.65"] = 407, -- Revantusk Village, Hammerfall, Kargath, Thorium Point + ["0.59:0.45:0.46:0.43:0.37:0.41"] = 257, -- Revantusk Village, Tarren Mill, The Sepulcher + ["0.59:0.45:0.42:0.37"] = 284, -- Revantusk Village, Undercity + ["0.59:0.45:0.46:0.43"] = 159, -- Revantusk Village, Tarren Mill + ["0.59:0.45:0.55:0.46"] = 93, -- Revantusk Village, Hammerfall + ["0.59:0.45:0.61:0.35"] = 139, -- Revantusk Village, Light's Hope Chapel + ["0.59:0.45:0.61:0.35:0.58:0.25"] = 255, -- Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 322, -- Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.59:0.45:0.42:0.37:0.50:0.66:0.41:0.93"] = 993, -- Revantusk Village, Undercity, Kargath, Booty Bay + ["0.59:0.45:0.61:0.35:0.61:0.28"] = 232, -- Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 481, -- Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.59:0.45:0.42:0.37:0.50:0.66:0.46:0.65"] = 752, -- Revantusk Village, Undercity, Kargath, Thorium Point + ["0.59:0.45:0.42:0.37:0.50:0.66:0.54:0.79"] = 920, -- Revantusk Village, Undercity, Kargath, Stonard + ["0.59:0.45:0.46:0.43:0.45:0.37"] = 228, -- Revantusk Village, Tarren Mill, The Bulwark + ["0.59:0.45:0.61:0.35:0.51:0.36"] = 236, -- Revantusk Village, Light's Hope Chapel, Thondroril River + ["0.59:0.45:0.61:0.35:0.62:0.34"] = 200, -- Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.59:0.45:0.42:0.37:0.50:0.66"] = 697, -- Revantusk Village, Undercity, Kargath + ["0.59:0.45:0.46:0.43:0.51:0.36"] = 260, -- Poblado Sañadiente, Molino Tarren, Río Thondroril + ["0.59:0.45:0.42:0.37:0.45:0.37"] = 303, -- Revantusk Village, Undercity, The Bulwark + + -- Horde: Shattered Sun Staging Area (Isle of Quel'Danas) + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 1117, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 1058, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.58:0.06:0.61:0.28"] = 233, -- Shattered Sun Staging Area, Zul'Aman + ["0.58:0.06:0.59:0.19"] = 167, -- Shattered Sun Staging Area, Silvermoon City + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.46:0.65"] = 876, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Thorium Point + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 1044, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45"] = 469, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 820, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.50:0.69"] = 888, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Flame Crest + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46"] = 562, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall + ["0.58:0.06:0.61:0.28:0.61:0.35"] = 329, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel + ["0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.46:0.43"] = 629, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.58:0.06:0.59:0.19:0.58:0.25"] = 231, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien + ["0.58:0.06:0.61:0.28:0.61:0.35:0.42:0.37"] = 590, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Undercity + ["0.58:0.06:0.61:0.28:0.61:0.35:0.42:0.37:0.37:0.41"] = 623, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Undercity, The Sepulcher + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 1129, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37"] = 602, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 1060, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.58:0.06:0.61:0.28:0.61:0.35:0.51:0.36:0.45:0.37"] = 504, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Thondroril River, The Bulwark + ["0.58:0.06:0.61:0.28:0.61:0.35:0.51:0.36"] = 427, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Thondroril River + ["0.58:0.06:0.61:0.28:0.61:0.35:0.62:0.34"] = 394, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.46:0.43"] = 641, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35"] = 346, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.54:0.79"] = 1139, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall, Kargath, Stonard + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37:0.45:0.37"] = 622, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity, The Bulwark + ["0.58:0.06:0.61:0.28:0.61:0.35:0.51:0.36:0.42:0.37"] = 588, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Thondoril River, Undercity + ["0.58:0.06:0.61:0.28:0.61:0.35:0.42:0.37:0.45:0.37"] = 609, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Undercity, The Bulwark + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 1072, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.42:0.37"] = 600, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Undercity + ["0.58:0.06:0.61:0.28:0.61:0.35:0.42:0.37:0.50:0.66:0.42:0.86"] = 1242, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Undercity, Kargath, Grom'gol + ["0.58:0.06:0.61:0.28:0.61:0.35:0.42:0.37:0.50:0.66:0.41:0.93"] = 1300, -- Sammelpunkt der Zerschmetterten Sonne, Zul'Aman, Kapelle des hoffnungsvollen Lichts, Unterstadt, Kargath, Beutebucht + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37:0.50:0.66:0.41:0.93"] = 1313, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity, Kargath, Booty Bay + ["0.58:0.06:0.61:0.28:0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.41:0.93"] = 1203, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall, Kargath, Booty Bay + ["0.58:0.06:0.61:0.28:0.61:0.35:0.51:0.36:0.46:0.43"] = 526, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Thondoril River, Tarren Mill + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.46:0.43:0.37:0.41"] = 642, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Tarren Mill, The Sepulcher + ["0.58:0.06:0.61:0.28:0.61:0.35:0.51:0.36:0.46:0.43:0.37:0.41"] = 629, -- Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Thondoril River, Tarren Mill, The Sepulcher + ["0.58:0.06:0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 833, -- Shattered Sun Staging Area, Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath + + -- Horde: Silvermoon City (Eversong Woods) + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 963, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 904, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 890, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.50:0.69"] = 733, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Flame Crest + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 667, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.46:0.65"] = 722, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Thorium Point + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46"] = 408, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45"] = 316, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village + ["0.59:0.19:0.58:0.25:0.61:0.35"] = 179, -- Silvermoon City, Tranquillien, Light's Hope Chapel + ["0.59:0.19:0.58:0.25"] = 65, -- Silvermoon City, Tranquillien + ["0.59:0.19:0.58:0.25:0.61:0.35:0.59:0.45:0.46:0.43"] = 475, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37"] = 437, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity + ["0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37:0.37:0.41"] = 469, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity, The Sepulcher + ["0.59:0.19:0.58:0.25:0.61:0.28"] = 111, -- Silvermoon City, Tranquillien, Zul'Aman + ["0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37:0.46:0.43:0.55:0.46"] = 619, -- Silbermond, Tristessa, Kapelle des hoffnungsvollen Lichts, Unterstadt, Tarrens Mühle, Hammerfall + ["0.59:0.19:0.58:0.06"] = 185, -- Silvermoon City, Shattered Sun Staging Area + ["0.59:0.19:0.58:0.06:0.61:0.28"] = 415, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman + ["0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37:0.50:0.66:0.54:0.79"] = 1071, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity, Kargath, Stonard + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 1240, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37:0.45:0.37"] = 456, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity, The Bulwark + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36"] = 276, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Thondroril River + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.45:0.37"] = 351, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Thondroril River, The Bulwark + ["0.59:0.19:0.58:0.25:0.61:0.35:0.62:0.34"] = 240, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.46:0.43"] = 375, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Tarren Mill + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.42:0.37"] = 435, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Undercity + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35"] = 522, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel (Tomas Nilsson reported 512) + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.41:0.93"] = 1046, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall, Kargath, Booty Bay + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.42:0.37"] = 772, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Undercity + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 1300, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.42:0.37:0.37:0.41"] = 809, -- Silbermond, Sammelpunkt der Zerschmetterten Sonne, Zul'Aman, Kapelle des hoffnungsvollen Lichts, Unterstadt, Das Grabmal + ["0.59:0.19:0.58:0.25:0.61:0.35:0.42:0.37:0.46:0.43"] = 513, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Undercity, Tarren Mill + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.46:0.43:0.37:0.41"] = 478, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Tarren Mill, The Sepulcher + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46"] = 745, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.51:0.36:0.46:0.43"] = 714, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Thondoril River, Tarren Mill + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 1228, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.46:0.43"] = 812, -- Silvermoon City, Shattered Sun Staging Area, Zul'Aman, Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.59:0.19:0.58:0.06:0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 1003, -- Silbermond, Sammelpunkt der Zerschmetterten Sonne, Zul'Aman, Kapelle des hoffnungsvollen Lichts, Dorf der Bruchhauer, Hammerfall, Kargath + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.42:0.37:0.50:0.66"] = 855, -- Луносвет, Транквиллион, Часовня Последней Надежды, Река Тондрорил, Подгород, Каргат + ["0.59:0.19:0.58:0.25:0.61:0.35:0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.42:0.86"] = 988, -- Silvermoon City, Tranquillien, Light's Hope Chapel, Thondoril River, Tarren Mill, Hammerfall, Kargath, Grom'gol + + -- Horde: Stonard (Swamp of Sorrows) + ["0.54:0.79:0.41:0.93"] = 230, -- Stonard, Booty Bay + ["0.54:0.79:0.42:0.86"] = 179, -- Stonard, Grom'gol + ["0.54:0.79:0.50:0.69"] = 176, -- Stonard, Flame Crest + ["0.54:0.79:0.50:0.66"] = 231, -- Stonard, Kargath + ["0.54:0.79:0.50:0.69:0.46:0.65"] = 208, -- Stonard, Flame Crest, Thorium Point + ["0.54:0.79:0.50:0.66:0.55:0.46:0.46:0.43:0.37:0.41"] = 707, -- Stonard, Kargath, Hammerfall, Tarren Mill, The Sepulcher + ["0.54:0.79:0.50:0.66:0.42:0.37"] = 728, -- Stonard, Kargath, Undercity + ["0.54:0.79:0.50:0.66:0.55:0.46:0.46:0.43"] = 608, -- Stonard, Kargath, Hammerfall, Tarren Mill + ["0.54:0.79:0.50:0.66:0.55:0.46"] = 493, -- Stonard, Kargath, Hammerfall + ["0.54:0.79:0.50:0.66:0.55:0.46:0.59:0.45"] = 582, -- Stonard, Kargath, Hammerfall, Revantusk Village + ["0.54:0.79:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35"] = 720, -- Stonard, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel + ["0.54:0.79:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25"] = 836, -- Stonard, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.54:0.79:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 903, -- Stonard, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.54:0.79:0.50:0.66:0.46:0.65"] = 287, -- Stonard, Kargath, Thorium Point + ["0.54:0.79:0.50:0.66:0.42:0.37:0.61:0.35"] = 917, -- Stonard, Kargath, Undercity, Light's Hope Chapel + ["0.54:0.79:0.50:0.66:0.42:0.37:0.46:0.43"] = 795, -- Stonard, Kargath, Undercity, Tarren Mill + ["0.54:0.79:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28"] = 814, -- Stonard, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.54:0.79:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 1062, -- Stonard, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.54:0.79:0.50:0.66:0.42:0.37:0.37:0.41"] = 762, -- Stonard, Kargath, Undercity, The Sepulcher + ["0.54:0.79:0.50:0.66:0.55:0.46:0.46:0.43:0.45:0.37"] = 677, -- Stonard, Kargath, Hammerfall, Tarren Mill, The Bulwark + ["0.54:0.79:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36"] = 708, -- Stonard, Kargath, Hammerfall, Tarren Mill, Thondoril River + ["0.54:0.79:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.62:0.34"] = 781, -- Stonard, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.54:0.79:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36:0.61:0.35"] = 804, -- Stonard, Kargath, Hammerfall, Tarren Mill, Thondoril River, Light's Hope Chapel + ["0.54:0.79:0.50:0.66:0.42:0.37:0.61:0.35:0.58:0.25:0.59:0.19"] = 1100, -- Stonard, Kargath, Undercity, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.54:0.79:0.50:0.66:0.42:0.37:0.59:0.45"] = 936, -- Stonard, Kargath, Undercity, Revantusk Village + + -- Horde: Tarren Mill (Hillsbrad Foothills) + ["0.46:0.43:0.55:0.46:0.50:0.66:0.41:0.93"] = 673, -- Tarren Mill, Hammerfall, Kargath, Booty Bay + ["0.46:0.43:0.55:0.46:0.50:0.66:0.42:0.86"] = 614, -- Tarren Mill, Hammerfall, Kargath, Grom'gol + ["0.46:0.43:0.55:0.46:0.50:0.66:0.54:0.79"] = 600, -- Tarren Mill, Hammerfall, Kargath, Stonard + ["0.46:0.43:0.55:0.46:0.50:0.66:0.50:0.69"] = 443, -- Tarren Mill, Hammerfall, Kargath, Flame Crest + ["0.46:0.43:0.55:0.46:0.50:0.66"] = 377, -- Tarren Mill, Hammerfall, Kargath + ["0.46:0.43:0.55:0.46:0.50:0.66:0.46:0.65"] = 432, -- Tarren Mill, Hammerfall, Kargath, Thorium Point + ["0.46:0.43:0.55:0.46"] = 118, -- Tarren Mill, Hammerfall + ["0.46:0.43:0.59:0.45"] = 160, -- Tarren Mill, Revantusk Village + ["0.46:0.43:0.59:0.45:0.61:0.35"] = 299, -- Tarren Mill, Revantusk Village, Light's Hope Chapel + ["0.46:0.43:0.59:0.45:0.61:0.35:0.58:0.25"] = 415, -- Tarren Mill, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.46:0.43:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 481, -- Tarren Mill, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.46:0.43:0.42:0.37"] = 139, -- Tarren Mill, Undercity + ["0.46:0.43:0.37:0.41"] = 99, -- Tarren Mill, The Sepulcher + ["0.46:0.43:0.42:0.37:0.61:0.35"] = 325, -- Tarren Mill, Undercity, Light's Hope Chapel + ["0.46:0.43:0.42:0.37:0.61:0.35:0.61:0.28"] = 416, -- Tarren Mill, Undercity, Light's Hope Chapel, Zul'Aman + ["0.46:0.43:0.59:0.45:0.61:0.35:0.61:0.28"] = 393, -- Tarren Mill, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.46:0.43:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 640, -- Tarren Mill, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.46:0.43:0.42:0.37:0.50:0.66:0.42:0.86"] = 787, -- Tarren Mill, Undercity, Kargath, Grom'gol + ["0.46:0.43:0.42:0.37:0.50:0.66"] = 550, -- Tarren Mill, Undercity, Kargath + ["0.46:0.43:0.42:0.37:0.50:0.66:0.54:0.79"] = 773, -- Tarren Mill, Undercity, Kargath, Stonard + ["0.46:0.43:0.45:0.37"] = 69, -- Tarren Mill, The Bulwark + ["0.46:0.43:0.51:0.36"] = 101, -- Tarren Mill, Thondroril River + ["0.46:0.43:0.51:0.36:0.61:0.35:0.62:0.34"] = 257, -- Tarren Mill, Thondoril River, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.46:0.43:0.51:0.36:0.61:0.35"] = 196, -- Tarren Mill, Thondoril River, Light's Hope Chapel + ["0.46:0.43:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06:0.59:0.19"] = 804, -- Tarren Mill, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area, Silvermoon City + ["0.46:0.43:0.42:0.37:0.50:0.66:0.50:0.69"] = 617, -- Tarren Mill, Undercity, Kargath, Flame Crest + ["0.46:0.43:0.51:0.36:0.61:0.35:0.58:0.25:0.59:0.19"] = 380, -- Tarren Mill, Thondoril River, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.46:0.43:0.51:0.36:0.61:0.35:0.58:0.25"] = 312, -- Tarren Mill, Thondoril River, Light's Hope Chapel, Tranquillien + ["0.46:0.43:0.51:0.36:0.61:0.35:0.61:0.28"] = 291, -- Tarren Mill, Thondoril River, Light's Hope Chapel, Zul'Aman + ["0.46:0.43:0.42:0.37:0.50:0.66:0.41:0.93"] = 847, -- Tarren Mill, Undercity, Kargath, Booty Bay + + -- Horde: The Bulwark (Tirisfal Glades) + ["0.45:0.37:0.42:0.37:0.61:0.35:0.58:0.25"] = 400, -- The Bulwark, Undercity, Light's Hope Chapel, Tranquillien + ["0.45:0.37:0.42:0.37:0.61:0.35:0.58:0.25:0.59:0.19"] = 466, -- The Bulwark, Undercity, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.45:0.37:0.51:0.36:0.61:0.35:0.61:0.28:0.58:0.06"] = 505, -- The Bulwark, Thondroril River, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.45:0.37:0.46:0.43:0.37:0.41"] = 177, -- The Bulwark, Tarren Mill, The Sepulcher + ["0.45:0.37:0.42:0.37"] = 90, -- The Bulwark, Undercity + ["0.45:0.37:0.42:0.37:0.61:0.35"] = 283, -- The Bulwark, Undercity, Light's Hope Chapel + ["0.45:0.37:0.46:0.43"] = 74, -- The Bulwark, Tarren Mill + ["0.45:0.37:0.46:0.43:0.55:0.46"] = 191, -- The Bulwark, Tarren Mill, Hammerfall + ["0.45:0.37:0.46:0.43:0.59:0.45"] = 233, -- The Bulwark, Tarren Mill, Revantusk Village + ["0.45:0.37:0.46:0.43:0.55:0.46:0.50:0.66:0.46:0.65"] = 505, -- The Bulwark, Tarren Mill, Hammerfall, Kargath, Thorium Point + ["0.45:0.37:0.46:0.43:0.55:0.46:0.50:0.66"] = 449, -- The Bulwark, Tarren Mill, Hammerfall, Kargath + ["0.45:0.37:0.46:0.43:0.55:0.46:0.50:0.66:0.50:0.69"] = 516, -- The Bulwark, Tarren Mill, Hammerfall, Kargath, Flame Crest + ["0.45:0.37:0.46:0.43:0.55:0.46:0.50:0.66:0.41:0.93"] = 745, -- The Bulwark, Tarren Mill, Hammerfall, Kargath, Booty Bay + ["0.45:0.37:0.46:0.43:0.55:0.46:0.50:0.66:0.42:0.86"] = 686, -- The Bulwark, Tarren Mill, Hammerfall, Kargath, Grom'gol + ["0.45:0.37:0.46:0.43:0.55:0.46:0.50:0.66:0.54:0.79"] = 672, -- The Bulwark, Tarren Mill, Hammerfall, Kargath, Stonard + ["0.45:0.37:0.51:0.36"] = 68, -- The Bulwark, Thondroril River + ["0.45:0.37:0.51:0.36:0.61:0.35"] = 164, -- The Bulwark, Thondroril River, Light's Hope Chapel + ["0.45:0.37:0.51:0.36:0.61:0.35:0.58:0.25"] = 281, -- The Bulwark, Thondroril River, Light's Hope Chapel, Tranquillien + ["0.45:0.37:0.51:0.36:0.61:0.35:0.58:0.25:0.59:0.19"] = 348, -- The Bulwark, Thondroril River, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.45:0.37:0.51:0.36:0.61:0.35:0.61:0.28"] = 257, -- The Bulwark, Thondroril River, Light's Hope Chapel, Zul'Aman + ["0.45:0.37:0.51:0.36:0.61:0.35:0.62:0.34"] = 224, -- The Bulwark, Thondoril River, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.45:0.37:0.42:0.37:0.37:0.41"] = 128, -- The Bulwark, Undercity, The Sepulcher + ["0.45:0.37:0.42:0.37:0.50:0.66"] = 507, -- The Bulwark, Undercity, Kargath + ["0.45:0.37:0.42:0.37:0.50:0.66:0.54:0.79"] = 731, -- The Bulwark, Undercity, Kargath, Stonard + ["0.45:0.37:0.42:0.37:0.61:0.35:0.61:0.28:0.58:0.06:0.59:0.19"] = 791, -- The Bulwark, Undercity, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area, Silvermoon City + ["0.45:0.37:0.42:0.37:0.59:0.45"] = 302, -- The Bulwark, Undercity, Revantusk Village + ["0.45:0.37:0.51:0.36:0.61:0.35:0.58:0.25:0.59:0.19:0.58:0.06"] = 529, -- The Bulwark, Thondoril River, Light's Hope Chapel, Tranquillien, Silvermoon City, Shattered Sun Staging Area + + -- Horde: The Sepulcher (Silverpine Forest) + ["0.37:0.41:0.46:0.43:0.55:0.46:0.50:0.66:0.41:0.93"] = 767, -- The Sepulcher, Tarren Mill, Hammerfall, Kargath, Booty Bay + ["0.37:0.41:0.46:0.43:0.55:0.46:0.50:0.66:0.42:0.86"] = 708, -- The Sepulcher, Tarren Mill, Hammerfall, Kargath, Grom'gol + ["0.37:0.41:0.46:0.43:0.55:0.46:0.50:0.66:0.54:0.79"] = 695, -- The Sepulcher, Tarren Mill, Hammerfall, Kargath, Stonard + ["0.37:0.41:0.46:0.43:0.55:0.46:0.50:0.66:0.50:0.69"] = 538, -- The Sepulcher, Tarren Mill, Hammerfall, Kargath, Flame Crest + ["0.37:0.41:0.46:0.43:0.55:0.46:0.50:0.66"] = 471, -- The Sepulcher, Tarren Mill, Hammerfall, Kargath + ["0.37:0.41:0.46:0.43:0.55:0.46:0.50:0.66:0.46:0.65"] = 526, -- The Sepulcher, Tarren Mill, Hammerfall, Kargath, Thorium Point + ["0.37:0.41:0.46:0.43:0.55:0.46"] = 212, -- The Sepulcher, Tarren Mill, Hammerfall + ["0.37:0.41:0.46:0.43:0.59:0.45"] = 255, -- The Sepulcher, Tarren Mill, Revantusk Village + ["0.37:0.41:0.42:0.37:0.61:0.35"] = 299, -- The Sepulcher, Undercity, Light's Hope Chapel + ["0.37:0.41:0.42:0.37:0.61:0.35:0.58:0.25"] = 415, -- The Sepulcher, Undercity, Light's Hope Chapel, Tranquillien + ["0.37:0.41:0.42:0.37:0.61:0.35:0.58:0.25:0.59:0.19"] = 483, -- The Sepulcher, Undercity, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.37:0.41:0.42:0.37"] = 112, -- The Sepulcher, Undercity + ["0.37:0.41:0.46:0.43"] = 95, -- The Sepulcher, Tarren Mill + ["0.37:0.41:0.42:0.37:0.61:0.35:0.61:0.28"] = 392, -- The Sepulcher, Undercity, Light's Hope Chapel, Zul'Aman + ["0.37:0.41:0.42:0.37:0.61:0.35:0.61:0.28:0.58:0.06"] = 639, -- The Sepulcher, Undercity, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.37:0.41:0.46:0.43:0.45:0.37"] = 164, -- The Sepulcher, Tarren Mill, The Bulwark + ["0.37:0.41:0.46:0.43:0.51:0.36"] = 196, -- The Sepulcher, Tarren Mill, Thondroril River + ["0.37:0.41:0.46:0.43:0.51:0.36:0.61:0.35:0.62:0.34"] = 352, -- The Sepulcher, Tarren Mill, Thondoril River, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.37:0.41:0.42:0.37:0.45:0.37"] = 130, -- The Sepulcher, Undercity, The Bulwark + ["0.37:0.41:0.46:0.43:0.51:0.36:0.61:0.35"] = 292, -- The Sepulcher, Tarren Mill, Thondoril River, Light's Hope Chapel + ["0.37:0.41:0.46:0.43:0.51:0.36:0.61:0.35:0.61:0.28"] = 386, -- The Sepulcher, Tarren Mill, Thondoril River, Light's Hope Chapel, Zul'Aman + ["0.37:0.41:0.46:0.43:0.51:0.36:0.61:0.35:0.58:0.25"] = 407, -- Le Sépulcre, Moulin-de-Tarren, La Thondroril, Chapelle de l'Espoir de Lumière, Tranquillien + + -- Horde: Thondroril River (Western Plaguelands) + ["0.51:0.36:0.61:0.35:0.58:0.25:0.59:0.19"] = 280, -- Thondroril River, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.51:0.36:0.45:0.37"] = 76, -- Thondroril River, The Bulwark + ["0.51:0.36:0.61:0.35:0.61:0.28:0.58:0.06"] = 438, -- Thondroril River, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.51:0.36:0.61:0.35"] = 96, -- Thondroril River, Light's Hope Chapel + ["0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.42:0.86"] = 714, -- Thondroril River, Tarren Mill, Hammerfall, Kargath, Grom'gol + ["0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.41:0.93"] = 773, -- Thondroril River, Tarren Mill, Hammerfall, Kargath, Booty Bay + ["0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.50:0.69"] = 543, -- Thondroril River, Tarren Mill, Hammerfall, Kargath, Flame Crest + ["0.51:0.36:0.61:0.35:0.61:0.28"] = 190, -- Thondroril River, Light's Hope Chapel, Zul'Aman + ["0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.46:0.65"] = 531, -- Thondroril River, Tarren Mill, Hammerfall, Kargath, Thorium Point + ["0.51:0.36:0.42:0.37"] = 160, -- Thondroril River, Undercity + ["0.51:0.36:0.46:0.43:0.37:0.41"] = 204, -- Thondroril River, Tarren Mill, The Sepulcher + ["0.51:0.36:0.46:0.43"] = 101, -- Thondroril River, Tarren Mill + ["0.51:0.36:0.61:0.35:0.59:0.45"] = 234, -- Thondroril River, Light's Hope Chapel, Revantusk Village + ["0.51:0.36:0.61:0.35:0.58:0.25"] = 214, -- Thondroril River, Light's Hope Chapel, Tranquillien + ["0.51:0.36:0.46:0.43:0.55:0.46"] = 218, -- Thondroril River, Tarren Mill, Hammerfall + ["0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66:0.54:0.79"] = 700, -- Thondroril River, Tarren Mill, Hammerfall, Kargath, Stonard + ["0.51:0.36:0.46:0.43:0.55:0.46:0.50:0.66"] = 476, -- Thondroril River, Tarren Mill, Hammerfall, Kargath + ["0.51:0.36:0.61:0.35:0.62:0.34"] = 156, -- Thondoril River, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.51:0.36:0.46:0.43:0.59:0.45"] = 260, -- Thondoril River, Tarren Mill, Revantusk Village + ["0.51:0.36:0.42:0.37:0.37:0.41"] = 199, -- Thondroril, Unterstadt, Das Grabmal + + -- Horde: Thorium Point (Searing Gorge) + ["0.46:0.65:0.50:0.69:0.42:0.86:0.41:0.93"] = 312, -- Thorium Point, Flame Crest, Grom'gol, Booty Bay + ["0.46:0.65:0.50:0.69:0.42:0.86"] = 234, -- Thorium Point, Flame Crest, Grom'gol + ["0.46:0.65:0.50:0.69:0.54:0.79"] = 218, -- Thorium Point, Flame Crest, Stonard + ["0.46:0.65:0.50:0.69"] = 61, -- Thorium Point, Flame Crest + ["0.46:0.65:0.50:0.66"] = 70, -- Thorium Point, Kargath + ["0.46:0.65:0.50:0.66:0.55:0.46:0.46:0.43:0.37:0.41"] = 545, -- Thorium Point, Kargath, Hammerfall, Tarren Mill, The Sepulcher + ["0.46:0.65:0.50:0.66:0.42:0.37"] = 566, -- Thorium Point, Kargath, Undercity + ["0.46:0.65:0.50:0.66:0.55:0.46:0.46:0.43"] = 446, -- Thorium Point, Kargath, Hammerfall, Tarren Mill + ["0.46:0.65:0.50:0.66:0.55:0.46"] = 332, -- Thorium Point, Kargath, Hammerfall + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45"] = 420, -- Thorium Point, Kargath, Hammerfall, Revantusk Village + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35"] = 559, -- Thorium Point, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25"] = 674, -- Thorium Point, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19"] = 741, -- Thorium Point, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.46:0.65:0.50:0.66:0.42:0.86"] = 307, -- Thorium Point, Kargath, Grom'gol + ["0.46:0.65:0.50:0.66:0.54:0.79"] = 294, -- Thorium Point, Kargath, Stonard + ["0.46:0.65:0.50:0.66:0.41:0.93"] = 366, -- Thorium Point, Kargath, Booty Bay + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28"] = 652, -- Thorium Point, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.61:0.28:0.58:0.06"] = 900, -- Thorium Point, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.46:0.65:0.50:0.66:0.42:0.37:0.59:0.45"] = 775, -- Thorium Point, Kargath, Undercity, Revantusk Village + ["0.46:0.65:0.50:0.66:0.55:0.46:0.46:0.43:0.45:0.37"] = 515, -- Thorium Point, Kargath, Hammerfall, Tarren Mill, The Bulwark + ["0.46:0.65:0.50:0.66:0.55:0.46:0.46:0.43:0.51:0.36"] = 547, -- Thorium Point, Kargath, Hammerfall, Tarren Mill, Thondroril River + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.62:0.34"] = 619, -- Thorium Point, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.46:0.65:0.50:0.66:0.55:0.46:0.59:0.45:0.61:0.35:0.58:0.25:0.59:0.19:0.58:0.06"] = 925, -- Thorium Point, Kargath, Hammerfall, Revantusk Village, Light's Hope Chapel, Tranquillien, Silvermoon City, Shattered Sun Staging Area + ["0.46:0.65:0.50:0.66:0.42:0.37:0.46:0.43"] = 636, -- Thorium Point, Kargath, Undercity, Tarren Mill + + -- Horde: Tranquillien (Ghostlands) + ["0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 900, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 841, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 827, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.50:0.69"] = 671, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Flame Crest + ["0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 604, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath + ["0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.46:0.65"] = 659, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Thorium Point + ["0.58:0.25:0.61:0.35:0.59:0.45:0.55:0.46"] = 345, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Hammerfall + ["0.58:0.25:0.61:0.35:0.59:0.45"] = 253, -- Tranquillien, Light's Hope Chapel, Revantusk Village + ["0.58:0.25:0.61:0.35"] = 116, -- Tranquillien, Light's Hope Chapel + ["0.58:0.25:0.59:0.19"] = 74, -- Tranquillien, Silvermoon City + ["0.58:0.25:0.61:0.35:0.42:0.37"] = 373, -- Tranquillien, Light's Hope Chapel, Undercity + ["0.58:0.25:0.61:0.35:0.42:0.37:0.37:0.41"] = 406, -- Tranquillien, Light's Hope Chapel, Undercity, The Sepulcher + ["0.58:0.25:0.61:0.35:0.59:0.45:0.46:0.43"] = 412, -- Tranquillien, Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.58:0.25:0.61:0.28"] = 52, -- Tranquillien, Zul'Aman + ["0.58:0.25:0.59:0.19:0.58:0.06"] = 257, -- Tranquillien, Silvermoon City, Shattered Sun Staging Area + ["0.58:0.25:0.61:0.35:0.42:0.37:0.46:0.43:0.55:0.46"] = 556, -- Tranquillien, Light's Hope Chapel, Undercity, Tarren Mill, Hammerfall + ["0.58:0.25:0.61:0.35:0.42:0.37:0.45:0.37"] = 393, -- Tranquillien, Light's Hope Chapel, Undercity, The Bulwark + ["0.58:0.25:0.61:0.35:0.51:0.36:0.45:0.37"] = 288, -- Tranquillien, Light's Hope Chapel, Thondroril River, The Bulwark + ["0.58:0.25:0.61:0.35:0.51:0.36"] = 213, -- Tranquillien, Light's Hope Chapel, Thondroril River + ["0.58:0.25:0.61:0.35:0.62:0.34"] = 177, -- Tranquillien, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.58:0.25:0.61:0.35:0.51:0.36:0.42:0.37"] = 372, -- Tranquillien, Light's Hope Chapel, Thondoril River, Undercity + ["0.58:0.25:0.61:0.35:0.51:0.36:0.46:0.43"] = 312, -- Tranquillien, Light's Hope Chapel, Thondoril River, Tarren Mill + ["0.58:0.25:0.61:0.35:0.51:0.36:0.42:0.37:0.37:0.41"] = 413, -- Tranquillien, Light's Hope Chapel, Thondoril River, Undercity, The Sepulcher + + -- Horde: Undercity (Tirisfal Glades) + ["0.42:0.37:0.50:0.66:0.41:0.93"] = 785, -- Undercity, Kargath, Booty Bay + ["0.42:0.37:0.50:0.66:0.42:0.86"] = 725, -- Undercity, Kargath, Grom'gol + ["0.42:0.37:0.50:0.66:0.54:0.79"] = 712, -- Undercity, Kargath, Stonard + ["0.42:0.37:0.50:0.66:0.50:0.69"] = 555, -- Undercity, Kargath, Flame Crest + ["0.42:0.37:0.50:0.66"] = 489, -- Undercity, Kargath + ["0.42:0.37:0.50:0.66:0.46:0.65"] = 544, -- Undercity, Kargath, Thorium Point + ["0.42:0.37:0.37:0.41"] = 106, -- Undercity, The Sepulcher + ["0.42:0.37:0.46:0.43"] = 141, -- Undercity, Tarren Mill + ["0.42:0.37:0.55:0.46"] = 301, -- Undercity, Hammerfall + ["0.42:0.37:0.59:0.45"] = 284, -- Undercity, Revantusk Village + ["0.42:0.37:0.61:0.35"] = 261, -- Undercity, Light's Hope Chapel + ["0.42:0.37:0.61:0.35:0.58:0.25"] = 378, -- Undercity, Light's Hope Chapel, Tranquillien + ["0.42:0.37:0.61:0.35:0.58:0.25:0.59:0.19"] = 444, -- Undercity, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.42:0.37:0.61:0.35:0.61:0.28"] = 356, -- Undercity, Light's Hope Chapel, Zul'Aman + ["0.42:0.37:0.61:0.35:0.61:0.28:0.58:0.06"] = 601, -- Undercity, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.42:0.37:0.45:0.37"] = 89, -- Undercity, The Bulwark + ["0.42:0.37:0.51:0.36"] = 153, -- Undercity, Thondroril River + ["0.42:0.37:0.51:0.36:0.61:0.35:0.62:0.34"] = 309, -- Undercity, Thondoril River, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.42:0.37:0.61:0.35:0.62:0.34"] = 318, -- Undercity, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.42:0.37:0.61:0.35:0.58:0.25:0.59:0.19:0.58:0.06"] = 627, -- Undercity, Light's Hope Chapel, Tranquillien, Silvermoon City, Shattered Sun Staging Area + ["0.42:0.37:0.51:0.36:0.61:0.35:0.58:0.25:0.59:0.19"] = 438, -- Undercity, Thondoril River, Light's Hope Chapel, Tranquillien, Silvermoon City + ["0.42:0.37:0.51:0.36:0.61:0.35:0.58:0.25"] = 366, -- Undercity, Thondoril River, Light's Hope Chapel, Tranquillien + ["0.42:0.37:0.51:0.36:0.61:0.35:0.61:0.28"] = 341, -- Undercity, Thondoril River, Light's Hope Chapel, Zul'Aman + ["0.42:0.37:0.51:0.36:0.61:0.35:0.61:0.28:0.58:0.06"] = 588, -- Undercity, Thondoril River, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area + ["0.42:0.37:0.61:0.35:0.61:0.28:0.58:0.06:0.59:0.19"] = 768, -- Undercity, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area, Silvermoon City + + -- Horde: Zul'Aman + ["0.61:0.28:0.58:0.25"] = 52, -- Zul'Aman, Tranquillien + ["0.61:0.28:0.58:0.25:0.59:0.19"] = 118, -- Zul'Aman, Tranquillien, Silvermoon City + ["0.61:0.28:0.61:0.35:0.42:0.37"] = 362, -- Zul'Aman, Light's Hope Chapel, Undercity + ["0.61:0.28:0.61:0.35"] = 102, -- Zul'Aman, Light's Hope Chapel + ["0.61:0.28:0.61:0.35:0.42:0.37:0.37:0.41"] = 395, -- Zul'Aman, Light's Hope Chapel, Undercity, The Sepulcher + ["0.61:0.28:0.61:0.35:0.59:0.45"] = 244, -- Zul'Aman, Light's Hope Chapel, Revantusk Village + ["0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46"] = 335, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall + ["0.61:0.28:0.61:0.35:0.59:0.45:0.46:0.43"] = 401, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Tarren Mill + ["0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.41:0.93"] = 889, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Booty Bay + ["0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.42:0.86"] = 831, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Grom'gol + ["0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.54:0.79"] = 817, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Stonard + ["0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.50:0.69"] = 661, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Flame Crest + ["0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66:0.46:0.65"] = 648, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath, Thorium Point + ["0.61:0.28:0.61:0.35:0.59:0.45:0.55:0.46:0.50:0.66"] = 593, -- Zul'Aman, Light's Hope Chapel, Revantusk Village, Hammerfall, Kargath + ["0.61:0.28:0.58:0.06"] = 252, -- Zul'Aman, Shattered Sun Staging Area + ["0.61:0.28:0.58:0.06:0.59:0.19"] = 416, -- Zul'Aman, Shattered Sun Staging Area, Silvermoon City + ["0.61:0.28:0.61:0.35:0.51:0.36:0.45:0.37"] = 275, -- Zul'Aman, Light's Hope Chapel, Thondroril River, The Bulwark + ["0.61:0.28:0.61:0.35:0.51:0.36"] = 201, -- Zul'Aman, Light's Hope Chapel, Thondroril River + ["0.61:0.28:0.61:0.35:0.62:0.34"] = 166, -- Zul'Aman, Light's Hope Chapel, Acherus: The Ebon Hold + ["0.61:0.28:0.61:0.35:0.51:0.36:0.46:0.43"] = 300, -- Zul'Aman, Light's Hope Chapel, Thondoril River, Tarren Mill + ["0.61:0.28:0.61:0.35:0.51:0.36:0.42:0.37"] = 360, -- Zul'Aman, Light's Hope Chapel, Thondoril River, Undercity + + }, + + -- Horde: Kalimdor + [1414] = { + + -- Horde: Bloodvenom Post (Felwood) + ["0.46:0.30:0.56:0.53:0.55:0.73:0.61:0.80"] = 518, -- Bloodvenom Post, Crossroads, Freewind Post, Gadgetzan + ["0.46:0.30:0.56:0.53:0.44:0.69:0.42:0.79"] = 623, -- Bloodvenom Post, Crossroads, Camp Mojache, Cenarion Hold + ["0.46:0.30:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 619, -- Bloodvenom Post, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.46:0.30:0.56:0.53:0.55:0.73"] = 426, -- Bloodvenom Post, Crossroads, Freewind Post + ["0.46:0.30:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 434, -- Bloodvenom Post, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.46:0.30:0.56:0.53:0.53:0.61:0.57:0.64"] = 373, -- Bloodvenom Post, Crossroads, Camp Taurajo, Brackenwall Village + ["0.46:0.30:0.56:0.53:0.53:0.61"] = 315, -- Bloodvenom Post, Crossroads, Camp Taurajo + ["0.46:0.30:0.56:0.53:0.44:0.69"] = 493, -- Bloodvenom Post, Crossroads, Camp Mojache + ["0.46:0.30:0.41:0.37:0.41:0.47:0.32:0.58"] = 398, -- Bloodvenom Post, Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village + ["0.46:0.30:0.56:0.53:0.45:0.56"] = 347, -- Bloodvenom Post, Crossroads, Thunder Bluff + ["0.46:0.30:0.56:0.53"] = 241, -- Bloodvenom Post, Crossroads + ["0.46:0.30:0.56:0.53:0.61:0.55"] = 292, -- Bloodvenom Post, Crossroads, Ratchet + ["0.46:0.30:0.63:0.44"] = 259, -- Bloodvenom Post, Orgrimmar + ["0.46:0.30:0.50:0.35:0.55:0.42"] = 151, -- Bloodvenom Post, Emerald Sanctuary, Splintertree Post + ["0.46:0.30:0.41:0.37:0.41:0.47"] = 256, -- Bloodvenom Post, Zoram'gar Outpost, Sun Rock Retreat + ["0.46:0.30:0.41:0.37"] = 136, -- Bloodvenom Post, Zoram'gar Outpost + ["0.46:0.30:0.50:0.35"] = 69, -- Bloodvenom Post, Emerald Sanctuary + ["0.46:0.30:0.63:0.36"] = 234, -- Bloodvenom Post, Valormok + ["0.46:0.30:0.64:0.23"] = 190, -- Bloodvenom Post, Everlook + ["0.46:0.30:0.54:0.21"] = 166, -- Bloodvenom Post, Moonglade + ["0.46:0.30:0.41:0.37:0.55:0.42"] = 309, -- Bloodvenom Post, Zoram'gar Outpost, Splintertree Post + ["0.46:0.30:0.56:0.53:0.61:0.55:0.61:0.80"] = 529, -- Bloodvenom Post, Crossroads, Ratchet, Gadgetzan + ["0.46:0.30:0.56:0.53:0.45:0.56:0.32:0.58"] = 507, -- Bloodvenom Post, Crossroads, Thunder Bluff, Shadowprey Village + + -- Horde: Brackenwall Village (Dustwallow Marsh) + ["0.57:0.64:0.61:0.80"] = 205, -- Brackenwall Village, Gadgetzan + ["0.57:0.64:0.55:0.73:0.44:0.69:0.42:0.79"] = 357, -- Brackenwall Village, Freewind Post, Camp Mojache, Cenarion Hold + ["0.57:0.64:0.55:0.73:0.61:0.80:0.50:0.76"] = 298, -- Brackenwall Village, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.57:0.64:0.55:0.73"] = 105, -- Brackenwall Village, Freewind Post + ["0.57:0.64:0.58:0.70"] = 62, -- Brackenwall Village, Mudsprocket + ["0.57:0.64:0.55:0.73:0.44:0.69"] = 227, -- Brackenwall Village, Freewind Post, Camp Mojache + ["0.57:0.64:0.53:0.61"] = 49, -- Brackenwall Village, Camp Taurajo + ["0.57:0.64:0.45:0.56"] = 225, -- Brackenwall Village, Thunder Bluff + ["0.57:0.64:0.53:0.61:0.45:0.56:0.32:0.58"] = 321, -- Brackenwall Village, Camp Taurajo, Thunder Bluff, Shadowprey Village + ["0.57:0.64:0.53:0.61:0.56:0.53:0.41:0.47"] = 276, -- Brackenwall Village, Camp Taurajo, Crossroads, Sun Rock Retreat + ["0.57:0.64:0.56:0.53"] = 162, -- Brackenwall Village, Crossroads + ["0.57:0.64:0.61:0.55"] = 90, -- Brackenwall Village, Ratchet + ["0.57:0.64:0.63:0.44"] = 217, -- Brackenwall Village, Orgrimmar + ["0.57:0.64:0.61:0.55:0.63:0.44:0.55:0.42"] = 273, -- Brackenwall Village, Ratchet, Orgrimmar, Splintertree Post + ["0.57:0.64:0.61:0.55:0.63:0.44:0.63:0.36"] = 279, -- Brackenwall Village, Ratchet, Orgrimmar, Valormok + ["0.57:0.64:0.61:0.55:0.63:0.44:0.55:0.42:0.50:0.35"] = 351, -- Brackenwall Village, Ratchet, Orgrimmar, Splintertree Post, Emerald Sanctuary + ["0.57:0.64:0.53:0.61:0.56:0.53:0.41:0.37"] = 357, -- Brackenwall Village, Camp Taurajo, Crossroads, Zoram'gar Outpost + ["0.57:0.64:0.53:0.61:0.56:0.53:0.46:0.30"] = 380, -- Brackenwall Village, Camp Taurajo, Crossroads, Bloodvenom Post + ["0.57:0.64:0.53:0.61:0.56:0.53:0.46:0.30:0.54:0.21"] = 501, -- Brackenwall Village, Camp Taurajo, Crossroads, Bloodvenom Post, Moonglade + ["0.57:0.64:0.61:0.55:0.63:0.44:0.63:0.36:0.64:0.23"] = 408, -- Brackenwall Village, Ratchet, Orgrimmar, Valormok, Everlook + ["0.57:0.64:0.53:0.61:0.56:0.53:0.44:0.69"] = 379, -- Brackenwall Village, Camp Taurajo, Crossroads, Camp Mojache + + -- Horde: Camp Mojache (The Barrens) + ["0.44:0.69:0.42:0.79"] = 130, -- Camp Mojache, Cenarion Hold + ["0.44:0.69:0.42:0.79:0.50:0.76"] = 222, -- Camp Mojache, Cenarion Hold, Marshal's Refuge + ["0.44:0.69:0.61:0.80"] = 201, -- Camp Mojache, Gadgetzan + ["0.44:0.69:0.55:0.73"] = 107, -- Camp Mojache, Freewind Post + ["0.44:0.69:0.55:0.73:0.58:0.70"] = 176, -- Camp Mojache, Freewind Post, Mudsprocket + ["0.44:0.69:0.55:0.73:0.57:0.64"] = 203, -- Camp Mojache, Freewind Post, Brackenwall Village + ["0.44:0.69:0.55:0.73:0.53:0.61"] = 245, -- Camp Mojache, Freewind Post, Camp Taurajo + ["0.44:0.69:0.55:0.73:0.57:0.64:0.61:0.55"] = 290, -- Camp Mojache, Freewind Post, Brackenwall Village, Ratchet + ["0.44:0.69:0.56:0.53"] = 265, -- Camp Mojache, Crossroads + ["0.44:0.69:0.45:0.56"] = 259, -- Camp Mojache, Thunder Bluff + ["0.44:0.69:0.32:0.58"] = 200, -- Camp Mojache, Shadowprey Village + ["0.44:0.69:0.32:0.58:0.41:0.47"] = 400, -- Camp Mojache, Shadowprey Village, Sun Rock Retreat + ["0.44:0.69:0.56:0.53:0.41:0.37"] = 495, -- Camp Mojache, Crossroads, Zoram'gar Outpost + ["0.44:0.69:0.56:0.53:0.55:0.42"] = 427, -- Camp Mojache, Crossroads, Splintertree Post + ["0.44:0.69:0.56:0.53:0.63:0.44"] = 381, -- Camp Mojache, Crossroads, Orgrimmar + ["0.44:0.69:0.56:0.53:0.63:0.36"] = 428, -- Camp Mojache, Crossroads, Valormok + ["0.44:0.69:0.56:0.53:0.55:0.42:0.50:0.35"] = 505, -- Camp Mojache, Crossroads, Splintertree Post, Emerald Sanctuary + ["0.44:0.69:0.56:0.53:0.46:0.30"] = 518, -- Camp Mojache, Crossroads, Bloodvenom Post + ["0.44:0.69:0.56:0.53:0.46:0.30:0.54:0.21"] = 639, -- Camp Mojache, Crossroads, Bloodvenom Post, Moonglade + ["0.44:0.69:0.56:0.53:0.63:0.36:0.64:0.23"] = 557, -- Camp Mojache, Crossroads, Valormok, Everlook + ["0.44:0.69:0.55:0.73:0.61:0.80:0.50:0.76"] = 301, -- Camp Mojache, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.44:0.69:0.56:0.53:0.61:0.55"] = 316, -- Camp Mojache, Crossroads, Ratchet + ["0.44:0.69:0.56:0.53:0.63:0.44:0.64:0.23"] = 621, -- Camp Mojache, Crossroads, Orgrimmar, Everlook + ["0.44:0.69:0.56:0.53:0.41:0.47"] = 415, -- Camp Mojache, Crossroads, Sun Rock Retreat + ["0.44:0.69:0.55:0.73:0.57:0.64:0.61:0.55:0.63:0.44"] = 386, -- Camp Mojache, Freewind Post, Brackenwall Village, Ratchet, Orgrimmar + ["0.44:0.69:0.56:0.53:0.53:0.61"] = 338, -- Camp Mojache, Crossroads, Camp Taurajo + ["0.44:0.69:0.56:0.53:0.63:0.36:0.64:0.23:0.54:0.21"] = 690, -- Camp Mojache, Crossroads, Valormok, Everlook, Moonglade + + -- Horde: Camp Taurajo (The Barrens) + ["0.53:0.61:0.55:0.73:0.61:0.80"] = 218, -- Camp Taurajo, Freewind Post, Gadgetzan + ["0.53:0.61:0.55:0.73:0.44:0.69:0.42:0.79"] = 378, -- Camp Taurajo, Freewind Post, Camp Mojache, Cenarion Hold + ["0.53:0.61:0.55:0.73:0.61:0.80:0.50:0.76"] = 319, -- Camp Taurajo, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.53:0.61:0.55:0.73"] = 125, -- Camp Taurajo, Freewind Post + ["0.53:0.61:0.57:0.64:0.58:0.70"] = 121, -- Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.53:0.61:0.57:0.64"] = 60, -- Camp Taurajo, Brackenwall Village + ["0.53:0.61:0.55:0.73:0.44:0.69"] = 248, -- Camp Taurajo, Freewind Post, Camp Mojache + ["0.53:0.61:0.45:0.56:0.32:0.58"] = 273, -- Camp Taurajo, Thunder Bluff, Shadowprey Village + ["0.53:0.61:0.45:0.56"] = 114, -- Camp Taurajo, Thunder Bluff + ["0.53:0.61:0.56:0.53"] = 79, -- Camp Taurajo, Crossroads + ["0.53:0.61:0.56:0.53:0.61:0.55"] = 130, -- Camp Taurajo, Crossroads, Ratchet + ["0.53:0.61:0.56:0.53:0.63:0.44"] = 195, -- Camp Taurajo, Crossroads, Orgrimmar + ["0.53:0.61:0.56:0.53:0.55:0.42"] = 241, -- Camp Taurajo, Crossroads, Splintertree Post + ["0.53:0.61:0.56:0.53:0.41:0.47"] = 228, -- Camp Taurajo, Crossroads, Sun Rock Retreat + ["0.53:0.61:0.56:0.53:0.41:0.37"] = 309, -- Camp Taurajo, Crossroads, Zoram'gar Outpost + ["0.53:0.61:0.56:0.53:0.55:0.42:0.50:0.35"] = 319, -- Camp Taurajo, Crossroads, Splintertree Post, Emerald Sanctuary + ["0.53:0.61:0.56:0.53:0.63:0.36"] = 242, -- Camp Taurajo, Crossroads, Valormok + ["0.53:0.61:0.56:0.53:0.46:0.30"] = 332, -- Camp Taurajo, Crossroads, Bloodvenom Post + ["0.53:0.61:0.56:0.53:0.46:0.30:0.54:0.21"] = 453, -- Camp Taurajo, Crossroads, Bloodvenom Post, Moonglade + ["0.53:0.61:0.56:0.53:0.63:0.36:0.64:0.23"] = 372, -- Camp Taurajo, Crossroads, Valormok, Everlook + ["0.53:0.61:0.56:0.53:0.44:0.69"] = 330, -- Camp Taurajo, Crossroads, Camp Mojache + ["0.53:0.61:0.56:0.53:0.63:0.44:0.64:0.23"] = 435, -- Camp Taurajo, Crossroads, Orgrimmar, Everlook + ["0.53:0.61:0.55:0.73:0.58:0.70"] = 194, -- Camp Taurajo, Freewind Post, Mudsprocket + ["0.53:0.61:0.45:0.56:0.63:0.44"] = 322, -- Camp Taurajo, Thunder Bluff, Orgrimmar + + -- Horde: Cenarion Hold (Silithus) + ["0.42:0.79:0.61:0.80"] = 242, -- Cenarion Hold, Gadgetzan + ["0.42:0.79:0.50:0.76"] = 97, -- Cenarion Hold, Marshal's Refuge + ["0.42:0.79:0.44:0.69:0.55:0.73"] = 237, -- Cenarion Hold, Camp Mojache, Freewind Post + ["0.42:0.79:0.44:0.69:0.55:0.73:0.58:0.70"] = 306, -- Cenarion Hold, Camp Mojache, Freewind Post, Mudsprocket + ["0.42:0.79:0.44:0.69:0.55:0.73:0.57:0.64"] = 332, -- Cenarion Hold, Camp Mojache, Freewind Post, Brackenwall Village + ["0.42:0.79:0.44:0.69:0.55:0.73:0.53:0.61"] = 374, -- Cenarion Hold, Camp Mojache, Freewind Post, Camp Taurajo + ["0.42:0.79:0.44:0.69"] = 131, -- Cenarion Hold, Camp Mojache + ["0.42:0.79:0.44:0.69:0.32:0.58"] = 330, -- Cenarion Hold, Camp Mojache, Shadowprey Village + ["0.42:0.79:0.44:0.69:0.45:0.56"] = 390, -- Cenarion Hold, Camp Mojache, Thunder Bluff + ["0.42:0.79:0.44:0.69:0.56:0.53"] = 394, -- Cenarion Hold, Camp Mojache, Crossroads + ["0.42:0.79:0.44:0.69:0.55:0.73:0.57:0.64:0.61:0.55"] = 420, -- Cenarion Hold, Camp Mojache, Freewind Post, Brackenwall Village, Ratchet + ["0.42:0.79:0.44:0.69:0.56:0.53:0.63:0.44"] = 511, -- Cenarion Hold, Camp Mojache, Crossroads, Orgrimmar + ["0.42:0.79:0.44:0.69:0.56:0.53:0.55:0.42"] = 556, -- Cenarion Hold, Camp Mojache, Crossroads, Splintertree Post + ["0.42:0.79:0.44:0.69:0.32:0.58:0.41:0.47"] = 528, -- Cenarion Hold, Camp Mojache, Shadowprey Village, Sun Rock Retreat + ["0.42:0.79:0.44:0.69:0.56:0.53:0.41:0.37"] = 624, -- Cenarion Hold, Camp Mojache, Crossroads, Zoram'gar Outpost + ["0.42:0.79:0.44:0.69:0.56:0.53:0.55:0.42:0.50:0.35"] = 634, -- Cenarion Hold, Camp Mojache, Crossroads, Splintertree Post, Emerald Sanctuary + ["0.42:0.79:0.44:0.69:0.56:0.53:0.46:0.30"] = 647, -- Cenarion Hold, Camp Mojache, Crossroads, Bloodvenom Post + ["0.42:0.79:0.44:0.69:0.56:0.53:0.63:0.36"] = 557, -- Cenarion Hold, Camp Mojache, Crossroads, Valormok + ["0.42:0.79:0.44:0.69:0.56:0.53:0.63:0.36:0.64:0.23"] = 686, -- Cenarion Hold, Camp Mojache, Crossroads, Valormok, Everlook + ["0.42:0.79:0.44:0.69:0.56:0.53:0.46:0.30:0.54:0.21"] = 769, -- Cenarion Hold, Camp Mojache, Crossroads, Bloodvenom Post, Moonglade + ["0.42:0.79:0.44:0.69:0.56:0.53:0.61:0.55"] = 446, -- Cenarion Hold, Camp Mojache, Crossroads, Ratchet + ["0.42:0.79:0.44:0.69:0.56:0.53:0.63:0.44:0.64:0.23"] = 750, -- Cenarion Hold, Camp Mojache, Crossroads, Orgrimmar, Everlook + ["0.42:0.79:0.61:0.80:0.63:0.44"] = 591, -- Cenarion Hold, Gadgetzan, Orgrimmar + ["0.42:0.79:0.50:0.76:0.61:0.80:0.55:0.73"] = 292, -- Cenarion Hold, Marshal's Refuge, Gadgetzan, Freewind Post + ["0.42:0.79:0.61:0.80:0.55:0.73"] = 328, -- Cenarion Hold, Gadgetzan, Freewind Post + ["0.42:0.79:0.50:0.76:0.61:0.80:0.55:0.73:0.53:0.61"] = 428, -- Cenarion Hold, Marshal's Refuge, Gadgetzan, Freewind Post, Camp Taurajo + ["0.42:0.79:0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44:0.64:0.23"] = 782, -- Cenarion Hold, Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar, Everlook + ["0.42:0.79:0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44"] = 543, -- Cenarion Hold, Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar + ["0.42:0.79:0.44:0.69:0.56:0.53:0.63:0.44:0.64:0.23:0.54:0.21"] = 884, -- Cenarion Hold, Camp Mojache, Crossroads, Orgrimmar, Everlook, Moonglade + ["0.42:0.79:0.61:0.80:0.61:0.55:0.63:0.44"] = 580, -- Cenarion Hold, Gadgetzan, Ratchet, Orgrimmar + ["0.42:0.79:0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44:0.63:0.36:0.64:0.23"] = 767, -- Cenarion Hold, Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar, Valormok, Everlook + ["0.42:0.79:0.50:0.76:0.61:0.80:0.45:0.56:0.32:0.58"] = 668, -- Cenarion Hold, Marshal's Refuge, Gadgetzan, Thunder Bluff, Shadowprey Village + + -- Horde: Crossroads (The Barrens) + ["0.56:0.53:0.44:0.69:0.42:0.79"] = 382, -- Crossroads, Camp Mojache, Cenarion Hold + ["0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 379, -- Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.56:0.53:0.61:0.80"] = 303, -- Crossroads, Gadgetzan + ["0.56:0.53:0.55:0.73"] = 184, -- Crossroads, Freewind Post + ["0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 193, -- Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.56:0.53:0.57:0.64"] = 162, -- Crossroads, Brackenwall Village + ["0.56:0.53:0.53:0.61"] = 74, -- Crossroads, Camp Taurajo + ["0.56:0.53:0.44:0.69"] = 252, -- Crossroads, Camp Mojache + ["0.56:0.53:0.45:0.56:0.32:0.58"] = 266, -- Crossroads, Thunder Bluff, Shadowprey Village + ["0.56:0.53:0.45:0.56"] = 107, -- Crossroads, Thunder Bluff + ["0.56:0.53:0.41:0.47"] = 150, -- Crossroads, Sun Rock Retreat + ["0.56:0.53:0.55:0.42"] = 162, -- Crossroads, Splintertree Post + ["0.56:0.53:0.63:0.44"] = 117, -- Crossroads, Orgrimmar + ["0.56:0.53:0.61:0.55"] = 52, -- Crossroads, Ratchet + ["0.56:0.53:0.63:0.36"] = 164, -- Crossroads, Valormok + ["0.56:0.53:0.55:0.42:0.50:0.35"] = 241, -- Crossroads, Splintertree Post, Emerald Sanctuary + ["0.56:0.53:0.41:0.37"] = 230, -- Crossroads, Zoram'gar Outpost + ["0.56:0.53:0.46:0.30"] = 254, -- Crossroads, Bloodvenom Post + ["0.56:0.53:0.46:0.30:0.54:0.21"] = 375, -- Crossroads, Bloodvenom Post, Moonglade + ["0.56:0.53:0.63:0.36:0.64:0.23"] = 293, -- Crossroads, Valormok, Everlook + ["0.56:0.53:0.61:0.55:0.61:0.80:0.50:0.76"] = 395, -- Crossroads, Ratchet, Gadgetzan, Marshal's Refuge + ["0.56:0.53:0.55:0.73:0.58:0.70"] = 254, -- Crossroads, Freewind Post, Mudsprocket + ["0.56:0.53:0.63:0.44:0.64:0.23"] = 357, -- Crossroads, Orgrimmar, Everlook + + -- Horde: Emerald Sanctuary (Felwood) + ["0.50:0.35:0.55:0.42:0.56:0.53:0.55:0.73:0.61:0.80"] = 514, -- Emerald Sanctuary, Splintertree Post, Crossroads, Freewind Post, Gadgetzan + ["0.50:0.35:0.55:0.42:0.56:0.53:0.44:0.69:0.42:0.79"] = 618, -- Emerald Sanctuary, Splintertree Post, Crossroads, Camp Mojache, Cenarion Hold + ["0.50:0.35:0.55:0.42:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 615, -- Emerald Sanctuary, Splintertree Post, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.50:0.35:0.55:0.42:0.56:0.53:0.55:0.73"] = 421, -- Emerald Sanctuary, Splintertree Post, Crossroads, Freewind Post + ["0.50:0.35:0.55:0.42:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 430, -- Emerald Sanctuary, Splintertree Post, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.50:0.35:0.55:0.42:0.56:0.53:0.53:0.61:0.57:0.64"] = 368, -- Emerald Sanctuary, Splintertree Post, Crossroads, Camp Taurajo, Brackenwall Village + ["0.50:0.35:0.55:0.42:0.56:0.53:0.53:0.61"] = 310, -- Emerald Sanctuary, Splintertree Post, Crossroads, Camp Taurajo + ["0.50:0.35:0.55:0.42:0.56:0.53:0.44:0.69"] = 489, -- Emerald Sanctuary, Splintertree Post, Crossroads, Camp Mojache + ["0.50:0.35:0.41:0.37:0.41:0.47:0.32:0.58"] = 378, -- Emerald Sanctuary, Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village + ["0.50:0.35:0.55:0.42:0.56:0.53:0.45:0.56"] = 343, -- Emerald Sanctuary, Splintertree Post, Crossroads, Thunder Bluff + ["0.50:0.35:0.55:0.42:0.56:0.53"] = 237, -- Emerald Sanctuary, Splintertree Post, Crossroads + ["0.50:0.35:0.55:0.42:0.63:0.44:0.61:0.55"] = 280, -- Emerald Sanctuary, Splintertree Post, Orgrimmar, Ratchet + ["0.50:0.35:0.55:0.42:0.63:0.44"] = 173, -- Emerald Sanctuary, Splintertree Post, Orgrimmar + ["0.50:0.35:0.55:0.42"] = 84, -- Emerald Sanctuary, Splintertree Post + ["0.50:0.35:0.41:0.37:0.41:0.47"] = 235, -- Emerald Sanctuary, Zoram'gar Outpost, Sun Rock Retreat + ["0.50:0.35:0.41:0.37"] = 115, -- Emerald Sanctuary, Zoram'gar Outpost + ["0.50:0.35:0.46:0.30"] = 80, -- Emerald Sanctuary, Bloodvenom Post + ["0.50:0.35:0.55:0.42:0.63:0.36"] = 169, -- Emerald Sanctuary, Splintertree Post, Valormok + ["0.50:0.35:0.46:0.30:0.64:0.23"] = 226, -- Emerald Sanctuary, Bloodvenom Post, Everlook + ["0.50:0.35:0.46:0.30:0.54:0.21"] = 203, -- Emerald Sanctuary, Bloodvenom Post, Moonglade + ["0.50:0.35:0.46:0.30:0.56:0.53:0.61:0.55"] = 330, -- Emerald Sanctuary, Bloodvenom Post, Crossroads, Ratchet + ["0.50:0.35:0.55:0.42:0.63:0.36:0.64:0.23"] = 298, -- Emerald Sanctuary, Splintertree Post, Valormok, Everlook + ["0.50:0.35:0.55:0.42:0.63:0.44:0.64:0.23"] = 413, -- Emerald Sanctuary, Splintertree Post, Orgrimmar, Everlook + ["0.50:0.35:0.46:0.30:0.63:0.44"] = 296, -- Emerald Sanctuary, Bloodvenom Post, Orgrimmar + ["0.50:0.35:0.41:0.37:0.56:0.53:0.55:0.73:0.61:0.80"] = 626, -- Emerald Sanctuary, Zoram'gar Outpost, Crossroads, Freewind Post, Gadgetzan + ["0.50:0.35:0.55:0.42:0.56:0.53:0.41:0.47"] = 387, -- Sanctuaire d'émeraude, Poste de Bois-brisé, La Croisée, Retraite de Roche-Soleil, Retraite de Roche-Soleil + ["0.50:0.35:0.55:0.42:0.63:0.44:0.61:0.55:0.61:0.80"] = 518, -- Emerald Sanctuary, Splintertree Post, Orgrimmar, Ratchet, Gadgetzan + + -- Horde: Everlook (Winterspring) + ["0.64:0.23:0.63:0.36:0.56:0.53:0.55:0.73:0.61:0.80"] = 575, -- Everlook, Valormok, Crossroads, Freewind Post, Gadgetzan + ["0.64:0.23:0.63:0.36:0.56:0.53:0.55:0.73"] = 483, -- Everlook, Valormok, Crossroads, Freewind Post + ["0.64:0.23:0.63:0.36:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 676, -- Everlook, Valormok, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.64:0.23:0.63:0.36:0.56:0.53:0.44:0.69:0.42:0.79"] = 680, -- Everlook, Valormok, Crossroads, Camp Mojache, Cenarion Hold + ["0.64:0.23:0.63:0.36:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 491, -- Everlook, Valormok, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.64:0.23:0.63:0.36:0.56:0.53:0.53:0.61:0.57:0.64"] = 430, -- Everlook, Valormok, Crossroads, Camp Taurajo, Brackenwall Village + ["0.64:0.23:0.63:0.36:0.56:0.53:0.53:0.61"] = 371, -- Everlook, Valormok, Crossroads, Camp Taurajo + ["0.64:0.23:0.63:0.36:0.56:0.53:0.44:0.69"] = 550, -- Everlook, Valormok, Crossroads, Camp Mojache + ["0.64:0.23:0.63:0.36:0.45:0.56:0.32:0.58"] = 544, -- Everlook, Valormok, Thunder Bluff, Shadowprey Village + ["0.64:0.23:0.63:0.36:0.45:0.56"] = 385, -- Everlook, Valormok, Thunder Bluff + ["0.64:0.23:0.63:0.36:0.56:0.53"] = 299, -- Everlook, Valormok, Crossroads + ["0.64:0.23:0.63:0.36:0.63:0.44:0.61:0.55"] = 342, -- Everlook, Valormok, Orgrimmar, Ratchet + ["0.64:0.23:0.63:0.44"] = 243, -- Everlook, Orgrimmar + ["0.64:0.23:0.63:0.36:0.55:0.42"] = 228, -- Everlook, Valormok, Splintertree Post + ["0.64:0.23:0.63:0.36:0.56:0.53:0.41:0.47"] = 448, -- Everlook, Valormok, Crossroads, Sun Rock Retreat + ["0.64:0.23:0.46:0.30:0.41:0.37"] = 296, -- Everlook, Bloodvenom Post, Zoram'gar Outpost + ["0.64:0.23:0.46:0.30:0.50:0.35"] = 229, -- Everlook, Bloodvenom Post, Emerald Sanctuary + ["0.64:0.23:0.63:0.36"] = 135, -- Everlook, Valormok + ["0.64:0.23:0.46:0.30"] = 195, -- Everlook, Bloodvenom Post + ["0.64:0.23:0.54:0.21"] = 135, -- Everlook, Moonglade + ["0.64:0.23:0.63:0.44:0.56:0.53:0.45:0.56"] = 457, -- Everlook, Orgrimmar, Crossroads, Thunder Bluff + ["0.64:0.23:0.63:0.44:0.61:0.55"] = 351, -- Everlook, Orgrimmar, Ratchet + ["0.64:0.23:0.63:0.44:0.55:0.42"] = 333, -- Everlook, Orgrimmar, Splintertree Post + ["0.64:0.23:0.63:0.44:0.61:0.55:0.61:0.80"] = 591, -- Everlook, Orgrimmar, Ratchet, Gadgetzan + ["0.64:0.23:0.63:0.44:0.56:0.53:0.44:0.69"] = 602, -- Everlook, Orgrimmar, Crossroads, Camp Mojache + ["0.64:0.23:0.63:0.36:0.55:0.42:0.50:0.35"] = 306, -- Everlook, Valormok, Splintertree Post, Emerald Sanctuary + ["0.64:0.23:0.63:0.44:0.61:0.55:0.61:0.80:0.50:0.76"] = 696, -- Everlook, Orgrimmar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.64:0.23:0.46:0.30:0.41:0.37:0.41:0.47"] = 416, -- Everlook, Bloodvenom Post, Zoram'gar Outpost, Sun Rock Retreat + ["0.64:0.23:0.46:0.30:0.41:0.37:0.41:0.47:0.32:0.58"] = 558, -- Everlook, Bloodvenom Post, Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village + ["0.64:0.23:0.63:0.44:0.55:0.42:0.50:0.35"] = 411, -- Everlook, Orgrimmar, Splintertree Post, Emerald Sanctuary + ["0.64:0.23:0.63:0.36:0.55:0.42:0.41:0.37"] = 388, -- Everlook, Valormok, Splintertree Post, Zoram'gar Outpost + ["0.64:0.23:0.63:0.44:0.56:0.53"] = 350, -- Everlook, Orgrimmar, Crossroads + ["0.64:0.23:0.63:0.44:0.56:0.53:0.55:0.73"] = 535, -- Everlook, Orgrimmar, Crossroads, Freewind Post + ["0.64:0.23:0.63:0.44:0.56:0.53:0.53:0.61"] = 424, -- Everlook, Orgrimmar, Crossroads, Camp Taurajo + ["0.64:0.23:0.63:0.36:0.56:0.53:0.55:0.73:0.58:0.70"] = 552, -- Everlook, Valormok, Crossroads, Freewind Post, Mudsprocket + ["0.64:0.23:0.63:0.44:0.56:0.53:0.44:0.69:0.42:0.79"] = 732, -- Everlook, Orgrimmar, Crossroads, Camp Mojache, Cenarion Hold + ["0.64:0.23:0.63:0.44:0.56:0.53:0.41:0.47"] = 500, -- Everlook, Orgrimmar, Crossroads, Sun Rock Retreat + ["0.64:0.23:0.63:0.36:0.45:0.56:0.44:0.69"] = 637, -- Everlook, Valormok, Thunder Bluff, Camp Mojache + ["0.64:0.23:0.63:0.44:0.56:0.53:0.41:0.37:0.50:0.35"] = 701, -- Everlook, Orgrimmar, Crossroads, Zoram'gar Outpost, Emerald Sanctuary + + -- Horde: Freewind Post (Thousand Needles) + ["0.55:0.73:0.44:0.69:0.42:0.79"] = 252, -- Freewind Post, Camp Mojache, Cenarion Hold + ["0.55:0.73:0.61:0.80:0.50:0.76"] = 194, -- Freewind Post, Gadgetzan, Marshal's Refuge + ["0.55:0.73:0.61:0.80"] = 93, -- Freewind Post, Gadgetzan + ["0.55:0.73:0.58:0.70"] = 69, -- Freewind Post, Mudsprocket + ["0.55:0.73:0.57:0.64"] = 96, -- Freewind Post, Brackenwall Village + ["0.55:0.73:0.53:0.61"] = 137, -- Freewind Post, Camp Taurajo + ["0.55:0.73:0.44:0.69"] = 123, -- Freewind Post, Camp Mojache + ["0.55:0.73:0.44:0.69:0.32:0.58"] = 323, -- Freewind Post, Camp Mojache, Shadowprey Village + ["0.55:0.73:0.45:0.56"] = 223, -- Freewind Post, Thunder Bluff + ["0.55:0.73:0.56:0.53"] = 192, -- Freewind Post, Crossroads + ["0.55:0.73:0.57:0.64:0.61:0.55"] = 184, -- Freewind Post, Brackenwall Village, Ratchet + ["0.55:0.73:0.57:0.64:0.61:0.55:0.63:0.44"] = 279, -- Freewind Post, Brackenwall Village, Ratchet, Orgrimmar + ["0.55:0.73:0.56:0.53:0.55:0.42"] = 354, -- Freewind Post, Crossroads, Splintertree Post + ["0.55:0.73:0.56:0.53:0.41:0.47"] = 342, -- Freewind Post, Crossroads, Sun Rock Retreat + ["0.55:0.73:0.56:0.53:0.41:0.37"] = 422, -- Freewind Post, Crossroads, Zoram'gar Outpost + ["0.55:0.73:0.56:0.53:0.46:0.30"] = 445, -- Freewind Post, Crossroads, Bloodvenom Post + ["0.55:0.73:0.56:0.53:0.55:0.42:0.50:0.35"] = 432, -- Freewind Post, Crossroads, Splintertree Post, Emerald Sanctuary + ["0.55:0.73:0.56:0.53:0.63:0.36"] = 355, -- Freewind Post, Crossroads, Valormok + ["0.55:0.73:0.56:0.53:0.63:0.36:0.64:0.23"] = 484, -- Freewind Post, Crossroads, Valormok, Everlook + ["0.55:0.73:0.56:0.53:0.46:0.30:0.54:0.21"] = 566, -- Freewind Post, Crossroads, Bloodvenom Post, Moonglade + ["0.55:0.73:0.56:0.53:0.63:0.44"] = 308, -- Freewind Post, Crossroads, Orgrimmar + ["0.55:0.73:0.45:0.56:0.32:0.58"] = 382, -- Freewind Post, Thunder Bluff, Shadowprey Village + ["0.55:0.73:0.56:0.53:0.61:0.55"] = 243, -- Freewind Post, Crossroads, Ratchet + ["0.55:0.73:0.61:0.80:0.63:0.44"] = 443, -- Freewind Post, Gadgetzan, Orgrimmar + ["0.55:0.73:0.45:0.56:0.63:0.44:0.55:0.42"] = 519, -- Freewind Post, Thunder Bluff, Orgrimmar, Splintertree Post + ["0.55:0.73:0.45:0.56:0.63:0.44"] = 430, -- Freewind Post, Thunder Bluff, Orgrimmar + + -- Horde: Gadgetzan (Tanaris) + ["0.61:0.80:0.42:0.79"] = 233, -- Gadgetzan, Cenarion Hold + ["0.61:0.80:0.50:0.76"] = 108, -- Gadgetzan, Marshal's Refuge + ["0.61:0.80:0.55:0.73"] = 87, -- Gadgetzan, Freewind Post + ["0.61:0.80:0.55:0.73:0.58:0.70"] = 155, -- Gadgetzan, Freewind Post, Mudsprocket + ["0.61:0.80:0.57:0.64"] = 194, -- Gadgetzan, Brackenwall Village + ["0.61:0.80:0.55:0.73:0.53:0.61"] = 223, -- Gadgetzan, Freewind Post, Camp Taurajo + ["0.61:0.80:0.44:0.69"] = 199, -- Gadgetzan, Camp Mojache + ["0.61:0.80:0.44:0.69:0.32:0.58"] = 399, -- Gadgetzan, Camp Mojache, Shadowprey Village + ["0.61:0.80:0.45:0.56"] = 304, -- Gadgetzan, Thunder Bluff + ["0.61:0.80:0.56:0.53"] = 300, -- Gadgetzan, Crossroads + ["0.61:0.80:0.61:0.55"] = 243, -- Gadgetzan, Ratchet + ["0.61:0.80:0.63:0.44"] = 350, -- Gadgetzan, Orgrimmar + ["0.61:0.80:0.61:0.55:0.63:0.44:0.55:0.42"] = 429, -- Gadgetzan, Ratchet, Orgrimmar, Splintertree Post + ["0.61:0.80:0.55:0.73:0.56:0.53:0.41:0.47"] = 427, -- Gadgetzan, Freewind Post, Crossroads, Sun Rock Retreat + ["0.61:0.80:0.55:0.73:0.56:0.53:0.41:0.37"] = 508, -- Gadgetzan, Freewind Post, Crossroads, Zoram'gar Outpost + ["0.61:0.80:0.61:0.55:0.63:0.44:0.55:0.42:0.50:0.35"] = 507, -- Gadgetzan, Ratchet, Orgrimmar, Splintertree Post, Emerald Sanctuary + ["0.61:0.80:0.55:0.73:0.56:0.53:0.46:0.30"] = 531, -- Gadgetzan, Freewind Post, Crossroads, Bloodvenom Post + ["0.61:0.80:0.61:0.55:0.63:0.44:0.63:0.36"] = 434, -- Gadgetzan, Ratchet, Orgrimmar, Valormok + ["0.61:0.80:0.61:0.55:0.63:0.44:0.63:0.36:0.64:0.23"] = 564, -- Gadgetzan, Ratchet, Orgrimmar, Valormok, Everlook + ["0.61:0.80:0.55:0.73:0.56:0.53:0.46:0.30:0.54:0.21"] = 652, -- Gadgetzan, Freewind Post, Crossroads, Bloodvenom Post, Moonglade + ["0.61:0.80:0.45:0.56:0.32:0.58"] = 463, -- Gadgetzan, Thunder Bluff, Shadowprey Village + ["0.61:0.80:0.56:0.53:0.53:0.61"] = 374, -- Gadgetzan, Crossroads, Camp Taurajo + ["0.61:0.80:0.61:0.55:0.63:0.44:0.64:0.23"] = 580, -- Gadgetzan, Ratchet, Orgrimmar, Everlook + ["0.61:0.80:0.57:0.64:0.58:0.70"] = 255, -- Gadgetzan, Brackenwall Village, Mudsprocket + ["0.61:0.80:0.55:0.73:0.56:0.53:0.63:0.36"] = 441, -- Gadgetzan, Freewind Post, Crossroads, Valormok + ["0.61:0.80:0.56:0.53:0.41:0.37"] = 532, -- Gadgetzan, Crossroads, Zoram'gar Outpost + ["0.61:0.80:0.63:0.44:0.55:0.42"] = 439, -- Gadgetzan, Orgrimmar, Splintertree Post + + -- Horde: Marshal's Refuge (Un'Goro Crater) + ["0.50:0.76:0.42:0.79"] = 100, -- Marshal's Refuge, Cenarion Hold + ["0.50:0.76:0.61:0.80"] = 113, -- Marshal's Refuge, Gadgetzan + ["0.50:0.76:0.61:0.80:0.55:0.73"] = 200, -- Marshal's Refuge, Gadgetzan, Freewind Post + ["0.50:0.76:0.61:0.80:0.55:0.73:0.58:0.70"] = 268, -- Marshal's Refuge, Gadgetzan, Freewind Post, Mudsprocket + ["0.50:0.76:0.61:0.80:0.55:0.73:0.57:0.64"] = 294, -- Marshal's Refuge, Gadgetzan, Freewind Post, Brackenwall Village + ["0.50:0.76:0.61:0.80:0.55:0.73:0.53:0.61"] = 336, -- Marshal's Refuge, Gadgetzan, Freewind Post, Camp Taurajo + ["0.50:0.76:0.42:0.79:0.44:0.69"] = 224, -- Marshal's Refuge, Cenarion Hold, Camp Mojache + ["0.50:0.76:0.42:0.79:0.44:0.69:0.32:0.58"] = 424, -- Marshal's Refuge, Cenarion Hold, Camp Mojache, Shadowprey Village + ["0.50:0.76:0.61:0.80:0.45:0.56"] = 416, -- Marshal's Refuge, Gadgetzan, Thunder Bluff + ["0.50:0.76:0.61:0.80:0.55:0.73:0.56:0.53"] = 392, -- Marshal's Refuge, Gadgetzan, Freewind Post, Crossroads + ["0.50:0.76:0.61:0.80:0.61:0.55"] = 354, -- Marshal's Refuge, Gadgetzan, Ratchet + ["0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44"] = 450, -- Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar + ["0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44:0.55:0.42"] = 540, -- Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar, Splintertree Post + ["0.50:0.76:0.61:0.80:0.55:0.73:0.56:0.53:0.41:0.47"] = 540, -- Marshal's Refuge, Gadgetzan, Freewind Post, Crossroads, Sun Rock Retreat + ["0.50:0.76:0.61:0.80:0.55:0.73:0.56:0.53:0.41:0.37"] = 621, -- Marshal's Refuge, Gadgetzan, Freewind Post, Crossroads, Zoram'gar Outpost + ["0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44:0.55:0.42:0.50:0.35"] = 618, -- Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar, Splintertree Post, Emerald Sanctuary + ["0.50:0.76:0.61:0.80:0.55:0.73:0.56:0.53:0.46:0.30"] = 645, -- Marshal's Refuge, Gadgetzan, Freewind Post, Crossroads, Bloodvenom Post + ["0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44:0.63:0.36"] = 546, -- Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar, Valormok + ["0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44:0.63:0.36:0.64:0.23"] = 675, -- Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar, Valormok, Everlook + ["0.50:0.76:0.61:0.80:0.55:0.73:0.56:0.53:0.46:0.30:0.54:0.21"] = 766, -- Marshal's Refuge, Gadgetzan, Freewind Post, Crossroads, Bloodvenom Post, Moonglade + ["0.50:0.76:0.61:0.80:0.44:0.69"] = 312, -- Marshal's Refuge, Gadgetzan, Camp Mojache + ["0.50:0.76:0.61:0.80:0.61:0.55:0.63:0.44:0.64:0.23"] = 691, -- Marshal's Refuge, Gadgetzan, Ratchet, Orgrimmar, Everlook + ["0.50:0.76:0.61:0.80:0.44:0.69:0.32:0.58"] = 512, -- Marshal's Refuge, Gadgetzan, Camp Mojache, Shadowprey Village + ["0.50:0.76:0.61:0.80:0.57:0.64:0.53:0.61"] = 354, -- Marshal's Refuge, Gadgetzan, Brackenwall Village, Camp Taurajo + ["0.50:0.76:0.61:0.80:0.57:0.64"] = 306, -- Marshal's Refuge, Gadgetzan, Brackenwall Village + + -- Horde: Moonglade (Moonglade) + ["0.54:0.21:0.46:0.30:0.56:0.53:0.44:0.69:0.42:0.79"] = 734, -- Moonglade, Bloodvenom Post, Crossroads, Camp Mojache, Cenarion Hold + ["0.54:0.21:0.46:0.30:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 730, -- Moonglade, Bloodvenom Post, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.54:0.21:0.46:0.30:0.56:0.53:0.55:0.73"] = 537, -- Moonglade, Bloodvenom Post, Crossroads, Freewind Post + ["0.54:0.21:0.46:0.30:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 545, -- Moonglade, Bloodvenom Post, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.54:0.21:0.46:0.30:0.56:0.53:0.55:0.73:0.61:0.80"] = 629, -- Moonglade, Bloodvenom Post, Crossroads, Freewind Post, Gadgetzan + ["0.54:0.21:0.46:0.30:0.56:0.53:0.53:0.61:0.57:0.64"] = 484, -- Moonglade, Bloodvenom Post, Crossroads, Camp Taurajo, Brackenwall Village + ["0.54:0.21:0.46:0.30:0.56:0.53:0.53:0.61"] = 426, -- Moonglade, Bloodvenom Post, Crossroads, Camp Taurajo + ["0.54:0.21:0.46:0.30:0.56:0.53:0.44:0.69"] = 604, -- Moonglade, Bloodvenom Post, Crossroads, Camp Mojache + ["0.54:0.21:0.46:0.30:0.41:0.37:0.41:0.47:0.32:0.58"] = 515, -- Moonglade, Bloodvenom Post, Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village + ["0.54:0.21:0.46:0.30:0.56:0.53:0.45:0.56"] = 459, -- Moonglade, Bloodvenom Post, Crossroads, Thunder Bluff + ["0.54:0.21:0.46:0.30:0.56:0.53"] = 353, -- Moonglade, Bloodvenom Post, Crossroads + ["0.54:0.21:0.46:0.30:0.56:0.53:0.61:0.55"] = 404, -- Moonglade, Bloodvenom Post, Crossroads, Ratchet + ["0.54:0.21:0.64:0.23:0.63:0.36:0.63:0.44"] = 377, -- Moonglade, Everlook, Valormok, Orgrimmar + ["0.54:0.21:0.46:0.30:0.50:0.35:0.55:0.42"] = 269, -- Moonglade, Bloodvenom Post, Emerald Sanctuary, Splintertree Post + ["0.54:0.21:0.46:0.30:0.41:0.37:0.41:0.47"] = 373, -- Moonglade, Bloodvenom Post, Zoram'gar Outpost, Sun Rock Retreat + ["0.54:0.21:0.46:0.30:0.41:0.37"] = 253, -- Moonglade, Bloodvenom Post, Zoram'gar Outpost + ["0.54:0.21:0.46:0.30:0.50:0.35"] = 186, -- Moonglade, Bloodvenom Post, Emerald Sanctuary + ["0.54:0.21:0.64:0.23:0.63:0.36"] = 276, -- Moonglade, Everlook, Valormok + ["0.54:0.21:0.64:0.23"] = 142, -- Moonglade, Everlook + ["0.54:0.21:0.46:0.30"] = 157, -- Moonglade, Bloodvenom Post + ["0.54:0.21:0.46:0.30:0.50:0.35:0.55:0.42:0.63:0.44"] = 358, -- Moonglade, Bloodvenom Post, Emerald Sanctuary, Splintertree Post, Orgrimmar + ["0.54:0.21:0.64:0.23:0.63:0.44"] = 384, -- Moonglade, Everlook, Orgrimmar + ["0.54:0.21:0.46:0.30:0.63:0.44"] = 371, -- Moonglade, Bloodvenom Post, Orgrimmar + ["0.54:0.21:0.64:0.23:0.63:0.44:0.61:0.55:0.57:0.64"] = 592, -- Moonglade, Everlook, Orgrimmar, Ratchet, Brackenwall Village + ["0.54:0.21:0.46:0.30:0.63:0.36"] = 339, -- Moonglade, Bloodvenom Post, Valormok + ["0.54:0.21:0.64:0.23:0.63:0.36:0.55:0.42"] = 370, -- Moonglade, Everlook, Valormok, Splintertree Post + ["0.54:0.21:0.64:0.23:0.63:0.36:0.56:0.53:0.44:0.69"] = 692, -- Moonglade, Everlook, Valormok, Crossroads, Camp Mojache + ["0.54:0.21:0.64:0.23:0.63:0.44:0.61:0.55:0.61:0.80:0.50:0.76:0.42:0.79"] = 933, -- Moonglade, Everlook, Orgrimmar, Ratchet, Gadgetzan, Marshal's Refuge, Cenarion Hold + ["0.54:0.21:0.46:0.30:0.56:0.53:0.45:0.56:0.32:0.58"] = 618, -- Moonglade, Bloodvenom Post, Crossroads, Thunder Bluff, Shadowprey Village + ["0.54:0.21:0.64:0.23:0.63:0.36:0.55:0.42:0.50:0.35"] = 448, -- Moonglade, Everlook, Valormok, Splintertree Post, Emerald Sanctuary + ["0.54:0.21:0.46:0.30:0.41:0.37:0.55:0.42"] = 426, -- Moonglade, Bloodvenom Post, Zoram'gar Outpost, Splintertree Post + ["0.54:0.21:0.64:0.23:0.63:0.44:0.61:0.55"] = 492, -- Mondlichtung, Ewige Warte, Orgrimmar, Ratschet + ["0.54:0.21:0.64:0.23:0.63:0.44:0.56:0.53:0.41:0.47"] = 641, -- Moonglade, Everlook, Orgrimmar, Crossroads, Sun Rock Retreat + ["0.54:0.21:0.64:0.23:0.63:0.44:0.61:0.55:0.61:0.80"] = 730, -- Moonglade, Everlook, Orgrimmar, Ratchet, Gadgetzan + ["0.54:0.21:0.64:0.23:0.63:0.44:0.56:0.53:0.44:0.69"] = 743, -- Moonglade, Everlook, Orgrimmar, Crossroads, Camp Mojache + ["0.54:0.21:0.64:0.23:0.63:0.44:0.61:0.55:0.61:0.80:0.50:0.76"] = 836, -- Moonglade, Everlook, Orgrimmar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.54:0.21:0.46:0.30:0.56:0.53:0.61:0.55:0.61:0.80"] = 640, -- Moonglade, Bloodvenom Post, Crossroads, Ratchet, Gadgetzan + ["0.54:0.21:0.64:0.23:0.63:0.36:0.56:0.53:0.53:0.61"] = 513, -- Moonglade, Everlook, Valormok, Crossroads, Camp Taurajo + + -- Horde: Mudsprocket (Dustwallow Marsh) + ["0.58:0.70:0.55:0.73:0.44:0.69:0.42:0.79"] = 324, -- Mudsprocket, Freewind Post, Camp Mojache, Cenarion Hold + ["0.58:0.70:0.55:0.73:0.61:0.80:0.50:0.76"] = 265, -- Mudsprocket, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.58:0.70:0.55:0.73"] = 71, -- Mudsprocket, Freewind Post + ["0.58:0.70:0.55:0.73:0.61:0.80"] = 164, -- Mudsprocket, Freewind Post, Gadgetzan + ["0.58:0.70:0.55:0.73:0.44:0.69"] = 194, -- Mudsprocket, Freewind Post, Camp Mojache + ["0.58:0.70:0.57:0.64"] = 63, -- Mudsprocket, Brackenwall Village + ["0.58:0.70:0.57:0.64:0.53:0.61"] = 111, -- Mudsprocket, Brackenwall Village, Camp Taurajo + ["0.58:0.70:0.57:0.64:0.53:0.61:0.45:0.56:0.32:0.58"] = 383, -- Mudsprocket, Brackenwall Village, Camp Taurajo, Thunder Bluff, Shadowprey Village + ["0.58:0.70:0.57:0.64:0.53:0.61:0.45:0.56"] = 224, -- Mudsprocket, Brackenwall Village, Camp Taurajo, Thunder Bluff + ["0.58:0.70:0.57:0.64:0.53:0.61:0.56:0.53"] = 189, -- Mudsprocket, Brackenwall Village, Camp Taurajo, Crossroads + ["0.58:0.70:0.57:0.64:0.61:0.55"] = 150, -- Mudsprocket, Brackenwall Village, Ratchet + ["0.58:0.70:0.57:0.64:0.61:0.55:0.63:0.44"] = 245, -- Mudsprocket, Brackenwall Village, Ratchet, Orgrimmar + ["0.58:0.70:0.57:0.64:0.61:0.55:0.63:0.44:0.55:0.42"] = 334, -- Mudsprocket, Brackenwall Village, Ratchet, Orgrimmar, Splintertree Post + ["0.58:0.70:0.57:0.64:0.53:0.61:0.56:0.53:0.41:0.47"] = 338, -- Mudsprocket, Brackenwall Village, Camp Taurajo, Crossroads, Sun Rock Retreat + ["0.58:0.70:0.57:0.64:0.53:0.61:0.56:0.53:0.41:0.37"] = 419, -- Mudsprocket, Brackenwall Village, Camp Taurajo, Crossroads, Zoram'gar Outpost + ["0.58:0.70:0.57:0.64:0.61:0.55:0.63:0.44:0.55:0.42:0.50:0.35"] = 412, -- Mudsprocket, Brackenwall Village, Ratchet, Orgrimmar, Splintertree Post, Emerald Sanctuary + ["0.58:0.70:0.57:0.64:0.61:0.55:0.63:0.44:0.63:0.36"] = 340, -- Mudsprocket, Brackenwall Village, Ratchet, Orgrimmar, Valormok + ["0.58:0.70:0.57:0.64:0.53:0.61:0.56:0.53:0.46:0.30"] = 442, -- Mudsprocket, Brackenwall Village, Camp Taurajo, Crossroads, Bloodvenom Post + ["0.58:0.70:0.57:0.64:0.53:0.61:0.56:0.53:0.46:0.30:0.54:0.21"] = 563, -- Mudsprocket, Brackenwall Village, Camp Taurajo, Crossroads, Bloodvenom Post, Moonglade + ["0.58:0.70:0.57:0.64:0.61:0.55:0.63:0.44:0.63:0.36:0.64:0.23"] = 469, -- Mudsprocket, Brackenwall Village, Ratchet, Orgrimmar, Valormok, Everlook + ["0.58:0.70:0.55:0.73:0.45:0.56"] = 294, -- Mudsprocket, Freewind Post, Thunder Bluff + ["0.58:0.70:0.55:0.73:0.56:0.53:0.61:0.55"] = 314, -- Mudsprocket, Freewind Post, Crossroads, Ratchet + ["0.58:0.70:0.55:0.73:0.53:0.61"] = 209, -- Mudsprocket, Freewind Post, Camp Taurajo + ["0.58:0.70:0.57:0.64:0.63:0.44"] = 279, -- Mudsprocket, Brackenwall Village, Orgrimmar + ["0.58:0.70:0.55:0.73:0.56:0.53:0.63:0.44"] = 379, -- Mudsprocket, Freewind Post, Crossroads, Orgrimmar + ["0.58:0.70:0.55:0.73:0.44:0.69:0.32:0.58"] = 394, -- Mudsprocket, Freewind Post, Camp Mojache, Shadowprey Village + ["0.58:0.70:0.55:0.73:0.45:0.56:0.32:0.58"] = 453, -- Mudsprocket, Freewind Post, Thunder Bluff, Shadowprey Village + ["0.58:0.70:0.57:0.64:0.61:0.80"] = 266, -- Mudsprocket, Brackenwall Village, Gadgetzan + + -- Horde: Orgrimmar (Durotar) + ["0.63:0.44:0.61:0.80"] = 417, -- Orgrimmar, Gadgetzan + ["0.63:0.44:0.56:0.53:0.44:0.69:0.42:0.79"] = 492, -- Orgrimmar, Crossroads, Camp Mojache, Cenarion Hold + ["0.63:0.44:0.61:0.55:0.61:0.80:0.50:0.76"] = 454, -- Orgrimmar, Ratchet, Gadgetzan, Marshal's Refuge (José Antonio González reported 478) + ["0.63:0.44:0.56:0.53:0.55:0.73"] = 292, -- Orgrimmar, Crossroads, Freewind Post (Yaki Kadafi reported 109) (John Comrie reported 147) + ["0.63:0.44:0.61:0.55:0.57:0.64:0.58:0.70"] = 268, -- Orgrimmar, Ratchet, Brackenwall Village, Mudsprocket + ["0.63:0.44:0.57:0.64"] = 229, -- Orgrimmar, Brackenwall Village + ["0.63:0.44:0.56:0.53:0.53:0.61"] = 181, -- Orgrimmar, Crossroads, Camp Taurajo + ["0.63:0.44:0.56:0.53:0.44:0.69"] = 361, -- Orgrimmar, Crossroads, Camp Mojache + ["0.63:0.44:0.56:0.53:0.45:0.56:0.32:0.58"] = 373, -- Orgrimmar, Crossroads, Thunder Bluff, Shadowprey Village + ["0.63:0.44:0.45:0.56"] = 224, -- Orgrimmar, Thunder Bluff (David Galindo suggested 233) + ["0.63:0.44:0.56:0.53"] = 110, -- Orgrimmar, Crossroads + ["0.63:0.44:0.61:0.55"] = 108, -- Orgrimmar, Ratchet + ["0.63:0.44:0.63:0.36"] = 95, -- Orgrimmar, Valormok + ["0.63:0.44:0.55:0.42"] = 90, -- Orgrimmar, Splintertree Post + ["0.63:0.44:0.56:0.53:0.41:0.47"] = 258, -- Orgrimmar, Crossroads, Sun Rock Retreat + ["0.63:0.44:0.55:0.42:0.41:0.37"] = 249, -- Orgrimmar, Splintertree Post, Zoram'gar Outpost + ["0.63:0.44:0.55:0.42:0.50:0.35"] = 168, -- Orgrimmar, Splintertree Post, Emerald Sanctuary + ["0.63:0.44:0.46:0.30"] = 252, -- Orgrimmar, Bloodvenom Post + ["0.63:0.44:0.63:0.36:0.64:0.23:0.54:0.21"] = 358, -- Orgrimmar, Valormok, Everlook, Moonglade + ["0.63:0.44:0.64:0.23"] = 240, -- Orgrimmar, Everlook + ["0.63:0.44:0.55:0.42:0.50:0.35:0.46:0.30:0.54:0.21"] = 371, -- Orgrimmar, Splintertree Post, Emerald Sanctuary, Bloodvenom Post, Moonglade + ["0.63:0.44:0.56:0.53:0.41:0.37"] = 339, -- Orgrimmar, Crossroads, Zoram'gar Outpost + ["0.63:0.44:0.64:0.23:0.54:0.21"] = 374, -- Orgrimmar, Everlook, Moonglade + ["0.63:0.44:0.61:0.55:0.61:0.80:0.50:0.76:0.42:0.79"] = 549, -- Orgrimmar, Ratchet, Gadgetzan, Marshal's Refuge, Cenarion Hold + ["0.63:0.44:0.57:0.64:0.58:0.70"] = 289, -- Orgrimmar, Brackenwall Village, Mudsprocket + ["0.63:0.44:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76:0.42:0.79"] = 581, -- Orgrimmar, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge, Cenarion Hold + ["0.63:0.44:0.61:0.80:0.42:0.79"] = 650, -- Orgrimmar, Gadgetzan, Cenarion Hold + ["0.63:0.44:0.45:0.56:0.53:0.61"] = 312, -- Orgrimmar, Thunder Bluff, Camp Taurajo + ["0.63:0.44:0.45:0.56:0.55:0.73"] = 429, -- Orgrimmar, Thunder Bluff, Freewind Post + ["0.63:0.44:0.56:0.53:0.55:0.73:0.58:0.70"] = 361, -- Orgrimmar, Crossroads, Freewind Post, Mudsprocket + ["0.63:0.44:0.46:0.30:0.50:0.35"] = 278, -- Orgrimmar, Bloodvenom Post, Emerald Sanctuary + ["0.63:0.44:0.61:0.55:0.57:0.64:0.55:0.73:0.44:0.69:0.32:0.58"] = 633, -- Orgrimmar, Ratchet, Brackenwall Village, Freewind Post, Camp Mojache, Shadowprey Village + ["0.63:0.44:0.56:0.53:0.41:0.47:0.32:0.58"] = 400, -- Orgrimmar, Crossroads, Sun Rock Retreat, Shadowprey Village + ["0.63:0.44:0.45:0.56:0.41:0.47"] = 407, -- Orgrimmar, Thunder Bluff, Sun Rock Retreat + ["0.63:0.44:0.56:0.53:0.41:0.37:0.50:0.35"] = 459, -- Orgrimmar, Crossroads, Zoram'gar Outpost, Emerald Sanctuary + ["0.63:0.44:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 485, -- Orgrimmar, La Croisée, Poste de Librevent, Gadgetzan, Refuge des Marshal + ["0.63:0.44:0.56:0.53:0.44:0.69:0.32:0.58"] = 559, -- Orgrimmar, Crossroads, Camp Mojache, Shadowprey Village + + -- Horde: Ratchet (The Barrens) + ["0.61:0.55:0.61:0.80:0.50:0.76:0.42:0.79"] = 443, -- Ratchet, Gadgetzan, Marshal's Refuge, Cenarion Hold + ["0.61:0.55:0.61:0.80:0.50:0.76"] = 347, -- Ratchet, Gadgetzan, Marshal's Refuge + ["0.61:0.55:0.57:0.64:0.55:0.73"] = 204, -- Ratchet, Brackenwall Village, Freewind Post + ["0.61:0.55:0.61:0.80"] = 241, -- Ratchet, Gadgetzan + ["0.61:0.55:0.56:0.53:0.44:0.69"] = 320, -- Ratchet, Crossroads, Camp Mojache + ["0.61:0.55:0.57:0.64:0.58:0.70"] = 161, -- Ratchet, Brackenwall Village, Mudsprocket + ["0.61:0.55:0.57:0.64"] = 101, -- Ratchet, Brackenwall Village + ["0.61:0.55:0.56:0.53:0.53:0.61"] = 141, -- Ratchet, Crossroads, Camp Taurajo + ["0.61:0.55:0.56:0.53:0.45:0.56:0.32:0.58"] = 334, -- Ratchet, Crossroads, Thunder Bluff, Shadowprey Village + ["0.61:0.55:0.56:0.53:0.45:0.56"] = 175, -- Ratchet, Crossroads, Thunder Bluff (Elena Liakhovskaia reported 70) + ["0.61:0.55:0.56:0.53"] = 69, -- Ratchet, Crossroads + ["0.61:0.55:0.56:0.53:0.41:0.47"] = 218, -- Ratchet, Crossroads, Sun Rock Retreat + ["0.61:0.55:0.63:0.44:0.55:0.42"] = 190, -- Ratchet, Orgrimmar, Splintertree Post -- CHANGE from 101 to 191 (Basse, Nate Sander, Lori Payne, Video Games, Josh Romey, Nelson Egger II) + ["0.61:0.55:0.63:0.44"] = 101, -- Ratchet, Orgrimmar + ["0.61:0.55:0.63:0.44:0.63:0.36"] = 196, -- Ratchet, Orgrimmar, Valormok + ["0.61:0.55:0.63:0.44:0.55:0.42:0.50:0.35"] = 269, -- Ratchet, Orgrimmar, Splintertree Post, Emerald Sanctuary + ["0.61:0.55:0.56:0.53:0.41:0.37"] = 299, -- Ratchet, Crossroads, Zoram'gar Outpost + ["0.61:0.55:0.56:0.53:0.46:0.30"] = 321, -- Ratchet, Crossroads, Bloodvenom Post + ["0.61:0.55:0.63:0.44:0.63:0.36:0.64:0.23:0.54:0.21"] = 458, -- Ratchet, Orgrimmar, Valormok, Everlook, Moonglade + ["0.61:0.55:0.63:0.44:0.63:0.36:0.64:0.23"] = 325, -- Ratchet, Orgrimmar, Valormok, Everlook + ["0.61:0.55:0.56:0.53:0.55:0.73"] = 253, -- Ratchet, Crossroads, Freewind Post + ["0.61:0.55:0.63:0.44:0.64:0.23"] = 341, -- Ratchet, Orgrimmar, Everlook + ["0.61:0.55:0.56:0.53:0.46:0.30:0.54:0.21"] = 443, -- Ratchet, Crossroads, Bloodvenom Post, Moonglade + ["0.61:0.55:0.56:0.53:0.55:0.73:0.58:0.70"] = 322, -- Ratchet, Crossroads, Freewind Post, Mudsprocket + ["0.61:0.55:0.63:0.44:0.55:0.42:0.41:0.37"] = 349, -- Ratchet, Orgrimmar, Splintertree Post, Zoram'gar Outpost + ["0.61:0.55:0.56:0.53:0.41:0.37:0.50:0.35"] = 420, -- Ratchet, Crossroads, Zoram'gar Outpost, Emerald Sanctuary + ["0.61:0.55:0.63:0.44:0.45:0.56"] = 326, -- Ratchet, Orgrimmar, Thunder Bluff + ["0.61:0.55:0.63:0.44:0.45:0.56:0.53:0.61"] = 413, -- Trinquete, Orgrimmar, Cima del Trueno, Campamento Taurajo + ["0.61:0.55:0.56:0.53:0.55:0.42"] = 231, -- Ratchet, Crossroads, Splintertree Post + ["0.61:0.55:0.56:0.53:0.41:0.47:0.32:0.58"] = 361, -- Ratchet, Crossroads, Sun Rock Retreat, Shadowprey Village + ["0.61:0.55:0.57:0.64:0.55:0.73:0.44:0.69"] = 326, -- Ratchet, Brackenwall Village, Freewind Post, Camp Mojache + ["0.61:0.55:0.63:0.44:0.64:0.23:0.54:0.21"] = 474, -- Ratschet, Orgrimmar, Ewige Warte, Mondlichtung + ["0.61:0.55:0.56:0.53:0.44:0.69:0.42:0.79"] = 450, -- Ratchet, Crossroads, Camp Mojache, Cenarion Hold + + -- Horde: Shadowprey Village (Desolace) + ["0.32:0.58:0.44:0.69:0.42:0.79"] = 326, -- Shadowprey Village, Camp Mojache, Cenarion Hold + ["0.32:0.58:0.44:0.69:0.42:0.79:0.50:0.76"] = 417, -- Shadowprey Village, Camp Mojache, Cenarion Hold, Marshal's Refuge + ["0.32:0.58:0.44:0.69:0.55:0.73:0.61:0.80"] = 395, -- Shadowprey Village, Camp Mojache, Freewind Post, Gadgetzan + ["0.32:0.58:0.44:0.69:0.55:0.73"] = 303, -- Shadowprey Village, Camp Mojache, Freewind Post + ["0.32:0.58:0.44:0.69"] = 196, -- Shadowprey Village, Camp Mojache + ["0.32:0.58:0.44:0.69:0.55:0.73:0.58:0.70"] = 372, -- Shadowprey Village, Camp Mojache, Freewind Post, Mudsprocket + ["0.32:0.58:0.45:0.56:0.53:0.61:0.57:0.64"] = 323, -- Shadowprey Village, Thunder Bluff, Camp Taurajo, Brackenwall Village + ["0.32:0.58:0.45:0.56:0.53:0.61"] = 265, -- Shadowprey Village, Thunder Bluff, Camp Taurajo + ["0.32:0.58:0.45:0.56:0.56:0.53:0.61:0.55"] = 332, -- Shadowprey Village, Thunder Bluff, Crossroads, Ratchet + ["0.32:0.58:0.45:0.56:0.56:0.53"] = 281, -- Shadowprey Village, Thunder Bluff, Crossroads + ["0.32:0.58:0.45:0.56"] = 178, -- Shadowprey Village, Thunder Bluff + ["0.32:0.58:0.41:0.47"] = 199, -- Shadowprey Village, Sun Rock Retreat + ["0.32:0.58:0.45:0.56:0.56:0.53:0.55:0.42"] = 443, -- Shadowprey Village, Thunder Bluff, Crossroads, Splintertree Post + ["0.32:0.58:0.45:0.56:0.63:0.44"] = 386, -- Shadowprey Village, Thunder Bluff, Orgrimmar + ["0.32:0.58:0.45:0.56:0.63:0.36"] = 429, -- Shadowprey Village, Thunder Bluff, Valormok + ["0.32:0.58:0.41:0.47:0.41:0.37:0.50:0.35"] = 441, -- Shadowprey Village, Sun Rock Retreat, Zoram'gar Outpost, Emerald Sanctuary + ["0.32:0.58:0.41:0.47:0.41:0.37"] = 320, -- Shadowprey Village, Sun Rock Retreat, Zoram'gar Outpost + ["0.32:0.58:0.41:0.47:0.41:0.37:0.46:0.30"] = 457, -- Shadowprey Village, Sun Rock Retreat, Zoram'gar Outpost, Bloodvenom Post + ["0.32:0.58:0.41:0.47:0.41:0.37:0.46:0.30:0.54:0.21"] = 581, -- Shadowprey Village, Sun Rock Retreat, Zoram'gar Outpost, Bloodvenom Post, Moonglade + ["0.32:0.58:0.45:0.56:0.63:0.36:0.64:0.23"] = 558, -- Shadowprey Village, Thunder Bluff, Valormok, Everlook + ["0.32:0.58:0.45:0.56:0.55:0.73"] = 382, -- Shadowprey Village, Thunder Bluff, Freewind Post + ["0.32:0.58:0.45:0.56:0.53:0.61:0.57:0.64:0.58:0.70"] = 384, -- Shadowprey Village, Thunder Bluff, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.32:0.58:0.45:0.56:0.61:0.80"] = 469, -- Shadowprey Village, Thunder Bluff, Gadgetzan + ["0.32:0.58:0.44:0.69:0.55:0.73:0.61:0.80:0.50:0.76"] = 497, -- Shadowprey Village, Camp Mojache, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.32:0.58:0.41:0.47:0.56:0.53:0.63:0.44"] = 465, -- Shadowprey Village, Sun Rock Retreat, Crossroads, Orgrimmar + ["0.32:0.58:0.45:0.56:0.63:0.44:0.64:0.23"] = 626, -- Shadowprey Village, Thunder Bluff, Orgrimmar, Everlook + ["0.32:0.58:0.45:0.56:0.63:0.36:0.64:0.23:0.54:0.21"] = 691, -- Shadowprey Village, Thunder Bluff, Valormok, Everlook, Moonglade + ["0.32:0.58:0.41:0.47:0.56:0.53:0.55:0.73"] = 533, -- Shadowprey Village, Sun Rock Retreat, Crossroads, Freewind Post + ["0.32:0.58:0.41:0.47:0.56:0.53"] = 348, -- Shadowprey Village, Sun Rock Retreat, Crossroads + ["0.32:0.58:0.45:0.56:0.56:0.53:0.55:0.42:0.50:0.35"] = 521, -- Shadowprey Village, Thunder Bluff, Crossroads, Splintertree Post, Emerald Sanctuary + ["0.32:0.58:0.41:0.47:0.56:0.53:0.61:0.55"] = 400, -- Schattenflucht, Sonnenfels, Das Wegekreuz, Ratschet + ["0.32:0.58:0.41:0.47:0.56:0.53:0.53:0.61"] = 422, -- Shadowprey Village, Sun Rock Retreat, Crossroads, Camp Taurajo + ["0.32:0.58:0.41:0.47:0.56:0.53:0.55:0.42"] = 511, -- Shadowprey Village, Sun Rock Retreat, Crossroads, Splintertree Post + ["0.32:0.58:0.45:0.56:0.41:0.37"] = 443, -- Shadowprey Village, Thunder Bluff, Zoram'gar Outpost + ["0.32:0.58:0.45:0.56:0.56:0.53:0.46:0.30:0.54:0.21"] = 655, -- Proie-de-l'Ombre, Les Pitons du Tonnerre, La Croisée, Poste de la Vénéneuse, Reflet-de-Lune, Reflet-de-Lune + ["0.32:0.58:0.41:0.47:0.56:0.53:0.55:0.73:0.61:0.80"] = 626, -- Shadowprey Village, Sun Rock Retreat, Crossroads, Freewind Post, Gadgetzan + ["0.32:0.58:0.45:0.56:0.56:0.53:0.46:0.30"] = 534, -- Shadowprey Village, Thunder Bluff, Crossroads, Bloodvenom Post + + -- Horde: Splintertree Post (Ashenvale) + ["0.55:0.42:0.56:0.53:0.44:0.69:0.42:0.79"] = 541, -- Splintertree Post, Crossroads, Camp Mojache, Cenarion Hold + ["0.55:0.42:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 538, -- Splintertree Post, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.55:0.42:0.56:0.53:0.55:0.73"] = 345, -- Splintertree Post, Crossroads, Freewind Post + ["0.55:0.42:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 354, -- Splintertree Post, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.55:0.42:0.56:0.53:0.55:0.73:0.61:0.80"] = 436, -- Splintertree Post, Crossroads, Freewind Post, Gadgetzan + ["0.55:0.42:0.56:0.53:0.53:0.61:0.57:0.64"] = 292, -- Splintertree Post, Crossroads, Camp Taurajo, Brackenwall Village + ["0.55:0.42:0.56:0.53:0.53:0.61"] = 234, -- Splintertree Post, Crossroads, Camp Taurajo + ["0.55:0.42:0.56:0.53:0.44:0.69"] = 412, -- Splintertree Post, Crossroads, Camp Mojache + ["0.55:0.42:0.56:0.53:0.45:0.56:0.32:0.58"] = 426, -- Splintertree Post, Crossroads, Thunder Bluff, Shadowprey Village + ["0.55:0.42:0.56:0.53:0.45:0.56"] = 267, -- Splintertree Post, Crossroads, Thunder Bluff + ["0.55:0.42:0.56:0.53"] = 160, -- Splintertree Post, Crossroads + ["0.55:0.42:0.63:0.44:0.61:0.55"] = 203, -- Splintertree Post, Orgrimmar, Ratchet + ["0.55:0.42:0.63:0.44"] = 96, -- Splintertree Post, Orgrimmar + ["0.55:0.42:0.63:0.36"] = 92, -- Splintertree Post, Valormok + ["0.55:0.42:0.50:0.35"] = 85, -- Splintertree Post, Emerald Sanctuary + ["0.55:0.42:0.41:0.37"] = 166, -- Splintertree Post, Zoram'gar Outpost + ["0.55:0.42:0.41:0.37:0.41:0.47"] = 287, -- Splintertree Post, Zoram'gar Outpost, Sun Rock Retreat + ["0.55:0.42:0.50:0.35:0.46:0.30"] = 163, -- Splintertree Post, Emerald Sanctuary, Bloodvenom Post + ["0.55:0.42:0.50:0.35:0.46:0.30:0.54:0.21"] = 287, -- Splintertree Post, Emerald Sanctuary, Bloodvenom Post, Moonglade + ["0.55:0.42:0.63:0.36:0.64:0.23"] = 221, -- Splintertree Post, Valormok, Everlook + ["0.55:0.42:0.56:0.53:0.61:0.55"] = 212, -- Splintertree Post, Crossroads, Ratchet + ["0.55:0.42:0.56:0.53:0.41:0.47"] = 310, -- Splintertree Post, Crossroads, Sun Rock Retreat + ["0.55:0.42:0.63:0.44:0.46:0.30"] = 348, -- Splintertree Post, Orgrimmar, Bloodvenom Post + ["0.55:0.42:0.41:0.37:0.46:0.30"] = 303, -- Splintertree Post, Zoram'gar Outpost, Bloodvenom Post + ["0.55:0.42:0.63:0.36:0.64:0.23:0.54:0.21"] = 354, -- Splintertree Post, Valormok, Everlook, Moonglade + ["0.55:0.42:0.63:0.44:0.64:0.23"] = 336, -- Splintertree Post, Orgrimmar, Everlook + ["0.55:0.42:0.41:0.37:0.41:0.47:0.32:0.58"] = 429, -- Splintertree Post, Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village + ["0.55:0.42:0.63:0.44:0.45:0.56:0.53:0.61"] = 408, -- Splintertree Post, Orgrimmar, Thunder Bluff, Camp Taurajo + + -- Horde: Sun Rock Retreat (Stonetalon Mountains) + ["0.41:0.47:0.56:0.53:0.55:0.73:0.61:0.80"] = 426, -- Sun Rock Retreat, Crossroads, Freewind Post, Gadgetzan + ["0.41:0.47:0.32:0.58:0.44:0.69:0.42:0.79"] = 469, -- Sun Rock Retreat, Shadowprey Village, Camp Mojache, Cenarion Hold + ["0.41:0.47:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 527, -- Sun Rock Retreat, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.41:0.47:0.56:0.53:0.55:0.73"] = 333, -- Sun Rock Retreat, Crossroads, Freewind Post + ["0.41:0.47:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 342, -- Sun Rock Retreat, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.41:0.47:0.56:0.53:0.53:0.61:0.57:0.64"] = 281, -- Sun Rock Retreat, Crossroads, Camp Taurajo, Brackenwall Village + ["0.41:0.47:0.56:0.53:0.53:0.61"] = 223, -- Sun Rock Retreat, Crossroads, Camp Taurajo + ["0.41:0.47:0.32:0.58:0.44:0.69"] = 339, -- Sun Rock Retreat, Shadowprey Village, Camp Mojache + ["0.41:0.47:0.32:0.58"] = 143, -- Sun Rock Retreat, Shadowprey Village + ["0.41:0.47:0.45:0.56"] = 175, -- Sun Rock Retreat, Thunder Bluff + ["0.41:0.47:0.56:0.53"] = 150, -- Sun Rock Retreat, Crossroads + ["0.41:0.47:0.56:0.53:0.61:0.55"] = 201, -- Sun Rock Retreat, Crossroads, Ratchet (was 200, changed to 150 by William Black, changed back to 201 by Oliver Snith) + ["0.41:0.47:0.56:0.53:0.63:0.44"] = 266, -- Sun Rock Retreat, Crossroads, Orgrimmar + ["0.41:0.47:0.41:0.37:0.55:0.42"] = 294, -- Sun Rock Retreat, Zoram'gar Outpost, Splintertree Post + ["0.41:0.47:0.56:0.53:0.63:0.36"] = 313, -- Sun Rock Retreat, Crossroads, Valormok + ["0.41:0.47:0.56:0.53:0.63:0.36:0.64:0.23"] = 442, -- Sun Rock Retreat, Crossroads, Valormok, Everlook + ["0.41:0.47:0.41:0.37:0.50:0.35"] = 242, -- Sun Rock Retreat, Zoram'gar Outpost, Emerald Sanctuary + ["0.41:0.47:0.41:0.37:0.46:0.30"] = 257, -- Sun Rock Retreat, Zoram'gar Outpost, Bloodvenom Post + ["0.41:0.47:0.41:0.37:0.46:0.30:0.54:0.21"] = 382, -- Sun Rock Retreat, Zoram'gar Outpost, Bloodvenom Post, Moonglade + ["0.41:0.47:0.41:0.37"] = 121, -- Sun Rock Retreat, Zoram'gar Outpost + ["0.41:0.47:0.56:0.53:0.55:0.42"] = 312, -- Sun Rock Retreat, Crossroads, Splintertree Post + ["0.41:0.47:0.45:0.56:0.63:0.44:0.55:0.42"] = 471, -- Sun Rock Retreat, Thunder Bluff, Orgrimmar, Splintertree Post + ["0.41:0.47:0.45:0.56:0.63:0.44"] = 382, -- Sun Rock Retreat, Thunder Bluff, Orgrimmar + ["0.41:0.47:0.41:0.37:0.46:0.30:0.64:0.23"] = 405, -- Sun Rock Retreat, Zoram'gar Outpost, Bloodvenom Post, Everlook + ["0.41:0.47:0.56:0.53:0.63:0.44:0.64:0.23"] = 506, -- Sun Rock Retreat, Crossroads, Orgrimmar, Everlook + ["0.41:0.47:0.56:0.53:0.44:0.69"] = 401, -- Sun Rock Retreat, Crossroads, Camp Mojache + + -- Horde: Thunder Bluff (Mulgore) + ["0.45:0.56:0.44:0.69:0.42:0.79"] = 381, -- Thunder Bluff, Camp Mojache, Cenarion Hold + ["0.45:0.56:0.61:0.80:0.50:0.76"] = 395, -- Thunder Bluff, Gadgetzan, Marshal's Refuge + ["0.45:0.56:0.55:0.73"] = 204, -- Thunder Bluff, Freewind Post + ["0.45:0.56:0.61:0.80"] = 290, -- Thunder Bluff, Gadgetzan (Maja Jean Jakobsen reported 194) + ["0.45:0.56:0.53:0.61:0.57:0.64:0.58:0.70"] = 206, -- Thunder Bluff, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.45:0.56:0.57:0.64"] = 239, -- Thunder Bluff, Brackenwall Village + ["0.45:0.56:0.53:0.61"] = 87, -- Thunder Bluff, Camp Taurajo (Steven Martin suggested 97 but testing showed 87) + ["0.45:0.56:0.44:0.69"] = 252, -- Thunder Bluff, Camp Mojache + ["0.45:0.56:0.32:0.58"] = 159, -- Thunder Bluff, Shadowprey Village + ["0.45:0.56:0.41:0.47"] = 182, -- Thunder Bluff, Sun Rock Retreat + ["0.45:0.56:0.56:0.53"] = 103, -- Thunder Bluff, Crossroads + ["0.45:0.56:0.56:0.53:0.61:0.55"] = 154, -- Thunder Bluff, Crossroads, Ratchet + ["0.45:0.56:0.63:0.44"] = 207, -- Thunder Bluff, Orgrimmar (Kraal Nae-Dell reported 249) + ["0.45:0.56:0.56:0.53:0.55:0.42"] = 265, -- Thunder Bluff, Crossroads, Splintertree Post + ["0.45:0.56:0.63:0.36"] = 251, -- Thunder Bluff, Valormok + ["0.45:0.56:0.56:0.53:0.55:0.42:0.50:0.35"] = 343, -- Thunder Bluff, Crossroads, Splintertree Post, Emerald Sanctuary + ["0.45:0.56:0.56:0.53:0.46:0.30"] = 355, -- Thunder Bluff, Crossroads, Bloodvenom Post + ["0.45:0.56:0.41:0.37"] = 265, -- Thunder Bluff, Zoram'gar Outpost + ["0.45:0.56:0.63:0.36:0.64:0.23:0.54:0.21"] = 513, -- Thunder Bluff, Valormok, Everlook, Moonglade + ["0.45:0.56:0.63:0.36:0.64:0.23"] = 380, -- Thunder Bluff, Valormok, Everlook + ["0.45:0.56:0.61:0.80:0.50:0.76:0.42:0.79"] = 490, -- Thunder Bluff, Gadgetzan, Marshal's Refuge, Cenarion Hold + ["0.45:0.56:0.63:0.44:0.64:0.23"] = 448, -- Thunder Bluff, Orgrimmar, Everlook + ["0.45:0.56:0.56:0.53:0.46:0.30:0.54:0.21"] = 477, -- Thunder Bluff, Crossroads, Bloodvenom Post, Moonglade + ["0.45:0.56:0.63:0.44:0.61:0.55"] = 315, -- Thunder Bluff, Orgrimmar, Ratchet + ["0.45:0.56:0.55:0.73:0.58:0.70"] = 273, -- Thunder Bluff, Freewind Post, Mudsprocket + ["0.45:0.56:0.61:0.80:0.42:0.79"] = 523, -- Thunder Bluff, Gadgetzan, Cenarion Hold + ["0.45:0.56:0.63:0.44:0.55:0.42"] = 297, -- Thunder Bluff, Orgrimmar, Splintertree Post + + -- Horde: Valormok (Azshara) + ["0.63:0.36:0.56:0.53:0.55:0.73:0.61:0.80"] = 441, -- Valormok, Crossroads, Freewind Post, Gadgetzan + ["0.63:0.36:0.56:0.53:0.44:0.69:0.42:0.79"] = 545, -- Valormok, Crossroads, Camp Mojache, Cenarion Hold + ["0.63:0.36:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 541, -- Valormok, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.63:0.36:0.56:0.53:0.55:0.73"] = 348, -- Valormok, Crossroads, Freewind Post + ["0.63:0.36:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 356, -- Valormok, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.63:0.36:0.56:0.53:0.53:0.61:0.57:0.64"] = 295, -- Valormok, Crossroads, Camp Taurajo, Brackenwall Village + ["0.63:0.36:0.56:0.53:0.53:0.61"] = 237, -- Valormok, Crossroads, Camp Taurajo + ["0.63:0.36:0.56:0.53:0.44:0.69"] = 415, -- Valormok, Crossroads, Camp Mojache + ["0.63:0.36:0.45:0.56:0.32:0.58"] = 409, -- Valormok, Thunder Bluff, Shadowprey Village + ["0.63:0.36:0.45:0.56"] = 250, -- Valormok, Thunder Bluff + ["0.63:0.36:0.56:0.53"] = 164, -- Valormok, Crossroads + ["0.63:0.36:0.63:0.44:0.61:0.55"] = 208, -- Valormok, Orgrimmar, Ratchet + ["0.63:0.36:0.63:0.44"] = 101, -- Valormok, Orgrimmar + ["0.63:0.36:0.55:0.42"] = 94, -- Valormok, Splintertree Post + ["0.63:0.36:0.56:0.53:0.41:0.47"] = 313, -- Valormok, Crossroads, Sun Rock Retreat + ["0.63:0.36:0.55:0.42:0.41:0.37"] = 253, -- Valormok, Splintertree Post, Zoram'gar Outpost + ["0.63:0.36:0.55:0.42:0.50:0.35"] = 172, -- Valormok, Splintertree Post, Emerald Sanctuary + ["0.63:0.36:0.46:0.30"] = 233, -- Valormok, Bloodvenom Post + ["0.63:0.36:0.64:0.23:0.54:0.21"] = 264, -- Valormok, Everlook, Moonglade + ["0.63:0.36:0.64:0.23"] = 131, -- Valormok, Everlook + ["0.63:0.36:0.46:0.30:0.54:0.21"] = 349, -- Valormok, Bloodvenom Post, Moonglade + ["0.63:0.36:0.63:0.44:0.61:0.55:0.61:0.80:0.50:0.76"] = 555, -- Valormok, Orgrimmar, Ratchet, Gadgetzan, Marshal's Refuge + ["0.63:0.36:0.56:0.53:0.55:0.73:0.58:0.70"] = 417, -- Valormok, Crossroads, Freewind Post, Mudsprocket + + -- Horde: Zoram'gar Outpost (Ashenvale) + ["0.41:0.37:0.56:0.53:0.55:0.73:0.61:0.80"] = 512, -- Zoram'gar Outpost, Crossroads, Freewind Post, Gadgetzan + ["0.41:0.37:0.41:0.47:0.32:0.58:0.44:0.69:0.42:0.79"] = 589, -- Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village, Camp Mojache, Cenarion Hold + ["0.41:0.37:0.56:0.53:0.55:0.73:0.61:0.80:0.50:0.76"] = 611, -- Zoram'gar Outpost, Crossroads, Freewind Post, Gadgetzan, Marshal's Refuge + ["0.41:0.37:0.56:0.53:0.55:0.73"] = 419, -- Zoram'gar Outpost, Crossroads, Freewind Post + ["0.41:0.37:0.56:0.53:0.53:0.61:0.57:0.64:0.58:0.70"] = 428, -- Zoram'gar Outpost, Crossroads, Camp Taurajo, Brackenwall Village, Mudsprocket + ["0.41:0.37:0.56:0.53:0.53:0.61:0.57:0.64"] = 366, -- Zoram'gar Outpost, Crossroads, Camp Taurajo, Brackenwall Village + ["0.41:0.37:0.56:0.53:0.53:0.61"] = 309, -- Zoram'gar Outpost, Crossroads, Camp Taurajo + ["0.41:0.37:0.41:0.47:0.32:0.58:0.44:0.69"] = 459, -- Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village, Camp Mojache + ["0.41:0.37:0.41:0.47:0.32:0.58"] = 264, -- Zoram'gar Outpost, Sun Rock Retreat, Shadowprey Village + ["0.41:0.37:0.45:0.56"] = 247, -- Zoram'gar Outpost, Thunder Bluff + ["0.41:0.37:0.56:0.53"] = 235, -- Zoram'gar Outpost, Crossroads + ["0.41:0.37:0.56:0.53:0.61:0.55"] = 287, -- Zoram'gar Outpost, Crossroads, Ratchet + ["0.41:0.37:0.55:0.42:0.63:0.44"] = 262, -- Zoram'gar Outpost, Splintertree Post, Orgrimmar + ["0.41:0.37:0.55:0.42"] = 173, -- Zoram'gar Outpost, Splintertree Post + ["0.41:0.37:0.41:0.47"] = 121, -- Zoram'gar Outpost, Sun Rock Retreat + ["0.41:0.37:0.50:0.35"] = 122, -- Zoram'gar Outpost, Emerald Sanctuary + ["0.41:0.37:0.46:0.30"] = 138, -- Zoram'gar Outpost, Bloodvenom Post + ["0.41:0.37:0.55:0.42:0.63:0.36"] = 258, -- Zoram'gar Outpost, Splintertree Post, Valormok + ["0.41:0.37:0.46:0.30:0.64:0.23"] = 285, -- Zoram'gar Outpost, Bloodvenom Post, Everlook + ["0.41:0.37:0.46:0.30:0.54:0.21"] = 263, -- Zoram'gar Outpost, Bloodvenom Post, Moonglade + ["0.41:0.37:0.56:0.53:0.63:0.44"] = 352, -- Zoram'gar Outpost, Crossroads, Orgrimmar + ["0.41:0.37:0.45:0.56:0.32:0.58"] = 407, -- Zoram'gar Outpost, Thunder Bluff, Shadowprey Village + ["0.41:0.37:0.45:0.56:0.63:0.44"] = 455, -- Zoram'gar Outpost, Thunder Bluff, Orgrimmar + + }, + + -- Horde: Outland + [1945] = { + + -- Horde: Altar of Sha'tar (Shadowmoon Valley) + ["0.81:0.77:0.66:0.77"] = 67, -- Altar of Sha'tar, Shadowmoon Village + ["0.81:0.77:0.51:0.73:0.44:0.67"] = 193, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath + ["0.81:0.77:0.51:0.73"] = 140, -- Altar of Sha'tar, Stonebreaker Hold + ["0.81:0.77:0.51:0.73:0.65:0.50"] = 263, -- Altar of Sha'tar, Stonebreaker Hold, Thrallmar + ["0.81:0.77:0.51:0.73:0.44:0.67:0.23:0.50"] = 329, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Zabra'jin + ["0.81:0.77:0.51:0.73:0.44:0.67:0.29:0.62"] = 274, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Garadar + ["0.81:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 398, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.81:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 463, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.81:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 446, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.81:0.77:0.51:0.73:0.44:0.67:0.44:0.51"] = 272, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Swamprat Post + ["0.81:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32"] = 378, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.81:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 403, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.81:0.77:0.51:0.73:0.65:0.50:0.68:0.63"] = 328, -- Altar of Sha'tar, Stonebreaker Hold, Thrallmar, Spinebreaker Ridge + ["0.81:0.77:0.51:0.73:0.65:0.50:0.79:0.54"] = 333, -- Altar of Sha'tar, Stonebreaker Hold, Thrallmar, Hellfire Peninsula + ["0.81:0.77:0.51:0.73:0.44:0.67:0.54:0.57"] = 269, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Falcon Watch + ["0.81:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36"] = 342, -- Altar of Sha'tar, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32"] = 378, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 398, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.81:0.77:0.66:0.77:0.51:0.73"] = 140, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67"] = 194, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.29:0.62"] = 274, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Garadar + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 445, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.81:0.77:0.66:0.77:0.51:0.73:0.65:0.50"] = 263, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Thrallmar + ["0.81:0.77:0.66:0.77:0.51:0.73:0.65:0.50:0.79:0.54"] = 333, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Thrallmar, Hellfire Peninsula + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51"] = 272, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 403, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27"] = 474, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36"] = 342, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 463, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.23:0.50"] = 329, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Zabra'jin + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.54:0.57"] = 269, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Shattrath, Falcon Watch + ["0.81:0.77:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27:0.63:0.18"] = 521, -- Altar der Sha'tar, Schattenmond, Steinbrecherfeste, Shattrath, Sumpfrattenposten, Donnerfeste, Area 52, Die Sturmsäule + ["0.81:0.77:0.66:0.77:0.51:0.73:0.65:0.50:0.68:0.63"] = 328, -- Altar of Sha'tar, Shadowmoon Village, Stonebreaker Hold, Thrallmar, Spinebreaker Ridge + + -- Horde: Area 52 (Netherstorm) + ["0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 357, -- Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 342, -- Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 343, -- Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50"] = 273, -- Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar + ["0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57"] = 204, -- Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch + ["0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73"] = 292, -- Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67"] = 224, -- Area 52, Mok'Nathal Village, Swamprat Post, Shattrath + ["0.58:0.27:0.49:0.36:0.44:0.51"] = 137, -- Area 52, Mok'Nathal Village, Swamprat Post + ["0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.29:0.62"] = 306, -- Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Garadar + ["0.58:0.27:0.49:0.36:0.44:0.51:0.23:0.50"] = 248, -- Area 52, Mok'Nathal Village, Swamprat Post, Zabra'jin + ["0.58:0.27:0.38:0.32"] = 108, -- Area 52, Thunderlord Stronghold + ["0.58:0.27:0.49:0.36"] = 64, -- Area 52, Mok'Nathal Village + ["0.58:0.27:0.42:0.28"] = 82, -- Area 52, Evergrove (was 80, Michael Kartoz reported 86 so changed to 82) + ["0.58:0.27:0.63:0.18"] = 47, -- Area 52, The Stormspire + ["0.58:0.27:0.72:0.28"] = 66, -- Area 52, Cosmowrench + ["0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 437, -- Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.58:0.27:0.38:0.32:0.44:0.51:0.54:0.57"] = 287, -- Area 52, Thunderlord Stronghold, Swamprat Post, Falcon Watch + ["0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 420, -- Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67"] = 311, -- Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath + ["0.58:0.27:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50"] = 359, -- Area 52, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar + ["0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 443, -- Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.58:0.27:0.38:0.32:0.44:0.51"] = 224, -- Area 52, Thunderlord Stronghold, Swamprat Post + ["0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73"] = 379, -- Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.58:0.27:0.38:0.32:0.23:0.50"] = 257, -- Area 52, Thunderlord Stronghold, Zabra'jin + ["0.58:0.27:0.38:0.32:0.23:0.50:0.29:0.62"] = 335, -- Area 52, Thunderlord Stronghold, Zabra'jin, Garadar + ["0.58:0.27:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 430, -- Area 52, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 507, -- Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 524, -- Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.58:0.27:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 424, -- Area 52, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.58:0.27:0.38:0.32:0.23:0.50:0.44:0.67"] = 405, -- Area 52, Thunderlord Stronghold, Zabra'jin, Shattrath + ["0.58:0.27:0.38:0.32:0.23:0.50:0.44:0.67:0.51:0.73"] = 474, -- Area 52, Thunderlord Stronghold, Zabra'jin, Shattrath, Stonebreaker Hold + + -- Horde: Cosmowrench (Netherstorm) + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 420, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 401, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 406, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50"] = 336, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57"] = 264, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73"] = 355, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67"] = 287, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51"] = 204, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.29:0.62"] = 371, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Garadar + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.23:0.50"] = 312, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Zabra'jin + ["0.72:0.28:0.58:0.27:0.38:0.32"] = 173, -- Cosmowrench, Area 52, Thunderlord Stronghold + ["0.72:0.28:0.58:0.27:0.49:0.36"] = 129, -- Cosmowrench, Area 52, Mok'Nathal Village + ["0.72:0.28:0.58:0.27:0.42:0.28"] = 146, -- Cosmowrench, Area 52, Evergrove + ["0.72:0.28:0.58:0.27"] = 64, -- Cosmowrench, Area 52 + ["0.72:0.28:0.63:0.18"] = 61, -- Cosmowrench, The Stormspire + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 484, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.72:0.28:0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67"] = 374, -- Cosmowrench, Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath + ["0.72:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 501, -- Cosmowrench, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.72:0.28:0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73"] = 442, -- Cosmowrench, Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.72:0.28:0.58:0.27:0.38:0.32:0.44:0.51"] = 288, -- Cosmowrench, Area 52, Thunderlord Stronghold, Swamprat Post + ["0.72:0.28:0.63:0.18:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50"] = 457, -- Cosmowrench, The Stormspire, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar + ["0.72:0.28:0.58:0.27:0.38:0.32:0.23:0.50"] = 320, -- Cosmowrench, Area 52, Thunderlord Stronghold, Zabra'jin + ["0.72:0.28:0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67:0.29:0.62"] = 456, -- Cosmowrench, Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath, Garadar + ["0.72:0.28:0.63:0.18:0.38:0.32:0.44:0.51:0.44:0.67"] = 409, -- Cosmowrench, The Stormspire, Thunderlord Stronghold, Swamprat Post, Shattrath + ["0.72:0.28:0.58:0.27:0.38:0.32:0.23:0.50:0.29:0.62"] = 398, -- Cosmowrench, Area 52, Thunderlord Stronghold, Zabra'jin, Garadar + ["0.72:0.28:0.58:0.27:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 571, -- Cosmowrench, Area 52, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.72:0.28:0.63:0.18:0.38:0.32:0.44:0.51"] = 322, -- Cosmowrench, The Stormspire, Thunderlord Stronghold, Swamprat Post + ["0.72:0.28:0.58:0.27:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50"] = 423, -- Kosmozang, Area 52, Donnerfeste, Sumpfrattenposten, Falkenwacht, Thrallmar + ["0.72:0.28:0.58:0.27:0.38:0.32:0.44:0.51:0.54:0.57"] = 351, -- Cosmowrench, Area 52, Thunderlord Stronghold, Swamprat Post, Falcon Watch + ["0.72:0.28:0.58:0.27:0.38:0.32:0.23:0.50:0.54:0.57"] = 464, -- Космоворот, Зона 52, Оплот Громоборцев, Забра'джин, Соколиный дозор + + -- Horde: Evergrove (Blade's Edge Mountains) + ["0.42:0.28:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 371, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.42:0.28:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 353, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.42:0.28:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 358, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.42:0.28:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50"] = 287, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar + ["0.42:0.28:0.38:0.32:0.44:0.51:0.54:0.57"] = 215, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Falcon Watch + ["0.42:0.28:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73"] = 306, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.42:0.28:0.38:0.32:0.44:0.51:0.44:0.67"] = 238, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Shattrath + ["0.42:0.28:0.38:0.32:0.44:0.51"] = 152, -- Evergrove, Thunderlord Stronghold, Swamprat Post + ["0.42:0.28:0.38:0.32:0.23:0.50:0.29:0.62"] = 262, -- Evergrove, Thunderlord Stronghold, Zabra'jin, Garadar + ["0.42:0.28:0.38:0.32:0.23:0.50"] = 184, -- Evergrove, Thunderlord Stronghold, Zabra'jin + ["0.42:0.28:0.38:0.32"] = 36, -- Evergrove, Thunderlord Stronghold + ["0.42:0.28:0.38:0.32:0.49:0.36"] = 91, -- Evergrove, Thunderlord Stronghold, Mok'Nathal Village + ["0.42:0.28:0.58:0.27"] = 78, -- Evergrove, Area 52 + ["0.42:0.28:0.58:0.27:0.72:0.28"] = 143, -- Evergrove, Area 52, Cosmowrench + ["0.42:0.28:0.58:0.27:0.63:0.18"] = 125, -- Evergrove, Area 52, The Stormspire + ["0.42:0.28:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 435, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.42:0.28:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 452, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.42:0.28:0.38:0.32:0.44:0.51:0.44:0.67:0.29:0.62"] = 319, -- Evergrove, Thunderlord Stronghold, Swamprat Post, Shattrath, Garadar + ["0.42:0.28:0.38:0.32:0.63:0.18"] = 192, -- Evergrove, Thunderlord Stronghold, The Stormspire + ["0.42:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67"] = 301, -- Evergrove, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath + ["0.42:0.28:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.29:0.62"] = 381, -- Evergrove, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Garadar + ["0.42:0.28:0.38:0.32:0.23:0.50:0.44:0.67"] = 333, -- Evergrove, Thunderlord Stronghold, Zabra'jin, Shattrath + + -- Horde: Falcon Watch (Hellfire Peninsula) + ["0.54:0.57:0.44:0.67:0.51:0.73:0.66:0.77"] = 204, -- Falcon Watch, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.54:0.57:0.65:0.50:0.68:0.63"] = 138, -- Falcon Watch, Thrallmar, Spinebreaker Ridge (suggestion of 74 by Jeremiah Wilson) + ["0.54:0.57:0.65:0.50:0.79:0.54"] = 143, -- Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.54:0.57:0.65:0.50"] = 73, -- Falcon Watch, Thrallmar + ["0.54:0.57:0.44:0.67:0.51:0.73"] = 139, -- Falcon Watch, Shattrath, Stonebreaker Hold + ["0.54:0.57:0.44:0.67"] = 71, -- Falcon Watch, Shattrath + ["0.54:0.57:0.44:0.51"] = 69, -- Falcon Watch, Swamprat Post (Infarkt reported 90) + ["0.54:0.57:0.29:0.62"] = 132, -- Falcon Watch, Garadar + ["0.54:0.57:0.23:0.50"] = 150, -- Falcon Watch, Zabra'jin + ["0.54:0.57:0.44:0.51:0.38:0.32"] = 174, -- Falcon Watch, Swamprat Post, Thunderlord Stronghold + ["0.54:0.57:0.44:0.51:0.38:0.32:0.42:0.28"] = 201, -- Falcon Watch, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.54:0.57:0.44:0.51:0.49:0.36"] = 139, -- Falcon Watch, Swamprat Post, Mok'Nathal Village + ["0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27"] = 199, -- Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 260, -- Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 242, -- Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.54:0.57:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 286, -- Falcon Watch, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.54:0.57:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 269, -- Falcon Watch, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.54:0.57:0.44:0.51:0.38:0.32:0.58:0.27"] = 271, -- Falcon Watch, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.54:0.57:0.44:0.51:0.38:0.32:0.58:0.27:0.63:0.18"] = 319, -- Falcon Watch, Swamprat Post, Thunderlord Stronghold, Area 52, The Stormspire + ["0.54:0.57:0.23:0.50:0.38:0.32"] = 261, -- Falcon Watch, Zabra'jin, Thunderlord Stronghold + ["0.54:0.57:0.65:0.50:0.51:0.73"] = 201, -- Falcon Watch, Thrallmar, Stonebreaker Hold + + -- Horde: Garadar (Nagrand) + ["0.29:0.62:0.44:0.67:0.51:0.73:0.66:0.77"] = 210, -- Garadar, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.29:0.62:0.44:0.67:0.51:0.73"] = 145, -- Garadar, Shattrath, Stonebreaker Hold + ["0.29:0.62:0.44:0.67"] = 77, -- Garadar, Shattrath + ["0.29:0.62:0.54:0.57:0.65:0.50:0.68:0.63"] = 266, -- Garadar, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.29:0.62:0.54:0.57:0.65:0.50:0.79:0.54"] = 270, -- Garadar, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.29:0.62:0.54:0.57:0.65:0.50"] = 199, -- Garadar, Falcon Watch, Thrallmar (Manuel Frank Griesel reported 41) + ["0.29:0.62:0.54:0.57"] = 126, -- Garadar, Falcon Watch + ["0.29:0.62:0.44:0.67:0.44:0.51"] = 156, -- Garadar, Shattrath, Swamprat Post + ["0.29:0.62:0.23:0.50"] = 67, -- Garadar, Zabra'jin + ["0.29:0.62:0.23:0.50:0.38:0.32"] = 177, -- Garadar, Zabra'jin, Thunderlord Stronghold + ["0.29:0.62:0.23:0.50:0.38:0.32:0.42:0.28"] = 203, -- Garadar, Zabra'jin, Thunderlord Stronghold, Evergrove + ["0.29:0.62:0.44:0.67:0.44:0.51:0.49:0.36"] = 227, -- Garadar, Shattrath, Swamprat Post, Mok'Nathal Village + ["0.29:0.62:0.23:0.50:0.38:0.32:0.58:0.27"] = 274, -- Garadar, Zabra'jin, Thunderlord Stronghold, Area 52 + ["0.29:0.62:0.23:0.50:0.38:0.32:0.58:0.27:0.72:0.28"] = 339, -- Garadar, Zabra'jin, Thunderlord Stronghold, Area 52, Cosmowrench + ["0.29:0.62:0.23:0.50:0.38:0.32:0.58:0.27:0.63:0.18"] = 322, -- Garadar, Zabra'jin, Thunderlord Stronghold, Area 52, The Stormspire + ["0.29:0.62:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 291, -- Garadar, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.29:0.62:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 274, -- Garadar, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.29:0.62:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 282, -- Garadar, Shattrath, Sumpfrattenposten, Dorf der Mok'Nathal, Area 52 + ["0.29:0.62:0.23:0.50:0.44:0.51"] = 175, -- Garadar, Zabra'jin, Swamprat Post + ["0.29:0.62:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27"] = 359, -- Garadar, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.29:0.62:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 287, -- Garadar, Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.29:0.62:0.44:0.67:0.44:0.51:0.38:0.32"] = 262, -- Garadar, Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.29:0.62:0.44:0.67:0.65:0.50"] = 205, -- Garadar, Shattrath, Thrallmar + ["0.29:0.62:0.23:0.50:0.38:0.32:0.49:0.36"] = 233, -- Garadar, Zabra'jin, Thunderlord Stronghold, Mok'Nathal Village + ["0.29:0.62:0.23:0.50:0.38:0.32:0.63:0.18"] = 333, -- Garadar, Zabra'jin, Thunderlord Stronghold, The Stormspire + ["0.29:0.62:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 330, -- Garadar, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.29:0.62:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.42:0.28"] = 362, -- Garadar, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Evergrove + + -- Horde: Hellfire Peninsula (Hellfire Peninsula) (Dark Portal) + ["0.79:0.54:0.65:0.50:0.51:0.73:0.66:0.77"] = 252, -- Hellfire Peninsula, Thrallmar, Stonebreaker Hold, Shadowmoon Village + ["0.79:0.54:0.65:0.50:0.68:0.63"] = 125, -- Hellfire Peninsula, Thrallmar, Spinebreaker Ridge + ["0.79:0.54:0.65:0.50"] = 59, -- Hellfire Peninsula, Thrallmar (Edward Barroso reported 81) + ["0.79:0.54:0.54:0.57"] = 122, -- Hellfire Peninsula, Falcon Watch + ["0.79:0.54:0.65:0.50:0.51:0.73"] = 188, -- Hellfire Peninsula, Thrallmar, Stonebreaker Hold + ["0.79:0.54:0.54:0.57:0.44:0.67"] = 193, -- Hellfire Peninsula, Falcon Watch, Shattrath + ["0.79:0.54:0.54:0.57:0.44:0.51"] = 190, -- Hellfire Peninsula, Falcon Watch, Swamprat Post + ["0.79:0.54:0.54:0.57:0.29:0.62"] = 253, -- Hellfire Peninsula, Falcon Watch, Garadar (Ben Collis reported 123) + ["0.79:0.54:0.54:0.57:0.23:0.50"] = 271, -- Hellfire Peninsula, Falcon Watch, Zabra'jin + ["0.79:0.54:0.54:0.57:0.44:0.51:0.38:0.32"] = 295, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Thunderlord Stronghold + ["0.79:0.54:0.54:0.57:0.44:0.51:0.38:0.32:0.42:0.28"] = 321, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.79:0.54:0.54:0.57:0.44:0.51:0.49:0.36"] = 261, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Mok'Nathal Village + ["0.79:0.54:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27"] = 316, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.79:0.54:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 381, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.79:0.54:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 364, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.79:0.54:0.65:0.50:0.51:0.73:0.66:0.77:0.78:0.85"] = 316, -- Hellfire Peninsula, Thrallmar, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.79:0.54:0.65:0.50:0.51:0.73:0.66:0.77:0.81:0.77"] = 333, -- Hellfire Peninsula, Thrallmar, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.79:0.54:0.65:0.50:0.51:0.73:0.44:0.67"] = 241, -- Hellfire Peninsula, Thrallmar, Stonebreaker Hold, Shattrath + ["0.79:0.54:0.65:0.50:0.44:0.67"] = 182, -- Hellfire Peninsula, Thrallmar, Shattrath (Matthias Rössing reported 203) + ["0.79:0.54:0.54:0.57:0.44:0.51:0.38:0.32:0.58:0.27"] = 392, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.79:0.54:0.65:0.50:0.44:0.67:0.23:0.50"] = 316, -- Hellfire Peninsula, Thrallmar, Shattrath, Zabra'jin + ["0.79:0.54:0.65:0.50:0.44:0.67:0.29:0.62"] = 262, -- Hellfire Peninsula, Thrallmar, Shattrath, Garadar + ["0.79:0.54:0.65:0.50:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 390, -- Hellfire Peninsula, Thrallmar, Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.79:0.54:0.54:0.57:0.44:0.51:0.38:0.32:0.58:0.27:0.72:0.28"] = 458, -- Полуостров Адского Пламени, Соколиный дозор, Застава Болотной Крысы, Оплот Громоборцев, Зона 52, Космоворот + ["0.79:0.54:0.54:0.57:0.44:0.51:0.38:0.32:0.63:0.18"] = 451, -- Hellfire Peninsula, Falcon Watch, Swamprat Post, Thunderlord Stronghold, The Stormspire + ["0.79:0.54:0.65:0.50:0.44:0.67:0.44:0.51"] = 259, -- Hellfire Peninsula, Thrallmar, Shattrath, Swamprat Post + + -- Horde: Mok'Nathal Village (Blade's Edge Mountains) + ["0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 292, -- Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 274, -- Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 279, -- Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50"] = 208, -- Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar + ["0.49:0.36:0.44:0.51:0.54:0.57"] = 136, -- Mok'Nathal Village, Swamprat Post, Falcon Watch + ["0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73"] = 228, -- Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.49:0.36:0.44:0.51:0.44:0.67"] = 160, -- Mok'Nathal Village, Swamprat Post, Shattrath + ["0.49:0.36:0.44:0.51"] = 74, -- Mok'Nathal Village, Swamprat Post + ["0.49:0.36:0.44:0.51:0.44:0.67:0.29:0.62"] = 243, -- Mok'Nathal Village, Swamprat Post, Shattrath, Garadar + ["0.49:0.36:0.44:0.51:0.23:0.50"] = 185, -- Mok'Nathal Village, Swamprat Post, Zabra'jin + ["0.49:0.36:0.38:0.32"] = 63, -- Mok'Nathal Village, Thunderlord Stronghold + ["0.49:0.36:0.38:0.32:0.42:0.28"] = 88, -- Mok'Nathal Village, Thunderlord Stronghold, Evergrove (Fabio Finger reported 64) + ["0.49:0.36:0.58:0.27"] = 57, -- Mok'Nathal Village, Area 52 + ["0.49:0.36:0.58:0.27:0.72:0.28"] = 122, -- Mok'Nathal Village, Area 52, Cosmowrench + ["0.49:0.36:0.58:0.27:0.63:0.18"] = 104, -- Mok'Nathal Village, Area 52, The Stormspire + ["0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 374, -- Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 357, -- Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.49:0.36:0.38:0.32:0.23:0.50:0.44:0.67"] = 359, -- Mok'Nathal Village, Thunderlord Stronghold, Zabra'jin, Shattrath + ["0.49:0.36:0.38:0.32:0.23:0.50:0.44:0.67:0.51:0.73:0.66:0.77"] = 492, -- Mok'Nathal Village, Thunderlord Stronghold, Zabra'jin, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.49:0.36:0.58:0.27:0.42:0.28"] = 137, -- Mok'Nathal Village, Area 52, Evergrove + + -- Horde: Sanctum of the Stars (Shadowmoon Valley) + ["0.78:0.85:0.66:0.77"] = 61, -- Sanctum of the Stars, Shadowmoon Village + ["0.78:0.85:0.51:0.73"] = 134, -- Sanctum of the Stars, Stonebreaker Hold + ["0.78:0.85:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 397, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.78:0.85:0.51:0.73:0.44:0.67"] = 187, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath + ["0.78:0.85:0.51:0.73:0.65:0.50:0.68:0.63"] = 322, -- Sanctum of the Stars, Stonebreaker Hold, Thrallmar, Spinebreaker Ridge + ["0.78:0.85:0.51:0.73:0.44:0.67:0.29:0.62"] = 268, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Garadar + ["0.78:0.85:0.51:0.73:0.65:0.50"] = 257, -- Sanctum of the Stars, Stonebreaker Hold, Thrallmar + ["0.78:0.85:0.51:0.73:0.44:0.67:0.23:0.50"] = 323, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Zabra'jin + ["0.78:0.85:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 439, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.78:0.85:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 457, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.78:0.85:0.51:0.73:0.65:0.50:0.79:0.54"] = 327, -- Sanctum of the Stars, Stonebreaker Hold, Thrallmar, Hellfire Peninsula + ["0.78:0.85:0.51:0.73:0.44:0.67:0.44:0.51"] = 266, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Swamprat Post + ["0.78:0.85:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 392, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.78:0.85:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32"] = 371, -- Sanctum of the Stars, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 439, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67"] = 187, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.29:0.62"] = 268, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Garadar + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 397, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Thunderlord Stronghold, Evergrove + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 392, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.78:0.85:0.66:0.77:0.51:0.73"] = 134, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51"] = 266, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27"] = 468, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32"] = 372, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.54:0.57"] = 263, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Falcon Watch + ["0.78:0.85:0.66:0.77:0.51:0.73:0.65:0.50"] = 257, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Thrallmar + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.23:0.50"] = 323, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Zabra'jin + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 457, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.78:0.85:0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36"] = 336, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village + ["0.78:0.85:0.66:0.77:0.51:0.73:0.65:0.50:0.79:0.54"] = 327, -- Sanctum of the Stars, Shadowmoon Village, Stonebreaker Hold, Thrallmar, Hellfire Peninsula + + -- Horde: Shadowmoon Village (Shadowmoon Valley) + ["0.66:0.77:0.51:0.73"] = 73, -- Shadowmoon Village, Stonebreaker Hold + ["0.66:0.77:0.51:0.73:0.44:0.67"] = 126, -- Shadowmoon Village, Stonebreaker Hold, Shattrath + ["0.66:0.77:0.51:0.73:0.44:0.67:0.29:0.62"] = 207, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Garadar + ["0.66:0.77:0.51:0.73:0.44:0.67:0.23:0.50"] = 262, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Zabra'jin + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51"] = 205, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post + ["0.66:0.77:0.51:0.73:0.44:0.67:0.54:0.57"] = 202, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Falcon Watch + ["0.66:0.77:0.51:0.73:0.65:0.50:0.68:0.63"] = 262, -- Shadowmoon Village, Stonebreaker Hold, Thrallmar, Spinebreaker Ridge + ["0.66:0.77:0.51:0.73:0.65:0.50:0.79:0.54"] = 267, -- Shadowmoon Village, Stonebreaker Hold, Thrallmar, Hellfire Peninsula + ["0.66:0.77:0.51:0.73:0.65:0.50"] = 196, -- Shadowmoon Village, Stonebreaker Hold, Thrallmar + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36"] = 276, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32"] = 311, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 336, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove (Kristopher Williamson reported 73, not changed) + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 331, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 397, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 379, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.66:0.77:0.78:0.85"] = 66, -- Shadowmoon Village, Sanctum of the Stars + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27"] = 407, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.66:0.77:0.81:0.77"] = 85, -- Shadowmoon Village, Altar of Sha'tar + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27:0.72:0.28"] = 473, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52, Cosmowrench + ["0.66:0.77:0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27:0.63:0.18"] = 455, -- Shadowmoon Village, Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52, The Stormspire + + -- Horde: Shattrath (Terokkar Forest) + ["0.44:0.67:0.23:0.50"] = 136, -- Shattrath, Zabra'jin + ["0.44:0.67:0.29:0.62"] = 81, -- Shattrath, Garadar + ["0.44:0.67:0.44:0.51"] = 79, -- Shattrath, Swamprat Post + ["0.44:0.67:0.54:0.57"] = 77, -- Shattrath, Falcon Watch + ["0.44:0.67:0.51:0.73"] = 69, -- Shattrath, Stonebreaker Hold + ["0.44:0.67:0.51:0.73:0.66:0.77"] = 133, -- Shattrath, Stonebreaker Hold, Shadowmoon Village (anders brøndum bach reported 150) + ["0.44:0.67:0.54:0.57:0.65:0.50:0.68:0.63"] = 215, -- Shattrath, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.44:0.67:0.54:0.57:0.65:0.50:0.79:0.54"] = 220, -- Shattrath, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.44:0.67:0.54:0.57:0.65:0.50"] = 150, -- Shattrath, Falcon Watch, Thrallmar (Mirko Riemann reported 78, not changed yet) + ["0.44:0.67:0.44:0.51:0.49:0.36"] = 150, -- Shattrath, Swamprat Post, Mok'Nathal Village + ["0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 211, -- Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.44:0.67:0.44:0.51:0.38:0.32"] = 185, -- Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 205, -- Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 253, -- Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 270, -- Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 215, -- Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27:0.72:0.28"] = 347, -- Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52, Cosmowrench + ["0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 198, -- Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27"] = 282, -- Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27:0.63:0.18"] = 329, -- Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52, The Stormspire + ["0.44:0.67:0.51:0.73:0.65:0.50"] = 193, -- Shattrath, Stonebreaker Hold, Thrallmar + ["0.44:0.67:0.44:0.51:0.38:0.32:0.63:0.18"] = 341, -- Shattrath, Swamprat Post, Thunderlord Stronghold, The Stormspire + ["0.44:0.67:0.51:0.73:0.65:0.50:0.68:0.63"] = 257, -- Shattrath, Stonebreaker Hold, Thrallmar, Spinebreaker Ridge + ["0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.42:0.28"] = 286, -- Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Evergrove + ["0.44:0.67:0.23:0.50:0.38:0.32:0.58:0.27"] = 344, -- Shattrath, Zabra'jin, Thunderlord Stronghold, Area 52 + ["0.44:0.67:0.65:0.50"] = 132, -- Shattrath, Thrallmar + ["0.44:0.67:0.65:0.50:0.79:0.54"] = 202, -- Shattrath, Thrallmar, Hellfire Peninsula + ["0.44:0.67:0.65:0.50:0.68:0.63"] = 197, -- Shattrath, Thrallmar, Spinebreaker Ridge + ["0.44:0.67:0.44:0.51:0.38:0.32:0.63:0.18:0.72:0.28"] = 409, -- Shattrath, Swamprat Post, Thunderlord Stronghold, The Stormspire, Cosmowrench + ["0.44:0.67:0.23:0.50:0.38:0.32:0.42:0.28"] = 272, -- Shattrath, Zabra'jin, Thunderlord Stronghold, Evergrove + ["0.44:0.67:0.23:0.50:0.38:0.32"] = 247, -- Shattrath, Zabra'jin, Thunderlord Stronghold + ["0.44:0.67:0.23:0.50:0.38:0.32:0.58:0.27:0.72:0.28"] = 409, -- Shattrath, Zabra'jin, Thunderlord Stronghold, Area 52, Cosmowrench + + -- Horde: Spinebreaker Ridge (Hellfire Peninsula) + ["0.68:0.63:0.65:0.50:0.54:0.57:0.29:0.62"] = 263, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Garadar + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.67"] = 200, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Shattrath + ["0.68:0.63:0.65:0.50:0.51:0.73"] = 190, -- Spinebreaker Ridge, Thrallmar, Stonebreaker Hold + ["0.68:0.63:0.65:0.50:0.51:0.73:0.66:0.77"] = 255, -- Spinebreaker Ridge, Thrallmar, Stonebreaker Hold, Shadowmoon Village + ["0.68:0.63:0.65:0.50:0.79:0.54"] = 133, -- Spinebreaker Ridge, Thrallmar, Hellfire Peninsula + ["0.68:0.63:0.65:0.50"] = 62, -- Spinebreaker Ridge, Thrallmar + ["0.68:0.63:0.65:0.50:0.54:0.57"] = 129, -- Spinebreaker Ridge, Thrallmar, Falcon Watch + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.51"] = 198, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Swamprat Post + ["0.68:0.63:0.65:0.50:0.54:0.57:0.23:0.50"] = 280, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Zabra'jin + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32"] = 303, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32:0.42:0.28"] = 330, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36"] = 268, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27"] = 327, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 389, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.68:0.63:0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 373, -- Spinebreaker Ridge, Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.68:0.63:0.65:0.50:0.51:0.73:0.66:0.77:0.78:0.85"] = 319, -- Spinebreaker Ridge, Thrallmar, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.68:0.63:0.65:0.50:0.51:0.73:0.66:0.77:0.81:0.77"] = 335, -- Spinebreaker Ridge, Thrallmar, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.68:0.63:0.65:0.50:0.44:0.67"] = 185, -- Spinebreaker Ridge, Thrallmar, Shattrath + + -- Horde: Stonebreaker Hold (Terokkar Forest) + ["0.51:0.73:0.66:0.77"] = 68, -- Stonebreaker Hold, Shadowmoon Village + ["0.51:0.73:0.65:0.50:0.68:0.63"] = 191, -- Stonebreaker Hold, Thrallmar, Spinebreaker Ridge + ["0.51:0.73:0.65:0.50:0.79:0.54"] = 195, -- Stonebreaker Hold, Thrallmar, Hellfire Peninsula + ["0.51:0.73:0.65:0.50"] = 125, -- Stonebreaker Hold, Thrallmar + ["0.51:0.73:0.44:0.67:0.54:0.57"] = 132, -- Stonebreaker Hold, Shattrath, Falcon Watch + ["0.51:0.73:0.44:0.67"] = 56, -- Stonebreaker Hold, Shattrath + ["0.51:0.73:0.44:0.67:0.29:0.62"] = 137, -- Stonebreaker Hold, Shattrath, Garadar + ["0.51:0.73:0.44:0.67:0.44:0.51"] = 135, -- Stonebreaker Hold, Shattrath, Swamprat Post + ["0.51:0.73:0.44:0.67:0.23:0.50"] = 193, -- Stonebreaker Hold, Shattrath, Zabra'jin + ["0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32"] = 242, -- Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold + ["0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.42:0.28"] = 266, -- Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36"] = 207, -- Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village + ["0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 261, -- Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 330, -- Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.51:0.73:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 313, -- Stonebreaker Hold, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.51:0.73:0.66:0.77:0.78:0.85"] = 133, -- Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.51:0.73:0.66:0.77:0.81:0.77"] = 149, -- Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27:0.63:0.18"] = 385, -- Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52, The Stormspire + ["0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27:0.72:0.28"] = 403, -- Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52, Cosmowrench + ["0.51:0.73:0.44:0.67:0.44:0.51:0.38:0.32:0.58:0.27"] = 338, -- Stonebreaker Hold, Shattrath, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.51:0.73:0.65:0.50:0.54:0.57"] = 192, -- Stonebreaker Hold, Thrallmar, Falcon Watch + ["0.51:0.73:0.65:0.50:0.54:0.57:0.44:0.51"] = 260, -- Stonebreaker Hold, Thrallmar, Falcon Watch, Swamprat Post + ["0.51:0.73:0.65:0.50:0.54:0.57:0.29:0.62"] = 324, -- Stonebreaker Hold, Thrallmar, Falcon Watch, Garadar + ["0.51:0.73:0.44:0.67:0.23:0.50:0.38:0.32:0.58:0.27"] = 400, -- Stonebreaker Hold, Shattrath, Zabra'jin, Thunderlord Stronghold, Area 52 + + -- Horde: Swamprat Post (Zangarmarsh) + ["0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 220, -- Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 201, -- Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 206, -- Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.44:0.51:0.54:0.57:0.65:0.50"] = 136, -- Swamprat Post, Falcon Watch, Thrallmar + ["0.44:0.51:0.54:0.57"] = 61, -- Swamprat Post, Falcon Watch + ["0.44:0.51:0.44:0.67:0.51:0.73"] = 155, -- Swamprat Post, Shattrath, Stonebreaker Hold + ["0.44:0.51:0.44:0.67"] = 86, -- Swamprat Post, Shattrath + ["0.44:0.51:0.44:0.67:0.29:0.62"] = 168, -- Swamprat Post, Shattrath, Garadar + ["0.44:0.51:0.23:0.50"] = 111, -- Swamprat Post, Zabra'jin + ["0.44:0.51:0.38:0.32"] = 106, -- Swamprat Post, Thunderlord Stronghold + ["0.44:0.51:0.38:0.32:0.42:0.28"] = 132, -- Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.44:0.51:0.49:0.36"] = 71, -- Swamprat Post, Mok'Nathal Village + ["0.44:0.51:0.49:0.36:0.58:0.27"] = 126, -- Swamprat Post, Mok'Nathal Village, Area 52 + ["0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 193, -- Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 174, -- Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 284, -- Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 301, -- Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.44:0.51:0.38:0.32:0.58:0.27"] = 202, -- Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.44:0.51:0.38:0.32:0.58:0.27:0.63:0.18"] = 250, -- Swamprat Post, Thunderlord Stronghold, Area 52, The Stormspire + ["0.44:0.51:0.54:0.57:0.65:0.50:0.51:0.73"] = 264, -- Swamprat Post, Falcon Watch, Thrallmar, Stonebreaker Hold + ["0.44:0.51:0.44:0.67:0.65:0.50"] = 215, -- Swamprat Post, Shattrath, Thrallmar + ["0.44:0.51:0.38:0.32:0.58:0.27:0.72:0.28"] = 268, -- Swamprat Post, Thunderlord Stronghold, Area 52, Cosmowrench + ["0.44:0.51:0.54:0.57:0.29:0.62"] = 195, -- Swamprat Post, Falcon Watch, Garadar + + -- Horde: The Stormspire (Netherstorm) + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 410, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 390, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 395, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57:0.65:0.50"] = 326, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch, Thrallmar + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.54:0.57"] = 254, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Falcon Watch + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73"] = 345, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67"] = 277, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51"] = 191, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.29:0.62"] = 359, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Garadar + ["0.63:0.18:0.38:0.32:0.23:0.50"] = 294, -- The Stormspire, Thunderlord Stronghold, Zabra'jin + ["0.63:0.18:0.58:0.27:0.49:0.36"] = 118, -- The Stormspire, Area 52, Mok'Nathal Village + ["0.63:0.18:0.38:0.32"] = 147, -- The Stormspire, Thunderlord Stronghold + ["0.63:0.18:0.58:0.27:0.42:0.28"] = 132, -- The Stormspire, Area 52, Evergrove + ["0.63:0.18:0.58:0.27"] = 53, -- The Stormspire, Area 52 + ["0.63:0.18:0.72:0.28"] = 69, -- The Stormspire, Cosmowrench + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 474, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.63:0.18:0.38:0.32:0.44:0.51:0.44:0.67"] = 348, -- The Stormspire, Thunderlord Stronghold, Swamprat Post, Shattrath (Gareth Horton reported 332) + ["0.63:0.18:0.58:0.27:0.49:0.36:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 490, -- The Stormspire, Area 52, Mok'Nathal Village, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.63:0.18:0.38:0.32:0.23:0.50:0.29:0.62"] = 372, -- The Stormspire, Thunderlord Stronghold, Zabra'jin, Garadar + ["0.63:0.18:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 481, -- The Stormspire, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.63:0.18:0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50"] = 397, -- The Stormspire, Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar + ["0.63:0.18:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73"] = 417, -- The Stormspire, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.63:0.18:0.38:0.32:0.44:0.51"] = 262, -- The Stormspire, Thunderlord Stronghold, Swamprat Post + ["0.63:0.18:0.38:0.32:0.23:0.50:0.44:0.67"] = 443, -- The Stormspire, Thunderlord Stronghold, Zabra'jin, Shattrath + ["0.63:0.18:0.38:0.32:0.44:0.51:0.54:0.57"] = 325, -- The Stormspire, Thunderlord Stronghold, Swamprat Post, Falcon Watch + ["0.63:0.18:0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 562, -- The Stormspire, Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + + -- Horde: Thrallmar (Hellfire Peninsula) + ["0.65:0.50:0.51:0.73:0.66:0.77"] = 192, -- Thrallmar, Stonebreaker Hold, Shadowmoon Village + ["0.65:0.50:0.68:0.63"] = 66, -- Thrallmar, Spinebreaker Ridge + ["0.65:0.50:0.79:0.54"] = 70, -- Thrallmar, Hellfire Peninsula + ["0.65:0.50:0.54:0.57"] = 66, -- Thrallmar, Falcon Watch + ["0.65:0.50:0.51:0.73"] = 129, -- Thrallmar, Stonebreaker Hold + ["0.65:0.50:0.54:0.57:0.44:0.67"] = 138, -- Thrallmar, Falcon Watch, Shattrath (Taylor Morris reported 67) + ["0.65:0.50:0.54:0.57:0.44:0.51"] = 135, -- Thrallmar, Falcon Watch, Swamprat Post + ["0.65:0.50:0.54:0.57:0.29:0.62"] = 199, -- Thrallmar, Falcon Watch, Garadar + ["0.65:0.50:0.54:0.57:0.23:0.50"] = 217, -- Thrallmar, Falcon Watch, Zabra'jin + ["0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32"] = 242, -- Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold + ["0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32:0.42:0.28"] = 267, -- Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold, Evergrove + ["0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36"] = 206, -- Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village + ["0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27"] = 262, -- Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.63:0.18"] = 309, -- Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, The Stormspire + ["0.65:0.50:0.54:0.57:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 327, -- Thrallmar, Falcon Watch, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.65:0.50:0.51:0.73:0.66:0.77:0.78:0.85"] = 257, -- Thrallmar, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32:0.58:0.27"] = 338, -- Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold, Area 52 + ["0.65:0.50:0.51:0.73:0.66:0.77:0.81:0.77"] = 273, -- Thrallmar, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32:0.58:0.27:0.63:0.18"] = 385, -- Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold, Area 52, The Stormspire + ["0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32:0.58:0.27:0.72:0.28"] = 403, -- Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold, Area 52, Cosmowrench + ["0.65:0.50:0.51:0.73:0.44:0.67"] = 182, -- Thrallmar, Stonebreaker Hold, Shattrath + ["0.65:0.50:0.54:0.57:0.44:0.51:0.38:0.32:0.63:0.18:0.72:0.28"] = 465, -- Thrallmar, Falcon Watch, Swamprat Post, Thunderlord Stronghold, The Stormspire, Cosmowrench + ["0.65:0.50:0.44:0.67"] = 123, -- Thrallmar, Shattrath + ["0.65:0.50:0.44:0.67:0.23:0.50"] = 257, -- Thrallmar, Shattrath, Zabra'jin + ["0.65:0.50:0.54:0.57:0.23:0.50:0.38:0.32"] = 328, -- Thrallmar, Falcon Watch, Zabra'jin, Thunderlord Stronghold + ["0.65:0.50:0.54:0.57:0.23:0.50:0.38:0.32:0.58:0.27"] = 424, -- Thrallmar, Falcon Watch, Zabra'jin, Thunderlord Stronghold, Area 52 + ["0.65:0.50:0.44:0.67:0.44:0.51:0.49:0.36:0.58:0.27"] = 326, -- Thrallmar, Shattrath, Swamprat Post, Mok'Nathal Village, Area 52 + ["0.65:0.50:0.44:0.67:0.29:0.62"] = 202, -- Thrallmar, Shattrath, Garadar + + -- Horde: Thunderlord Stronghold (Blade's Edge Mountains) + ["0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77"] = 335, -- Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50:0.68:0.63"] = 316, -- Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50:0.79:0.54"] = 322, -- Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.38:0.32:0.44:0.51:0.54:0.57:0.65:0.50"] = 251, -- Thunderlord Stronghold, Swamprat Post, Falcon Watch, Thrallmar + ["0.38:0.32:0.44:0.51:0.54:0.57"] = 179, -- Thunderlord Stronghold, Swamprat Post, Falcon Watch + ["0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73"] = 271, -- Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold + ["0.38:0.32:0.44:0.51:0.44:0.67"] = 202, -- Thunderlord Stronghold, Swamprat Post, Shattrath + ["0.38:0.32:0.44:0.51"] = 116, -- Thunderlord Stronghold, Swamprat Post + ["0.38:0.32:0.23:0.50:0.29:0.62"] = 227, -- Thunderlord Stronghold, Zabra'jin, Garadar + ["0.38:0.32:0.23:0.50"] = 149, -- Thunderlord Stronghold, Zabra'jin + ["0.38:0.32:0.49:0.36"] = 55, -- Thunderlord Stronghold, Mok'Nathal Village + ["0.38:0.32:0.42:0.28"] = 26, -- Thunderlord Stronghold, Evergrove + ["0.38:0.32:0.58:0.27"] = 97, -- Thunderlord Stronghold, Area 52 + ["0.38:0.32:0.58:0.27:0.72:0.28"] = 163, -- Thunderlord Stronghold, Area 52, Cosmowrench + ["0.38:0.32:0.63:0.18"] = 158, -- Thunderlord Stronghold, The Stormspire + ["0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 416, -- Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.38:0.32:0.44:0.51:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 400, -- Thunderlord Stronghold, Swamprat Post, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.38:0.32:0.23:0.50:0.44:0.67"] = 297, -- Thunderlord Stronghold, Zabra'jin, Shattrath + ["0.38:0.32:0.44:0.51:0.44:0.67:0.29:0.62"] = 284, -- Thunderlord Stronghold, Swamprat Post, Shattrath, Garadar + + -- Horde: Zabra'jin (Zangarmarsh) + ["0.23:0.50:0.29:0.62"] = 81, -- Zabra'jin, Garadar + ["0.23:0.50:0.44:0.67"] = 151, -- Zabra'jin, Shattrath + ["0.23:0.50:0.44:0.67:0.51:0.73"] = 220, -- Zabra'jin, Shattrath, Stonebreaker Hold + ["0.23:0.50:0.44:0.67:0.51:0.73:0.66:0.77"] = 284, -- Zabra'jin, Shattrath, Stonebreaker Hold, Shadowmoon Village + ["0.23:0.50:0.54:0.57:0.65:0.50:0.68:0.63"] = 287, -- Zabra'jin, Falcon Watch, Thrallmar, Spinebreaker Ridge + ["0.23:0.50:0.54:0.57:0.65:0.50:0.79:0.54"] = 290, -- Zabra'jin, Falcon Watch, Thrallmar, Hellfire Peninsula + ["0.23:0.50:0.54:0.57:0.65:0.50"] = 220, -- Zabra'jin, Falcon Watch, Thrallmar + ["0.23:0.50:0.54:0.57"] = 147, -- Zabra'jin, Falcon Watch + ["0.23:0.50:0.44:0.51"] = 112, -- Zabra'jin, Swamprat Post + ["0.23:0.50:0.38:0.32"] = 113, -- Zabra'jin, Thunderlord Stronghold + ["0.23:0.50:0.38:0.32:0.42:0.28"] = 139, -- Zabra'jin, Thunderlord Stronghold, Evergrove + ["0.23:0.50:0.38:0.32:0.49:0.36"] = 168, -- Zabra'jin, Thunderlord Stronghold, Mok'Nathal Village + ["0.23:0.50:0.38:0.32:0.58:0.27"] = 209, -- Zabra'jin, Thunderlord Stronghold, Area 52 + ["0.23:0.50:0.38:0.32:0.58:0.27:0.63:0.18"] = 257, -- Zabra'jin, Thunderlord Stronghold, Area 52, The Stormspire + ["0.23:0.50:0.38:0.32:0.58:0.27:0.72:0.28"] = 275, -- Zabra'jin, Thunderlord Stronghold, Area 52, Cosmowrench + ["0.23:0.50:0.44:0.67:0.51:0.73:0.66:0.77:0.78:0.85"] = 349, -- Zabra'jin, Shattrath, Stonebreaker Hold, Shadowmoon Village, Sanctum of the Stars + ["0.23:0.50:0.44:0.51:0.49:0.36:0.58:0.27:0.72:0.28"] = 304, -- Zabra'jin, Swamprat Post, Mok'Nathal Village, Area 52, Cosmowrench + ["0.23:0.50:0.44:0.67:0.51:0.73:0.66:0.77:0.81:0.77"] = 365, -- Zabra'jin, Shattrath, Stonebreaker Hold, Shadowmoon Village, Altar of Sha'tar + ["0.23:0.50:0.44:0.67:0.51:0.73:0.65:0.50"] = 343, -- Zabra'jin, Shattrath, Stonebreaker Hold, Thrallmar + ["0.23:0.50:0.54:0.57:0.65:0.50:0.51:0.73"] = 349, -- Zabra'jin, Falcon Watch, Thrallmar, Stonebreaker Hold + ["0.23:0.50:0.44:0.67:0.65:0.50:0.68:0.63"] = 344, -- Zabra'jin, Shattrath, Thrallmar, Spinebreaker Ridge + ["0.23:0.50:0.44:0.67:0.65:0.50"] = 280, -- Zabra'jin, Shattrath, Thrallmar + ["0.23:0.50:0.44:0.51:0.49:0.36:0.58:0.27"] = 238, -- Zabra'jin, Swamprat Post, Mok'Nathal Village, Area 52 + + }, + + -- Horde: Northrend + [113] = { + + ---------------------------------------------------------------------- + -- Horde: Borean Tundra + ---------------------------------------------------------------------- + + -- Horde: Borean Tundra: Amber Ledge + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38"] = 187, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran + ["0.17:0.53:0.15:0.57"] = 28, -- Amber Ledge, Warsong Hold + ["0.17:0.53:0.18:0.47"] = 23, -- Amber Ledge, Bor'gorok Outpost + ["0.17:0.53:0.18:0.47:0.24:0.40"] = 61, -- Amber Ledge, Bor'gorok Outpost, River's Heart + ["0.17:0.53:0.12:0.53"] = 25, -- Amber Ledge, Transitus Shield (Johann Boleininger reported 62) + ["0.17:0.53:0.29:0.54:0.29:0.57"] = 68, -- Amber Ledge, Taunka'le Village, Unu'pe + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73"] = 289, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 309, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.17:0.53:0.29:0.54"] = 49, -- Amber Ledge, Taunka'le Village + ["0.17:0.53:0.29:0.54:0.45:0.51"] = 109, -- Amber Ledge, Taunka'le Village, Agmar's Hammer + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55"] = 166, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite + ["0.17:0.53:0.15:0.57:0.29:0.57"] = 90, -- Escarpement d'Ambre, Bastion Chanteguerre, Unu'pe + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73:0.74:0.71"] = 339, -- Bernsteinflöz, Taunka'le, Agmars Hammer, Gallgrimm, Neu-Agamand, Kamagua + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 230, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38"] = 203, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52"] = 142, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple + ["0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58"] = 147, -- Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 261, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71"] = 269, -- Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Kamagua + ["0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.52:0.38"] = 228, -- Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Dalaran + ["0.17:0.53:0.15:0.57:0.29:0.57:0.49:0.58:0.59:0.55"] = 209, -- Amber Ledge, Warsong Hold, Unu'pe, Moa'ki, Venomspite + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55"] = 204, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 279, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga + ["0.17:0.53:0.29:0.54:0.31:0.43"] = 95, -- Amber Ledge, Taunka'le Village, Warsong Camp + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.72:0.29"] = 285, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Dun Nifflelem + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 267, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42"] = 210, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch + ["0.17:0.53:0.15:0.57:0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73"] = 332, -- Amber Ledge, Warsong Hold, Unu'pe, Moa'ki, Kamagua, New Agamand + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36"] = 202, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard + ["0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73"] = 311, -- Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Kamagua, New Agamand + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51:0.95:0.63"] = 341, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.17:0.53:0.18:0.47:0.24:0.40:0.52:0.38"] = 190, -- Amber Ledge, Bor'gorok Outpost, River's Heart, Dalaran + ["0.17:0.53:0.29:0.54:0.45:0.51:0.49:0.58"] = 149, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Moa'ki + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59"] = 356, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof + ["0.17:0.53:0.18:0.47:0.18:0.40"] = 56, -- Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp + ["0.17:0.53:0.29:0.54:0.31:0.43:0.52:0.38"] = 190, -- Amber Ledge, Taunka'le Village, Warsong Camp, Dalaran + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.69:0.42"] = 239, -- El Saliente Ámbar, Poblado Taunka'le, Martillo de Agmar, Templo del Reposo del Dragón, Puesto de Vigilancia de Ébano, Brecha de la Luz + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 268, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44"] = 150, -- Bernsteinflöz, Taunka'le, Agmars Hammer, Vorposten der Kor'kron + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36"] = 217, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3 + ["0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28"] = 115, -- Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise + ["0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21"] = 178, -- Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.60:0.40"] = 219, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Sunreaver's Command + ["0.17:0.53:0.18:0.47:0.24:0.40:0.31:0.43:0.45:0.51"] = 180, -- Amber Ledge, Bor'gorok Outpost, River's Heart, Warsong Camp, Agmar's Hammer + ["0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.59:0.55"] = 187, -- Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Venomspite + ["0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.54:0.52"] = 178, -- Bernsteinflöz, Taunka'le, Unu'pe, Moa'ki, Wyrmruhtempel + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 272, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.62:0.36:0.60:0.25"] = 283, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 315, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42"] = 237, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach + ["0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 228, -- Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 231, -- Escarpement d'Ambre, Avant-poste Bor'gorok, Le Cœur du fleuve, Cime de la Mort, Le caveau des Ombres, Enceinte du tournoi d'Argent + ["0.17:0.53:0.29:0.54:0.31:0.43:0.52:0.34"] = 202, -- Amber Ledge, Taunka'le Village, Warsong Camp, Crusaders' Pinnacle + ["0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19"] = 287, -- Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.57:0.21"] = 258, -- Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Bouldercrag's Refuge + ["0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28"] = 118, -- Amber Ledge, Bor'gorok Outpost, River's Heart, Death's Rise + ["0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40"] = 252, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.49:0.21"] = 264, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Argent Tournament Grounds + ["0.17:0.53:0.29:0.54:0.31:0.43:0.38:0.21"] = 204, -- Amber Ledge, Taunka'le Village, Warsong Camp, The Shadow Vault + ["0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.52:0.34:0.38:0.21"] = 288, -- Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle, The Shadow Vault + + -- Horde: Borean Tundra: Bor'gorok Outpost + ["0.18:0.47:0.29:0.54"] = 78, -- Bor'gorok Outpost, Taunka'le Village + ["0.18:0.47:0.24:0.40:0.28:0.28"] = 143, -- Bor'gorok Outpost, River's Heart, Death's Rise + ["0.18:0.47:0.24:0.40:0.52:0.38"] = 251, -- Bor'gorok Outpost, River's Heart, Dalaran + ["0.18:0.47:0.24:0.40"] = 58, -- Bor'gorok Outpost, River's Heart + ["0.18:0.47:0.17:0.53"] = 57, -- Bor'gorok Outpost, Amber Ledge + ["0.18:0.47:0.17:0.53:0.12:0.53"] = 92, -- Bor'gorok Outpost, Amber Ledge, Transitus Shield + ["0.18:0.47:0.24:0.40:0.52:0.38:0.56:0.36"] = 273, -- Bor'gorok Outpost, River's Heart, Dalaran, The Argent Vanguard + ["0.18:0.47:0.15:0.57"] = 72, -- Bor'gorok Outpost, Warsong Hold + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73"] = 439, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 469, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 351, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.18:0.47:0.29:0.54:0.45:0.51"] = 168, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer + ["0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58"] = 225, -- Bor'gorok Outpost, Taunka'le Village, Unu'pe, Moa'ki + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51:0.95:0.63"] = 517, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.18:0.47:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38"] = 285, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran + ["0.18:0.47:0.15:0.57:0.29:0.57"] = 165, -- Bor'gorok Outpost, Warsong Hold, Unu'pe + ["0.18:0.47:0.29:0.54:0.29:0.57"] = 107, -- Bor'goroks Außenposten, Taunka'le, Unu'pe + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55"] = 312, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold + ["0.18:0.47:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42"] = 319, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch + ["0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71"] = 408, -- Bor'goroks Außenposten, Taunka'le, Unu'pe, Moa'ki, Kamagua + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55"] = 253, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite + ["0.18:0.47:0.29:0.54:0.45:0.51:0.48:0.44"] = 230, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard + ["0.18:0.47:0.29:0.54:0.45:0.51:0.49:0.58"] = 229, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Moa'ki + ["0.18:0.47:0.24:0.40:0.52:0.38:0.62:0.36"] = 296, -- Bor'gorok Outpost, River's Heart, Dalaran, K3 + ["0.18:0.47:0.18:0.40"] = 48, -- Bor'gorok Outpost, Nesingwary Base Camp + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42:0.84:0.51:0.84:0.59"] = 512, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.18:0.47:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 406, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42"] = 359, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach + ["0.18:0.47:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38"] = 310, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran + ["0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58:0.52:0.38"] = 346, -- Застава Бор'горока, Деревня Таунка'ле, Уну'пе, Моа'ки, Даларан + ["0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58:0.54:0.52"] = 272, -- Bor'gorok Outpost, Taunka'le Village, Unu'pe, Moa'ki, Wyrmrest Temple + ["0.18:0.47:0.29:0.54:0.45:0.51:0.54:0.52"] = 216, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple + ["0.18:0.47:0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 396, -- Bor'goroks Außenposten, Flussnabel, Dalaran, K3, Dun Niffelem + ["0.18:0.47:0.29:0.54:0.31:0.43:0.52:0.38"] = 289, -- Bor'gorok Outpost, Taunka'le Village, Warsong Camp, Dalaran + ["0.18:0.47:0.29:0.54:0.31:0.43"] = 149, -- Bor'gorok Outpost, Taunka'le Village, Warsong Camp + ["0.18:0.47:0.24:0.40:0.31:0.43"] = 135, -- Bor'gorok Outpost, River's Heart, Warsong Camp + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 483, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 412, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah + ["0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.57:0.21"] = 352, -- Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Bouldercrag's Refuge + ["0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21"] = 232, -- Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault + ["0.18:0.47:0.18:0.40:0.28:0.28"] = 138, -- Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise + ["0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58:0.59:0.55"] = 286, -- Bor'gorok Outpost, Taunka'le Village, Unu'pe, Moa'ki, Venomspite + ["0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71:0.74:0.62:0.84:0.59"] = 522, -- Bor'gorok Outpost, Taunka'le Village, Unu'pe, Moa'ki, Kamagua, Apothecary Camp, Camp Winterhoof + ["0.18:0.47:0.24:0.40:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 422, -- Bor'gorok Outpost, River's Heart, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.18:0.47:0.24:0.40:0.52:0.38:0.62:0.36:0.60:0.25"] = 371, -- Bor'gorok Outpost, River's Heart, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 308, -- Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 395, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 404, -- Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + + -- Horde: Borean Tundra: Taunka'le Village + ["0.29:0.54:0.29:0.57"] = 30, -- Taunka'le Village, Unu'pe + ["0.29:0.54:0.31:0.43"] = 72, -- Taunka'le Village, Warsong Camp + ["0.29:0.54:0.18:0.47:0.24:0.40"] = 129, -- Taunka'le Village, Bor'gorok Outpost, River's Heart + ["0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73"] = 362, -- Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38"] = 208, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran + ["0.29:0.54:0.17:0.53"] = 76, -- Taunka'le Village, Amber Ledge + ["0.29:0.54:0.18:0.47"] = 73, -- Taunka'le Village, Bor'gorok Outpost + ["0.29:0.54:0.15:0.57"] = 85, -- Taunka'le Village, Warsong Hold + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.60:0.40"] = 255, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Sunreaver's Command + ["0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 392, -- Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 328, -- Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 274, -- Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 319, -- Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 399, -- Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 335, -- Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah + ["0.29:0.54:0.29:0.57:0.49:0.58"] = 148, -- Taunka'le Village, Unu'pe, Moa'ki + ["0.29:0.54:0.45:0.51"] = 92, -- Taunka'le Village, Agmar's Hammer + ["0.29:0.54:0.17:0.53:0.12:0.53"] = 111, -- Taunka'le Village, Amber Ledge, Transitus Shield + ["0.29:0.54:0.45:0.51:0.54:0.52"] = 139, -- Taunka'le, Agmars Hammer, Wyrmruhtempel + ["0.29:0.54:0.45:0.51:0.59:0.55"] = 177, -- Taunka'le Village, Agmar's Hammer, Venomspite + ["0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55"] = 234, -- Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold + ["0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71:0.74:0.62"] = 386, -- Taunka'le Village, Unu'pe, Moa'ki, Kamagua, Apothecary Camp + ["0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38"] = 233, -- Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran + ["0.29:0.54:0.45:0.51:0.49:0.58"] = 152, -- Taunka'le Village, Agmar's Hammer, Moa'ki + ["0.29:0.54:0.29:0.57:0.49:0.58:0.54:0.52"] = 195, -- Taunka'le Village, Unu'pe, Moa'ki, Wyrmrest Temple + ["0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73:0.74:0.71"] = 437, -- Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand, Kamagua + ["0.29:0.54:0.18:0.47:0.18:0.40"] = 119, -- Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.29:0.54:0.29:0.57:0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59"] = 365, -- Taunka'le Village, Unu'pe, Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 407, -- Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.29:0.54:0.45:0.51:0.48:0.44"] = 153, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard + ["0.29:0.54:0.29:0.57:0.49:0.58:0.52:0.38"] = 269, -- Taunka'le Village, Unu'pe, Moa'ki, Dalaran + ["0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42"] = 243, -- Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.72:0.29"] = 354, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Dun Nifflelem + ["0.29:0.54:0.29:0.57:0.49:0.58:0.59:0.55"] = 209, -- Taunka'le Village, Unu'pe, Moa'ki, Venomspite + ["0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42"] = 282, -- Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 366, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.29:0.54:0.45:0.51:0.59:0.55:0.64:0.42:0.52:0.38"] = 326, -- Taunka'le Village, Agmar's Hammer, Venomspite, Ebon Watch, Dalaran + ["0.29:0.54:0.31:0.43:0.52:0.38"] = 212, -- Taunka'le Village, Warsong Camp, Dalaran + ["0.29:0.54:0.31:0.43:0.24:0.40"] = 148, -- Taunka'le Village, Warsong Camp, River's Heart + ["0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73"] = 394, -- Poblado Taunka'le, Unu'pe, Moa'ki, Komawa, Nuevo Agamand + ["0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73:0.95:0.63"] = 473, -- Poblado Taunka'le, Unu'pe, Moa'ki, Komawa, Nuevo Agamand, Campo Venganza + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36:0.38:0.21"] = 378, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36"] = 231, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard + ["0.29:0.54:0.31:0.43:0.38:0.21"] = 235, -- Taunka'le Village, Warsong Camp, The Shadow Vault + ["0.29:0.54:0.29:0.57:0.49:0.58:0.59:0.55:0.69:0.42"] = 315, -- Taunka'le Village, Unu'pe, Moa'ki, Venomspite, Light's Breach + ["0.29:0.54:0.45:0.51:0.49:0.58:0.52:0.38"] = 273, -- Taunka'le, Agmars Hammer, Moa'ki, Dalaran + ["0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59"] = 334, -- Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42:0.84:0.51"] = 387, -- Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach, Camp Oneqwah + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 381, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.29:0.54:0.18:0.47:0.24:0.40:0.28:0.28:0.38:0.21"] = 307, -- Taunka'le Village, Bor'gorok Outpost, River's Heart, Death's Rise, The Shadow Vault + ["0.29:0.54:0.31:0.43:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 383, -- Taunka'le Village, Warsong Camp, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.29:0.54:0.45:0.51:0.48:0.44:0.64:0.42"] = 259, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Ebon Watch + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36"] = 255, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3 + ["0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71"] = 331, -- Taunka'le Village, Unu'pe, Moa'ki, Kamagua + ["0.29:0.54:0.31:0.43:0.52:0.34"] = 230, -- Taunka'le Village, Warsong Camp, Crusaders' Pinnacle + ["0.29:0.54:0.18:0.47:0.18:0.40:0.28:0.28"] = 210, -- Taunka'le, Bor'goroks Außenposten, Nesingwarys Basislager, Todesanhöhe + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36:0.38:0.21:0.57:0.21"] = 499, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard, The Shadow Vault, Bouldercrag's Refuge + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 330, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40"] = 306, -- Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.29:0.54:0.45:0.51:0.48:0.44:0.64:0.42:0.69:0.42"] = 303, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Ebon Watch, Light's Breach + ["0.29:0.54:0.45:0.51:0.49:0.58:0.74:0.71:0.74:0.62"] = 390, -- Taunka'le Village, Agmar's Hammer, Moa'ki, Kamagua, Apothecary Camp + ["0.29:0.54:0.18:0.47:0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 539, -- Taunka'le Village, Bor'gorok Outpost, River's Heart, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.29:0.54:0.31:0.43:0.38:0.21:0.49:0.21"] = 311, -- Taunka'le Village, Warsong Camp, The Shadow Vault, Argent Tournament Grounds + ["0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.73:0.25"] = 344, -- Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Camp Tunka'lo + ["0.29:0.54:0.31:0.43:0.38:0.21:0.57:0.21"] = 355, -- Taunka'le Village, Warsong Camp, The Shadow Vault, Bouldercrag's Refuge + + -- Horde: Borean Tundra: Transitus Shield (Coldarra) + ["0.12:0.53:0.17:0.53:0.15:0.57"] = 58, -- Transitus Shield, Amber Ledge, Warsong Hold + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38"] = 216, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran + ["0.12:0.53:0.17:0.53"] = 31, -- Transitus Shield, Amber Ledge + ["0.12:0.53:0.17:0.53:0.18:0.47:0.24:0.40"] = 90, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, River's Heart + ["0.12:0.53:0.17:0.53:0.18:0.47"] = 52, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.73:0.25"] = 306, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Camp Tunka'lo + ["0.12:0.53:0.17:0.53:0.29:0.54:0.29:0.57"] = 97, -- Transitus Shield, Amber Ledge, Taunka'le Village, Unu'pe + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73"] = 318, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 300, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 338, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.12:0.53:0.17:0.53:0.29:0.54"] = 78, -- Transitus Shield, Amber Ledge, Taunka'le Village + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51"] = 138, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.49:0.58"] = 178, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Moa'ki + ["0.12:0.53:0.17:0.53:0.15:0.57:0.29:0.57"] = 119, -- Transitus Shield, Amber Ledge, Warsong Hold, Unu'pe + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 370, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.12:0.53:0.17:0.53:0.15:0.57:0.29:0.57:0.49:0.58"] = 197, -- Transitus Shield, Amber Ledge, Warsong Hold, Unu'pe, Moa'ki + ["0.12:0.53:0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58"] = 176, -- Transitus Shield, Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki + ["0.12:0.53:0.17:0.53:0.15:0.57:0.29:0.57:0.49:0.58:0.45:0.51"] = 239, -- Transitus Shield, Amber Ledge, Warsong Hold, Unu'pe, Moa'ki, Agmar's Hammer + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55"] = 194, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52"] = 170, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 260, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44"] = 178, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51:0.72:0.40"] = 366, -- Transitusschild, Bernsteinflöz, Taunka'le, Agmars Hammer, Gallgrimm, Burg Siegeswall, Camp Oneqwah, Argentumwache + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 289, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73:0.95:0.63"] = 371, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand, Vengeance Landing + ["0.12:0.53:0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.59:0.55"] = 216, -- Transitus Shield, Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Venomspite + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55"] = 233, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43:0.38:0.21"] = 233, -- Transitus Shield, Amber Ledge, Taunka'le Village, Warsong Camp, The Shadow Vault + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 295, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 343, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.12:0.53:0.17:0.53:0.18:0.47:0.24:0.40:0.52:0.38"] = 219, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, River's Heart, Dalaran + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 308, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga + ["0.12:0.53:0.17:0.53:0.18:0.47:0.18:0.40"] = 83, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.72:0.29"] = 313, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Dun Nifflelem + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 330, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.24:0.40"] = 365, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran, River's Heart + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36"] = 231, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.52:0.34"] = 236, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36"] = 246, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3 + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38"] = 232, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 332, -- Transitus Shield, Amber Ledge, Taunka'le Village, Warsong Camp, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.12:0.53:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28"] = 144, -- Transitusschild, Bernsteinflöz, Bor'goroks Außenposten, Nesingwarys Basislager, Todesanhöhe + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40"] = 281, -- Bouclier Transitus, Escarpement d'Ambre, Taunka'le, Marteau d'Agmar, Temple du Repos du ver, Guet d'Ébène, Le séjour d'Argent + ["0.12:0.53:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21"] = 206, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59"] = 299, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42"] = 265, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43:0.52:0.38"] = 219, -- Transitus Shield, Amber Ledge, Taunka'le Village, Warsong Camp, Dalaran + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43"] = 124, -- Bouclier Transitus, Escarpement d'Ambre, Taunka'le, Camp chanteguerre + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 296, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.12:0.53:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19"] = 316, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.52:0.34:0.38:0.21"] = 317, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.60:0.40"] = 247, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Sunreaver's Command + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.49:0.58:0.52:0.38"] = 259, -- Transitus Shield, Amber Ledge, Taunka'le Village, Agmar's Hammer, Moa'ki, Dalaran + ["0.12:0.53:0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19"] = 319, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, River's Heart, Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.12:0.53:0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.52:0.38"] = 257, -- Transitus Shield, Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Dalaran + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43:0.24:0.40"] = 175, -- Transitus Shield, Amber Ledge, Taunka'le Village, Warsong Camp, River's Heart + ["0.12:0.53:0.17:0.53:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42"] = 239, -- Escudo de Tránsito, El Saliente Ámbar, Poblado Taunka'le, Martillo de Agmar, Templo del Reposo del Dragón, Puesto de Vigilancia de Ébano + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43:0.38:0.21:0.57:0.21:0.64:0.19"] = 343, -- Transitus Shield, Amber Ledge, Taunka'le Village, Warsong Camp, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.12:0.53:0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28:0.38:0.21"] = 209, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, River's Heart, Death's Rise, The Shadow Vault + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43:0.52:0.34"] = 230, -- Transitusschild, Bernsteinflöz, Taunka'le, Kriegshymnenlager, Kreuzfahrerturm + ["0.12:0.53:0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71"] = 298, -- Transitus Shield, Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Kamagua + ["0.12:0.53:0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 370, -- Transitus Shield, Amber Ledge, Taunka'le Village, Unu'pe, Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.12:0.53:0.17:0.53:0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71:0.74:0.62"] = 335, -- Transitusschild, Bernsteinflöz, Taunka'le, Unu'pe, Moa'ki, Kamagua, Apothekerlager + ["0.12:0.53:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 257, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.12:0.53:0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 259, -- Transitus Shield, Amber Ledge, Bor'gorok Outpost, River's Heart, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.12:0.53:0.17:0.53:0.29:0.54:0.31:0.43:0.38:0.21:0.49:0.21"] = 284, -- Transitus Shield, Amber Ledge, Taunka'le Village, Warsong Camp, The Shadow Vault, Argent Tournament Grounds + + -- Horde: Borean Tundra: Unu'pe + ["0.29:0.57:0.29:0.54"] = 22, -- Unu'pe, Taunka'le Village + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38"] = 230, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran + ["0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 133, -- Unu'pe, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.29:0.57:0.15:0.57"] = 88, -- Unu'pe, Warsong Hold + ["0.29:0.57:0.49:0.58"] = 119, -- Unu'pe, Moa'ki + ["0.29:0.57:0.29:0.54:0.45:0.51"] = 113, -- Unu'pe, Taunka'le Village, Agmar's Hammer + ["0.29:0.57:0.49:0.58:0.59:0.55:0.70:0.55"] = 238, -- Unu'pe, Moa'ki, Venomspite, Conquest Hold + ["0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73"] = 364, -- Unu'pe, Moa'ki, Kamagua, New Agamand + ["0.29:0.57:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 395, -- Unu'pe, Moa'ki, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.29:0.57:0.49:0.58:0.74:0.71"] = 302, -- Unu'pe, Moa'ki, Kamagua + ["0.29:0.57:0.49:0.58:0.59:0.55:0.74:0.62"] = 277, -- Unu'pe, Moa'ki, Venomspite, Apothecary Camp + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36"] = 275, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3 + ["0.29:0.57:0.49:0.58:0.59:0.55:0.69:0.42"] = 285, -- Unu'pe, Moa'ki, Venomspite, Light's Breach + ["0.29:0.57:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.59"] = 322, -- Unu'pe, Moa'ki, Venomspite, Conquest Hold, Camp Winterhoof + ["0.29:0.57:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.51"] = 339, -- Unu'pe, Moa'ki, Venomspite, Conquest Hold, Camp Oneqwah + ["0.29:0.57:0.49:0.58:0.59:0.55:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 419, -- Unu'pe, Moa'ki, Venomspite, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.29:0.57:0.29:0.54:0.17:0.53"] = 97, -- Unu'pe, Taunka'le Village, Amber Ledge + ["0.29:0.57:0.29:0.54:0.18:0.47"] = 94, -- Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.29:0.57:0.49:0.58:0.59:0.55"] = 179, -- Unu'pe, Moa'ki, Venomspite + ["0.29:0.57:0.15:0.57:0.17:0.53"] = 124, -- Unu'pe, Warsong Hold, Amber Ledge + ["0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73:0.84:0.59"] = 444, -- Unu'pe, Moa'ki, Kamagua, New Agamand, Camp Winterhoof + ["0.29:0.57:0.29:0.54:0.45:0.51:0.54:0.52"] = 161, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple + ["0.29:0.57:0.49:0.58:0.59:0.55:0.69:0.42:0.72:0.40"] = 328, -- Unu'pe, Moa'ki, Venomspite, Light's Breach, The Argent Stand + ["0.29:0.57:0.29:0.54:0.31:0.43:0.52:0.38"] = 234, -- Unu'pe, Taunka'le Village, Warsong Camp, Dalaran + ["0.29:0.57:0.29:0.54:0.18:0.47:0.24:0.40"] = 150, -- Unu'pe, Taunka'le Village, Bor'gorok Outpost, River's Heart + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44"] = 174, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard + ["0.29:0.57:0.49:0.58:0.59:0.55:0.64:0.42"] = 261, -- Unu'pe, Moa'ki, Venomspite, Ebon Watch + ["0.29:0.57:0.49:0.58:0.59:0.55:0.64:0.42:0.72:0.40:0.78:0.38"] = 365, -- Unu'pe, Moa'ki, Venomspite, Ebon Watch, The Argent Stand, Zim'Torga + ["0.29:0.57:0.49:0.58:0.59:0.55:0.64:0.42:0.72:0.40"] = 325, -- Unu'pe, Moa'ki, Gallgrimm, Schwarze Wacht, Argentumwache + ["0.29:0.57:0.49:0.58:0.52:0.38:0.24:0.40"] = 438, -- Unu'pe, Moa'ki, Dalaran, Flussnabel + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.72:0.29"] = 376, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Dun Nifflelem + ["0.29:0.57:0.29:0.54:0.31:0.43:0.24:0.40"] = 169, -- Unu'pe, Taunka'le Village, Warsong Camp, River's Heart + ["0.29:0.57:0.29:0.54:0.31:0.43"] = 92, -- Unu'pe, Taunka'le Village, Warsong Camp + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.60:0.40"] = 276, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Sunreaver's Command + ["0.29:0.57:0.49:0.58:0.52:0.38"] = 239, -- Unu'pe, Moa'ki, Dalaran + ["0.29:0.57:0.29:0.54:0.31:0.43:0.52:0.38:0.62:0.36:0.72:0.29"] = 379, -- Unu'pe, Taunka'le Village, Warsong Camp, Dalaran, K3, Dun Nifflelem + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36:0.38:0.21"] = 399, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.29:0.57:0.49:0.58:0.52:0.38:0.62:0.36:0.60:0.25"] = 358, -- Unu'pe, Moa'ki, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.29:0.57:0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40"] = 211, -- Unu'pe, Bastion Chanteguerre, Escarpement d'Ambre, Avant-poste Bor'gorok, Le Cœur du fleuve + ["0.29:0.57:0.29:0.54:0.45:0.51:0.59:0.55"] = 198, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Venomspite + ["0.29:0.57:0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59"] = 336, -- Unu'pe, Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.29:0.57:0.49:0.58:0.54:0.52:0.48:0.44"] = 232, -- Unu'pe, Moa'ki, Wyrmrest Temple, Kor'koron Vanguard + ["0.29:0.57:0.29:0.54:0.18:0.47:0.18:0.40"] = 141, -- Unu'pe, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.29:0.57:0.29:0.54:0.31:0.43:0.38:0.21"] = 256, -- Unu'pe, Taunka'le Village, Warsong Camp, The Shadow Vault + ["0.29:0.57:0.29:0.54:0.31:0.43:0.28:0.28"] = 205, -- Unu'pe, Taunka'le Village, Warsong Camp, Death's Rise + ["0.29:0.57:0.29:0.54:0.31:0.43:0.38:0.21:0.49:0.21"] = 332, -- Unu'pe, Taunka'le, Kriegshymnenlager, Das Schattengewölbe, Argentumturnierplatz + ["0.29:0.57:0.49:0.58:0.52:0.38:0.49:0.21"] = 353, -- Unu'pe, Moa'ki, Dalaran, Argentumturnierplatz + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 402, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.29:0.57:0.29:0.54:0.31:0.43:0.38:0.21:0.57:0.21"] = 377, -- Unu'pe, Taunka'le Village, Warsong Camp, The Shadow Vault, Bouldercrag's Refuge + ["0.29:0.57:0.29:0.54:0.31:0.43:0.52:0.34"] = 252, -- Unu'pe, Taunka'le Village, Warsong Camp, Crusaders' Pinnacle + ["0.29:0.57:0.49:0.58:0.59:0.55:0.64:0.42:0.60:0.40"] = 288, -- Unu'pe, Moa'ki, Venomspite, Ebon Watch, Sunreaver's Command + ["0.29:0.57:0.29:0.54:0.31:0.43:0.52:0.38:0.62:0.36"] = 279, -- Unu'pe, Taunka'le Village, Warsong Camp, Dalaran, K3 + ["0.29:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 296, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.29:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 351, -- Unu'pe, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + + -- Horde: Borean Tundra: Warsong Hold + ["0.15:0.57:0.29:0.57:0.49:0.58:0.74:0.71"] = 394, -- Warsong Hold, Unu'pe, Moa'ki, Kamagua + ["0.15:0.57:0.17:0.53:0.12:0.53"] = 72, -- Warsong Hold, Amber Ledge, Transitus Shield (Ryandi Tjia reported 125) + ["0.15:0.57:0.18:0.47"] = 69, -- Warsong Hold, Bor'gorok Outpost + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38"] = 294, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran + ["0.15:0.57:0.17:0.53"] = 36, -- Warsong Hold, Amber Ledge + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40"] = 125, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart + ["0.15:0.57:0.29:0.54"] = 87, -- Warsong Hold, Taunka'le Village + ["0.15:0.57:0.29:0.57"] = 93, -- Warsong Hold, Unu'pe + ["0.15:0.57:0.29:0.54:0.31:0.43"] = 157, -- Warsong Hold, Taunka'le Village, Warsong Camp + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73"] = 448, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 478, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.15:0.57:0.29:0.54:0.45:0.51"] = 177, -- Warsong Hold, Taunka'le Village, Agmar's Hammer + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 493, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.15:0.57:0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73:0.84:0.59"] = 536, -- Warsong Hold, Unu'pe, Moa'ki, Kamagua, New Agamand, Camp Winterhoof + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55"] = 263, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52"] = 226, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73:0.95:0.63"] = 526, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand, Vengeance Landing + ["0.15:0.57:0.29:0.57:0.49:0.58"] = 210, -- Warsong Hold, Unu'pe, Moa'ki + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55"] = 320, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 421, -- Kriegshymnenfeste, Taunka'le, Agmars Hammer, Gallgrimm, Burg Siegeswall, Camp Oneqwah + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38"] = 319, -- Kriegshymnenfeste, Taunka'le, Agmars Hammer, Wyrmruhtempel, Dalaran + ["0.15:0.57:0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73"] = 456, -- Warsong Hold, Unu'pe, Moa'ki, Kamagua, New Agamand + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44"] = 239, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42"] = 329, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch + ["0.15:0.57:0.29:0.57:0.49:0.58:0.59:0.55:0.70:0.55"] = 330, -- Kriegshymnenfeste, Unu'pe, Moa'ki, Gallgrimm, Burg Siegeswall + ["0.15:0.57:0.17:0.53:0.18:0.47:0.18:0.40"] = 116, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp + ["0.15:0.57:0.29:0.54:0.45:0.51:0.49:0.58"] = 238, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Moa'ki + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36"] = 317, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard + ["0.15:0.57:0.29:0.57:0.49:0.58:0.52:0.38"] = 332, -- Warsong Hold, Unu'pe, Moa'ki, Dalaran + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 405, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42"] = 368, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach + ["0.15:0.57:0.29:0.57:0.49:0.58:0.74:0.71:0.85:0.73:0.95:0.63"] = 536, -- Warsong Hold, Unu'pe, Moa'ki, Kamagua, New Agamand, Vengeance Landing + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40"] = 392, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.15:0.57:0.29:0.57:0.49:0.58:0.54:0.52:0.48:0.44"] = 324, -- Warsong Hold, Unu'pe, Moa'ki, Wyrmrest Temple, Kor'koron Vanguard + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 415, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.15:0.57:0.29:0.57:0.49:0.58:0.59:0.55:0.64:0.42"] = 354, -- Warsong Hold, Unu'pe, Moa'ki, Venomspite, Ebon Watch + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 432, -- Bastion Chanteguerre, Taunka'le, Marteau d'Agmar, Temple du Repos du ver, Guet d'Ébène, Le séjour d'Argent, Zim'Torga + ["0.15:0.57:0.29:0.54:0.31:0.43:0.52:0.34"] = 317, -- Kriegshymnenfeste, Taunka'le, Kriegshymnenlager, Kreuzfahrerturm + ["0.15:0.57:0.29:0.54:0.31:0.43:0.52:0.38"] = 298, -- Warsong Hold, Taunka'le Village, Warsong Camp, Dalaran + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 360, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.15:0.57:0.29:0.57:0.49:0.58:0.59:0.55"] = 271, -- Warsong Hold, Unu'pe, Moa'ki, Venomspite + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.52:0.34"] = 346, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28:0.38:0.21"] = 303, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart, Death's Rise, The Shadow Vault + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36"] = 340, -- Kriegshymnenfeste, Taunka'le, Agmars Hammer, Vorposten der Kor'kron, Dalaran, K3 + ["0.15:0.57:0.29:0.57:0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59"] = 428, -- Warsong Hold, Unu'pe, Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.73:0.25"] = 430, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Camp Tunka'lo + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.72:0.29"] = 440, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Dun Nifflelem + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 452, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 413, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40:0.52:0.38"] = 319, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart, Dalaran + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59:0.84:0.51"] = 476, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof, Camp Oneqwah + ["0.15:0.57:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28"] = 207, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise + ["0.15:0.57:0.29:0.54:0.45:0.51:0.49:0.58:0.52:0.38"] = 358, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Moa'ki, Dalaran + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.62:0.36"] = 363, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran, K3 + ["0.15:0.57:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19"] = 465, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 485, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.60:0.40"] = 341, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Sunreaver's Command + ["0.15:0.57:0.18:0.47:0.24:0.40"] = 125, -- Warsong Hold, Bor'gorok Outpost, River's Heart + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.62:0.36:0.72:0.29"] = 463, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran, K3, Dun Nifflelem + ["0.15:0.57:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21"] = 299, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59"] = 419, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28"] = 210, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart, Death's Rise + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40:0.52:0.38:0.48:0.44:0.45:0.51"] = 431, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.15:0.57:0.18:0.47:0.24:0.40:0.52:0.38:0.62:0.36"] = 365, -- Warsong Hold, Bor'gorok Outpost, River's Heart, Dalaran, K3 + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.60:0.40"] = 355, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, Sunreaver's Command + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.69:0.42:0.70:0.55"] = 447, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, Light's Breach, Conquest Hold + ["0.15:0.57:0.29:0.54:0.31:0.43:0.24:0.40:0.18:0.40"] = 269, -- Bastion Chanteguerre, Taunka'le, Camp chanteguerre, Le Cœur du fleuve, Camp de base de Nesingwary + ["0.15:0.57:0.29:0.54:0.31:0.43:0.24:0.40"] = 234, -- Warsong Hold, Taunka'le Village, Warsong Camp, River's Heart + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73:0.84:0.59:0.84:0.51"] = 581, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand, Camp Winterhoof, Camp Oneqwah + ["0.15:0.57:0.29:0.57:0.49:0.58:0.45:0.51"] = 274, -- Warsong Hold, Unu'pe, Moa'ki, Agmar's Hammer + ["0.15:0.57:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.57:0.21"] = 420, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Bouldercrag's Refuge + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.24:0.40:0.18:0.40"] = 530, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, River's Heart, Nesingwary Base Camp + ["0.15:0.57:0.29:0.57:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.51"] = 431, -- Kriegshymnenfeste, Unu'pe, Moa'ki, Gallgrimm, Burg Siegeswall, Camp Oneqwah + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36:0.60:0.25"] = 419, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51:0.95:0.63"] = 526, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.52:0.34:0.38:0.21"] = 446, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.15:0.57:0.29:0.57:0.49:0.58:0.74:0.71:0.74:0.62:0.84:0.59"] = 508, -- Warsong Hold, Unu'pe, Moa'ki, Kamagua, Apothecary Camp, Camp Winterhoof + ["0.15:0.57:0.29:0.57:0.49:0.58:0.52:0.38:0.62:0.36:0.73:0.25"] = 466, -- Warsong Hold, Unu'pe, Moa'ki, Dalaran, K3, Camp Tunka'lo + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.64:0.42"] = 344, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Ebon Watch + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.52:0.34"] = 324, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 612, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.64:0.42:0.52:0.38"] = 411, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Ebon Watch, Dalaran + ["0.15:0.57:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42:0.72:0.40"] = 410, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach, The Argent Stand + ["0.15:0.57:0.29:0.54:0.45:0.51:0.49:0.58:0.74:0.71:0.85:0.73:0.95:0.63"] = 563, -- Bastion Chanteguerre, Taunka'le, Marteau d'Agmar, Moa'ki, Kamagua, Nouvelle-Agamand, Accostage de la Vengeance + ["0.15:0.57:0.29:0.54:0.31:0.43:0.38:0.21:0.49:0.21"] = 396, -- Warsong Hold, Taunka'le Village, Warsong Camp, The Shadow Vault, Argent Tournament Grounds + ["0.15:0.57:0.29:0.54:0.31:0.43:0.38:0.21:0.57:0.21"] = 441, -- Warsong Hold, Taunka'le Village, Warsong Camp, The Shadow Vault, Bouldercrag's Refuge + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.49:0.21"] = 433, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.15:0.57:0.29:0.57:0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 501, -- Warsong Hold, Unu'pe, Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.15:0.57:0.17:0.53:0.18:0.47:0.18:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 375, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, Nesingwary Base Camp, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 467, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 379, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 489, -- Bastion Chanteguerre, Taunka'le, Marteau d'Agmar, Temple du Repos du ver, Dalaran, K3, Point d'impact de Grom'arsh, Ulduar + ["0.15:0.57:0.29:0.54:0.45:0.51:0.48:0.44:0.52:0.38:0.49:0.21"] = 409, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard, Dalaran, Argent Tournament Grounds + ["0.15:0.57:0.29:0.54:0.31:0.43:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 469, -- Warsong Hold, Taunka'le Village, Warsong Camp, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 489, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.15:0.57:0.29:0.54:0.45:0.51:0.54:0.52:0.52:0.38:0.56:0.36"] = 341, -- Warsong Hold, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.15:0.57:0.17:0.53:0.18:0.47:0.24:0.40:0.52:0.38:0.56:0.36"] = 340, -- Warsong Hold, Amber Ledge, Bor'gorok Outpost, River's Heart, Dalaran, The Argent Vanguard + + ---------------------------------------------------------------------- + -- Horde: Crystalsong Forest + ---------------------------------------------------------------------- + + -- Horde: Crystalsong Forest: Sunreaver's Command + ["0.60:0.40:0.52:0.38"] = 56, -- Sunreaver's Command, Dalaran + ["0.60:0.40:0.64:0.42"] = 38, -- Sunreaver's Command, Ebon Watch + ["0.60:0.40:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 213, -- Sunreaver's Command, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.60:0.40:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 305, -- Sunreaver's Command, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.60:0.40:0.52:0.38:0.48:0.44"] = 116, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard + ["0.60:0.40:0.52:0.38:0.31:0.43"] = 205, -- Sunreaver's Command, Dalaran, Warsong Camp + ["0.60:0.40:0.64:0.42:0.54:0.52:0.45:0.51"] = 197, -- Sunreaver's Command, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.60:0.40:0.52:0.38:0.49:0.58"] = 203, -- Sunreaver's Command, Dalaran, Moa'ki + ["0.60:0.40:0.52:0.38:0.56:0.36"] = 78, -- Sunreaver's Command, Dalaran, The Argent Vanguard + ["0.60:0.40:0.62:0.36"] = 34, -- Sunreaver's Command, K3 + ["0.60:0.40:0.64:0.42:0.69:0.42"] = 83, -- Sonnenhäschers Schar, Schwarze Wacht, Lichtbresche + ["0.60:0.40:0.64:0.42:0.69:0.42:0.70:0.55"] = 157, -- Sunreaver's Command, Ebon Watch, Light's Breach, Conquest Hold + ["0.60:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 307, -- Sunreaver's Command, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.60:0.40:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 235, -- Sunreaver's Command, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.60:0.40:0.64:0.42:0.59:0.55"] = 137, -- Sunreaver's Command, Ebon Watch, Venomspite + ["0.60:0.40:0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55"] = 273, -- Sunreaver's Command, Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold + ["0.60:0.40:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 196, -- Sunreaver's Command, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.60:0.40:0.64:0.42:0.54:0.52"] = 129, -- Sunreaver's Command, Ebon Watch, Wyrmrest Temple + ["0.60:0.40:0.64:0.42:0.69:0.42:0.84:0.51"] = 187, -- Sunreaver's Command, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.60:0.40:0.52:0.38:0.48:0.44:0.45:0.51"] = 169, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.60:0.40:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 293, -- Sunreaver's Command, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.60:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 379, -- Dominio de los Atracasol, Puesto de Vigilancia de Ébano, Templo del Reposo del Dragón, Martillo de Agmar, Poblado Taunka'le, Avanzada Bor'gorok + ["0.60:0.40:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 267, -- Sunreaver's Command, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.60:0.40:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 363, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.60:0.40:0.62:0.36:0.60:0.25:0.64:0.19"] = 160, -- Quartier général de Saccage-soleil, K3, Point d'impact de Grom'arsh, Ulduar + ["0.60:0.40:0.52:0.38:0.24:0.40"] = 255, -- Sunreaver's Command, Dalaran, River's Heart + ["0.60:0.40:0.62:0.36:0.72:0.29"] = 134, -- Sunreaver's Command, K3, Dun Nifflelem + ["0.60:0.40:0.52:0.38:0.24:0.40:0.18:0.40"] = 290, -- Sunreaver's Command, Dalaran, River's Heart, Nesingwary Base Camp + ["0.60:0.40:0.52:0.38:0.56:0.36:0.38:0.21:0.28:0.28"] = 301, -- Sunreaver's Command, Dalaran, The Argent Vanguard, The Shadow Vault, Death's Rise + ["0.60:0.40:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.29:0.57"] = 309, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.60:0.40:0.52:0.38:0.48:0.44:0.59:0.55"] = 206, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard, Venomspite + ["0.60:0.40:0.64:0.42:0.72:0.40:0.78:0.38"] = 143, -- Quartier général de Saccage-soleil, Guet d'Ébène, Le séjour d'Argent, Zim'Torga + ["0.60:0.40:0.64:0.42:0.72:0.40"] = 102, -- Sunreaver's Command, Ebon Watch, The Argent Stand + ["0.60:0.40:0.52:0.38:0.54:0.52:0.45:0.51"] = 233, -- Sunreaver's Command, Dalaran, Wyrmrest Temple, Agmar's Hammer + ["0.60:0.40:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47"] = 351, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.60:0.40:0.64:0.42:0.59:0.55:0.85:0.73"] = 322, -- Sunreaver's Command, Ebon Watch, Venomspite, New Agamand + ["0.60:0.40:0.64:0.42:0.59:0.55:0.74:0.62:0.84:0.59"] = 294, -- Sonnenhäschers Schar, Schwarze Wacht, Gallgrimm, Apothekerlager, Lager der Winterhufe + ["0.60:0.40:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 390, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.60:0.40:0.52:0.38:0.49:0.21"] = 170, -- Sunreaver's Command, Dalaran, Argent Tournament Grounds + ["0.60:0.40:0.62:0.36:0.60:0.25"] = 109, -- Sunreaver's Command, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.60:0.40:0.64:0.42:0.59:0.55:0.70:0.55"] = 196, -- Sunreaver's Command, Ebon Watch, Venomspite, Conquest Hold + ["0.60:0.40:0.64:0.42:0.59:0.55:0.85:0.73:0.84:0.59"] = 401, -- Sunreaver's Command, Ebon Watch, Venomspite, New Agamand, Camp Winterhoof + ["0.60:0.40:0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.51"] = 297, -- Sunreaver's Command, Ebon Watch, Venomspite, Conquest Hold, Camp Oneqwah + ["0.60:0.40:0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.59"] = 279, -- Sunreaver's Command, Ebon Watch, Venomspite, Conquest Hold, Camp Winterhoof + ["0.60:0.40:0.64:0.42:0.59:0.55:0.74:0.62"] = 234, -- Sunreaver's Command, Ebon Watch, Venomspite, Apothecary Camp + ["0.60:0.40:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 279, -- Sonnenhäschers Schar, Dalaran, Vorposten der Kor'kron, Agmars Hammer, Taunka'le + ["0.60:0.40:0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59"] = 240, -- Sunreaver's Command, Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof + ["0.60:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 391, -- Sunreaver's Command, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.60:0.40:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.59"] = 349, -- Sunreaver's Command, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Winterhoof + ["0.60:0.40:0.52:0.38:0.24:0.40:0.18:0.47"] = 309, -- Sunreaver's Command, Dalaran, River's Heart, Bor'gorok Outpost + + ---------------------------------------------------------------------- + -- Horde: Dalaran + ---------------------------------------------------------------------- + + -- Horde: Dalaran + ["0.52:0.38:0.56:0.36"] = 33, -- Dalaran, The Argent Vanguard + ["0.52:0.38:0.62:0.36"] = 55, -- Dalaran, K3 + ["0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 348, -- Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 310, -- Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 186, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.52:0.38:0.48:0.44"] = 73, -- Dalaran, Kor'koron Vanguard + ["0.52:0.38:0.52:0.34"] = 40, -- Dalaran, Crusaders' Pinnacle + ["0.52:0.38:0.60:0.40"] = 57, -- Dalaran, Sunreaver's Command + ["0.52:0.38:0.64:0.42"] = 81, -- Dalaran, Ebon Watch + ["0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 257, -- Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 279, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.52:0.38:0.49:0.58"] = 160, -- Dalaran, Moa'ki + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 336, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.52:0.38:0.48:0.44:0.45:0.51"] = 125, -- Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 200, -- Dalaran, Ebon Watch, Light's Breach, Conquest Hold + ["0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.29:0.57"] = 266, -- Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.52:0.38:0.54:0.52"] = 122, -- Dalaran, Wyrmrest Temple + ["0.52:0.38:0.48:0.44:0.59:0.55"] = 163, -- Dalaran, Kor'koron Vanguard, Venomspite + ["0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 236, -- Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 231, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53"] = 311, -- Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.52:0.38:0.64:0.42:0.72:0.40"] = 145, -- Dalaran, Ebon Watch, The Argent Stand + ["0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 320, -- Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 347, -- Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.52:0.38:0.24:0.40:0.18:0.47"] = 265, -- Dalaran, River's Heart, Bor'gorok Outpost (xDontPanic42x reported 298) + ["0.52:0.38:0.24:0.40"] = 212, -- Dalaran, River's Heart + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 239, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.38:0.64:0.42:0.69:0.42"] = 126, -- Dalaran, Ebon Watch, Light's Breach + ["0.52:0.38:0.62:0.36:0.73:0.25"] = 145, -- Dalaran, K3, Camp Tunka'lo + ["0.52:0.38:0.62:0.36:0.60:0.25"] = 130, -- Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.52:0.38:0.31:0.43"] = 161, -- Dalaran, Warsong Camp + ["0.52:0.38:0.52:0.34:0.28:0.28"] = 207, -- Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.52:0.38:0.31:0.43:0.29:0.54"] = 241, -- Dalaran, Warsong Camp, Taunka'le Village + ["0.52:0.38:0.48:0.44:0.59:0.55:0.69:0.42"] = 269, -- Dalaran, Kor'koron Vanguard, Venomspite, Light's Breach + ["0.52:0.38:0.48:0.44:0.59:0.55:0.85:0.73:0.95:0.63"] = 427, -- Dalaran, Kor'koron Vanguard, Venomspite, New Agamand, Vengeance Landing + ["0.52:0.38:0.54:0.52:0.45:0.51"] = 188, -- Dalaran, Wyrmrest Temple, Agmar's Hammer + ["0.52:0.38:0.54:0.52:0.59:0.55:0.85:0.73"] = 356, -- Dalaran, Wyrmrest Temple, Venomspite, New Agamand + ["0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 374, -- Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.52:0.38:0.48:0.44:0.59:0.55:0.85:0.73:0.74:0.71"] = 423, -- Dalaran, Kor'koron Vanguard, Venomspite, New Agamand, Kamagua + ["0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 386, -- Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.52:0.38:0.48:0.44:0.59:0.55:0.85:0.73"] = 348, -- Dalaran, Kor'koron Vanguard, Venomspite, New Agamand + ["0.52:0.38:0.54:0.52:0.59:0.55"] = 170, -- Dalaran, Wyrmrest Temple, Venomspite + ["0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55"] = 222, -- Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold + ["0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51"] = 323, -- Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Oneqwah + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59:0.85:0.73"] = 359, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.52:0.38:0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53"] = 411, -- Dalaran, Moa'ki, Unu'pe, Warsong Hold, Amber Ledge + ["0.52:0.38:0.54:0.52:0.59:0.55:0.74:0.62:0.74:0.71"] = 321, -- Dalaran, Wyrmrest Temple, Venomspite, Apothecary Camp, Kamagua + ["0.52:0.38:0.49:0.58:0.45:0.51"] = 221, -- Dalaran, Moa'ki, Agmar's Hammer + ["0.52:0.38:0.54:0.52:0.59:0.55:0.74:0.62"] = 268, -- Dalaran, Wyrmrest Temple, Venomspite, Apothecary Camp + ["0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62:0.84:0.59"] = 320, -- Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 409, -- Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.59"] = 313, -- Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold, Camp Winterhoof + ["0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 379, -- Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 181, -- Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 383, -- Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.52:0.38:0.24:0.40:0.18:0.47:0.29:0.54"] = 342, -- Dalaran, River's Heart, Bor'gorok Outpost, Taunka'le Village + ["0.52:0.38:0.49:0.58:0.59:0.55:0.70:0.55"] = 277, -- Dalaran, Moa'ki, Venomspite, Conquest Hold + ["0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.51:0.72:0.40"] = 428, -- Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold, Camp Oneqwah, The Argent Stand + ["0.52:0.38:0.49:0.58:0.74:0.71:0.85:0.73"] = 404, -- Dalaran, Moa'ki, Kamagua, New Agamand + ["0.52:0.38:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.59"] = 361, -- Dalaran, Moa'ki, Venomspite, Conquest Hold, Camp Winterhoof + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 339, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar + ["0.52:0.38:0.24:0.40:0.18:0.40"] = 247, -- Dalaran, River's Heart, Nesingwary Base Camp + ["0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47"] = 308, -- Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.51:0.78:0.38"] = 421, -- Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold, Camp Oneqwah, Zim'Torga + ["0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55"] = 229, -- Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold + ["0.52:0.38:0.54:0.52:0.59:0.55:0.69:0.42:0.72:0.40"] = 319, -- Dalaran, Wyrmrest Temple, Venomspite, Light's Breach, The Argent Stand + ["0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54"] = 299, -- Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.52:0.38:0.49:0.58:0.45:0.51:0.29:0.54"] = 331, -- Dalaran, Moa'ki, Agmar's Hammer, Taunka'le Village + ["0.52:0.38:0.49:0.58:0.74:0.71"] = 342, -- Dalaran, Moa'ki, Kamagua + ["0.52:0.38:0.62:0.36:0.72:0.29"] = 155, -- Dalaran, K3, Dun Niffelem + ["0.52:0.38:0.49:0.58:0.59:0.55"] = 219, -- Dalaran, Moa'ki, Venomspite + ["0.52:0.38:0.49:0.58:0.29:0.57:0.29:0.54"] = 310, -- Dalaran, Moa'ki, Unu'pe, Taunka'le Village + ["0.52:0.38:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 421, -- Dalaran, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62"] = 261, -- Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp + ["0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62:0.74:0.71"] = 314, -- Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp, Kamagua + ["0.52:0.38:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 385, -- Dalaran, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.52:0.38:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47"] = 382, -- Dalaran, Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 371, -- Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.52:0.38:0.24:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 356, -- Dalaran, River's Heart, Bor'gorok Outpost, Amber Ledge, Transitus Shield + ["0.52:0.38:0.49:0.58:0.29:0.57:0.15:0.57"] = 375, -- Dalaran, Moa'ki, Unu'pe, Warsong Hold + ["0.52:0.38:0.64:0.42:0.59:0.55:0.45:0.51:0.29:0.54"] = 423, -- Dalaran, Ebon Watch, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.52:0.38:0.64:0.42:0.72:0.40:0.84:0.51:0.84:0.59"] = 292, -- Dalaran, Ebon Watch, The Argent Stand, Camp Oneqwah, Camp Winterhoof + ["0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54:0.29:0.57"] = 328, -- Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.52:0.38:0.64:0.42:0.59:0.55:0.45:0.51"] = 312, -- Dalaran, Schwarze Wacht, Gallgrimm, Agmars Hammer + ["0.52:0.38:0.52:0.34:0.38:0.21"] = 162, -- Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.52:0.38:0.54:0.52:0.59:0.55:0.69:0.42"] = 276, -- Dalaran, Wyrmrest Temple, Venomspite, Light's Breach + ["0.52:0.38:0.48:0.44:0.59:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 405, -- Dalaran, Kor'koron Vanguard, Venomspite, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.38:0.64:0.42:0.59:0.55:0.45:0.51:0.29:0.54:0.17:0.53"] = 497, -- Dalaran, Ebon Watch, Venomspite, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.52:0.38:0.64:0.42:0.59:0.55"] = 180, -- Dalaran, Ebon Watch, Venomspite + ["0.52:0.38:0.62:0.36:0.73:0.25:0.64:0.19"] = 218, -- Dalaran, K3, Camp Tunka'lo, Ulduar + ["0.52:0.38:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.51"] = 378, -- Dalaran, Moa'ki, Venomspite, Conquest Hold, Camp Oneqwah + ["0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 167, -- Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.52:0.38:0.49:0.58:0.29:0.57"] = 288, -- Dalaran, Moa'ki, Unu'pe + ["0.52:0.38:0.64:0.42:0.59:0.55:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 533, -- Dalaran, Ebon Watch, Venomspite, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.52:0.38:0.49:0.58:0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.72:0.40"] = 565, -- Dalaran, Moa'ki, Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, The Argent Stand + ["0.52:0.38:0.24:0.40:0.18:0.47:0.17:0.53"] = 321, -- Dalaran, River's Heart, Bor'gorok Outpost, Amber Ledge + ["0.52:0.38:0.54:0.52:0.59:0.55:0.74:0.62:0.84:0.59"] = 328, -- Dalaran, Wyrmrest Temple, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.51"] = 330, -- Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold, Camp Oneqwah + ["0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 393, -- Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.52:0.38:0.49:0.58:0.59:0.55:0.69:0.42"] = 325, -- Dalaran, Moa'ki, Venomspite, Light's Breach + ["0.52:0.38:0.54:0.52:0.59:0.55:0.69:0.42:0.84:0.51:0.95:0.63"] = 486, -- Dalaran, Wyrmrest Temple, Venomspite, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.52:0.38:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 435, -- Dalaran, Moa'ki, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.52:0.38:0.56:0.36:0.60:0.25:0.64:0.19"] = 186, -- Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Ulduar + ["0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.59"] = 306, -- Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Winterhoof + ["0.52:0.38:0.24:0.40:0.18:0.47:0.15:0.57"] = 337, -- Dalaran, River's Heart, Bor'gorok Outpost, Warsong Hold + ["0.52:0.38:0.24:0.40:0.28:0.28"] = 296, -- Dalaran, River's Heart, Death's Rise + ["0.52:0.38:0.49:0.58:0.59:0.55:0.74:0.62"] = 316, -- Dalaran, Moa'ki, Venomspite, Apothecary Camp + ["0.52:0.38:0.54:0.52:0.59:0.55:0.85:0.73:0.95:0.63"] = 434, -- Dalaran, Wyrmrest Temple, Venomspite, New Agamand, Vengeance Landing + ["0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59"] = 284, -- Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof + ["0.52:0.38:0.31:0.43:0.45:0.51"] = 263, -- Dalaran, Warsong Camp, Agmar's Hammer + ["0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21:0.38:0.21"] = 280, -- Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.78:0.38:0.64:0.19"] = 476, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Zim'Torga, Ulduar + ["0.52:0.38:0.31:0.43:0.29:0.54:0.17:0.53:0.12:0.53"] = 352, -- Dalaran, Camp chanteguerre, Taunka'le, Escarpement d'Ambre, Bouclier Transitus + ["0.52:0.38:0.31:0.43:0.29:0.54:0.15:0.57"] = 325, -- Dalaran, Warsong Camp, Taunka'le Village, Warsong Hold + ["0.52:0.38:0.56:0.36:0.38:0.21"] = 179, -- Dalaran, The Argent Vanguard, The Shadow Vault + ["0.52:0.38:0.64:0.42:0.72:0.40:0.84:0.51"] = 244, -- Dalaran, Guet d'Ébène, Le séjour d'Argent, Camp Oneqwah + ["0.52:0.38:0.56:0.36:0.60:0.25:0.73:0.25:0.72:0.29"] = 275, -- Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Camp Tunka'lo, Dun Nifflelem + ["0.52:0.38:0.31:0.43:0.38:0.21"] = 325, -- Dalaran, Warsong Camp, The Shadow Vault + ["0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51:0.95:0.63"] = 428, -- Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.52:0.38:0.48:0.44:0.59:0.55:0.69:0.42:0.72:0.40"] = 312, -- Dalaran, Vorposten der Kor'kron, Gallgrimm, Lichtbresche, Argentumwache + ["0.52:0.38:0.31:0.43:0.29:0.54:0.17:0.53"] = 316, -- Dalaran, Warsong Camp, Taunka'le Village, Amber Ledge + ["0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59:0.95:0.63"] = 357, -- Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.52:0.38:0.56:0.36:0.60:0.25"] = 135, -- Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.52:0.38:0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59"] = 375, -- Dalaran, Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.52:0.38:0.62:0.36:0.72:0.29:0.64:0.19"] = 239, -- Dalaran, K3, Dun Nifflelem, Ulduar + ["0.52:0.38:0.48:0.44:0.59:0.55:0.85:0.73:0.84:0.59"] = 426, -- Dalaran, Kor'koron Vanguard, Venomspite, New Agamand, Camp Winterhoof + ["0.52:0.38:0.49:0.58:0.74:0.71:0.85:0.73:0.95:0.63"] = 483, -- Dalaran, Moa'ki, Kamagua, New Agamand, Vengeance Landing + ["0.52:0.38:0.62:0.36:0.73:0.25:0.78:0.38:0.82:0.31"] = 296, -- Dalaran, K3, Camp Tunka'lo, Zim'Torga, Gundrak + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 270, -- Даларан, Черная застава, Серебряная застава, Зим'Торга, Дун Ниффелем + ["0.52:0.38:0.56:0.36:0.60:0.25:0.73:0.25"] = 230, -- Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Camp Tunka'lo + ["0.52:0.38:0.62:0.36:0.73:0.25:0.78:0.38:0.72:0.40"] = 295, -- Dalaran, K3, Camp Tunka'lo, Zim'Torga, The Argent Stand + ["0.52:0.38:0.64:0.42:0.59:0.55:0.70:0.55"] = 239, -- Dalaran, Ebon Watch, Venomspite, Conquest Hold + ["0.52:0.38:0.54:0.52:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 400, -- Dalaran, Wyrmrest Temple, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.52:0.38:0.64:0.42:0.59:0.55:0.74:0.62"] = 278, -- Даларан, Черная застава, Ядозлобь, Аптекарский поселок + ["0.52:0.38:0.62:0.36:0.73:0.25:0.78:0.38"] = 243, -- Dalaran, K3, Camp Tunka'lo, Zim'Torga + ["0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73:0.95:0.63"] = 427, -- Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand, Vengeance Landing + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.78:0.38"] = 323, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Zim'Torga + ["0.52:0.38:0.31:0.43:0.29:0.54:0.29:0.57"] = 270, -- Dalaran, Warsong Camp, Taunka'le Village, Unu'pe + ["0.52:0.38:0.52:0.34:0.38:0.21:0.57:0.21"] = 283, -- Dalaran, Crusaders' Pinnacle, The Shadow Vault, Bouldercrag's Refuge + ["0.52:0.38:0.54:0.52:0.59:0.55:0.85:0.73:0.84:0.59"] = 433, -- Dalaran, Wyrmrest Temple, Venomspite, New Agamand, Camp Winterhoof + ["0.52:0.38:0.56:0.36:0.38:0.21:0.28:0.28"] = 256, -- Dalaran, Die Argentumvorhut, Das Schattengewölbe, Todesanhöhe + ["0.52:0.38:0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53:0.18:0.47"] = 443, -- Dalaran, Moa'ki, Unu'pe, Warsong Hold, Amber Ledge, Bor'gorok Outpost + ["0.52:0.38:0.56:0.36:0.60:0.25:0.57:0.21"] = 171, -- Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59:0.74:0.62"] = 336, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof, Apothecary Camp + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38"] = 244, -- Dalaran, K3, Dun Niffelem, Zim'Torga + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 387, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.52:0.38:0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51"] = 432, -- Dalaran, Flussnabel, Bor'goroks Außenposten, Taunka'le, Agmars Hammer + ["0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19:0.78:0.38:0.82:0.31"] = 388, -- Dalaran, K3, Grom'arsh Crash-Site, Ulduar, Zim'Torga, Gundrak + ["0.52:0.38:0.31:0.43:0.28:0.28"] = 273, -- Dalaran, Warsong Camp, Death's Rise + ["0.52:0.38:0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.51:0.72:0.40"] = 477, -- Dalaran, Moa'ki, Venomspite, Conquest Hold, Camp Oneqwah, The Argent Stand + ["0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62:0.84:0.59:0.84:0.51"] = 377, -- Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp, Camp Winterhoof, Camp Oneqwah + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38:0.82:0.31"] = 297, -- Dalaran, K3, Dun Niffelem, Zim'Torga, Gundrak + ["0.52:0.38:0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 396, -- Даларан, Черная застава, Ядозлобь, Крепость Завоевателей, Лагерь Заиндевевшего Копыта, Лагерь Возмездия + ["0.52:0.38:0.64:0.42:0.59:0.55:0.85:0.73"] = 366, -- Даларан, Черная застава, Ядозлобь, Новый Агамонд + ["0.52:0.38:0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.59"] = 324, -- Dalaran, Ebon Watch, Venomspite, Conquest Hold, Camp Winterhoof + ["0.52:0.38:0.49:0.58:0.74:0.71:0.74:0.62"] = 397, -- Dalaran, Moa'ki, Kamagua, Apothecary Camp + ["0.52:0.38:0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53:0.12:0.53"] = 446, -- Dalaran, Moa'ki, Unu'pe, Warsong Hold, Amber Ledge, Transitus Shield + ["0.52:0.38:0.54:0.52:0.59:0.55:0.69:0.42:0.72:0.40:0.78:0.38"] = 359, -- Dalaran, Wyrmrest Temple, Venomspite, Light's Breach, The Argent Stand, Zim'Torga + ["0.52:0.38:0.62:0.36:0.73:0.25:0.64:0.19:0.57:0.21"] = 266, -- Dalaran, K3, Camp Tunka'lo, Ulduar, Bouldercrag's Refuge + ["0.52:0.38:0.52:0.34:0.38:0.21:0.57:0.21:0.64:0.19"] = 327, -- Dalaran, Crusaders' Pinnacle, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.52:0.38:0.49:0.58:0.45:0.51:0.29:0.54:0.18:0.47"] = 403, -- Dalaran, Moa'ki, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.51:0.95:0.63"] = 434, -- Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.52:0.38:0.54:0.52:0.59:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 412, -- Dalaran, Wyrmrest Temple, Venomspite, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59:0.74:0.62:0.74:0.71"] = 390, -- Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Kamagua + ["0.52:0.38:0.54:0.52:0.59:0.55:0.85:0.73:0.74:0.71"] = 431, -- Dalaran, Temple du Repos du ver, Vexevenin, Nouvelle-Agamand, Kamagua + ["0.52:0.38:0.49:0.58:0.74:0.71:0.74:0.62:0.70:0.55"] = 443, -- Dalaran, Moa'ki, Kamagua, Apothecary Camp, Conquest Hold + ["0.52:0.38:0.31:0.43:0.29:0.54:0.18:0.47"] = 313, -- Dalaran, Warsong Camp, Taunka'le Village, Bor'gorok Outpost + ["0.52:0.38:0.64:0.42:0.72:0.40:0.84:0.51:0.84:0.59:0.85:0.73"] = 371, -- Dalaran, Ebon Watch, The Argent Stand, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.52:0.38:0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 449, -- Dalaran, Moa'ki, Gallgrimm, Apothekerlager, Lager der Winterhufe, Hafen der Vergeltung + ["0.52:0.38:0.49:0.58:0.59:0.55:0.69:0.42:0.72:0.40"] = 367, -- Dalaran, Moa'ki, Venomspite, Light's Breach, The Argent Stand + ["0.52:0.38:0.49:0.58:0.59:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 461, -- Dalaran, Moa'ki, Venomspite, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21:0.38:0.21:0.28:0.28"] = 357, -- Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.52:0.38:0.64:0.42:0.59:0.55:0.74:0.62:0.74:0.71"] = 331, -- Dalaran, Puesto de Vigilancia de Ébano, Rencor Venenoso, Campamento de los Boticarios, Komawa + ["0.52:0.38:0.24:0.40:0.28:0.28:0.38:0.21"] = 390, -- Dalaran, River's Heart, Death's Rise, The Shadow Vault + ["0.52:0.38:0.49:0.21"] = 123, -- Dalaran, Argent Tournament Grounds + ["0.52:0.38:0.49:0.21:0.57:0.21:0.64:0.19"] = 215, -- Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar + ["0.52:0.38:0.49:0.58:0.74:0.71:0.74:0.62:0.84:0.59"] = 456, -- Dalaran, Moa'ki, Kamagua, Apothecary Camp, Camp Winterhoof + ["0.52:0.38:0.49:0.21:0.57:0.21"] = 171, -- Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge + ["0.52:0.38:0.62:0.36:0.73:0.25:0.78:0.38:0.84:0.51"] = 325, -- Dalaran, K3, Camp Tunka'lo, Zim'Torga, Camp Oneqwah + ["0.52:0.38:0.64:0.42:0.72:0.40:0.84:0.51:0.95:0.63"] = 348, -- Dalaran, Ebon Watch, The Argent Stand, Camp Oneqwah, Vengeance Landing + ["0.52:0.38:0.49:0.21:0.57:0.21:0.60:0.25"] = 211, -- Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.52:0.38:0.62:0.36:0.72:0.29:0.78:0.38:0.72:0.40"] = 297, -- Dalaran, K3, Dun Nifflelem, Zim'Torga, The Argent Stand + ["0.52:0.38:0.64:0.42:0.59:0.55:0.85:0.73:0.84:0.59"] = 444, -- Dalaran, Ebon Watch, Venomspite, New Agamand, Camp Winterhoof + ["0.52:0.38:0.49:0.58:0.74:0.71:0.85:0.73:0.84:0.59"] = 483, -- Dalaran, Moa'ki, Kamagua, New Agamand, Camp Winterhoof + ["0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.60:0.25"] = 382, -- Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar, Grom'arsh Crash-Site, Grom'arsh Crash-Site + + ---------------------------------------------------------------------- + -- Horde: Dragonblight + ---------------------------------------------------------------------- + + -- Horde: Dragonblight: Agmar's Hammer + ["0.45:0.51:0.48:0.44:0.52:0.38"] = 121, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran + ["0.45:0.51:0.49:0.58"] = 64, -- Agmar's Hammer, Moa'ki + ["0.45:0.51:0.48:0.44"] = 65, -- Agmar's Hammer, Kor'koron Vanguard + ["0.45:0.51:0.54:0.52"] = 52, -- Agmar's Hammer, Wyrmrest Temple + ["0.45:0.51:0.59:0.55"] = 88, -- Agmar's Hammer, Venomspite + ["0.45:0.51:0.59:0.55:0.85:0.73"] = 273, -- Agmar's Hammer, Venomspite, New Agamand + ["0.45:0.51:0.29:0.54"] = 114, -- Agmar's Hammer, Taunka'le Village + ["0.45:0.51:0.59:0.55:0.74:0.62"] = 185, -- Agmar's Hammer, Venomspite, Apothecary Camp + ["0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 225, -- Agmars Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.45:0.51:0.29:0.54:0.15:0.57"] = 198, -- Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.45:0.51:0.54:0.52:0.52:0.38"] = 145, -- Agmar's Hammer, Wyrmrest Temple, Dalaran + ["0.45:0.51:0.49:0.58:0.29:0.57:0.15:0.57"] = 282, -- Agmar's Hammer, Moa'ki, Unu'pe, Warsong Hold + ["0.45:0.51:0.59:0.55:0.70:0.55"] = 146, -- Agmar's Hammer, Venomspite, Conquest Hold + ["0.45:0.51:0.48:0.44:0.64:0.42:0.72:0.40"] = 234, -- Agmar's Hammer, Kor'koron Vanguard, Ebon Watch, The Argent Stand + ["0.45:0.51:0.54:0.52:0.64:0.42"] = 154, -- Agmar's Hammer, Wyrmrest Temple, Ebon Watch + ["0.45:0.51:0.29:0.54:0.17:0.53"] = 189, -- Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.45:0.51:0.49:0.58:0.29:0.57"] = 195, -- Marteau d'Agmar, Moa'ki, Unu'pe + ["0.45:0.51:0.29:0.54:0.18:0.47"] = 186, -- Martillo de Agmar, Poblado Taunka'le, Avanzada Bor'gorok + ["0.45:0.51:0.49:0.58:0.74:0.71:0.85:0.73:0.95:0.63"] = 389, -- Agmar's Hammer, Moa'ki, Kamagua, New Agamand, Vengeance Landing + ["0.45:0.51:0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53"] = 318, -- Agmar's Hammer, Moa'ki, Unu'pe, Warsong Hold, Amber Ledge + ["0.45:0.51:0.49:0.58:0.74:0.71:0.85:0.73"] = 310, -- Agmar's Hammer, Moa'ki, Kamagua, New Agamand + ["0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40"] = 218, -- Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.45:0.51:0.59:0.55:0.85:0.73:0.84:0.59"] = 351, -- Agmar's Hammer, Venomspite, New Agamand, Camp Winterhoof + ["0.45:0.51:0.59:0.55:0.69:0.42"] = 194, -- Agmar's Hammer, Venomspite, Light's Breach + ["0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 246, -- Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah + ["0.45:0.51:0.49:0.58:0.52:0.38"] = 185, -- Agmar's Hammer, Moa'ki, Dalaran + ["0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59"] = 245, -- Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 318, -- Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.45:0.51:0.59:0.55:0.85:0.73:0.74:0.71"] = 348, -- Agmar's Hammer, Venomspite, New Agamand, Kamagua + ["0.45:0.51:0.29:0.54:0.29:0.57"] = 143, -- Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.45:0.51:0.54:0.52:0.64:0.42:0.60:0.40"] = 181, -- Agmar's Hammer, Wyrmrest Temple, Ebon Watch, Sunreaver's Command + ["0.45:0.51:0.59:0.55:0.69:0.42:0.72:0.40"] = 237, -- Agmar's Hammer, Venomspite, Light's Breach, The Argent Stand + ["0.45:0.51:0.49:0.58:0.74:0.71"] = 248, -- Agmar's Hammer, Moa'ki, Kamagua + ["0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 230, -- Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 239, -- Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.45:0.51:0.54:0.52:0.52:0.38:0.24:0.40:0.18:0.40"] = 379, -- Agmar's Hammer, Wyrmrest Temple, Dalaran, River's Heart, Nesingwary Base Camp + ["0.45:0.51:0.49:0.58:0.74:0.71:0.74:0.62:0.84:0.59"] = 362, -- Agmar's Hammer, Moa'ki, Kamagua, Apothecary Camp, Camp Winterhoof + ["0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 258, -- Agmars Hammer, Wyrmruhtempel, Schwarze Wacht, Argentumwache, Zim'Torga + ["0.45:0.51:0.59:0.55:0.85:0.73:0.95:0.63"] = 352, -- Agmars Hammer, Gallgrimm, Neu-Agamand, Hafen der Vergeltung + ["0.45:0.51:0.29:0.54:0.18:0.47:0.24:0.40"] = 241, -- Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, River's Heart + ["0.45:0.51:0.31:0.43"] = 118, -- Agmar's Hammer, Warsong Camp + ["0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 303, -- Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.45:0.51:0.59:0.55:0.64:0.42"] = 170, -- Agmar's Hammer, Venomspite, Ebon Watch + ["0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 292, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.45:0.51:0.31:0.43:0.38:0.21"] = 281, -- Agmar's Hammer, Warsong Camp, The Shadow Vault + ["0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51:0.78:0.38"] = 339, -- Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah, Zim'Torga + ["0.45:0.51:0.59:0.55:0.64:0.42:0.52:0.38"] = 237, -- Agmar's Hammer, Venomspite, Ebon Watch, Dalaran + ["0.45:0.51:0.54:0.52:0.64:0.42:0.62:0.36:0.72:0.29"] = 295, -- Agmar's Hammer, Wyrmrest Temple, Ebon Watch, K3, Dun Nifflelem + ["0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59:0.84:0.51"] = 302, -- Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof, Camp Oneqwah + ["0.45:0.51:0.29:0.54:0.18:0.47:0.18:0.40"] = 232, -- Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.45:0.51:0.48:0.44:0.52:0.38:0.52:0.34:0.38:0.21"] = 272, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.45:0.51:0.48:0.44:0.52:0.38:0.24:0.40"] = 321, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, River's Heart + ["0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.72:0.29"] = 266, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Dun Nifflelem + ["0.45:0.51:0.49:0.58:0.74:0.71:0.85:0.73:0.84:0.59"] = 389, -- Agmar's Hammer, Moa'ki, Kamagua, New Agamand, Camp Winterhoof + ["0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 312, -- Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.45:0.51:0.54:0.52:0.52:0.38:0.24:0.40:0.18:0.47:0.17:0.53"] = 454, -- Agmar's Hammer, Wyrmrest Temple, Dalaran, River's Heart, Bor'gorok Outpost, Amber Ledge + ["0.45:0.51:0.59:0.55:0.64:0.42:0.52:0.38:0.56:0.36"] = 258, -- Agmar's Hammer, Venomspite, Ebon Watch, Dalaran, The Argent Vanguard + ["0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.73:0.25"] = 256, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Camp Tunka'lo + ["0.45:0.51:0.48:0.44:0.52:0.38:0.24:0.40:0.18:0.47:0.15:0.57"] = 447, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, River's Heart, Bor'gorok Outpost, Warsong Hold + ["0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36"] = 167, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3 + ["0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 242, -- Agmars Hammer, Vorposten der Kor'kron, Dalaran, K3, Absturzstelle Grom'ash + ["0.45:0.51:0.31:0.43:0.24:0.40"] = 194, -- Agmar's Hammer, Warsong Camp, River's Heart + ["0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51:0.95:0.63"] = 351, -- Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36"] = 143, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard + ["0.45:0.51:0.59:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 330, -- Agmar's Hammer, Venomspite, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.45:0.51:0.48:0.44:0.52:0.38:0.52:0.34"] = 150, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle + ["0.45:0.51:0.48:0.44:0.64:0.42"] = 171, -- Agmar's Hammer, Kor'koron Vanguard, Ebon Watch + ["0.45:0.51:0.31:0.43:0.52:0.38"] = 259, -- Agmar's Hammer, Warsong Camp, Dalaran + ["0.45:0.51:0.54:0.52:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 321, -- Agmar's Hammer, Wyrmrest Temple, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.45:0.51:0.31:0.43:0.28:0.28"] = 230, -- Agmar's Hammer, Warsong Camp, Death's Rise + ["0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51:0.78:0.38:0.82:0.31"] = 392, -- Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah, Zim'Torga, Gundrak + ["0.45:0.51:0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 278, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.45:0.51:0.31:0.43:0.24:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 339, -- Agmar's Hammer, Warsong Camp, River's Heart, Bor'gorok Outpost, Amber Ledge, Transitus Shield + ["0.45:0.51:0.54:0.52:0.64:0.42:0.62:0.36"] = 194, -- Agmar's Hammer, Wyrmrest Temple, Ebon Watch, K3 + ["0.45:0.51:0.48:0.44:0.52:0.38:0.49:0.21"] = 235, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, Argent Tournament Grounds + ["0.45:0.51:0.54:0.52:0.52:0.38:0.49:0.21"] = 258, -- Agmar's Hammer, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.45:0.51:0.48:0.44:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 346, -- Agmar's Hammer, Kor'koron Vanguard, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.45:0.51:0.48:0.44:0.52:0.38:0.56:0.36:0.60:0.25:0.64:0.19"] = 297, -- Agmar's Hammer, Kor'koron Vanguard, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Ulduar + ["0.45:0.51:0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 295, -- Agmar's Hammer, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + + -- Horde: Dragonblight: Kor'koron Vanguard + ["0.48:0.44:0.52:0.38"] = 56, -- Kor'koron Vanguard, Dalaran + ["0.48:0.44:0.52:0.38:0.60:0.40"] = 103, -- Kor'koron Vanguard, Dalaran, Sunreaver's Command + ["0.48:0.44:0.45:0.51:0.29:0.54"] = 164, -- Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.48:0.44:0.54:0.52"] = 67, -- Kor'koron Vanguard, Wyrmrest Temple + ["0.48:0.44:0.45:0.51"] = 53, -- Kor'koron Vanguard, Agmar's Hammer + ["0.48:0.44:0.45:0.51:0.49:0.58"] = 114, -- Kor'koron Vanguard, Agmar's Hammer, Moa'ki + ["0.48:0.44:0.59:0.55"] = 90, -- Kor'koron Vanguard, Venomspite + ["0.48:0.44:0.52:0.38:0.56:0.36"] = 79, -- Kor'koron Vanguard, Dalaran, The Argent Vanguard + ["0.48:0.44:0.64:0.42:0.72:0.40"] = 171, -- Kor'koron Vanguard, Ebon Watch, The Argent Stand + ["0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 307, -- Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 248, -- Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 274, -- Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.48:0.44:0.59:0.55:0.70:0.55"] = 149, -- Kor'koron Vanguard, Venomspite, Conquest Hold + ["0.48:0.44:0.45:0.51:0.49:0.58:0.29:0.57"] = 245, -- Kor'koron Vanguard, Agmar's Hammer, Moa'ki, Unu'pe + ["0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53"] = 238, -- Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.48:0.44:0.59:0.55:0.74:0.62"] = 188, -- Kor'koron Vanguard, Venomspite, Apothecary Camp + ["0.48:0.44:0.52:0.38:0.24:0.40"] = 258, -- Kor'koron Vanguard, Dalaran, River's Heart + ["0.48:0.44:0.45:0.51:0.49:0.58:0.74:0.71"] = 297, -- Kor'koron Vanguard, Agmar's Hammer, Moa'ki, Kamagua + ["0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47"] = 236, -- Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 214, -- Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51"] = 250, -- Avant-garde kor'kronne, Vexevenin, Bastion de la Conquête, Camp Oneqwah + ["0.48:0.44:0.64:0.42:0.60:0.40"] = 134, -- Стоянка отряда Кор'крона, Черная застава, Лагерь Похитителя Солнца + ["0.48:0.44:0.59:0.55:0.69:0.42"] = 197, -- Kor'koron Vanguard, Venomspite, Light's Breach + ["0.48:0.44:0.64:0.42"] = 107, -- Kor'koron Vanguard, Ebon Watch + ["0.48:0.44:0.45:0.51:0.29:0.54:0.29:0.57"] = 193, -- Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.48:0.44:0.52:0.38:0.56:0.36:0.60:0.25"] = 181, -- Kor'koron Vanguard, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.59"] = 234, -- Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Winterhoof + ["0.48:0.44:0.45:0.51:0.31:0.43"] = 168, -- Kor'koron Vanguard, Agmar's Hammer, Warsong Camp + ["0.48:0.44:0.64:0.42:0.69:0.42"] = 152, -- Kor'koron Vanguard, Ebon Watch, Light's Breach + ["0.48:0.44:0.45:0.51:0.31:0.43:0.24:0.40"] = 244, -- Kor'koron Vanguard, Agmar's Hammer, Warsong Camp, River's Heart + ["0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47:0.18:0.40"] = 282, -- Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.48:0.44:0.59:0.55:0.85:0.73"] = 276, -- Kor'koron Vanguard, Venomspite, New Agamand + ["0.48:0.44:0.52:0.38:0.62:0.36:0.72:0.29"] = 202, -- Kor'koron Vanguard, Dalaran, K3, Dun Nifflelem + ["0.48:0.44:0.52:0.38:0.62:0.36"] = 103, -- Kor'koron Vanguard, Dalaran, K3 + ["0.48:0.44:0.59:0.55:0.74:0.62:0.74:0.71"] = 242, -- Kor'koron Vanguard, Venomspite, Apothecary Camp, Kamagua + ["0.48:0.44:0.54:0.52:0.49:0.58"] = 120, -- Kor'koron Vanguard, Wyrmrest Temple, Moa'ki + ["0.48:0.44:0.52:0.38:0.52:0.34"] = 85, -- Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle + ["0.48:0.44:0.52:0.38:0.56:0.36:0.60:0.25:0.64:0.19:0.72:0.29"] = 336, -- Kor'koron Vanguard, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Ulduar, Dun Nifflelem + ["0.48:0.44:0.52:0.38:0.52:0.34:0.38:0.21"] = 208, -- Kor'koron Vanguard, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.48:0.44:0.52:0.38:0.24:0.40:0.28:0.28"] = 342, -- Kor'koron Vanguard, Dalaran, River's Heart, Death's Rise + ["0.48:0.44:0.52:0.38:0.31:0.43"] = 207, -- Kor'koron Vanguard, Dalaran, Warsong Camp + ["0.48:0.44:0.52:0.38:0.56:0.36:0.38:0.21"] = 226, -- Kor'koron Vanguard, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.48:0.44:0.45:0.51:0.49:0.58:0.29:0.57:0.15:0.57"] = 331, -- Kor'koron Vanguard, Agmar's Hammer, Moa'ki, Unu'pe, Warsong Hold + ["0.48:0.44:0.52:0.38:0.62:0.36:0.60:0.25"] = 177, -- Kor'koron Vanguard, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.48:0.44:0.52:0.38:0.49:0.21"] = 171, -- Kor'koron Vanguard, Dalaran, Argent Tournament Grounds + ["0.48:0.44:0.45:0.51:0.31:0.43:0.24:0.40:0.18:0.47:0.15:0.57"] = 370, -- Kor'koron Vanguard, Agmar's Hammer, Warsong Camp, River's Heart, Bor'gorok Outpost, Warsong Hold + ["0.48:0.44:0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59"] = 310, -- Kor'koron Vanguard, Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof + + -- Horde: Dragonblight: Moa'ki + ["0.49:0.58:0.45:0.51:0.31:0.43:0.24:0.40"] = 255, -- Moa'ki, Agmar's Hammer, Warsong Camp, River's Heart + ["0.49:0.58:0.52:0.38"] = 123, -- Moa'ki, Dalaran + ["0.49:0.58:0.45:0.51"] = 65, -- Moa'ki, Agmar's Hammer + ["0.49:0.58:0.54:0.52"] = 49, -- Moa'ki, Wyrmrest Temple + ["0.49:0.58:0.59:0.55"] = 62, -- Moa'ki, Venomspite + ["0.49:0.58:0.29:0.57"] = 133, -- Moa'ki, Unu'pe + ["0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.51"] = 222, -- Moa'ki, Venomspite, Conquest Hold, Camp Oneqwah + ["0.49:0.58:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 293, -- Moa'ki, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.49:0.58:0.29:0.57:0.29:0.54"] = 154, -- Moa'ki, Unu'pe, Taunka'le Village + ["0.49:0.58:0.74:0.71:0.85:0.73"] = 247, -- Moa'ki, Kamagua, New Agamand + ["0.49:0.58:0.59:0.55:0.85:0.73"] = 247, -- Moa'ki, Venomspite, New Agamand + ["0.49:0.58:0.74:0.71"] = 184, -- Moa'ki, Kamagua + ["0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 292, -- Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.49:0.58:0.74:0.71:0.85:0.73:0.95:0.63"] = 327, -- Moa'ki, Kamagua, New Agamand, Vengeance Landing + ["0.49:0.58:0.45:0.51:0.29:0.54:0.15:0.57"] = 259, -- Moa'ki, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47"] = 225, -- Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 229, -- Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.49:0.58:0.29:0.57:0.15:0.57"] = 219, -- Moa'ki, Unu'pe, Warsong Hold + ["0.49:0.58:0.59:0.55:0.74:0.62"] = 160, -- Moa'ki, Venomspite, Apothecary Camp + ["0.49:0.58:0.59:0.55:0.70:0.55"] = 121, -- Moa'ki, Venomspite, Conquest Hold + ["0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 264, -- Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.49:0.58:0.59:0.55:0.64:0.42:0.72:0.40:0.78:0.38"] = 248, -- Moa'ki, Venomspite, Ebon Watch, The Argent Stand, Zim'Torga + ["0.49:0.58:0.45:0.51:0.29:0.54"] = 174, -- Moa'ki, Agmar's Hammer, Taunka'le Village + ["0.49:0.58:0.54:0.52:0.48:0.44"] = 115, -- Moa'ki, Wyrmrest Temple, Kor'koron Vanguard + ["0.49:0.58:0.74:0.71:0.85:0.73:0.84:0.59"] = 326, -- Moa'ki, Kamagua, Neu-Agamand, Lager der Winterhufe + ["0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47:0.24:0.40"] = 282, -- Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost, River's Heart + ["0.49:0.58:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 286, -- Moa'ki, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.49:0.58:0.59:0.55:0.64:0.42:0.72:0.40"] = 208, -- Moa'ki, Venomspite, Ebon Watch, The Argent Stand + ["0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.59"] = 205, -- Moa'ki, Rencor Venenoso, Bastión de la Conquista, Campamento Pezuña Invernal + ["0.49:0.58:0.59:0.55:0.69:0.42"] = 168, -- Moa'ki, Venomspite, Light's Breach + ["0.49:0.58:0.59:0.55:0.64:0.42"] = 144, -- Moa'ki, Venomspite, Ebon Watch + ["0.49:0.58:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 278, -- Moa'ki, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53:0.18:0.47"] = 286, -- Moa'ki, Unu'pe, Warsong Hold, Amber Ledge, Bor'gorok Outpost + ["0.49:0.58:0.59:0.55:0.85:0.73:0.95:0.63"] = 326, -- Moa'ki, Venomspite, New Agamand, Vengeance Landing + ["0.49:0.58:0.59:0.55:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 302, -- Moa'ki, Venomspite, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.49:0.58:0.45:0.51:0.48:0.44"] = 126, -- Moa'ki, Agmar's Hammer, Kor'koron Vanguard + ["0.49:0.58:0.45:0.51:0.31:0.43"] = 179, -- Moa'ki, Agmar's Hammer, Warsong Camp + ["0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47:0.18:0.40"] = 273, -- Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.49:0.58:0.52:0.38:0.62:0.36"] = 167, -- Moa'ki, Dalaran, K3 + ["0.49:0.58:0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 311, -- Moa'ki, Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.49:0.58:0.52:0.38:0.52:0.34:0.38:0.21"] = 273, -- Moa'ki, Dalaran, Cime des Croisés, Le caveau des Ombres + ["0.49:0.58:0.52:0.38:0.24:0.40"] = 322, -- Moa'ki, Dalaran, River's Heart + ["0.49:0.58:0.52:0.38:0.62:0.36:0.72:0.29"] = 267, -- Moa'ki, Dalaran, K3, Dun Nifflelem + ["0.49:0.58:0.59:0.55:0.74:0.62:0.84:0.59"] = 219, -- Moa'ki, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.49:0.58:0.45:0.51:0.29:0.54:0.17:0.53"] = 250, -- Moa'ki, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.49:0.58:0.52:0.38:0.52:0.34"] = 151, -- Moa'ki, Dalaran, Crusaders' Pinnacle + ["0.49:0.58:0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 278, -- Moa'ki, Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.49:0.58:0.52:0.38:0.56:0.36"] = 145, -- Moa'ki, Dalaran, The Argent Vanguard + ["0.49:0.58:0.45:0.51:0.31:0.43:0.28:0.28"] = 291, -- Moa'ki, Agmar's Hammer, Warsong Camp, Death's Rise + ["0.49:0.58:0.74:0.71:0.74:0.62"] = 240, -- Moa'ki, Kamagua, Apothecary Camp + ["0.49:0.58:0.45:0.51:0.29:0.54:0.18:0.47:0.24:0.40"] = 303, -- Moa'ki, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, River's Heart + ["0.49:0.58:0.52:0.38:0.62:0.36:0.73:0.25"] = 256, -- Moa'ki, Dalaran, K3, Camp Tunka'lo + ["0.49:0.58:0.52:0.38:0.49:0.21"] = 237, -- Moa'ki, Dalaran, Argent Tournament Grounds + ["0.49:0.58:0.52:0.38:0.56:0.36:0.38:0.21"] = 291, -- Moa'ki, Dalaran, The Argent Vanguard, The Shadow Vault + + -- Horde: Dragonblight: Venomspite + ["0.59:0.55:0.54:0.52:0.52:0.38"] = 149, -- Venomspite, Wyrmrest Temple, Dalaran + ["0.59:0.55:0.54:0.52"] = 52, -- Venomspite, Wyrmrest Temple + ["0.59:0.55:0.49:0.58"] = 83, -- Venomspite, Moa'ki + ["0.59:0.55:0.45:0.51"] = 133, -- Venomspite, Agmar's Hammer + ["0.59:0.55:0.48:0.44"] = 121, -- Venomspite, Kor'koron Vanguard + ["0.59:0.55:0.70:0.55"] = 60, -- Venomspite, Conquest Hold + ["0.59:0.55:0.74:0.62"] = 99, -- Venomspite, Apothecary Camp + ["0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 231, -- Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.59:0.55:0.85:0.73"] = 187, -- Venomspite, New Agamand + ["0.59:0.55:0.74:0.62:0.74:0.71"] = 152, -- Venomspite, Apothecary Camp, Kamagua + ["0.59:0.55:0.85:0.73:0.84:0.59"] = 264, -- Venomspite, New Agamand, Camp Winterhoof + ["0.59:0.55:0.74:0.62:0.84:0.59"] = 158, -- Venomspite, Apothecary Camp, Camp Winterhoof + ["0.59:0.55:0.85:0.73:0.95:0.63"] = 264, -- Venomspite, New Agamand, Vengeance Landing + ["0.59:0.55:0.85:0.73:0.74:0.71"] = 261, -- Vexevenin, Nouvelle-Agamand, Kamagua + ["0.59:0.55:0.70:0.55:0.84:0.59"] = 144, -- Venomspite, Conquest Hold, Camp Winterhoof + ["0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 301, -- Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.59:0.55:0.45:0.51:0.29:0.54:0.18:0.47"] = 316, -- Venomspite, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.59:0.55:0.69:0.42:0.72:0.40"] = 150, -- Venomspite, Light's Breach, The Argent Stand + ["0.59:0.55:0.64:0.42:0.60:0.40"] = 110, -- Venomspite, Ebon Watch, Sunreaver's Command + ["0.59:0.55:0.45:0.51:0.29:0.54:0.17:0.53"] = 319, -- Venomspite, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.59:0.55:0.45:0.51:0.29:0.54:0.15:0.57"] = 328, -- Venomspite, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.59:0.55:0.74:0.62:0.84:0.59:0.84:0.51"] = 215, -- Venomspite, Apothecary Camp, Camp Winterhoof, Camp Oneqwah + ["0.59:0.55:0.49:0.58:0.52:0.38"] = 204, -- Venomspite, Moa'ki, Dalaran + ["0.59:0.55:0.45:0.51:0.29:0.54"] = 244, -- Venomspite, Agmar's Hammer, Taunka'le Village + ["0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 304, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 231, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.59:0.55:0.64:0.42"] = 83, -- Venomspite, Ebon Watch + ["0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 217, -- Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 342, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 316, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 306, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.59:0.55:0.69:0.42"] = 107, -- Venomspite, Light's Breach + ["0.59:0.55:0.64:0.42:0.72:0.40"] = 147, -- Venomspite, Ebon Watch, The Argent Stand + ["0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 346, -- Venomspite, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 298, -- Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.59:0.55:0.70:0.55:0.84:0.51"] = 160, -- Venomspite, Conquest Hold, Camp Oneqwah + ["0.59:0.55:0.64:0.42:0.62:0.36:0.60:0.25"] = 199, -- Venomspite, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.59:0.55:0.49:0.58:0.29:0.57"] = 214, -- Venomspite, Moa'ki, Unu'pe + ["0.59:0.55:0.64:0.42:0.62:0.36:0.72:0.29"] = 224, -- Venomspite, Ebon Watch, K3, Dun Nifflelem + ["0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47:0.18:0.40"] = 350, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.59:0.55:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 236, -- Venomspite, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34:0.28:0.28"] = 343, -- Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.59:0.55:0.64:0.42:0.62:0.36"] = 124, -- Venomspite, Ebon Watch, K3 + ["0.59:0.55:0.49:0.58:0.74:0.71"] = 266, -- Venomspite, Moa'ki, Kamagua + ["0.59:0.55:0.48:0.44:0.52:0.38"] = 176, -- Venomspite, Kor'koron Vanguard, Dalaran + ["0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43:0.24:0.40"] = 311, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp, River's Heart + ["0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 310, -- Rencor Venenoso, Moa'ki, Unu'pe, Poblado Taunka'le, El Saliente Ámbar + ["0.59:0.55:0.64:0.42:0.52:0.38"] = 151, -- Venomspite, Ebon Watch, Dalaran + ["0.59:0.55:0.54:0.52:0.52:0.38:0.24:0.40"] = 348, -- Venomspite, Wyrmrest Temple, Dalaran, River's Heart + ["0.59:0.55:0.54:0.52:0.52:0.38:0.56:0.36"] = 171, -- Venomspite, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.59:0.55:0.69:0.42:0.84:0.51:0.84:0.59"] = 259, -- Venomspite, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.59:0.55:0.69:0.42:0.84:0.51"] = 211, -- Gallgrimm, Lichtbresche, Camp Oneqwah + ["0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43"] = 235, -- Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36"] = 192, -- Venomspite, Wyrmrest Temple, Dalaran, K3 + ["0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34"] = 176, -- Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle + ["0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 262, -- Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.59:0.55:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 250, -- Venomspite, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.59:0.55:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 241, -- Venomspite, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.59:0.55:0.54:0.52:0.52:0.38:0.56:0.36:0.38:0.21"] = 317, -- Venomspite, Wyrmrest Temple, Dalaran, The Argent Vanguard, The Shadow Vault + + -- Horde: Dragonblight: Wyrmrest Temple + ["0.54:0.52:0.52:0.38"] = 65, -- Wyrmrest Temple, Dalaran + ["0.54:0.52:0.45:0.51"] = 47, -- Wyrmrest Temple, Agmar's Hammer + ["0.54:0.52:0.49:0.58"] = 36, -- Wyrmrest Temple, Moa'ki + ["0.54:0.52:0.59:0.55"] = 35, -- Wyrmrest Temple, Venomspite + ["0.54:0.52:0.48:0.44"] = 45, -- Wyrmrest Temple, Kor'koron Vanguard + ["0.54:0.52:0.64:0.42:0.60:0.40"] = 89, -- Wyrmrest Temple, Ebon Watch, Sunreaver's Command + ["0.54:0.52:0.52:0.38:0.56:0.36"] = 79, -- Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.54:0.52:0.45:0.51:0.29:0.54"] = 120, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.54:0.52:0.59:0.55:0.85:0.73"] = 158, -- Wyrmrest Temple, Venomspite, New Agamand + ["0.54:0.52:0.49:0.58:0.74:0.71:0.85:0.73"] = 200, -- Wyrmrest Temple, Moa'ki, Kamagua, New Agamand + ["0.54:0.52:0.59:0.55:0.70:0.55"] = 73, -- Wyrmrest Temple, Venomspite, Conquest Hold + ["0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 178, -- Wyrmrest Temple, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.54:0.52:0.59:0.55:0.85:0.73:0.95:0.63"] = 210, -- Wyrmrest Temple, Venomspite, New Agamand, Vengeance Landing + ["0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 177, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 194, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.54:0.52:0.59:0.55:0.74:0.62:0.74:0.71"] = 135, -- Wyrmrest Temple, Venomspite, Apothecary Camp, Kamagua + ["0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 171, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.54:0.52:0.64:0.42:0.69:0.42"] = 100, -- Wyrmrest Temple, Ebon Watch, Light's Breach + ["0.54:0.52:0.64:0.42"] = 71, -- Wyrmrest Temple, Ebon Watch + ["0.54:0.52:0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53:0.12:0.53"] = 229, -- Wyrmrest Temple, Moa'ki, Unu'pe, Warsong Hold, Amber Ledge, Transitus Shield + ["0.54:0.52:0.49:0.58:0.29:0.57"] = 124, -- Wyrmrest Temple, Moa'ki, Unu'pe + ["0.54:0.52:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 187, -- Wyrmrest Temple, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.54:0.52:0.64:0.42:0.72:0.40"] = 113, -- Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.54:0.52:0.64:0.42:0.62:0.36:0.60:0.25"] = 148, -- Wyrmrest Temple, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.54:0.52:0.59:0.55:0.69:0.42"] = 105, -- Wyrmrest Temple, Venomspite, Light's Breach + ["0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 165, -- Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.51"] = 140, -- Wyrmrest Temple, Venomspite, Conquest Hold, Camp Oneqwah + ["0.54:0.52:0.59:0.55:0.74:0.62"] = 99, -- Wyrmrest Temple, Venomspite, Apothecary Camp + ["0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 169, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.54:0.52:0.52:0.38:0.52:0.34"] = 84, -- Wyrmrest Temple, Dalaran, Crusaders' Pinnacle + ["0.54:0.52:0.64:0.42:0.62:0.36"] = 98, -- Wyrmrest Temple, Ebon Watch, K3 + ["0.54:0.52:0.52:0.38:0.24:0.40"] = 198, -- Wyrmrest Temple, Dalaran, River's Heart + ["0.54:0.52:0.59:0.55:0.74:0.62:0.84:0.59"] = 139, -- Wyrmrest Temple, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.54:0.52:0.45:0.51:0.31:0.43:0.24:0.40"] = 174, -- Wyrmrest Temple, Agmar's Hammer, Warsong Camp, River's Heart + ["0.54:0.52:0.45:0.51:0.31:0.43:0.28:0.28"] = 198, -- Wyrmrest Temple, Agmar's Hammer, Warsong Camp, Death's Rise + ["0.54:0.52:0.64:0.42:0.62:0.36:0.72:0.29"] = 164, -- Wyrmrest Temple, Ebon Watch, K3, Dun Nifflelem + ["0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.51:0.95:0.63"] = 210, -- Wyrmrest Temple, Venomspite, Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.54:0.52:0.64:0.42:0.62:0.36:0.73:0.25"] = 158, -- Wyrmrest Temple, Ebon Watch, K3, Camp Tunka'lo + ["0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 176, -- Wyrmrest Temple, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.54:0.52:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 172, -- Wyrmrest Temple, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.54:0.52:0.49:0.58:0.29:0.57:0.29:0.54"] = 138, -- Wyrmrest Temple, Moa'ki, Unu'pe, Taunka'le Village + ["0.54:0.52:0.64:0.42:0.62:0.36:0.73:0.25:0.64:0.19:0.57:0.21"] = 238, -- Wyrmrest Temple, Ebon Watch, K3, Camp Tunka'lo, Ulduar, Bouldercrag's Refuge + ["0.54:0.52:0.45:0.51:0.31:0.43"] = 123, -- Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.54:0.52:0.64:0.42:0.72:0.40:0.78:0.38"] = 140, -- Temple du Repos du ver, Guet d'Ébène, Le séjour d'Argent, Zim'Torga + ["0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.59"] = 129, -- Wyrmrest Temple, Venomspite, Conquest Hold, Camp Winterhoof + ["0.54:0.52:0.49:0.58:0.74:0.71"] = 158, -- Wyrmrest Temple, Moa'ki, Kamagua + ["0.54:0.52:0.59:0.55:0.69:0.42:0.72:0.40"] = 133, -- Wyrmrest Temple, Venomspite, Light's Breach, The Argent Stand + ["0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47:0.18:0.40"] = 199, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47:0.24:0.40"] = 206, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, River's Heart + ["0.54:0.52:0.52:0.38:0.52:0.34:0.28:0.28"] = 194, -- Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.54:0.52:0.59:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 263, -- Храм Драконьего Покоя, Ядозлобь, Разлом Света, Серебряная застава, Зим'Торга, Ульдуар + ["0.54:0.52:0.52:0.38:0.56:0.36:0.38:0.21:0.28:0.28"] = 229, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, The Shadow Vault, Death's Rise + ["0.54:0.52:0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 169, -- Wyrmrest Temple, Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.54:0.52:0.52:0.38:0.62:0.36:0.72:0.29"] = 161, -- Wyrmrest Temple, Dalaran, K3, Dun Nifflelem + ["0.54:0.52:0.52:0.38:0.56:0.36:0.38:0.21"] = 178, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.54:0.52:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 211, -- Templo del Reposo del Dragón, Moa'ki, Unu'pe, Poblado Taunka'le, El Saliente Ámbar, Escudo de Tránsito + ["0.54:0.52:0.52:0.38:0.56:0.36:0.60:0.25"] = 148, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.54:0.52:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 182, -- Wyrmrest Temple, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.54:0.52:0.59:0.55:0.69:0.42:0.84:0.51"] = 174, -- Wyrmrest Temple, Venomspite, Light's Breach, Camp Oneqwah + ["0.54:0.52:0.49:0.58:0.29:0.57:0.15:0.57"] = 182, -- Temple du Repos du ver, Moa'ki, Unu'pe, Bastion Chanteguerre + ["0.54:0.52:0.52:0.38:0.24:0.40:0.18:0.40"] = 222, -- Wyrmrest Temple, Dalaran, River's Heart, Nesingwary Base Camp + ["0.54:0.52:0.45:0.51:0.29:0.54:0.29:0.57"] = 140, -- Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.54:0.52:0.52:0.38:0.62:0.36:0.60:0.25"] = 144, -- Wyrmrest Temple, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.54:0.52:0.52:0.38:0.62:0.36"] = 94, -- Wyrmrest Temple, Dalaran, K3 + ["0.54:0.52:0.49:0.58:0.74:0.71:0.85:0.73:0.95:0.63"] = 253, -- Wyrmruhtempel, Moa'ki, Kamagua, Neu-Agamand, Hafen der Vergeltung + ["0.54:0.52:0.52:0.38:0.56:0.36:0.60:0.25:0.57:0.21"] = 172, -- Wyrmrest Temple, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.54:0.52:0.52:0.38:0.49:0.21"] = 141, -- Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.54:0.52:0.52:0.38:0.24:0.40:0.28:0.28:0.38:0.21"] = 317, -- Wyrmrest Temple, Dalaran, River's Heart, Death's Rise, The Shadow Vault + ["0.54:0.52:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 179, -- Wyrmrest Temple, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.54:0.52:0.45:0.51:0.31:0.43:0.24:0.40:0.18:0.47:0.15:0.57"] = 257, -- Wyrmrest Temple, Agmar's Hammer, Warsong Camp, River's Heart, Bor'gorok Outpost, Warsong Hold + + ---------------------------------------------------------------------- + -- Horde: Grizzly Hills + ---------------------------------------------------------------------- + + -- Horde: Grizzly Hills: Camp Oneqwah + ["0.84:0.51:0.70:0.55:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 483, -- Camp Oneqwah, Conquest Hold, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.84:0.51:0.78:0.38:0.82:0.31"] = 147, -- Camp Oneqwah, Zim'Torga, Gundrak + ["0.84:0.51:0.70:0.55"] = 96, -- Camp Oneqwah, Conquest Hold + ["0.84:0.51:0.70:0.55:0.59:0.55"] = 183, -- Camp Oneqwah, Conquest Hold, Venomspite + ["0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 512, -- Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.31:0.43"] = 346, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Warsong Camp + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 397, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51"] = 291, -- Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.84:0.51:0.70:0.55:0.59:0.55:0.49:0.58:0.29:0.57"] = 395, -- Camp Oneqwah, Conquest Hold, Venomspite, Moa'ki, Unu'pe + ["0.84:0.51:0.84:0.59:0.74:0.62:0.59:0.55"] = 223, -- Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Venomspite + ["0.84:0.51:0.69:0.42"] = 93, -- Camp Oneqwah, Light's Breach + ["0.84:0.51:0.69:0.42:0.64:0.42:0.48:0.44:0.45:0.51"] = 292, -- Camp Oneqwah, Light's Breach, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38"] = 330, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran + ["0.84:0.51:0.72:0.40"] = 100, -- Camp Oneqwah, The Argent Stand + ["0.84:0.51:0.78:0.38:0.64:0.19"] = 246, -- Camp Oneqwah, Zim'Torga, Ulduar + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.48:0.44"] = 299, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.84:0.51:0.70:0.55:0.59:0.55:0.64:0.42"] = 266, -- Camp Oneqwah, Conquest Hold, Venomspite, Ebon Watch + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51"] = 303, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.84:0.51:0.78:0.38"] = 93, -- Camp Oneqwah, Zim'Torga + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.24:0.40"] = 529, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, River's Heart + + -- Horde: Grizzly Hills: Conquest Hold + ["0.70:0.55:0.74:0.62"] = 57, -- Conquest Hold, Apothecary Camp + ["0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38"] = 186, -- Conquest Hold, Light's Breach, Ebon Watch, Dalaran + ["0.70:0.55:0.84:0.59"] = 85, -- Conquest Hold, Camp Winterhoof + ["0.70:0.55:0.84:0.51"] = 102, -- Conquest Hold, Camp Oneqwah + ["0.70:0.55:0.74:0.62:0.85:0.73"] = 149, -- Conquest Hold, Apothecary Camp, New Agamand + ["0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38"] = 164, -- Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga + ["0.70:0.55:0.59:0.55:0.54:0.52"] = 139, -- Conquest Hold, Venomspite, Wyrmrest Temple + ["0.70:0.55:0.59:0.55"] = 88, -- Conquest Hold, Venomspite + ["0.70:0.55:0.69:0.42"] = 80, -- Conquest Hold, Light's Breach + ["0.70:0.55:0.59:0.55:0.45:0.51"] = 219, -- Conquest Hold, Venomspite, Agmar's Hammer + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51"] = 207, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.70:0.55:0.59:0.55:0.54:0.52:0.48:0.44"] = 204, -- Conquest Hold, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.70:0.55:0.59:0.55:0.64:0.42"] = 170, -- Conquest Hold, Venomspite, Ebon Watch + ["0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38"] = 234, -- Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran + ["0.70:0.55:0.69:0.42:0.72:0.40"] = 123, -- Bastion de la Conquête, La Brèche de Lumière, Le séjour d'Argent + ["0.70:0.55:0.69:0.42:0.64:0.42:0.60:0.40"] = 146, -- Conquest Hold, Light's Breach, Ebon Watch, Sunreaver's Command + ["0.70:0.55:0.84:0.59:0.95:0.63"] = 159, -- Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.70:0.55:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 387, -- Conquest Hold, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 402, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 390, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 249, -- Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.70:0.55:0.69:0.42:0.64:0.42"] = 119, -- Conquest Hold, Light's Breach, Ebon Watch + ["0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 384, -- Conquest Hold, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.70:0.55:0.59:0.55:0.49:0.58"] = 170, -- Conquest Hold, Venomspite, Moa'ki + ["0.70:0.55:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54"] = 322, -- Conquest Hold, Venomspite, Moa'ki, Unu'pe, Taunka'le Village + ["0.70:0.55:0.74:0.62:0.74:0.71"] = 111, -- Conquest Hold, Apothecary Camp, Kamagua + ["0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 217, -- Bastión de la Conquista, Brecha de la Luz, El Confín Argenta, Zim'Torga, Gundrak + ["0.70:0.55:0.74:0.62:0.85:0.73:0.95:0.63"] = 228, -- Conquest Hold, Apothecary Camp, New Agamand, Vengeance Landing + ["0.70:0.55:0.84:0.51:0.95:0.63"] = 206, -- Conquest Hold, Camp Oneqwah, Vengeance Landing + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 393, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.70:0.55:0.59:0.55:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 441, -- Conquest Hold, Venomspite, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 318, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 419, -- Conquest Hold, Light's Breach, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.70:0.55:0.59:0.55:0.49:0.58:0.29:0.57"] = 301, -- Conquest Hold, Venomspite, Moa'ki, Unu'pe + ["0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 318, -- Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga, Ulduar + ["0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36"] = 160, -- Conquest Hold, Light's Breach, Ebon Watch, K3 + ["0.70:0.55:0.59:0.55:0.48:0.44:0.52:0.38"] = 262, -- Conquest Hold, Venomspite, Kor'koron Vanguard, Dalaran + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47:0.18:0.40"] = 437, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.70:0.55:0.59:0.55:0.85:0.73:0.74:0.71"] = 348, -- Conquest Hold, Venomspite, New Agamand, Kamagua + ["0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 207, -- Conquest Hold, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 379, -- Burg Siegeswall, Lichtbresche, Schwarze Wacht, Dalaran, Kreuzfahrerturm, Todesanhöhe + ["0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.24:0.40"] = 434, -- Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, River's Heart + ["0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 235, -- Bastion de la Conquête, La Brèche de Lumière, Guet d'Ébène, K3, Point d'impact de Grom'arsh + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 429, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43"] = 322, -- Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.70:0.55:0.59:0.55:0.45:0.51:0.29:0.54"] = 330, -- Conquest Hold, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 212, -- Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.70:0.55:0.84:0.59:0.85:0.73"] = 164, -- Conquest Hold, Camp Winterhoof, New Agamand + ["0.70:0.55:0.69:0.42:0.64:0.42:0.48:0.44:0.45:0.51"] = 279, -- Conquest Hold, Light's Breach, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer + ["0.70:0.55:0.59:0.55:0.49:0.58:0.52:0.38"] = 290, -- Conquest Hold, Venomspite, Moa'ki, Dalaran + ["0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.73:0.25"] = 250, -- Conquest Hold, Light's Breach, Ebon Watch, K3, Camp Tunka'lo + ["0.70:0.55:0.59:0.55:0.85:0.73"] = 273, -- Bastion de la Conquête, Vexevenin, Nouvelle-Agamand, Nouvelle-Agamand + ["0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36:0.72:0.29"] = 379, -- Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, K3, Dun Nifflelem + ["0.70:0.55:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 396, -- Conquest Hold, Venomspite, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 286, -- Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.70:0.55:0.59:0.55:0.64:0.42:0.60:0.40"] = 196, -- Conquest Hold, Venomspite, Ebon Watch, Sunreaver's Command + ["0.70:0.55:0.59:0.55:0.45:0.51:0.29:0.54:0.17:0.53"] = 405, -- Conquest Hold, Venomspite, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.70:0.55:0.59:0.55:0.45:0.51:0.29:0.54:0.15:0.57"] = 414, -- Conquest Hold, Venomspite, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.70:0.55:0.74:0.62:0.74:0.71:0.49:0.58:0.45:0.51"] = 369, -- Conquest Hold, Apothecary Camp, Kamagua, Moa'ki, Agmar's Hammer + ["0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.56:0.36"] = 257, -- Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 385, -- Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.70:0.55:0.74:0.62:0.74:0.71:0.49:0.58:0.52:0.38"] = 427, -- Conquest Hold, Apothecary Camp, Kamagua, Moa'ki, Dalaran + ["0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 299, -- Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.70:0.55:0.84:0.59:0.85:0.73:0.74:0.71"] = 237, -- 정복의 요새 (회색 구릉지), 겨울발굽 야영지 (울부짖는 협만), 신 아가만드 (울부짖는 협만), 카마구아 (울부짖는 협만), 카마구아 (울부짖는 협만) + ["0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 349, -- Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.70:0.55:0.59:0.55:0.85:0.73:0.95:0.63"] = 351, -- Conquest Hold, Venomspite, New Agamand, Vengeance Landing + ["0.70:0.55:0.59:0.55:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 336, -- Conquest Hold, Venomspite, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.70:0.55:0.59:0.55:0.64:0.42:0.52:0.38"] = 237, -- Conquest Hold, Venomspite, Ebon Watch, Dalaran + ["0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36:0.73:0.25:0.78:0.38:0.72:0.40"] = 519, -- Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, K3, Camp Tunka'lo, Zim'Torga, The Argent Stand + + ---------------------------------------------------------------------- + -- Horde: Howling Fjord + ---------------------------------------------------------------------- + + -- Horde: Howling Fjord: Apothecary Camp + ["0.74:0.62:0.74:0.71"] = 54, -- Apothecary Camp, Kamagua + ["0.74:0.62:0.84:0.59"] = 60, -- Apothecary Camp, Camp Winterhoof + ["0.74:0.62:0.85:0.73"] = 93, -- Apothecary Camp, New Agamand + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38"] = 232, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran + ["0.74:0.62:0.84:0.59:0.95:0.63"] = 133, -- Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.74:0.62:0.84:0.59:0.84:0.51"] = 118, -- Apothecary Camp, Camp Winterhoof, Camp Oneqwah + ["0.74:0.62:0.70:0.55"] = 48, -- Apothecary Camp, Conquest Hold + ["0.74:0.62:0.59:0.55"] = 118, -- Apothecary Camp, Venomspite + ["0.74:0.62:0.59:0.55:0.54:0.52"] = 169, -- Apothecary Camp, Venomspite, Wyrmrest Temple + ["0.74:0.62:0.59:0.55:0.49:0.58"] = 200, -- Apothecary Camp, Venomspite, Moa'ki + ["0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57"] = 331, -- Apothecary Camp, Venomspite, Moa'ki, Unu'pe + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 349, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51"] = 238, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 460, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 433, -- Camp des Apothicaires, Vexevenin, Temple du Repos du ver, Marteau d'Agmar, Taunka'le, Bastion Chanteguerre + ["0.74:0.62:0.59:0.55:0.45:0.51"] = 250, -- Apothecary Camp, Venomspite, Agmar's Hammer + ["0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47"] = 424, -- Apothecary Camp, Venomspite, Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 253, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 418, -- Apothecary Camp, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.60:0.40"] = 193, -- Apothekerlager, Burg Siegeswall, Lichtbresche, Schwarze Wacht, Sonnenhäschers Schar + ["0.74:0.62:0.84:0.59:0.84:0.51:0.78:0.38:0.72:0.29"] = 294, -- Apothecary Camp, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 431, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.74:0.62:0.85:0.73:0.95:0.63"] = 171, -- Apothecary Camp, New Agamand, Vengeance Landing + ["0.74:0.62:0.74:0.71:0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53:0.18:0.47"] = 534, -- Apothecary Camp, Kamagua, Moa'ki, Unu'pe, Warsong Hold, Amber Ledge, Bor'gorok Outpost + ["0.74:0.62:0.70:0.55:0.69:0.42"] = 127, -- Apothecary Camp, Conquest Hold, Light's Breach + ["0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54"] = 361, -- Apothecary Camp, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43"] = 353, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38"] = 265, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 318, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.74:0.62:0.59:0.55:0.64:0.42:0.72:0.40"] = 264, -- Apothecary Camp, Venomspite, Ebon Watch, The Argent Stand + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 420, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.74:0.62:0.74:0.71:0.49:0.58"] = 249, -- Apothecary Camp, Kamagua, Moa'ki + ["0.74:0.62:0.59:0.55:0.54:0.52:0.48:0.44"] = 235, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.74:0.62:0.70:0.55:0.69:0.42:0.72:0.40"] = 170, -- Apothekerlager, Burg Siegeswall, Lichtbresche, Argentumwache + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 424, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43:0.24:0.40"] = 429, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp, River's Heart + ["0.74:0.62:0.74:0.71:0.49:0.58:0.52:0.38"] = 371, -- Apothecary Camp, Kamagua, Moa'ki, Dalaran + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 281, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36"] = 206, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3 + ["0.74:0.62:0.70:0.55:0.84:0.51"] = 148, -- Apothecary Camp, Conquest Hold, Camp Oneqwah + ["0.74:0.62:0.84:0.59:0.84:0.51:0.78:0.38:0.82:0.31"] = 263, -- Apothecary Camp, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Gundrak + ["0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54:0.15:0.57"] = 445, -- Apothecary Camp, Venomspite, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.74:0.62:0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.73:0.25:0.60:0.25:0.57:0.21"] = 432, -- Apothecary Camp, Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga, Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54:0.17:0.53"] = 436, -- Apothecary Camp, Venomspite, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.74:0.62:0.59:0.55:0.64:0.42:0.52:0.38"] = 268, -- Apothecary Camp, Venomspite, Ebon Watch, Dalaran + ["0.74:0.62:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 476, -- Apothecary Camp, Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 345, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 425, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42"] = 165, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch + ["0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 379, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47:0.18:0.40"] = 467, -- Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 381, -- Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.74:0.62:0.74:0.71:0.49:0.58:0.29:0.57:0.15:0.57"] = 467, -- Apothecary Camp, Kamagua, Moa'ki, Unu'pe, Warsong Hold + + -- Horde: Howling Fjord: Camp Oneqwah + ["0.84:0.51:0.84:0.59"] = 49, -- Camp Oneqwah, Camp Winterhoof + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38"] = 199, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran + ["0.84:0.51:0.84:0.59:0.74:0.62"] = 106, -- Camp Oneqwah, Camp Winterhoof, Apothecary Camp + ["0.84:0.51:0.95:0.63"] = 106, -- Camp Oneqwah, Vengeance Landing + ["0.84:0.51:0.69:0.42:0.64:0.42"] = 132, -- Camp Oneqwah, Light's Breach, Ebon Watch + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 488, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.84:0.51:0.84:0.59:0.74:0.62:0.74:0.71"] = 160, -- Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Kamagua + ["0.84:0.51:0.70:0.55:0.59:0.55:0.48:0.44:0.52:0.38"] = 357, -- Camp Oneqwah, Burg Siegeswall, Gallgrimm, Vorposten der Kor'kron, Dalaran + ["0.84:0.51:0.84:0.59:0.85:0.73"] = 129, -- Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52"] = 222, -- Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 524, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52"] = 233, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple + ["0.84:0.51:0.72:0.40:0.64:0.42"] = 152, -- Camp Oneqwah, Argentumwache, Schwarze Wacht + ["0.84:0.51:0.69:0.42:0.64:0.42:0.48:0.44"] = 240, -- Camp Oneqwah, Lichtbresche, Schwarze Wacht, Vorposten der Kor'kron + ["0.84:0.51:0.70:0.55:0.59:0.55:0.49:0.58"] = 265, -- Camp Oneqwah, Conquest Hold, Venomspite, Moa'ki + ["0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 284, -- Camp Oneqwah, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 220, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.84:0.51:0.70:0.55:0.59:0.55:0.49:0.58:0.52:0.38"] = 386, -- Camp Oneqwah, Conquest Hold, Venomspite, Moa'ki, Dalaran + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 498, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.84:0.51:0.70:0.55:0.59:0.55:0.45:0.51"] = 315, -- Camp Oneqwah, Conquest Hold, Venomspite, Agmar's Hammer + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36"] = 374, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, K3 + ["0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 476, -- Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.84:0.51:0.78:0.38:0.73:0.25:0.62:0.36:0.52:0.38"] = 363, -- Camp Oneqwah, Zim'Torga, Camp Tunka'lo, K3, Dalaran + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 347, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 432, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47:0.18:0.40"] = 532, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost, Nesingwary Base Camp + ["0.84:0.51:0.78:0.38:0.72:0.29"] = 177, -- Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 401, -- Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 392, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43"] = 417, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 472, -- Camp Oneqwah, Lichtbresche, Schwarze Wacht, Wyrmruhtempel, Agmars Hammer, Taunka'le, Bor'goroks Außenposten + ["0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 248, -- Camp Oneqwah, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.84:0.51:0.69:0.42:0.64:0.42:0.60:0.40"] = 159, -- Camp Oneqwah, Light's Breach, Ebon Watch, Sunreaver's Command + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 312, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.84:0.51:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.48:0.44"] = 340, -- Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 225, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 443, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36"] = 172, -- Camp Oneqwah, Light's Breach, Ebon Watch, K3 + ["0.84:0.51:0.78:0.38:0.64:0.19:0.57:0.21:0.49:0.21"] = 355, -- Camp Oneqwah, Zim'Torga, Ulduar, Bergfels' Zuflucht, Argentumturnierplatz + ["0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43:0.24:0.40"] = 494, -- Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp, River's Heart + ["0.84:0.51:0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.21"] = 332, -- Camp Oneqwah, The Argent Stand, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.84:0.51:0.70:0.55:0.59:0.55:0.49:0.58:0.52:0.38:0.49:0.21"] = 499, -- Camp Oneqwah, Conquest Hold, Venomspite, Moa'ki, Dalaran, Argent Tournament Grounds + ["0.84:0.51:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38"] = 370, -- Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran + ["0.84:0.51:0.78:0.38:0.73:0.25:0.60:0.25"] = 278, -- Camp Oneqwah, Zim'Torga, Camp Tunka'lo, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 366, -- Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.84:0.51:0.78:0.38:0.73:0.25"] = 179, -- Лагерь Уанква, Зим'Торга, Лагерь Тунка'ло + ["0.84:0.51:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 484, -- Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.84:0.51:0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58:0.45:0.51"] = 417, -- Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki, Agmar's Hammer + ["0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36:0.72:0.29"] = 272, -- Camp Oneqwah, Light's Breach, Ebon Watch, K3, Dun Nifflelem + ["0.84:0.51:0.70:0.55:0.74:0.62"] = 153, -- Camp Oneqwah, Conquest Hold, Apothecary Camp + ["0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.47"] = 450, -- Camp Oneqwah, Lichtbresche, Schwarze Wacht, Dalaran, Flussnabel, Bor'goroks Außenposten + + -- Horde: Howling Fjord: Camp Winterhoof + ["0.84:0.59:0.85:0.73"] = 80, -- Camp Winterhoof, New Agamand + ["0.84:0.59:0.95:0.63"] = 75, -- Camp Winterhoof, Vengeance Landing + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38"] = 257, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran + ["0.84:0.59:0.84:0.51"] = 58, -- Camp Winterhoof, Camp Oneqwah + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 277, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.48:0.44"] = 291, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43"] = 409, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.84:0.59:0.74:0.62"] = 57, -- Camp Winterhoof, Apothecary Camp + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52"] = 226, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple + ["0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57"] = 387, -- Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Unu'pe + ["0.84:0.59:0.85:0.73:0.59:0.55"] = 273, -- Camp Winterhoof, New Agamand, Venomspite + ["0.84:0.59:0.85:0.73:0.74:0.71:0.49:0.58"] = 348, -- Camp Winterhoof, New Agamand, Kamagua, Moa'ki + ["0.84:0.59:0.74:0.62:0.59:0.55"] = 174, -- Camp Winterhoof, Apothecary Camp, Venomspite + ["0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58"] = 305, -- Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51"] = 295, -- Camp Sabot-d'hiver, Camp des Apothicaires, Vexevenin, Temple du Repos du ver, Marteau d'Agmar + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38"] = 322, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran + ["0.84:0.59:0.74:0.62:0.74:0.71"] = 111, -- Camp Winterhoof, Apothecary Camp, Kamagua + ["0.84:0.59:0.85:0.73:0.74:0.71"] = 153, -- Camp Winterhoof, New Agamand, Kamagua + ["0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58"] = 256, -- Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki + ["0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 474, -- Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.84:0.59:0.70:0.55"] = 94, -- Camp Winterhoof, Conquest Hold + ["0.84:0.59:0.74:0.62:0.59:0.55:0.45:0.51"] = 307, -- Camp Winterhoof, Apothecary Camp, Venomspite, Agmar's Hammer + ["0.84:0.59:0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 528, -- Camp Winterhoof, Apothecary Camp, Venomspite, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.84:0.59:0.84:0.51:0.69:0.42"] = 151, -- Camp Winterhoof, Camp Oneqwah, Light's Breach + ["0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 589, -- Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38"] = 279, -- Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, Dalaran + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 516, -- Camp Sabot-d'hiver, Camp des Apothicaires, Vexevenin, Temple du Repos du ver, Marteau d'Agmar, Taunka'le, Escarpement d'Ambre, Bouclier Transitus + ["0.84:0.59:0.70:0.55:0.59:0.55"] = 180, -- Camp Winterhoof, Conquest Hold, Venomspite + ["0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51"] = 300, -- Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 490, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 477, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42"] = 190, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch + ["0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58:0.45:0.51"] = 369, -- Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki, Agmar's Hammer + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 530, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.84:0.59:0.84:0.51:0.78:0.38"] = 151, -- Camp Winterhoof, Camp Oneqwah, Zim'Torga + ["0.84:0.59:0.74:0.62:0.59:0.55:0.64:0.42:0.62:0.36:0.60:0.25"] = 373, -- Camp Winterhoof, Apothecary Camp, Venomspite, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 405, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.84:0.59:0.85:0.73:0.59:0.55:0.54:0.52:0.48:0.44"] = 390, -- Camp Winterhoof, New Agamand, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58:0.29:0.57"] = 436, -- Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki, Unu'pe + ["0.84:0.59:0.84:0.51:0.78:0.38:0.72:0.29"] = 235, -- Camp Winterhoof, Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 327, -- Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 283, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 406, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 472, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43"] = 414, -- Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.84:0.59:0.74:0.62:0.59:0.55:0.69:0.42"] = 281, -- Lager der Winterhufe, Apothekerlager, Gallgrimm, Lichtbresche + ["0.84:0.59:0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54"] = 417, -- Camp Winterhoof, Apothecary Camp, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.84:0.59:0.70:0.55:0.69:0.42"] = 173, -- Camp Winterhoof, Conquest Hold, Light's Breach + ["0.84:0.59:0.84:0.51:0.78:0.38:0.82:0.31"] = 203, -- Camp Winterhoof, Camp Oneqwah, Zim'Torga, Gundrak + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36"] = 230, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, K3 + ["0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38"] = 327, -- Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran + ["0.84:0.59:0.84:0.51:0.78:0.38:0.64:0.19"] = 304, -- Camp Winterhoof, Camp Oneqwah, Zim'Torga, Ulduar + ["0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58:0.52:0.38"] = 426, -- Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki, Dalaran + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.24:0.40"] = 522, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, River's Heart + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 489, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52"] = 230, -- Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple + ["0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 477, -- Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 480, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54"] = 408, -- Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Unu'pe, Taunka'le Village + ["0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36"] = 252, -- Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, K3 + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 341, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.84:0.59:0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54:0.15:0.57"] = 501, -- Camp Winterhoof, Apothecary Camp, Venomspite, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58:0.29:0.57:0.15:0.57"] = 524, -- Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki, Unu'pe, Warsong Hold + ["0.84:0.59:0.85:0.73:0.74:0.71:0.49:0.58:0.52:0.38"] = 470, -- Camp Winterhoof, New Agamand, Kamagua, Moa'ki, Dalaran + ["0.84:0.59:0.70:0.55:0.59:0.55:0.49:0.58"] = 261, -- Camp Winterhoof, Conquest Hold, Venomspite, Moa'ki + ["0.84:0.59:0.70:0.55:0.59:0.55:0.48:0.44:0.52:0.38"] = 355, -- Camp Winterhoof, Conquest Hold, Venomspite, Kor'koron Vanguard, Dalaran + ["0.84:0.59:0.74:0.62:0.59:0.55:0.48:0.44:0.52:0.38"] = 349, -- Camp Winterhoof, Apothecary Camp, Venomspite, Kor'koron Vanguard, Dalaran + ["0.84:0.59:0.84:0.51:0.78:0.38:0.73:0.25"] = 236, -- Camp Winterhoof, Camp Oneqwah, Zim'Torga, Camp Tunka'lo + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 305, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 436, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 369, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 392, -- Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.84:0.59:0.74:0.62:0.74:0.71:0.49:0.58:0.45:0.51:0.29:0.54"] = 479, -- Camp Winterhoof, Apothecary Camp, Kamagua, Moa'ki, Agmar's Hammer, Taunka'le Village + ["0.84:0.59:0.84:0.51:0.72:0.40"] = 158, -- Lager der Winterhufe, Camp Oneqwah, Argentumwache + ["0.84:0.59:0.85:0.73:0.59:0.55:0.54:0.52:0.52:0.38"] = 421, -- Camp Winterhoof, New Agamand, Venomspite, Wyrmrest Temple, Dalaran + ["0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 441, -- Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 454, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.60:0.40"] = 216, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Sunreaver's Command + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.48:0.44:0.45:0.51"] = 349, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer + ["0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34"] = 354, -- Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle + ["0.84:0.59:0.84:0.51:0.78:0.38:0.64:0.19:0.57:0.21:0.49:0.21"] = 413, -- Camp Winterhoof, Camp Oneqwah, Zim'Torga, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.84:0.59:0.85:0.73:0.59:0.55:0.64:0.42"] = 356, -- Camp Winterhoof, New Agamand, Venomspite, Ebon Watch + ["0.84:0.59:0.84:0.51:0.78:0.38:0.73:0.25:0.60:0.25"] = 336, -- Camp Winterhoof, Camp Oneqwah, Zim'Torga, Camp Tunka'lo, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.60:0.40"] = 239, -- Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, Sunreaver's Command + ["0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.56:0.36"] = 344, -- Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.52:0.38:0.49:0.21"] = 491, -- Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Dalaran, Argent Tournament Grounds + ["0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 449, -- Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.84:0.59:0.84:0.51:0.72:0.40:0.64:0.42:0.62:0.36"] = 250, -- Camp Winterhoof, Camp Oneqwah, The Argent Stand, Ebon Watch, K3 + + -- Horde: Howling Fjord: Kamagua + ["0.74:0.71:0.85:0.73"] = 64, -- Kamagua, New Agamand + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38"] = 288, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran + ["0.74:0.71:0.74:0.62:0.84:0.59:0.84:0.51:0.78:0.38"] = 265, -- Kamagua, Apothecary Camp, Camp Winterhoof, Camp Oneqwah, Zim'Torga + ["0.74:0.71:0.74:0.62"] = 56, -- Kamagua, Apothecary Camp + ["0.74:0.71:0.85:0.73:0.95:0.63"] = 143, -- Kamagua, New Agamand, Vengeance Landing + ["0.74:0.71:0.49:0.58:0.29:0.57"] = 326, -- Kamagua, Moa'ki, Unu'pe + ["0.74:0.71:0.74:0.62:0.84:0.59:0.84:0.51:0.78:0.38:0.82:0.31"] = 318, -- Kamagua, Apothecary Camp, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Gundrak + ["0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54"] = 348, -- Kamagua, Moa'ki, Unu'pe, Taunka'le Village + ["0.74:0.71:0.74:0.62:0.84:0.59"] = 116, -- Kamagua, Apothecary Camp, Camp Winterhoof + ["0.74:0.71:0.85:0.73:0.84:0.59"] = 143, -- Kamagua, New Agamand, Camp Winterhoof + ["0.74:0.71:0.85:0.73:0.84:0.59:0.84:0.51"] = 198, -- Kamagua, New Agamand, Camp Winterhoof, Camp Oneqwah + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52"] = 224, -- Kamagua, Apothecary Camp, Venomspite, Wyrmrest Temple + ["0.74:0.71:0.74:0.62:0.59:0.55"] = 174, -- Kamagua, Apothecary Camp, Venomspite + ["0.74:0.71:0.74:0.62:0.84:0.59:0.95:0.63"] = 189, -- Kamagua, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.74:0.71:0.49:0.58:0.54:0.52:0.48:0.44"] = 308, -- Kamagua, Moa'ki, Wyrmrest Temple, Kor'koron Vanguard + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51"] = 294, -- Kamagua, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.74:0.71:0.49:0.58"] = 195, -- Kamagua, Moa'ki + ["0.74:0.71:0.74:0.62:0.70:0.55"] = 103, -- Kamagua, Apothecary Camp, Conquest Hold + ["0.74:0.71:0.49:0.58:0.45:0.51"] = 258, -- Kamagua, Moa'ki, Agmar's Hammer + ["0.74:0.71:0.49:0.58:0.29:0.57:0.15:0.57"] = 413, -- Kamagua, Moa'ki, Unu'pe, Warsong Hold + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38"] = 321, -- Kamagua, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran + ["0.74:0.71:0.74:0.62:0.59:0.55:0.45:0.51"] = 305, -- Kamagua, Apothecary Camp, Venomspite, Agmar's Hammer + ["0.74:0.71:0.49:0.58:0.45:0.51:0.29:0.54"] = 369, -- Kamagua, Moa'ki, Agmar's Hammer, Taunka'le Village + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 404, -- Kamagua, Apothekerlager, Gallgrimm, Wyrmruhtempel, Agmars Hammer, Taunka'le + ["0.74:0.71:0.74:0.62:0.84:0.59:0.84:0.51:0.78:0.38:0.72:0.29"] = 350, -- Kamagua, Apothecary Camp, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.74:0.71:0.49:0.58:0.52:0.38"] = 317, -- Kamagua, Moa'ki, Dalaran + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52:0.48:0.44"] = 291, -- Kamagua, Apothecary Camp, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 458, -- Kamagua, Moa'ki, Unu'pe, Taunka'le, Escarpement d'Ambre, Bouclier Transitus + ["0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47:0.18:0.40"] = 467, -- Kamagua, Moa'ki, Unu'pe, Taunka'le, Bor'goroks Außenposten, Nesingwarys Basislager + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42"] = 221, -- Kamagua, Camp des Apothicaires, Bastion de la Conquête, La Brèche de Lumière, Guet d'Ébène + ["0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47:0.24:0.40"] = 475, -- Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost, River's Heart + ["0.74:0.71:0.49:0.58:0.54:0.52"] = 243, -- Kamagua, Moa'ki, Wyrmrest Temple + ["0.74:0.71:0.74:0.62:0.59:0.55:0.64:0.42"] = 256, -- Kamagua, Apothecary Camp, Venomspite, Ebon Watch + ["0.74:0.71:0.49:0.58:0.45:0.51:0.29:0.54:0.15:0.57"] = 453, -- Kamagua, Moa'ki, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.74:0.71:0.49:0.58:0.59:0.55:0.69:0.42:0.72:0.40"] = 405, -- Kamagua, Moa'ki, Venomspite, Light's Breach, The Argent Stand + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.72:0.40"] = 225, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, The Argent Stand + ["0.74:0.71:0.74:0.62:0.84:0.59:0.84:0.51"] = 172, -- Kamagua, Apothecary Camp, Camp Winterhoof, Camp Oneqwah + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 350, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36"] = 261, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3 + ["0.74:0.71:0.85:0.73:0.59:0.55:0.45:0.51"] = 389, -- Kamagua, New Agamand, Venomspite, Agmar's Hammer + ["0.74:0.71:0.74:0.62:0.59:0.55:0.64:0.42:0.72:0.40"] = 320, -- Kamagua, Apothecary Camp, Venomspite, Ebon Watch, The Argent Stand + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 373, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 314, -- Kamagua, Apothekerlager, Burg Siegeswall, Lichtbresche, Schwarze Wacht, Dalaran, Kreuzfahrerturm + ["0.74:0.71:0.49:0.58:0.45:0.51:0.31:0.43:0.24:0.40"] = 449, -- Kamagua, Moa'ki, Agmar's Hammer, Warsong Camp, River's Heart + ["0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 423, -- Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 481, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 455, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.74:0.71:0.49:0.58:0.45:0.51:0.31:0.43:0.28:0.28"] = 485, -- Kamagua, Moa'ki, Agmar's Hammer, Warsong Camp, Death's Rise + ["0.74:0.71:0.49:0.58:0.52:0.38:0.62:0.36:0.72:0.29"] = 461, -- Kamagua, Moa'ki, Dalaran, K3, Dun Nifflelem + ["0.74:0.71:0.49:0.58:0.45:0.51:0.31:0.43"] = 372, -- Kamagua, Moa'ki, Agmar's Hammer, Warsong Camp + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 309, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.74:0.71:0.49:0.58:0.45:0.51:0.29:0.54:0.17:0.53"] = 444, -- Kamagua, Moa'ki, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47"] = 420, -- Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42"] = 182, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 436, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.74:0.71:0.74:0.62:0.59:0.55:0.64:0.42:0.62:0.36:0.72:0.29"] = 396, -- Kamagua, Apothekerlager, Gallgrimm, Schwarze Wacht, K3, Dun Niffelem + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.72:0.29"] = 362, -- Kamagua, Apothekerlager, Burg Siegeswall, Lichtbresche, Schwarze Wacht, K3, Dun Niffelem + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 471, -- Kamagua, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.74:0.71:0.74:0.62:0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38"] = 370, -- Kamagua, Apothecary Camp, Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 337, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.74:0.71:0.85:0.73:0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36"] = 370, -- Kamagua, New Agamand, Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, K3 + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36:0.72:0.29"] = 465, -- Kamagua, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, K3, Dun Nifflelem + ["0.74:0.71:0.49:0.58:0.45:0.51:0.29:0.54:0.18:0.47"] = 441, -- Kamagua, Moa'ki, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.74:0.71:0.85:0.73:0.84:0.59:0.84:0.51:0.78:0.38:0.72:0.29"] = 375, -- Kamagua, New Agamand, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.74:0.71:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36"] = 365, -- Kamagua, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, K3 + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 400, -- 卡瑪廓,凜風峽灣, 藥劑師營地,凜風峽灣, 征服堡,灰白之丘, 聖光止境,祖爾德拉克, 黯黑守望,祖爾德拉克, 達拉然, 銀白聯賽場地,寒冰皇冠 + ["0.74:0.71:0.74:0.62:0.59:0.55:0.64:0.42:0.52:0.38"] = 323, -- Kamagua, Apothekerlager, Gallgrimm, Schwarze Wacht, Dalaran + ["0.74:0.71:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 388, -- Kamagua, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.74:0.71:0.85:0.73:0.59:0.55:0.64:0.42:0.62:0.36"] = 379, -- Kamagua, New Agamand, Venomspite, Ebon Watch, K3 + + -- Horde: Howling Fjord: New Agamand + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38"] = 335, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran + ["0.85:0.73:0.95:0.63"] = 80, -- New Agamand, Vengeance Landing + ["0.85:0.73:0.74:0.71"] = 77, -- New Agamand, Kamagua + ["0.85:0.73:0.84:0.59:0.84:0.51"] = 136, -- New Agamand, Camp Winterhoof, Camp Oneqwah + ["0.85:0.73:0.74:0.62"] = 104, -- New Agamand, Apothecary Camp + ["0.85:0.73:0.84:0.59"] = 80, -- New Agamand, Camp Winterhoof + ["0.85:0.73:0.74:0.62:0.70:0.55"] = 150, -- New Agamand, Apothecary Camp, Conquest Hold + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57"] = 402, -- New Agamand, Kamagua, Moa'ki, Unu'pe + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.15:0.57"] = 489, -- New Agamand, Kamagua, Moa'ki, Unu'pe, Warsong Hold + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 534, -- New Agamand, Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 498, -- New Agamand, Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47"] = 496, -- New Agamand, Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54"] = 424, -- New Agamand, Kamagua, Moa'ki, Unu'pe, Taunka'le Village + ["0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43:0.24:0.40"] = 506, -- New Agamand, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp, River's Heart + ["0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43"] = 429, -- New Agamand, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 528, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.85:0.73:0.59:0.55"] = 194, -- New Agamand, Venomspite + ["0.85:0.73:0.59:0.55:0.45:0.51"] = 327, -- New Agamand, Venomspite, Agmar's Hammer + ["0.85:0.73:0.59:0.55:0.54:0.52"] = 246, -- New Agamand, Venomspite, Wyrmrest Temple + ["0.85:0.73:0.74:0.71:0.49:0.58"] = 271, -- New Agamand, Kamagua, Moa'ki + ["0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51"] = 315, -- New Agamand, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42"] = 229, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach + ["0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 501, -- New Agamand, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.85:0.73:0.74:0.71:0.49:0.58:0.45:0.51"] = 334, -- New Agamand, Kamagua, Moa'ki, Agmar's Hammer + ["0.85:0.73:0.59:0.55:0.48:0.44:0.52:0.38"] = 370, -- New Agamand, Venomspite, Kor'koron Vanguard, Dalaran + ["0.85:0.73:0.59:0.55:0.54:0.52:0.52:0.38"] = 342, -- New Agamand, Venomspite, Wyrmrest Temple, Dalaran + ["0.85:0.73:0.95:0.63:0.84:0.51:0.69:0.42"] = 275, -- New Agamand, Vengeance Landing, Camp Oneqwah, Light's Breach + ["0.85:0.73:0.59:0.55:0.49:0.58"] = 277, -- New Agamand, Venomspite, Moa'ki + ["0.85:0.73:0.84:0.59:0.84:0.51:0.78:0.38"] = 228, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Zim'Torga + ["0.85:0.73:0.84:0.59:0.84:0.51:0.78:0.38:0.64:0.19"] = 381, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Ulduar + ["0.85:0.73:0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38"] = 334, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran + ["0.85:0.73:0.84:0.59:0.84:0.51:0.78:0.38:0.73:0.25"] = 314, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Camp Tunka'lo + ["0.85:0.73:0.95:0.63:0.84:0.51:0.78:0.38"] = 275, -- New Agamand, Vengeance Landing, Camp Oneqwah, Zim'Torga + ["0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 510, -- New Agamand, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.85:0.73:0.84:0.59:0.84:0.51:0.78:0.38:0.72:0.29"] = 313, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.85:0.73:0.84:0.59:0.84:0.51:0.78:0.38:0.82:0.31"] = 281, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Zim'Torga, Gundrak + ["0.85:0.73:0.74:0.71:0.49:0.58:0.52:0.38"] = 393, -- New Agamand, Kamagua, Moa'ki, Dalaran + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.15:0.57:0.17:0.53"] = 525, -- New Agamand, Kamagua, Moa'ki, Unu'pe, Warsong Hold, Amber Ledge + ["0.85:0.73:0.59:0.55:0.64:0.42:0.52:0.38"] = 345, -- Новый Агамонд, Ядозлобь, Черная застава, Даларан + ["0.85:0.73:0.59:0.55:0.64:0.42"] = 277, -- New Agamand, Venomspite, Ebon Watch + ["0.85:0.73:0.59:0.55:0.45:0.51:0.29:0.54:0.15:0.57"] = 521, -- New Agamand, Venomspite, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 425, -- New Agamand, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.85:0.73:0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 382, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 397, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.85:0.73:0.95:0.63:0.84:0.51:0.78:0.38:0.72:0.29"] = 359, -- New Agamand, Vengeance Landing, Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 361, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.85:0.73:0.59:0.55:0.54:0.52:0.48:0.44"] = 311, -- New Agamand, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.85:0.73:0.59:0.55:0.45:0.51:0.29:0.54"] = 438, -- New Agamand, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47:0.18:0.40"] = 542, -- Neu-Agamand, Kamagua, Moa'ki, Unu'pe, Taunka'le, Bor'goroks Außenposten, Nesingwarys Basislager + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 648, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 384, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 449, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.85:0.73:0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 447, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 483, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 421, -- New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.85:0.73:0.84:0.59:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36"] = 307, -- New Agamand, Camp Winterhoof, Camp Oneqwah, Light's Breach, Ebon Watch, K3 + ["0.85:0.73:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 456, -- Новый Агамонд, Ядозлобь, Храм Драконьего Покоя, Даларан, Ристалище Серебряного турнира + + -- Horde: Howling Fjord: Vengeance Landing + ["0.95:0.63:0.85:0.73"] = 88, -- Vengeance Landing, New Agamand + ["0.95:0.63:0.85:0.73:0.74:0.71"] = 163, -- Vengeance Landing, New Agamand, Kamagua + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58"] = 330, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38"] = 303, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran + ["0.95:0.63:0.84:0.51"] = 105, -- Vengeance Landing, Camp Oneqwah + ["0.95:0.63:0.84:0.59:0.74:0.62"] = 130, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 548, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 589, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 554, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57"] = 461, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Unu'pe + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 550, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.95:0.63:0.84:0.59"] = 74, -- Vengeance Landing, Camp Winterhoof + ["0.95:0.63:0.84:0.51:0.78:0.38"] = 197, -- Vengeance Landing, Camp Oneqwah, Zim'Torga + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 478, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51"] = 368, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.95:0.63:0.84:0.59:0.70:0.55"] = 166, -- Vengeance Landing, CCamp Winterhoof, Conquest Hold + ["0.95:0.63:0.85:0.73:0.74:0.62"] = 189, -- Vengeance Landing, New Agamand, Apothecary Camp + ["0.95:0.63:0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.15:0.57"] = 576, -- Vengeance Landing, New Agamand, Kamagua, Moa'ki, Unu'pe, Warsong Hold + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55"] = 248, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite + ["0.95:0.63:0.85:0.73:0.74:0.62:0.70:0.55"] = 236, -- Vengeance Landing, New Agamand, Apothecary Camp, Conquest Hold + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.45:0.51"] = 380, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Agmar's Hammer + ["0.95:0.63:0.85:0.73:0.59:0.55"] = 280, -- Vengeance Landing, New Agamand, Venomspite + ["0.95:0.63:0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 622, -- Vengeance Landing, New Agamand, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.95:0.63:0.85:0.73:0.74:0.71:0.49:0.58"] = 358, -- Vengeance Landing, New Agamand, Kamagua, Moa'ki + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55"] = 252, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite + ["0.95:0.63:0.85:0.73:0.59:0.55:0.45:0.51:0.29:0.54:0.15:0.57"] = 608, -- Vengeance Landing, New Agamand, Venomspite, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54:0.15:0.57"] = 575, -- Accostage de la Vengeance, Camp Sabot-d'hiver, Camp des Apothicaires, Vexevenin, Marteau d'Agmar, Taunka'le, Bastion Chanteguerre + ["0.95:0.63:0.84:0.51:0.72:0.40"] = 204, -- Vengeance Landing, Camp Oneqwah, The Argent Stand + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52"] = 299, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38"] = 395, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran + ["0.95:0.63:0.84:0.51:0.78:0.38:0.82:0.31"] = 250, -- Vengeance Landing, Camp Oneqwah, Zim'Torga, Gundrak + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54"] = 483, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Unu'pe, Taunka'le Village + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38"] = 328, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga + ["0.95:0.63:0.84:0.51:0.69:0.42"] = 197, -- Vengeance Landing, Camp Oneqwah, Light's Breach + ["0.95:0.63:0.85:0.73:0.59:0.55:0.54:0.52:0.52:0.38"] = 428, -- Vengeance Landing, New Agamand, Venomspite, Wyrmrest Temple, Dalaran + ["0.95:0.63:0.85:0.73:0.74:0.71:0.49:0.58:0.45:0.51"] = 421, -- Vengeance Landing, New Agamand, Kamagua, Moa'ki, Agmar's Hammer + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42"] = 236, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.56:0.36"] = 417, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, The Argent Vanguard + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51"] = 394, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.95:0.63:0.84:0.59:0.74:0.62:0.74:0.71"] = 184, -- Лагерь Возмездия, Лагерь Заиндевевшего Копыта, Аптекарский поселок, Камагуа + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 563, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.95:0.63:0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36"] = 394, -- Vengeance Landing, New Agamand, Apothecary Camp, Conquest Hold, Light's Breach, Ebon Watch, K3 + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 557, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.95:0.63:0.85:0.73:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 580, -- Vengeance Landing, New Agamand, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.95:0.63:0.84:0.51:0.70:0.55"] = 200, -- Vengeance Landing, Camp Oneqwah, Conquest Hold + ["0.95:0.63:0.84:0.51:0.78:0.38:0.64:0.19:0.57:0.21:0.38:0.21"] = 511, -- Accostage de la Vengeance, Camp Oneqwah, Zim'Torga, Ulduar, Refuge de Rochecombe, Le caveau des Ombres + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38"] = 350, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, Dalaran + ["0.95:0.63:0.84:0.51:0.78:0.38:0.72:0.29"] = 281, -- Vengeance Landing, Camp Oneqwah, Zim'Torga, Dun Nifflelem + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 388, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 553, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.62:0.36"] = 276, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, K3 + ["0.95:0.63:0.85:0.73:0.59:0.55:0.54:0.52:0.45:0.51"] = 401, -- Hafen der Vergeltung, Neu-Agamand, Gallgrimm, Wyrmruhtempel, Agmars Hammer + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 451, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.95:0.63:0.84:0.51:0.78:0.38:0.64:0.19:0.57:0.21:0.38:0.21:0.28:0.28"] = 588, -- Vengeance Landing, Camp Oneqwah, Zim'Torga, Ulduar, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.95:0.63:0.84:0.51:0.78:0.38:0.64:0.19"] = 350, -- Vengeance Landing, Camp Oneqwah, Zim'Torga, Ulduar + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52"] = 302, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple + ["0.95:0.63:0.85:0.73:0.74:0.62:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38"] = 421, -- Campo Venganza, Nuevo Agamand, Campamento de los Boticarios, Bastión de la Conquista, Brecha de la Luz, Puesto de Vigilancia de Ébano, Dalaran + ["0.95:0.63:0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53:0.12:0.53"] = 621, -- Vengeance Landing, New Agamand, Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 536, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.48:0.44:0.52:0.38:0.62:0.36"] = 469, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Kor'koron Vanguard, Dalaran, K3 + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.64:0.42:0.62:0.36:0.72:0.29"] = 470, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Ebon Watch, K3, Dun Nifflelem + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38"] = 398, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran + ["0.95:0.63:0.84:0.51:0.78:0.38:0.73:0.25"] = 282, -- Vengeance Landing, Camp Oneqwah, Zim'Torga, Camp Tunka'lo + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 471, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.95:0.63:0.85:0.73:0.74:0.71:0.49:0.58:0.52:0.38"] = 479, -- Hafen der Vergeltung, Neu-Agamand, Kamagua, Moa'ki, Dalaran + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 450, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.31:0.43"] = 450, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Warsong Camp + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 482, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51"] = 371, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.95:0.63:0.85:0.73:0.59:0.55:0.54:0.52"] = 332, -- Vengeance Landing, New Agamand, Venomspite, Wyrmrest Temple + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 548, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.95:0.63:0.85:0.73:0.59:0.55:0.48:0.44:0.52:0.38"] = 455, -- Vengeance Landing, New Agamand, Venomspite, Kor'koron Vanguard, Dalaran + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.72:0.40"] = 287, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, The Argent Stand + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.45:0.51:0.29:0.54"] = 490, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 501, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.95:0.63:0.84:0.51:0.72:0.40:0.64:0.42:0.52:0.38"] = 323, -- Vengeance Landing, Camp Oneqwah, The Argent Stand, Ebon Watch, Dalaran + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 615, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 589, -- Accostage de la Vengeance, Camp Oneqwah, La Brèche de Lumière, Guet d'Ébène, Temple du Repos du ver, Marteau d'Agmar, Taunka'le, Bastion Chanteguerre + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 329, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.48:0.44:0.52:0.38"] = 423, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Kor'koron Vanguard, Dalaran + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.64:0.42"] = 330, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Ebon Watch + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.62:0.36:0.72:0.29"] = 423, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, K3, Dun Nifflelem + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.60:0.40"] = 263, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Sunreaver's Command + ["0.95:0.63:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 416, -- Vengeance Landing, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 412, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 593, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.95:0.63:0.84:0.59:0.70:0.55:0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 463, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.48:0.44"] = 365, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.95:0.63:0.85:0.73:0.59:0.55:0.64:0.42:0.60:0.40"] = 389, -- Vengeance Landing, New Agamand, Venomspite, Ebon Watch, Sunreaver's Command + ["0.95:0.63:0.84:0.59:0.70:0.55:0.59:0.55:0.54:0.52:0.48:0.44"] = 367, -- Vengeance Landing, Camp Winterhoof, Conquest Hold, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.95:0.63:0.85:0.73:0.59:0.55:0.70:0.55"] = 339, -- Vengeance Landing, New Agamand, Venomspite, Conquest Hold + ["0.95:0.63:0.85:0.73:0.74:0.71:0.49:0.58:0.45:0.51:0.29:0.54:0.15:0.57"] = 615, -- Vengeance Landing, New Agamand, Kamagua, Moa'ki, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.95:0.63:0.84:0.59:0.74:0.62:0.59:0.55:0.54:0.52:0.52:0.38:0.49:0.21"] = 509, -- Vengeance Landing, Camp Winterhoof, Apothecary Camp, Venomspite, Wyrmrest Temple, Dalaran, Argent Tournament Grounds + + ---------------------------------------------------------------------- + -- Horde: Icecrown + ---------------------------------------------------------------------- + + -- Horde: Icecrown: Argent Tournament Grounds + ["0.49:0.21:0.38:0.21"] = 89, -- Campos del Torneo Argenta, La Cámara de las Sombras + ["0.49:0.21:0.52:0.38"] = 141, -- Argent Tournament Grounds, Dalaran + ["0.49:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.17:0.53:0.12:0.53"] = 414, -- Argent Tournament Grounds, The Shadow Vault, Warsong Camp, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.49:0.21:0.52:0.34:0.56:0.36"] = 106, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard + ["0.49:0.21:0.57:0.21:0.60:0.25"] = 92, -- Argent Tournament Grounds, Bouldercrag's Refuge, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 321, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold + ["0.49:0.21:0.38:0.21:0.28:0.28:0.24:0.40"] = 282, -- Argent Tournament Grounds, The Shadow Vault, Death's Rise, River's Heart + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44"] = 197, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard + ["0.49:0.21:0.52:0.34"] = 74, -- Argent Tournament Grounds, Crusaders' Pinnacle + ["0.49:0.21:0.57:0.21:0.64:0.19:0.72:0.29"] = 200, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Dun Nifflelem + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.60:0.40"] = 182, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Sunreaver's Command + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55"] = 287, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite + ["0.49:0.21:0.52:0.38:0.49:0.58"] = 288, -- Argent Tournament Grounds, Dalaran, Moa'ki + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.84:0.51"] = 331, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga, Camp Oneqwah + ["0.49:0.21:0.57:0.21:0.60:0.25:0.62:0.36"] = 179, -- Argent Tournament Grounds, Bouldercrag's Refuge, Grom'arsh Crash-Site, K3 + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42"] = 202, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch + ["0.49:0.21:0.38:0.21:0.31:0.43"] = 225, -- Argent Tournament Grounds, The Shadow Vault, Warsong Camp + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.49:0.58"] = 285, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Moa'ki + ["0.49:0.21:0.52:0.38:0.24:0.40:0.18:0.40"] = 375, -- Argent Tournament Grounds, Dalaran, River's Heart, Nesingwary Base Camp + ["0.49:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.29:0.57"] = 333, -- Argent Tournament Grounds, The Shadow Vault, Warsong Camp, Taunka'le Village, Unu'pe + ["0.49:0.21:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 354, -- Enceinte du tournoi d'Argent, Dalaran, Guet d'Ébène, La Brèche de Lumière, Camp Oneqwah + ["0.49:0.21:0.57:0.21:0.64:0.19"] = 96, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 249, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.49:0.21:0.57:0.21"] = 52, -- Argent Tournament Grounds, Bouldercrag's Refuge + ["0.49:0.21:0.38:0.21:0.31:0.43:0.29:0.54"] = 304, -- Argent Tournament Grounds, The Shadow Vault, Warsong Camp, Taunka'le Village + ["0.49:0.21:0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55:0.84:0.59"] = 441, -- Argent Tournament Grounds, Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold, Camp Winterhoof + ["0.49:0.21:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55"] = 349, -- Argent Tournament Grounds, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold + ["0.49:0.21:0.52:0.38:0.64:0.42:0.69:0.42"] = 249, -- Argent Tournament Grounds, Dalaran, Ebon Watch, Light's Breach + ["0.49:0.21:0.52:0.38:0.24:0.40"] = 339, -- Argent Tournament Grounds, Dalaran, River's Heart + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.54:0.52"] = 247, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38"] = 249, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga + ["0.49:0.21:0.38:0.21:0.28:0.28:0.18:0.40"] = 283, -- Argent Tournament Grounds, The Shadow Vault, Death's Rise, Nesingwary Base Camp + ["0.49:0.21:0.52:0.38:0.54:0.52"] = 250, -- Argent Tournament Grounds, Dalaran, Wyrmrest Temple + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.82:0.31"] = 302, -- Enceinte du tournoi d'Argent, Refuge de Rochecombe, Ulduar, Zim'Torga, Gundrak + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59"] = 379, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 247, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.49:0.21:0.38:0.21:0.28:0.28"] = 166, -- Argent Tournament Grounds, The Shadow Vault, Death's Rise + ["0.49:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.17:0.53"] = 379, -- Argent Tournament Grounds, The Shadow Vault, Warsong Camp, Taunka'le Village, Amber Ledge + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 352, -- Enceinte du tournoi d'Argent, Cime des Croisés, L'avant-garde d'Argent, Dalaran, Guet d'Ébène, La Brèche de Lumière, Camp Oneqwah + ["0.49:0.21:0.52:0.38:0.64:0.42"] = 205, -- Argent Tournament Grounds, Dalaran, Ebon Watch + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 377, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 431, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.49:0.21:0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 434, -- Ристалище Серебряного турнира, Мрачный Свод, Уступ Смерти, Лагерь Эрнестуэя, Застава Бор'горока, Янтарная гряда, Маскировочный щит + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36"] = 182, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3 + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40"] = 336, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, River's Heart + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 360, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.49:0.21:0.52:0.38:0.60:0.40"] = 185, -- Argent Tournament Grounds, Dalaran, Sunreaver's Command + ["0.49:0.21:0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47"] = 343, -- Argent Tournament Grounds, The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost + ["0.49:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.15:0.57"] = 388, -- Ристалище Серебряного турнира, Мрачный Свод, Лагерь Песни Войны, Деревня Таунка'ле, Крепость Песни Войны + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29:0.64:0.19"] = 366, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3, Dun Nifflelem, Ulduar + ["0.49:0.21:0.52:0.34:0.56:0.36:0.60:0.25:0.64:0.19"] = 259, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Grom'arsh Crash-Site, Ulduar + ["0.49:0.21:0.38:0.21:0.31:0.43:0.24:0.40"] = 301, -- Argent Tournament Grounds, The Shadow Vault, Warsong Camp, River's Heart + ["0.49:0.21:0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47:0.15:0.57"] = 415, -- Argent Tournament Grounds, The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Warsong Hold + ["0.49:0.21:0.57:0.21:0.60:0.25:0.56:0.36"] = 172, -- Argent Tournament Grounds, Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard + ["0.49:0.21:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 323, -- Argent Tournament Grounds, Dalaran, Ebon Watch, Light's Breach, Conquest Hold + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40:0.18:0.47:0.17:0.53"] = 446, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, River's Heart, Bor'gorok Outpost, Amber Ledge + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73"] = 459, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51"] = 446, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Oneqwah + ["0.49:0.21:0.52:0.34:0.31:0.43:0.24:0.40:0.18:0.40"] = 342, -- Argent Tournament Grounds, Crusaders' Pinnacle, Warsong Camp, River's Heart, Nesingwary Base Camp + ["0.49:0.21:0.52:0.38:0.48:0.44"] = 200, -- Argent Tournament Grounds, Dalaran, Kor'koron Vanguard + ["0.49:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.84:0.51:0.95:0.63"] = 436, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Zim'Torga, Camp Oneqwah, Vengeance Landing + ["0.49:0.21:0.52:0.38:0.56:0.36"] = 162, -- Argent Tournament Grounds, Dalaran, The Argent Vanguard + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.69:0.42"] = 394, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Light's Breach + ["0.49:0.21:0.52:0.38:0.31:0.43"] = 289, -- Argent Tournament Grounds, Dalaran, Warsong Camp + ["0.49:0.21:0.52:0.34:0.56:0.36:0.60:0.25"] = 208, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.49:0.21:0.52:0.34:0.31:0.43"] = 231, -- Argent Tournament Grounds, Crusaders' Pinnacle, Warsong Camp + ["0.49:0.21:0.52:0.34:0.31:0.43:0.29:0.54:0.15:0.57"] = 395, -- Argent Tournament Grounds, Crusaders' Pinnacle, Warsong Camp, Taunka'le Village, Warsong Hold + ["0.49:0.21:0.57:0.21:0.64:0.19:0.73:0.25"] = 183, -- Argent Tournament Grounds, Bouldercrag's Refuge, Ulduar, Camp Tunka'lo + ["0.49:0.21:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 400, -- Argent Tournament Grounds, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.49:0.21:0.57:0.21:0.60:0.25:0.73:0.25:0.72:0.29"] = 233, -- Argent Tournament Grounds, Bouldercrag's Refuge, Grom'arsh Crash-Site, Camp Tunka'lo, Dun Nifflelem + ["0.49:0.21:0.57:0.21:0.60:0.25:0.73:0.25:0.78:0.38:0.84:0.51"] = 368, -- Argent Tournament Grounds, Bouldercrag's Refuge, Grom'arsh Crash-Site, Camp Tunka'lo, Zim'Torga, Camp Oneqwah + ["0.49:0.21:0.52:0.38:0.62:0.36"] = 185, -- Argent Tournament Grounds, Dalaran, K3 + ["0.49:0.21:0.52:0.34:0.31:0.43:0.29:0.54"] = 310, -- Argent Tournament Grounds, Crusaders' Pinnacle, Warsong Camp, Taunka'le Village + ["0.49:0.21:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 362, -- Argent Tournament Grounds, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.49:0.21:0.52:0.34:0.31:0.43:0.24:0.40"] = 307, -- Argent Tournament Grounds, Crusaders' Pinnacle, Warsong Camp, River's Heart + + -- Horde: Icecrown: Crusaders' Pinnacle + ["0.52:0.34:0.56:0.36:0.52:0.38:0.54:0.52"] = 175, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.52:0.34:0.52:0.38"] = 72, -- Crusaders' Pinnacle, Dalaran + ["0.52:0.34:0.31:0.43"] = 159, -- Crusaders' Pinnacle, Warsong Camp + ["0.52:0.34:0.38:0.21"] = 124, -- Crusaders' Pinnacle, The Shadow Vault + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 248, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold + ["0.52:0.34:0.31:0.43:0.29:0.54:0.17:0.53"] = 313, -- Kreuzfahrerturm, Kriegshymnenlager, Taunka'le, Bernsteinflöz + ["0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 209, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.52:0.34:0.52:0.38:0.54:0.52"] = 182, -- Crusaders' Pinnacle, Dalaran, Wyrmrest Temple + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 327, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.52:0.34:0.56:0.36:0.60:0.25:0.57:0.21"] = 172, -- Crusaders' Pinnacle, The Argent Vanguard, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.52:0.34:0.56:0.36"] = 33, -- Crusaders' Pinnacle, The Argent Vanguard + ["0.52:0.34:0.28:0.28:0.18:0.40"] = 286, -- Crusaders' Pinnacle, Death's Rise, Nesingwary Base Camp + ["0.52:0.34:0.52:0.38:0.49:0.58"] = 220, -- Crusaders' Pinnacle, Dalaran, Moa'ki + ["0.52:0.34:0.56:0.36:0.52:0.38:0.24:0.40"] = 264, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, River's Heart + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 288, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.52:0.34:0.28:0.28"] = 168, -- Crusaders' Pinnacle, Death's Rise + ["0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36"] = 109, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3 + ["0.52:0.34:0.31:0.43:0.29:0.54"] = 238, -- Crusaders' Pinnacle, Warsong Camp, Taunka'le Village + ["0.52:0.34:0.31:0.43:0.29:0.54:0.15:0.57"] = 322, -- Crusaders' Pinnacle, Warsong Camp, Taunka'le Village, Warsong Hold + ["0.52:0.34:0.56:0.36:0.60:0.25"] = 135, -- Crusaders' Pinnacle, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.52:0.34:0.31:0.43:0.24:0.40"] = 235, -- Crusaders' Pinnacle, Warsong Camp, River's Heart + ["0.52:0.34:0.56:0.36:0.52:0.38:0.49:0.58"] = 212, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Moa'ki + ["0.52:0.34:0.56:0.36:0.60:0.25:0.64:0.19"] = 187, -- Crusaders' Pinnacle, The Argent Vanguard, Grom'arsh Crash-Site, Ulduar + ["0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55"] = 215, -- Вершина Рыцарей, Оплот Серебряного Авангарда, Даларан, Стоянка отряда Кор'крона, Ядозлобь + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 175, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 177, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42"] = 130, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch + ["0.52:0.34:0.52:0.38:0.24:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 416, -- Cime des Croisés, Dalaran, Le Cœur du fleuve, Avant-poste Bor'gorok, Escarpement d'Ambre, Bouclier Transitus + ["0.52:0.34:0.56:0.36:0.52:0.38:0.60:0.40"] = 109, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Sunreaver's Command + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 193, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.52:0.34:0.31:0.43:0.24:0.40:0.18:0.40"] = 270, -- Crusaders' Pinnacle, Warsong Camp, River's Heart, Nesingwary Base Camp + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 234, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 279, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44"] = 125, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard + ["0.52:0.34:0.49:0.21"] = 97, -- Crusaders' Pinnacle, Argent Tournament Grounds + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.84:0.51"] = 292, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Camp Oneqwah + ["0.52:0.34:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 287, -- Crusaders' Pinnacle, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.29:0.57"] = 316, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.52:0.34:0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54"] = 359, -- Crusaders' Pinnacle, Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.52:0.34:0.49:0.21:0.57:0.21"] = 145, -- Crusaders' Pinnacle, Argent Tournament Grounds, Bouldercrag's Refuge + ["0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 305, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36:0.73:0.25:0.78:0.38:0.84:0.51"] = 379, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3, Camp Tunka'lo, Zim'Torga, Camp Oneqwah + ["0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 372, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.52:0.34:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51"] = 374, -- Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Oneqwah + + -- Horde: Icecrown: Death's Rise + ["0.28:0.28:0.38:0.21"] = 94, -- Death's Rise, The Shadow Vault + ["0.28:0.28:0.38:0.21:0.49:0.21"] = 170, -- Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38"] = 238, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran + ["0.28:0.28:0.31:0.43"] = 114, -- Death's Rise, Warsong Camp + ["0.28:0.28:0.31:0.43:0.29:0.54:0.29:0.57"] = 223, -- Death's Rise, Warsong Camp, Taunka'le Village, Unu'pe + ["0.28:0.28:0.38:0.21:0.57:0.21"] = 215, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge + ["0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19:0.78:0.38"] = 412, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar, Zim'Torga + ["0.28:0.28:0.52:0.34"] = 175, -- Death's Rise, Crusaders' Pinnacle + ["0.28:0.28:0.38:0.21:0.57:0.21:0.60:0.25"] = 255, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.28:0.28:0.24:0.40:0.52:0.38"] = 310, -- Death's Rise, River's Heart, Dalaran + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 382, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19:0.72:0.29"] = 362, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar, Dun Nifflelem + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 348, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.28:0.28:0.52:0.34:0.52:0.38:0.62:0.36"] = 289, -- Death's Rise, Crusaders' Pinnacle, Dalaran, K3 + ["0.28:0.28:0.24:0.40"] = 117, -- Death's Rise, River's Heart + ["0.28:0.28:0.18:0.40"] = 119, -- Death's Rise, Nesingwary Base Camp + ["0.28:0.28:0.38:0.21:0.56:0.36"] = 227, -- Death's Rise, The Shadow Vault, The Argent Vanguard + ["0.28:0.28:0.52:0.34:0.56:0.36"] = 208, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard + ["0.28:0.28:0.24:0.40:0.18:0.47"] = 171, -- Death's Rise, River's Heart, Bor'gorok Outpost + ["0.28:0.28:0.31:0.43:0.45:0.51:0.48:0.44"] = 275, -- Death's Rise, Warsong Camp, Agmar's Hammer, Kor'koron Vanguard + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 368, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.28:0.28:0.31:0.43:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 479, -- Death's Rise, Warsong Camp, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19"] = 259, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.28:0.28:0.31:0.43:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 451, -- Death's Rise, Warsong Camp, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19:0.78:0.38:0.82:0.31"] = 465, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar, Zim'Torga, Gundrak + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 532, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.28:0.28:0.38:0.21:0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42:0.72:0.40"] = 449, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch, The Argent Stand + ["0.28:0.28:0.31:0.43:0.52:0.38"] = 255, -- Death's Rise, Warsong Camp, Dalaran + ["0.28:0.28:0.24:0.40:0.18:0.47:0.29:0.54:0.29:0.57"] = 277, -- Death's Rise, River's Heart, Bor'gorok Outpost, Taunka'le Village, Unu'pe + ["0.28:0.28:0.18:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 270, -- Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Amber Ledge, Transitus Shield + ["0.28:0.28:0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 443, -- Ascenso de la Muerte, La Cámara de las Sombras, La Vanguardia Argenta, Dalaran, Puesto de Vigilancia de Ébano, Brecha de la Luz, Bastión de la Conquista + ["0.28:0.28:0.38:0.21:0.56:0.36:0.52:0.38"] = 258, -- Death's Rise, The Shadow Vault, The Argent Vanguard, Dalaran + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 501, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.28:0.28:0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55"] = 358, -- Death's Rise, Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.54:0.52"] = 348, -- Уступ Смерти, Вершина Рыцарей, Оплот Серебряного Авангарда, Даларан, Храм Драконьего Покоя + ["0.28:0.28:0.31:0.43:0.45:0.51:0.54:0.52"] = 262, -- Death's Rise, Warsong Camp, Agmar's Hammer, Wyrmrest Temple + ["0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19:0.73:0.25"] = 347, -- Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar, Camp Tunka'lo + ["0.28:0.28:0.31:0.43:0.29:0.54:0.17:0.53:0.12:0.53"] = 305, -- Death's Rise, Warsong Camp, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.28:0.28:0.31:0.43:0.45:0.51"] = 215, -- Death's Rise, Warsong Camp, Agmar's Hammer + ["0.28:0.28:0.31:0.43:0.45:0.51:0.59:0.55"] = 300, -- Death's Rise, Warsong Camp, Agmar's Hammer, Venomspite + ["0.28:0.28:0.24:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 262, -- Todesanhöhe, Flussnabel, Bor'goroks Außenposten, Bernsteinflöz, Transitusschild + ["0.28:0.28:0.31:0.43:0.52:0.38:0.60:0.40"] = 301, -- Todesanhöhe, Kriegshymnenlager, Dalaran, Sonnenhäschers Schar + ["0.28:0.28:0.31:0.43:0.52:0.38:0.64:0.42:0.69:0.42"] = 365, -- Death's Rise, Warsong Camp, Dalaran, Ebon Watch, Light's Breach + ["0.28:0.28:0.52:0.34:0.52:0.38"] = 245, -- Ascenso de la Muerte, Pináculo de los Cruzados, Dalaran + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.62:0.36"] = 282, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, K3 + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42"] = 304, -- Ascenso de la Muerte, Pináculo de los Cruzados, La Vanguardia Argenta, Dalaran, Puesto de Vigilancia de Ébano + ["0.28:0.28:0.18:0.40:0.18:0.47:0.29:0.54:0.29:0.57"] = 285, -- Todesanhöhe, Nesingwarys Basislager, Bor'goroks Außenposten, Taunka'le, Unu'pe + ["0.28:0.28:0.31:0.43:0.45:0.51:0.59:0.55:0.85:0.73"] = 485, -- Death's Rise, Warsong Camp, Agmar's Hammer, Venomspite, New Agamand + ["0.28:0.28:0.18:0.40:0.18:0.47:0.17:0.53"] = 235, -- Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Amber Ledge + ["0.28:0.28:0.31:0.43:0.29:0.54"] = 194, -- Death's Rise, Warsong Camp, Taunka'le Village + ["0.28:0.28:0.52:0.34:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 453, -- Death's Rise, Crusaders' Pinnacle, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + + -- Horde: Icecrown: The Argent Vanguard + ["0.56:0.36:0.52:0.38"] = 32, -- The Argent Vanguard, Dalaran + ["0.56:0.36:0.52:0.38:0.60:0.40"] = 78, -- The Argent Vanguard, Dalaran, Sunreaver's Command + ["0.56:0.36:0.52:0.38:0.48:0.44"] = 93, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard + ["0.56:0.36:0.52:0.38:0.62:0.36"] = 77, -- The Argent Vanguard, Dalaran, K3 + ["0.56:0.36:0.52:0.34:0.31:0.43"] = 186, -- The Argent Vanguard, Crusaders' Pinnacle, Warsong Camp + ["0.56:0.36:0.52:0.38:0.64:0.42"] = 98, -- The Argent Vanguard, Dalaran, Ebon Watch + ["0.56:0.36:0.52:0.38:0.24:0.40"] = 232, -- The Argent Vanguard, Dalaran, River's Heart + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 296, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.56:0.36:0.52:0.34:0.31:0.43:0.29:0.54"] = 266, -- The Argent Vanguard, Crusaders' Pinnacle, Warsong Camp, Taunka'le Village + ["0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47"] = 327, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 216, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold + ["0.56:0.36:0.38:0.21"] = 148, -- The Argent Vanguard, The Shadow Vault + ["0.56:0.36:0.60:0.25:0.57:0.21"] = 140, -- The Argent Vanguard, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 161, -- The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.56:0.36:0.52:0.38:0.54:0.52"] = 142, -- The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 177, -- The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62"] = 281, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp + ["0.56:0.36:0.52:0.34"] = 28, -- The Argent Vanguard, Crusaders' Pinnacle + ["0.56:0.36:0.52:0.38:0.49:0.58"] = 180, -- The Argent Vanguard, Dalaran, Moa'ki + ["0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 145, -- Die Argentumvorhut, Dalaran, Vorposten der Kor'kron, Agmars Hammer + ["0.56:0.36:0.52:0.34:0.31:0.43:0.29:0.54:0.17:0.53:0.12:0.53"] = 376, -- The Argent Vanguard, Crusaders' Pinnacle, Warsong Camp, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 352, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 142, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 256, -- The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62:0.74:0.71"] = 334, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp, Kamagua + ["0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.69:0.42"] = 289, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Light's Breach + ["0.56:0.36:0.60:0.25"] = 103, -- The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 340, -- 은빛십자군 선봉기지 (얼음왕관), 달라란, 코르크론 선봉기지 (용의 안식처), 아그마르의 망치 (용의 안식처), 타운카르 마을 (북풍의 땅), 전쟁노래부족 요새 (북풍의 땅), 전쟁노래부족 요새 (북풍의 땅) + ["0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 256, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.56:0.36:0.52:0.38:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 431, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.56:0.36:0.52:0.38:0.62:0.36:0.73:0.25"] = 167, -- The Argent Vanguard, Dalaran, K3, Camp Tunka'lo + ["0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53"] = 330, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.56:0.36:0.60:0.25:0.64:0.19"] = 155, -- The Argent Vanguard, Grom'arsh Crash-Site, Ulduar + ["0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 202, -- La Vanguardia Argenta, Dalaran, Puesto de Vigilancia de Ébano, El Confín Argenta, Zim'Torga + ["0.56:0.36:0.52:0.34:0.28:0.28"] = 195, -- The Argent Vanguard, Crusaders' Pinnacle, Death's Rise + ["0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 366, -- Die Argentumvorhut, Dalaran, Vorposten der Kor'kron, Agmars Hammer, Taunka'le, Bernsteinflöz, Transitusschild + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 365, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.56:0.36:0.52:0.34:0.31:0.43:0.29:0.54:0.17:0.53"] = 340, -- Die Argentumvorhut, Kreuzfahrerturm, Kriegshymnenlager, Taunka'le, Bernsteinflöz + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 327, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.56:0.36:0.38:0.21:0.28:0.28"] = 225, -- La Vanguardia Argenta, La Cámara de las Sombras, Ascenso de la Muerte + ["0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55"] = 182, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 273, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.29:0.57"] = 285, -- The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 247, -- The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.56:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 267, -- The Argent Vanguard, Dalaran, River's Heart, Nesingwary Base Camp + ["0.56:0.36:0.52:0.38:0.24:0.40:0.18:0.47:0.17:0.53"] = 342, -- The Argent Vanguard, Dalaran, River's Heart, Bor'gorok Outpost, Amber Ledge + ["0.56:0.36:0.52:0.38:0.54:0.52:0.45:0.51"] = 209, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Agmar's Hammer + ["0.56:0.36:0.52:0.38:0.54:0.52:0.59:0.55:0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 433, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Venomspite, Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.56:0.36:0.52:0.38:0.54:0.52:0.59:0.55"] = 191, -- The Argent Vanguard, Dalaran, Wyrmrest Temple, Venomspite + ["0.56:0.36:0.52:0.34:0.49:0.21"] = 124, -- The Argent Vanguard, Crusaders' Pinnacle, Argent Tournament Grounds + ["0.56:0.36:0.52:0.38:0.49:0.21"] = 146, -- The Argent Vanguard, Dalaran, Argent Tournament Grounds + ["0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51"] = 342, -- Die Argentumvorhut, Dalaran, Vorposten der Kor'kron, Gallgrimm, Burg Siegeswall, Camp Oneqwah + + -- Horde: Icecrown: The Shadow Vault + ["0.38:0.21:0.56:0.36:0.52:0.38"] = 166, -- The Shadow Vault, The Argent Vanguard, Dalaran + ["0.38:0.21:0.57:0.21"] = 122, -- The Shadow Vault, Bouldercrag's Refuge + ["0.38:0.21:0.56:0.36"] = 135, -- The Shadow Vault, The Argent Vanguard + ["0.38:0.21:0.57:0.21:0.64:0.19:0.72:0.29"] = 270, -- Das Schattengewölbe, Bergfels' Zuflucht, Ulduar, Dun Niffelem + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 336, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.38:0.21:0.57:0.21:0.60:0.25:0.73:0.25:0.72:0.29"] = 303, -- The Shadow Vault, Bouldercrag's Refuge, Grom'arsh Crash-Site, Camp Tunka'lo, Dun Nifflelem + ["0.38:0.21:0.57:0.21:0.60:0.25:0.62:0.36:0.52:0.38"] = 321, -- The Shadow Vault, Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Dalaran + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 381, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.38:0.21:0.28:0.28"] = 78, -- The Shadow Vault, Death's Rise + ["0.38:0.21:0.31:0.43:0.45:0.51"] = 237, -- The Shadow Vault, Warsong Camp, Agmar's Hammer + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40"] = 296, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand + ["0.38:0.21:0.52:0.34"] = 121, -- The Shadow Vault, Crusaders' Pinnacle + ["0.38:0.21:0.56:0.36:0.52:0.38:0.62:0.36:0.72:0.29"] = 311, -- The Shadow Vault, The Argent Vanguard, Dalaran, K3, Dun Nifflelem + ["0.38:0.21:0.56:0.36:0.52:0.38:0.49:0.58:0.29:0.57:0.15:0.57"] = 530, -- The Shadow Vault, The Argent Vanguard, Dalaran, Moa'ki, Unu'pe, Warsong Hold + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 350, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold + ["0.38:0.21:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55"] = 317, -- The Shadow Vault, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite + ["0.38:0.21:0.57:0.21:0.64:0.19"] = 166, -- The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.38:0.21:0.31:0.43:0.29:0.54:0.29:0.57"] = 246, -- Das Schattengewölbe, Kriegshymnenlager, Taunka'le, Unu'pe + ["0.38:0.21:0.31:0.43"] = 138, -- The Shadow Vault, Warsong Camp + ["0.38:0.21:0.31:0.43:0.29:0.54:0.17:0.53:0.12:0.53"] = 327, -- The Shadow Vault, Warsong Camp, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.38:0.21:0.56:0.36:0.52:0.38:0.54:0.52"] = 277, -- The Shadow Vault, The Argent Vanguard, Dalaran, Wyrmrest Temple + ["0.38:0.21:0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55"] = 381, -- The Shadow Vault, Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold + ["0.38:0.21:0.52:0.34:0.52:0.38"] = 192, -- The Shadow Vault, Crusaders' Pinnacle, Dalaran + ["0.38:0.21:0.56:0.36:0.52:0.38:0.48:0.44"] = 227, -- The Shadow Vault, The Argent Vanguard, Dalaran, Kor'koron Vanguard + ["0.38:0.21:0.56:0.36:0.52:0.38:0.24:0.40"] = 365, -- The Shadow Vault, The Argent Vanguard, Dalaran, River's Heart + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 407, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.38:0.21:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 500, -- The Shadow Vault, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.38:0.21:0.31:0.43:0.29:0.54"] = 217, -- The Shadow Vault, Warsong Camp, Taunka'le Village + ["0.38:0.21:0.56:0.36:0.52:0.38:0.62:0.36"] = 210, -- The Shadow Vault, The Argent Vanguard, Dalaran, K3 + ["0.38:0.21:0.52:0.34:0.52:0.38:0.62:0.36:0.72:0.29"] = 336, -- The Shadow Vault, Crusaders' Pinnacle, Dalaran, K3, Dun Nifflelem + ["0.38:0.21:0.57:0.21:0.60:0.25"] = 163, -- The Shadow Vault, Bouldercrag's Refuge, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.38:0.21:0.56:0.36:0.52:0.38:0.49:0.58"] = 314, -- The Shadow Vault, The Argent Vanguard, Dalaran, Moa'ki + ["0.38:0.21:0.28:0.28:0.24:0.40"] = 195, -- The Shadow Vault, Death's Rise, River's Heart + ["0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 347, -- The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Amber Ledge, Transitus Shield + ["0.38:0.21:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 473, -- Le caveau des Ombres, L'avant-garde d'Argent, Dalaran, Avant-garde kor'kronne, Marteau d'Agmar, Taunka'le, Bastion Chanteguerre + ["0.38:0.21:0.57:0.21:0.60:0.25:0.73:0.25"] = 258, -- The Shadow Vault, Bouldercrag's Refuge, Grom'arsh Crash-Site, Camp Tunka'lo + ["0.38:0.21:0.28:0.28:0.24:0.40:0.52:0.38"] = 387, -- The Shadow Vault, Death's Rise, River's Heart, Dalaran + ["0.38:0.21:0.31:0.43:0.45:0.51:0.49:0.58"] = 298, -- The Shadow Vault, Warsong Camp, Agmar's Hammer, Moa'ki + ["0.38:0.21:0.28:0.28:0.24:0.40:0.18:0.47:0.17:0.53"] = 304, -- The Shadow Vault, Death's Rise, River's Heart, Bor'gorok Outpost, Amber Ledge + ["0.38:0.21:0.56:0.36:0.60:0.25"] = 237, -- Мрачный Свод, Оплот Серебряного Авангарда, Место крушения Гром'арша + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42"] = 276, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach + ["0.38:0.21:0.31:0.43:0.52:0.38:0.62:0.36"] = 323, -- The Shadow Vault, Warsong Camp, Dalaran, K3 + ["0.38:0.21:0.56:0.36:0.60:0.25:0.64:0.19"] = 288, -- The Shadow Vault, The Argent Vanguard, Grom'arsh Crash-Site, Ulduar + ["0.38:0.21:0.31:0.43:0.45:0.51:0.59:0.55"] = 323, -- The Shadow Vault, Warsong Camp, Agmar's Hammer, Venomspite + ["0.38:0.21:0.28:0.28:0.18:0.40"] = 195, -- The Shadow Vault, Death's Rise, Nesingwary Base Camp + ["0.38:0.21:0.56:0.36:0.52:0.38:0.62:0.36:0.73:0.25"] = 301, -- The Shadow Vault, The Argent Vanguard, Dalaran, K3, Camp Tunka'lo + ["0.38:0.21:0.52:0.34:0.52:0.38:0.54:0.52"] = 302, -- The Shadow Vault, Crusaders' Pinnacle, Dalaran, Wyrmrest Temple + ["0.38:0.21:0.57:0.21:0.64:0.19:0.78:0.38"] = 319, -- The Shadow Vault, Bouldercrag's Refuge, Ulduar, Zim'Torga + ["0.38:0.21:0.31:0.43:0.29:0.54:0.15:0.57"] = 301, -- The Shadow Vault, Warsong Camp, Taunka'le Village, Warsong Hold + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42"] = 232, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch + ["0.38:0.21:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 278, -- The Shadow Vault, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47:0.15:0.57"] = 327, -- The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Warsong Hold + ["0.38:0.21:0.31:0.43:0.24:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 359, -- Мрачный Свод, Лагерь Песни Войны, Слияние рек, Застава Бор'горока, Янтарная гряда, Маскировочный щит + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59"] = 434, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof + ["0.38:0.21:0.57:0.21:0.60:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 434, -- Das Schattengewölbe, Bergfels' Zuflucht, Absturzstelle Grom'ash, K3, Dalaran, Vorposten der Kor'kron, Agmars Hammer + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 389, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47:0.29:0.54"] = 333, -- The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village + ["0.38:0.21:0.49:0.21"] = 78, -- The Shadow Vault, Argent Tournament Grounds + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 429, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.38:0.21:0.56:0.36:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 486, -- The Shadow Vault, The Argent Vanguard, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.38:0.21:0.56:0.36:0.52:0.38:0.60:0.40"] = 212, -- The Shadow Vault, The Argent Vanguard, Dalaran, Sunreaver's Command + ["0.38:0.21:0.31:0.43:0.24:0.40:0.18:0.47"] = 268, -- The Shadow Vault, Warsong Camp, River's Heart, Bor'gorok Outpost + ["0.38:0.21:0.57:0.21:0.64:0.19:0.73:0.25"] = 254, -- The Shadow Vault, Bouldercrag's Refuge, Ulduar, Camp Tunka'lo + ["0.38:0.21:0.31:0.43:0.45:0.51:0.54:0.52"] = 286, -- The Shadow Vault, Warsong Camp, Agmar's Hammer, Wyrmrest Temple + ["0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47"] = 256, -- The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost + ["0.38:0.21:0.52:0.34:0.52:0.38:0.64:0.42:0.72:0.40"] = 322, -- The Shadow Vault, Crusaders' Pinnacle, Dalaran, Ebon Watch, The Argent Stand + ["0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47:0.29:0.54:0.29:0.57"] = 362, -- The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Unu'pe + + ---------------------------------------------------------------------- + -- Horde: Sholazar Basin + ---------------------------------------------------------------------- + + -- Horde: Sholazar Basin: Nesingwary Base Camp + ["0.18:0.40:0.24:0.40:0.52:0.38"] = 363, -- Nesingwary Base Camp, River's Heart, Dalaran + ["0.18:0.40:0.24:0.40"] = 77, -- Nesingwary Base Camp, River's Heart + ["0.18:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 229, -- Nesingwary Base Camp, Bor'gorok Outpost, Amber Ledge, Transitus Shield + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55"] = 471, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55"] = 557, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42"] = 531, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, Light's Breach + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51"] = 342, -- Camp de base de Nesingwary, Avant-poste Bor'gorok, Taunka'le, Marteau d'Agmar + ["0.18:0.40:0.24:0.40:0.52:0.38:0.56:0.36"] = 397, -- Nesingwary Base Camp, River's Heart, Dalaran, The Argent Vanguard + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 620, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.18:0.40:0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 581, -- Nesingwary Base Camp, River's Heart, Dalaran, K3, Dun Nifflelem + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 850, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar + ["0.18:0.40:0.18:0.47:0.15:0.57"] = 199, -- Nesingwary Base Camp, Bor'gorok Outpost, Warsong Hold + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42"] = 464, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.64:0.19:0.60:0.25"] = 916, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Ulduar, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.18:0.40:0.18:0.47"] = 91, -- Nesingwary Base Camp, Bor'gorok Outpost + ["0.18:0.40:0.18:0.47:0.29:0.54"] = 207, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 683, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 688, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 708, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40"] = 559, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand + ["0.18:0.40:0.24:0.40:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 826, -- Nesingwary Base Camp, River's Heart, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.18:0.40:0.24:0.40:0.31:0.43:0.29:0.54"] = 310, -- Nesingwary Base Camp, River's Heart, Warsong Camp, Taunka'le Village + ["0.18:0.40:0.24:0.40:0.31:0.43:0.29:0.54:0.29:0.57"] = 354, -- Nesingwary Base Camp, River's Heart, Warsong Camp, Taunka'le Village, Unu'pe + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.54:0.52"] = 415, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple + ["0.18:0.40:0.24:0.40:0.52:0.38:0.62:0.36"] = 431, -- Nesingwary Base Camp, River's Heart, Dalaran, K3 + ["0.18:0.40:0.24:0.40:0.52:0.38:0.62:0.36:0.60:0.25"] = 544, -- Nesingwary Base Camp, River's Heart, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.18:0.40:0.18:0.47:0.17:0.53"] = 176, -- Nesingwary Base Camp, Bor'gorok Outpost, Amber Ledge + ["0.18:0.40:0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 700, -- Nesingwary Base Camp, River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.18:0.40:0.28:0.28"] = 137, -- Nesingwary Base Camp, Death's Rise + ["0.18:0.40:0.18:0.47:0.29:0.54:0.29:0.57"] = 251, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Unu'pe + ["0.18:0.40:0.24:0.40:0.31:0.43"] = 191, -- Nesingwary Base Camp, River's Heart, Warsong Camp + ["0.18:0.40:0.28:0.28:0.38:0.21"] = 277, -- Nesingwary Base Camp, Death's Rise, The Shadow Vault + ["0.18:0.40:0.24:0.40:0.52:0.38:0.62:0.36:0.73:0.25"] = 566, -- Nesingwary Base Camp, River's Heart, Dalaran, K3, Camp Tunka'lo + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 697, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 617, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.18:0.40:0.24:0.40:0.52:0.38:0.52:0.34"] = 406, -- Nesingwary Base Camp, River's Heart, Dalaran, Crusaders' Pinnacle + ["0.18:0.40:0.24:0.40:0.52:0.38:0.60:0.40"] = 433, -- Nesingwary Base Camp, River's Heart, Dalaran, Sunreaver's Command + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.85:0.73"] = 748, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, New Agamand + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.48:0.44"] = 435, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard + ["0.18:0.40:0.24:0.40:0.52:0.38:0.48:0.44"] = 455, -- Nesingwary Base Camp, River's Heart, Dalaran, Kor'koron Vanguard + ["0.18:0.40:0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58"] = 428, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Unu'pe, Moa'ki + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.84:0.59"] = 706, -- Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.18:0.40:0.28:0.28:0.52:0.34"] = 398, -- Nesingwary Base Camp, Death's Rise, Crusaders' Pinnacle + ["0.18:0.40:0.24:0.40:0.52:0.38:0.48:0.44:0.45:0.51"] = 534, -- Nesingwary Base Camp, River's Heart, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.18:0.40:0.24:0.40:0.31:0.43:0.38:0.21"] = 435, -- Nesingwary Base Camp, River's Heart, Warsong Camp, The Shadow Vault + ["0.18:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42"] = 629, -- Nesingwarys Basislager, Bor'goroks Außenposten, Taunka'le, Agmars Hammer, Gallgrimm, Lichtbresche + ["0.18:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 391, -- Nesingwary Base Camp, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.18:0.40:0.28:0.28:0.38:0.21:0.57:0.21:0.60:0.25"] = 519, -- Nesingwary Base Camp, Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Grom'arsh Crash-Site, Grom'arsh Crash-Site + + -- Horde: Sholazar Basin: River's Heart + ["0.24:0.40:0.31:0.43"] = 129, -- River's Heart, Warsong Camp + ["0.24:0.40:0.18:0.47:0.29:0.54"] = 209, -- River's Heart, Bor'gorok Outpost, Taunka'le Village + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51"] = 626, -- River's Heart, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.24:0.40:0.52:0.38"] = 302, -- River's Heart, Dalaran + ["0.24:0.40:0.18:0.47"] = 94, -- River's Heart, Bor'gorok Outpost + ["0.24:0.40:0.18:0.47:0.15:0.57"] = 201, -- River's Heart, Bor'gorok Outpost, Warsong Hold + ["0.24:0.40:0.18:0.47:0.17:0.53"] = 177, -- River's Heart, Bor'gorok Outpost, Amber Ledge + ["0.24:0.40:0.28:0.28"] = 140, -- River's Heart, Death's Rise + ["0.24:0.40:0.18:0.47:0.17:0.53:0.12:0.53"] = 231, -- River's Heart, Bor'gorok Outpost, Amber Ledge, Transitus Shield + ["0.24:0.40:0.31:0.43:0.45:0.51:0.59:0.55:0.85:0.73"] = 684, -- River's Heart, Warsong Camp, Agmar's Hammer, Venomspite, New Agamand + ["0.24:0.40:0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 728, -- River's Heart, Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 795, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62"] = 618, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.24:0.40:0.18:0.47:0.29:0.54:0.29:0.57"] = 253, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Unu'pe + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.54:0.52"] = 417, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.48:0.44"] = 436, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Kor'koron Vanguard + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51"] = 345, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55"] = 559, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold + ["0.24:0.40:0.18:0.40"] = 64, -- River's Heart, Nesingwary Base Camp + ["0.24:0.40:0.52:0.38:0.62:0.36"] = 370, -- River's Heart, Dalaran, K3 + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42"] = 469, -- River's Heart, Dalaran, Ebon Watch, Light's Breach + ["0.24:0.40:0.52:0.38:0.64:0.42"] = 403, -- River's Heart, Dalaran, Ebon Watch + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55"] = 472, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite + ["0.24:0.40:0.28:0.28:0.38:0.21"] = 280, -- River's Heart, Death's Rise, The Shadow Vault + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40"] = 498, -- Flussnabel, Dalaran, Schwarze Wacht, Argentumwache + ["0.24:0.40:0.52:0.38:0.62:0.36:0.60:0.25:0.57:0.21"] = 537, -- River's Heart, Dalaran, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.24:0.40:0.52:0.38:0.48:0.44"] = 394, -- Flussnabel, Dalaran, Vorposten der Kor'kron + ["0.24:0.40:0.52:0.38:0.62:0.36:0.72:0.29"] = 520, -- River's Heart, Dalaran, K3, Dun Nifflelem + ["0.24:0.40:0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55"] = 492, -- River's Heart, Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold + ["0.24:0.40:0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58"] = 429, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Unu'pe, Moa'ki + ["0.24:0.40:0.52:0.38:0.54:0.52"] = 468, -- River's Heart, Dalaran, Wyrmrest Temple + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 639, -- River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 685, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.24:0.40:0.52:0.38:0.52:0.34"] = 344, -- River's Heart, Dalaran, Crusaders' Pinnacle + ["0.24:0.40:0.52:0.38:0.60:0.40"] = 371, -- River's Heart, Dalaran, Sunreaver's Command + ["0.24:0.40:0.31:0.43:0.45:0.51:0.54:0.52"] = 350, -- River's Heart, Warsong Camp, Agmar's Hammer, Wyrmrest Temple + ["0.24:0.40:0.31:0.43:0.45:0.51:0.49:0.58"] = 369, -- River's Heart, Warsong Camp, Agmar's Hammer, Moa'ki + ["0.24:0.40:0.52:0.38:0.62:0.36:0.60:0.25"] = 482, -- River's Heart, Dalaran, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.24:0.40:0.31:0.43:0.45:0.51:0.59:0.55"] = 406, -- River's Heart, Warsong Camp, Agmar's Hammer, Venomspite + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55"] = 580, -- River's Heart, Dalaran, Ebon Watch, Light's Breach, Conquest Hold + ["0.24:0.40:0.52:0.38:0.62:0.36:0.73:0.25"] = 504, -- River's Heart, Dalaran, K3, Camp Tunka'lo + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.60:0.40"] = 611, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, Sunreaver's Command + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 784, -- River's Heart, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.24:0.40:0.31:0.43:0.45:0.51"] = 279, -- River's Heart, Warsong Camp, Agmar's Hammer + ["0.24:0.40:0.52:0.38:0.56:0.36"] = 335, -- River's Heart, Dalaran, The Argent Vanguard + ["0.24:0.40:0.31:0.43:0.29:0.54"] = 248, -- River's Heart, Warsong Camp, Taunka'le Village + ["0.24:0.40:0.31:0.43:0.45:0.51:0.48:0.44"] = 370, -- River's Heart, Warsong Camp, Agmar's Hammer, Kor'koron Vanguard + ["0.24:0.40:0.31:0.43:0.45:0.51:0.49:0.58:0.29:0.57"] = 565, -- River's Heart, Warsong Camp, Agmar's Hammer, Moa'ki, Unu'pe + ["0.24:0.40:0.31:0.43:0.29:0.54:0.29:0.57"] = 291, -- River's Heart, Warsong Camp, Taunka'le Village, Unu'pe + ["0.24:0.40:0.31:0.43:0.29:0.54:0.17:0.53"] = 359, -- River's Heart, Warsong Camp, Taunka'le Village, Amber Ledge + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 745, -- River's Heart, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.24:0.40:0.31:0.43:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 632, -- River's Heart, Warsong Camp, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.24:0.40:0.52:0.38:0.48:0.44:0.45:0.51"] = 472, -- River's Heart, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.54:0.52:0.64:0.42:0.72:0.40"] = 666, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Wyrmrest Temple, Ebon Watch, The Argent Stand + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.69:0.42"] = 631, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Agmar's Hammer, Venomspite, Light's Breach + ["0.24:0.40:0.31:0.43:0.38:0.21"] = 373, -- River's Heart, Warsong Camp, The Shadow Vault + ["0.24:0.40:0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 619, -- River's Heart, Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.24:0.40:0.18:0.47:0.29:0.54:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 699, -- Le Cœur du fleuve, Avant-poste Bor'gorok, Taunka'le, Marteau d'Agmar, Vexevenin, Camp des Apothicaires, Kamagua + ["0.24:0.40:0.31:0.43:0.45:0.51:0.59:0.55:0.74:0.62"] = 552, -- River's Heart, Warsong Camp, Agmar's Hammer, Venomspite, Apothecary Camp + ["0.24:0.40:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 558, -- River's Heart, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.24:0.40:0.18:0.47:0.29:0.54:0.29:0.57:0.49:0.58:0.74:0.71"] = 704, -- River's Heart, Bor'gorok Outpost, Taunka'le Village, Unu'pe, Moa'ki, Kamagua + ["0.24:0.40:0.52:0.38:0.56:0.36:0.60:0.25"] = 488, -- River's Heart, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.24:0.40:0.31:0.43:0.29:0.54:0.15:0.57"] = 374, -- River's Heart, Warsong Camp, Taunka'le Village, Warsong Hold + ["0.24:0.40:0.28:0.28:0.38:0.21:0.57:0.21:0.64:0.19"] = 527, -- River's Heart, Death's Rise, The Shadow Vault, Bouldercrag's Refuge, Ulduar + ["0.24:0.40:0.28:0.28:0.38:0.21:0.49:0.21"] = 394, -- River's Heart, Death's Rise, The Shadow Vault, Argent Tournament Grounds + ["0.24:0.40:0.52:0.38:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 665, -- River's Heart, Dalaran, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.24:0.40:0.28:0.28:0.38:0.21:0.57:0.21"] = 461, -- River's Heart, Death's Rise, The Shadow Vault, Bouldercrag's Refuge + ["0.24:0.40:0.52:0.38:0.49:0.21"] = 473, -- Corazón del Río, Dalaran, Campos del Torneo Argenta + ["0.24:0.40:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 559, -- River's Heart, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.24:0.40:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55"] = 616, -- Flussnabel, Dalaran, Vorposten der Kor'kron, Gallgrimm, Burg Siegeswall + + ---------------------------------------------------------------------- + -- Horde: The Storm Peaks + ---------------------------------------------------------------------- + + -- Horde: The Storm Peaks: Bouldercrag's Refuge + ["0.57:0.21:0.64:0.19"] = 45, -- Bouldercrag's Refuge, Ulduar + ["0.57:0.21:0.60:0.25"] = 41, -- Bouldercrag's Refuge, Grom'arsh Crash-Site + ["0.57:0.21:0.60:0.25:0.62:0.36:0.52:0.38"] = 199, -- Bergfels' Zuflucht, Absturzstelle Grom'ash, K3, Dalaran + ["0.57:0.21:0.64:0.19:0.72:0.29"] = 149, -- Bouldercrag's Refuge, Ulduar, Dun Nifflelem + ["0.57:0.21:0.60:0.25:0.62:0.36"] = 128, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3 + ["0.57:0.21:0.60:0.25:0.62:0.36:0.72:0.29"] = 228, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Dun Nifflelem + ["0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42"] = 215, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach + ["0.57:0.21:0.60:0.25:0.56:0.36:0.52:0.38:0.24:0.40"] = 351, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, River's Heart + ["0.57:0.21:0.60:0.25:0.73:0.25:0.72:0.29"] = 182, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, Camp Tunka'lo, Dun Nifflelem + ["0.57:0.21:0.60:0.25:0.73:0.25"] = 137, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, Camp Tunka'lo + ["0.57:0.21:0.38:0.21:0.28:0.28"] = 190, -- Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.57:0.21:0.60:0.25:0.56:0.36:0.52:0.38"] = 151, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran + ["0.57:0.21:0.60:0.25:0.56:0.36"] = 120, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard + ["0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42:0.54:0.52"] = 262, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch, Wyrmrest Temple + ["0.57:0.21:0.60:0.25:0.56:0.36:0.52:0.34"] = 147, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle + ["0.57:0.21:0.60:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 507, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.57:0.21:0.60:0.25:0.62:0.36:0.52:0.38:0.52:0.34"] = 227, -- Refuge de Rochecombe, Point d'impact de Grom'arsh, K3, Dalaran, Cime des Croisés + ["0.57:0.21:0.64:0.19:0.73:0.25"] = 132, -- Bouldercrag's Refuge, Ulduar, Camp Tunka'lo + ["0.57:0.21:0.64:0.19:0.73:0.25:0.62:0.36"] = 246, -- Bouldercrag's Refuge, Ulduar, Camp Tunka'lo, K3 + ["0.57:0.21:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 264, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.57:0.21:0.64:0.19:0.72:0.29:0.62:0.36:0.52:0.38:0.54:0.52"] = 417, -- Bouldercrag's Refuge, Ulduar, Dun Nifflelem, K3, Dalaran, Wyrmrest Temple + ["0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55"] = 289, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold + ["0.57:0.21:0.38:0.21:0.56:0.36:0.52:0.38"] = 278, -- Bouldercrag's Refuge, The Shadow Vault, The Argent Vanguard, Dalaran + ["0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42"] = 172, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch + ["0.57:0.21:0.38:0.21"] = 114, -- Refugio de Pedruscón, La Cámara de las Sombras + ["0.57:0.21:0.64:0.19:0.78:0.38"] = 198, -- Bouldercrag's Refuge, Ulduar, Zim'Torga + ["0.57:0.21:0.38:0.21:0.28:0.28:0.24:0.40"] = 307, -- Bouldercrag's Refuge, The Shadow Vault, Death's Rise, River's Heart + ["0.57:0.21:0.38:0.21:0.28:0.28:0.18:0.40"] = 308, -- Bouldercrag's Refuge, The Shadow Vault, Death's Rise, Nesingwary Base Camp + ["0.57:0.21:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44"] = 212, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard + ["0.57:0.21:0.64:0.19:0.72:0.29:0.62:0.36:0.64:0.42:0.59:0.55"] = 377, -- Bouldercrag's Refuge, Ulduar, Dun Nifflelem, K3, Ebon Watch, Venomspite + ["0.57:0.21:0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47:0.29:0.54"] = 446, -- Bouldercrag's Refuge, The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost, Taunka'le Village + ["0.57:0.21:0.38:0.21:0.52:0.34:0.52:0.38:0.62:0.36:0.72:0.29"] = 448, -- Bouldercrag's Refuge, The Shadow Vault, Crusaders' Pinnacle, Dalaran, K3, Dun Nifflelem + ["0.57:0.21:0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47"] = 369, -- Bouldercrag's Refuge, The Shadow Vault, Death's Rise, Nesingwary Base Camp, Bor'gorok Outpost + ["0.57:0.21:0.64:0.19:0.78:0.38:0.82:0.31"] = 251, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, Gundrak + ["0.57:0.21:0.38:0.21:0.31:0.43"] = 250, -- Bouldercrag's Refuge, The Shadow Vault, Warsong Camp + ["0.57:0.21:0.38:0.21:0.31:0.43:0.24:0.40"] = 326, -- Bouldercrag's Refuge, The Shadow Vault, Warsong Camp, River's Heart + ["0.57:0.21:0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 369, -- Bergfels' Zuflucht, Ulduar, Zim'Torga, Argentumwache, Schwarze Wacht, Dalaran + ["0.57:0.21:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55"] = 361, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold + ["0.57:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.17:0.53"] = 404, -- Bouldercrag's Refuge, The Shadow Vault, Warsong Camp, Taunka'le Village, Amber Ledge + ["0.57:0.21:0.64:0.19:0.73:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 684, -- Bouldercrag's Refuge, Ulduar, Camp Tunka'lo, K3, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.57:0.21:0.60:0.25:0.56:0.36:0.52:0.38:0.49:0.58"] = 299, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Moa'ki + ["0.57:0.21:0.38:0.21:0.31:0.43:0.29:0.54"] = 329, -- Bouldercrag's Refuge, The Shadow Vault, Warsong Camp, Taunka'le Village + ["0.57:0.21:0.64:0.19:0.78:0.38:0.84:0.51"] = 280, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, Camp Oneqwah + ["0.57:0.21:0.49:0.21"] = 61, -- Bouldercrag's Refuge, Argent Tournament Grounds + ["0.57:0.21:0.49:0.21:0.52:0.34"] = 131, -- Bouldercrag's Refuge, Argent Tournament Grounds, Crusaders' Pinnacle + ["0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 346, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42:0.72:0.40"] = 235, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch, The Argent Stand + ["0.57:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.15:0.57"] = 414, -- Bouldercrag's Refuge, The Shadow Vault, Warsong Camp, Taunka'le Village, Warsong Hold + ["0.57:0.21:0.64:0.19:0.72:0.29:0.62:0.36:0.52:0.38"] = 306, -- Bouldercrag's Refuge, Ulduar, Dun Nifflelem, K3, Dalaran + ["0.57:0.21:0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59"] = 328, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.57:0.21:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 400, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.57:0.21:0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73"] = 407, -- Bouldercrag's Refuge, Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.57:0.21:0.49:0.21:0.52:0.34:0.31:0.43"] = 288, -- Bouldercrag's Refuge, Argent Tournament Grounds, Crusaders' Pinnacle, Warsong Camp + ["0.57:0.21:0.49:0.21:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 366, -- Bouldercrag's Refuge, Argent Tournament Grounds, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.57:0.21:0.60:0.25:0.62:0.36:0.52:0.38:0.48:0.44"] = 260, -- Bouldercrag's Refuge, Grom'arsh Crash-Site, K3, Dalaran, Kor'koron Vanguard + + -- Horde: The Storm Peaks: Camp Tunka'lo + ["0.73:0.25:0.78:0.38:0.82:0.31"] = 152, -- Camp Tunka'lo, Zim'Torga, Gundrak + ["0.73:0.25:0.62:0.36:0.52:0.38"] = 186, -- Camp Tunka'lo, K3, Dalaran + ["0.73:0.25:0.62:0.36"] = 115, -- Camp Tunka'lo, K3 + ["0.73:0.25:0.64:0.19:0.57:0.21"] = 122, -- Camp Tunka'lo, Ulduar, Bouldercrag's Refuge + ["0.73:0.25:0.72:0.29"] = 46, -- Camp Tunka'lo, Dun Nifflelem + ["0.73:0.25:0.60:0.25:0.56:0.36"] = 180, -- Camp Tunka'lo, Grom'arsh Crash-Site, The Argent Vanguard + ["0.73:0.25:0.60:0.25"] = 100, -- Camp Tunka'lo, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.73:0.25:0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58:0.29:0.57:0.15:0.57"] = 520, -- Camp Tunka'lo, K3, Ebon Watch, Wyrmrest Temple, Moa'ki, Unu'pe, Warsong Hold + ["0.73:0.25:0.62:0.36:0.52:0.38:0.48:0.44"] = 247, -- Camp Tunka'lo, K3, Dalaran, Kor'koron Vanguard + ["0.73:0.25:0.60:0.25:0.57:0.21"] = 137, -- Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.73:0.25:0.62:0.36:0.52:0.38:0.31:0.43"] = 336, -- Camp Tunka'lo, K3, Dalaran, Warsong Camp + ["0.73:0.25:0.64:0.19"] = 74, -- Camp Tunka'lo, Ulduar + ["0.73:0.25:0.64:0.19:0.57:0.21:0.38:0.21"] = 235, -- Camp Tunka'lo, Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.73:0.25:0.62:0.36:0.52:0.38:0.24:0.40"] = 386, -- Camp Tunka'lo, K3, Dalaran, River's Heart + ["0.73:0.25:0.62:0.36:0.64:0.42"] = 158, -- Campamento Tunka'lo, K3, Puesto de Vigilancia de Ébano + ["0.73:0.25:0.78:0.38"] = 99, -- Camp Tunka'lo, Zim'Torga + ["0.73:0.25:0.62:0.36:0.64:0.42:0.54:0.52"] = 249, -- Camp Tunka'lo, K3, Schwarze Wacht, Wyrmruhtempel + ["0.73:0.25:0.62:0.36:0.52:0.38:0.54:0.52:0.59:0.55:0.85:0.73"] = 531, -- Camp Tunka'lo, K3, Dalaran, Wyrmrest Temple, Venomspite, New Agamand + ["0.73:0.25:0.62:0.36:0.60:0.40"] = 153, -- Camp Tunka'lo, K3, Sunreaver's Command + ["0.73:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 299, -- Camp Tunka'lo, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.73:0.25:0.64:0.19:0.57:0.21:0.38:0.21:0.28:0.28"] = 312, -- Camp Tunka'lo, Ulduar, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.73:0.25:0.60:0.25:0.56:0.36:0.52:0.34"] = 206, -- Camp Tunka'lo, Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle + ["0.73:0.25:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58"] = 346, -- Camp Tunka'lo, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.73:0.25:0.62:0.36:0.64:0.42:0.59:0.55"] = 257, -- Camp Tunka'lo, K3, Ebon Watch, Venomspite + ["0.73:0.25:0.60:0.25:0.57:0.21:0.38:0.21"] = 250, -- Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault + ["0.73:0.25:0.62:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 421, -- Camp Tunka'lo, K3, Dalaran, River's Heart, Nesingwary Base Camp + ["0.73:0.25:0.78:0.38:0.84:0.51:0.84:0.59"] = 229, -- Camp Tunka'lo, Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.73:0.25:0.60:0.25:0.56:0.36:0.52:0.38"] = 211, -- Camp Tunka'lo, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran + ["0.73:0.25:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 270, -- Camp Tunka'lo, Zim'Torga, Argentumwache, Schwarze Wacht, Dalaran + ["0.73:0.25:0.78:0.38:0.84:0.51:0.95:0.63"] = 286, -- Camp Tunka'lo, Zim'Torga, Camp Oneqwah, Vengeance Landing + ["0.73:0.25:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55"] = 249, -- Camp Tunka'lo, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold + ["0.73:0.25:0.62:0.36:0.52:0.38:0.52:0.34"] = 215, -- Camp Tunka'lo, K3, Dalaran, Crusaders' Pinnacle + ["0.73:0.25:0.78:0.38:0.72:0.40:0.69:0.42"] = 175, -- Campamento Tunka'lo, Zim'Torga, El Confín Argenta, Brecha de la Luz + ["0.73:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 410, -- Camp Tunka'lo, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.73:0.25:0.78:0.38:0.72:0.40"] = 151, -- Camp Tunka'lo, Zim'Torga, Le séjour d'Argent + ["0.73:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 520, -- Camp Tunka'lo, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.73:0.25:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62"] = 305, -- Camp Tunka'lo, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp + ["0.73:0.25:0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58"] = 301, -- Camp Tunka'lo, K3, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.73:0.25:0.64:0.19:0.57:0.21:0.49:0.21"] = 182, -- Camp Tunka'lo, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.73:0.25:0.78:0.38:0.84:0.51"] = 181, -- Camp Tunka'lo, Zim'Torga, Camp Oneqwah + ["0.73:0.25:0.62:0.36:0.52:0.38:0.52:0.34:0.38:0.21"] = 337, -- Camp Tunka'lo, K3, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.73:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47"] = 482, -- Camp Tunka'lo, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + + -- Horde: The Storm Peaks: Dun Nifflelem + ["0.72:0.29:0.62:0.36:0.52:0.38"] = 159, -- Dun Nifflelem, K3, Dalaran + ["0.72:0.29:0.62:0.36:0.52:0.38:0.24:0.40"] = 360, -- Dun Niffelem, K3, Dalaran, Flussnabel + ["0.72:0.29:0.62:0.36:0.52:0.38:0.52:0.34"] = 188, -- Dun Nifflelem, K3, Dalaran, Crusaders' Pinnacle + ["0.72:0.29:0.64:0.19:0.57:0.21:0.38:0.21"] = 246, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.72:0.29:0.73:0.25:0.60:0.25"] = 132, -- Dun Nifflelem, Camp Tunka'lo, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.72:0.29:0.62:0.36:0.60:0.25"] = 163, -- Dun Niffelem, K3, Absturzstelle Grom'ash + ["0.72:0.29:0.62:0.36:0.52:0.38:0.31:0.43"] = 309, -- Dun Nifflelem, K3, Dalaran, Warsong Camp + ["0.72:0.29:0.62:0.36:0.52:0.38:0.56:0.36"] = 181, -- Dun Nifflelem, K3, Dalaran, The Argent Vanguard + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55"] = 239, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold + ["0.72:0.29:0.78:0.38:0.84:0.51:0.95:0.63"] = 277, -- Dun Nifflelem, Zim'Torga, Camp Oneqwah, Vengeance Landing + ["0.72:0.29:0.64:0.19:0.60:0.25"] = 128, -- Dun Nifflelem, Ulduar, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.72:0.29:0.62:0.36:0.52:0.38:0.56:0.36:0.38:0.21"] = 328, -- Dun Nifflelem, K3, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.72:0.29:0.78:0.38:0.72:0.40"] = 142, -- Dun Nifflelem, Zim'Torga, The Argent Stand + ["0.72:0.29:0.73:0.25"] = 33, -- Dun Nifflelem, Camp Tunka'lo + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52"] = 222, -- Dun Niffelem, K3, Schwarze Wacht, Wyrmruhtempel + ["0.72:0.29:0.73:0.25:0.60:0.25:0.57:0.21:0.38:0.21"] = 282, -- Dun Nifflelem, Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault + ["0.72:0.29:0.64:0.19"] = 85, -- Dun Nifflelem, Ulduar + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42"] = 165, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 494, -- Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.72:0.29:0.62:0.36"] = 88, -- Dun Niffelem, K3 + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53"] = 458, -- Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.72:0.29:0.78:0.38:0.82:0.31"] = 143, -- Dun Nifflelem, Zim'Torga, Gundrak + ["0.72:0.29:0.64:0.19:0.57:0.21"] = 133, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58"] = 275, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.72:0.29:0.78:0.38:0.84:0.51:0.84:0.59"] = 220, -- Dun Nifflelem, Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.72:0.29:0.62:0.36:0.64:0.42:0.69:0.42"] = 176, -- Dun Nifflelem, K3, Ebon Watch, Light's Breach + ["0.72:0.29:0.62:0.36:0.52:0.38:0.31:0.43:0.28:0.28"] = 422, -- Dun Nifflelem, K3, Dalaran, Warsong Camp, Death's Rise + ["0.72:0.29:0.73:0.25:0.60:0.25:0.57:0.21"] = 169, -- Dun Nifflelem, Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.72:0.29:0.62:0.36:0.64:0.42:0.59:0.55"] = 229, -- Dun Nifflelem, K3, Ebon Watch, Venomspite + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.69:0.42"] = 416, -- Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard, Venomspite, Light's Breach + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 261, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.72:0.29:0.78:0.38:0.84:0.51:0.84:0.59:0.74:0.62:0.74:0.71"] = 330, -- Dun Nifflelem, Zim'Torga, Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Kamagua + ["0.72:0.29:0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38"] = 239, -- Dun Nifflelem, Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 273, -- Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.72:0.29:0.62:0.36:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 386, -- Dun Nifflelem, K3, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 573, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.72:0.29:0.62:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 394, -- Dun Niffelem, K3, Dalaran, Flussnabel, Nesingwarys Basislager + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 428, -- Дун Ниффелем, Зим'Торга, Серебряная застава, Черная застава, Даларан, Оплот Серебряного Авангарда, Мрачный Свод + ["0.72:0.29:0.78:0.38:0.84:0.51:0.84:0.59:0.74:0.62"] = 276, -- Dun Nifflelem, Zim'Torga, Camp Oneqwah, Camp Winterhoof, Apothecary Camp + ["0.72:0.29:0.62:0.36:0.52:0.38:0.52:0.34:0.38:0.21"] = 309, -- Dun Nifflelem, K3, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44"] = 221, -- Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard + ["0.72:0.29:0.78:0.38"] = 90, -- Dun Nifflelem, Zim'Torga + ["0.72:0.29:0.62:0.36:0.60:0.25:0.57:0.21:0.38:0.21"] = 313, -- Dun Nifflelem, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault + ["0.72:0.29:0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73"] = 299, -- Dun Nifflelem, Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.72:0.29:0.62:0.36:0.52:0.38:0.49:0.58"] = 308, -- Dun Nifflelem, K3, Dalaran, Moa'ki + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 467, -- Dun Niffelem, K3, Dalaran, Vorposten der Kor'kron, Agmars Hammer, Taunka'le, Kriegshymnenfeste + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 409, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.72:0.29:0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73:0.74:0.71"] = 373, -- Dun Nifflelem, Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand, Kamagua + ["0.72:0.29:0.62:0.36:0.52:0.38:0.54:0.52"] = 270, -- Dun Nifflelem, K3, Dalaran, Wyrmrest Temple + ["0.72:0.29:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55"] = 250, -- Dun Nifflelem, K3, Ebon Watch, Light's Breach, Conquest Hold + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 383, -- Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.72:0.29:0.62:0.36:0.52:0.38:0.24:0.40:0.18:0.47"] = 413, -- Dun Nifflelem, K3, Dalaran, River's Heart, Bor'gorok Outpost + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58:0.29:0.57"] = 405, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Moa'ki, Unu'pe + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 349, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.72:0.29:0.78:0.38:0.84:0.51"] = 172, -- Dun Nifflelem, Zim'Torga, Camp Oneqwah + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 284, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.72:0.29:0.64:0.19:0.57:0.21:0.38:0.21:0.28:0.28"] = 323, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.72:0.29:0.62:0.36:0.52:0.38:0.52:0.34:0.28:0.28"] = 354, -- Dun Nifflelem, K3, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.72:0.29:0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.34"] = 234, -- Dun Nifflelem, Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle + ["0.72:0.29:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62"] = 295, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp + ["0.72:0.29:0.62:0.36:0.60:0.40"] = 125, -- Dun Nifflelem, K3, Sunreaver's Command + ["0.72:0.29:0.73:0.25:0.60:0.25:0.56:0.36:0.52:0.38"] = 243, -- Dun Nifflelem, Camp Tunka'lo, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran + ["0.72:0.29:0.62:0.36:0.64:0.42"] = 131, -- Dun Nifflelem, K3, Ebon Watch + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 511, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.72:0.29:0.62:0.36:0.64:0.42:0.54:0.52:0.45:0.51"] = 290, -- Dun Nifflelem, K3, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.72:0.29:0.62:0.36:0.64:0.42:0.69:0.42:0.84:0.51"] = 281, -- Dun Nifflelem, K3, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.74:0.62:0.74:0.71"] = 461, -- Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard, Venomspite, Apothecary Camp, Kamagua + ["0.72:0.29:0.62:0.36:0.64:0.42:0.59:0.55:0.74:0.62:0.74:0.71"] = 382, -- Dun Nifflelem, K3, Ebon Watch, Venomspite, Apothecary Camp, Kamagua + ["0.72:0.29:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 360, -- Dun Nifflelem, K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 458, -- Dun Nifflelem, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.72:0.29:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 286, -- Dun Niffelem, Zim'Torga, Argentumwache, Schwarze Wacht, Dalaran, Kreuzfahrerturm + ["0.72:0.29:0.73:0.25:0.60:0.25:0.57:0.21:0.38:0.21:0.28:0.28"] = 359, -- Dun Nifflelem, Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.72:0.29:0.73:0.25:0.60:0.25:0.56:0.36:0.52:0.38:0.24:0.40"] = 442, -- Dun Nifflelem, Camp Tunka'lo, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, River's Heart + ["0.72:0.29:0.64:0.19:0.60:0.25:0.56:0.36:0.38:0.21"] = 354, -- Dun Nifflelem, Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, The Shadow Vault + ["0.72:0.29:0.64:0.19:0.57:0.21:0.49:0.21"] = 193, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.72:0.29:0.62:0.36:0.64:0.42:0.72:0.40"] = 195, -- Dun Nifflelem, K3, Ebon Watch, The Argent Stand + ["0.72:0.29:0.73:0.25:0.60:0.25:0.57:0.21:0.49:0.21"] = 229, -- Dun Nifflelem, Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.72:0.29:0.62:0.36:0.60:0.25:0.57:0.21"] = 200, -- Dun Nifflelem, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.72:0.29:0.62:0.36:0.52:0.38:0.49:0.21"] = 273, -- Dun Nifflelem, K3, Dalaran, Argent Tournament Grounds + ["0.72:0.29:0.64:0.19:0.57:0.21:0.49:0.21:0.52:0.38"] = 329, -- Dun Nifflelem, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds, Dalaran + + -- Horde: The Storm Peaks: Grom'arsh Crash-Site + ["0.60:0.25:0.56:0.36:0.52:0.38"] = 111, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran + ["0.60:0.25:0.62:0.36:0.52:0.38:0.24:0.40"] = 358, -- Grom'arsh Crash-Site, K3, Dalaran, River's Heart + ["0.60:0.25:0.62:0.36:0.52:0.38"] = 158, -- Grom'arsh Crash-Site, K3, Dalaran + ["0.60:0.25:0.73:0.25:0.72:0.29"] = 141, -- Grom'arsh Crash-Site, Camp Tunka'lo, Dun Nifflelem + ["0.60:0.25:0.64:0.19"] = 51, -- Point d'impact de Grom'arsh, Ulduar + ["0.60:0.25:0.56:0.36:0.52:0.38:0.49:0.58"] = 259, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Moa'ki + ["0.60:0.25:0.62:0.36"] = 87, -- Grom'arsh Crash-Site, K3 + ["0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55"] = 249, -- Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold + ["0.60:0.25:0.73:0.25"] = 97, -- Grom'arsh Crash-Site, Camp Tunka'lo + ["0.60:0.25:0.64:0.19:0.72:0.29"] = 156, -- Grom'arsh Crash-Site, Ulduar, Dun Nifflelem + ["0.60:0.25:0.73:0.25:0.78:0.38:0.82:0.31"] = 248, -- Grom'arsh Crash-Site, Camp Tunka'lo, Zim'Torga, Gundrak + ["0.60:0.25:0.56:0.36:0.52:0.34"] = 107, -- Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle + ["0.60:0.25:0.57:0.21"] = 37, -- Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.60:0.25:0.56:0.36:0.52:0.38:0.24:0.40"] = 310, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, River's Heart + ["0.60:0.25:0.62:0.36:0.72:0.29"] = 187, -- Grom'arsh Crash-Site, K3, Dun Nifflelem + ["0.60:0.25:0.73:0.25:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 389, -- Grom'arsh Crash-Site, Camp Tunka'lo, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 306, -- Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.60:0.25:0.56:0.36"] = 81, -- Grom'arsh Crash-Site, The Argent Vanguard + ["0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 385, -- Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.60:0.25:0.56:0.36:0.52:0.34:0.31:0.43"] = 264, -- Absturzstelle Grom'ash, Die Argentumvorhut, Kreuzfahrerturm, Kriegshymnenlager + ["0.60:0.25:0.62:0.36:0.64:0.42:0.72:0.40"] = 195, -- Grom'arsh Crash-Site, K3, Ebon Watch, The Argent Stand + ["0.60:0.25:0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 376, -- Grom'arsh Crash-Site, Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.60:0.25:0.57:0.21:0.38:0.21"] = 150, -- Lugar del accidente de Grom'arsh, Refugio de Pedruscón, La Cámara de las Sombras + ["0.60:0.25:0.56:0.36:0.38:0.21"] = 226, -- Grom'arsh Crash-Site, The Argent Vanguard, The Shadow Vault + ["0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44"] = 171, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard + ["0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 445, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 359, -- Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.60:0.25:0.57:0.21:0.38:0.21:0.28:0.28"] = 227, -- Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.60:0.25:0.73:0.25:0.78:0.38:0.84:0.51:0.84:0.59"] = 325, -- Grom'arsh Crash-Site, Camp Tunka'lo, Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.60:0.25:0.64:0.19:0.78:0.38:0.82:0.31"] = 258, -- Grom'arsh Crash-Site, Ulduar, Zim'Torga, Gundrak + ["0.60:0.25:0.62:0.36:0.64:0.42:0.54:0.52"] = 221, -- Grom'arsh Crash-Site, K3, Ebon Watch, Wyrmrest Temple + ["0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 398, -- Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.60:0.25:0.73:0.25:0.78:0.38:0.84:0.51:0.95:0.63"] = 382, -- Grom'arsh Crash-Site, Camp Tunka'lo, Zim'Torga, Camp Oneqwah, Vengeance Landing + ["0.60:0.25:0.56:0.36:0.52:0.38:0.31:0.43"] = 260, -- Место крушения Гром'арша, Оплот Серебряного Авангарда, Даларан, Лагерь Песни Войны + ["0.60:0.25:0.62:0.36:0.52:0.38:0.54:0.52"] = 269, -- Grom'arsh Crash-Site, K3, Dalaran, Wyrmrest Temple + ["0.60:0.25:0.62:0.36:0.64:0.42"] = 131, -- Grom'arsh Crash-Site, K3, Ebon Watch + ["0.60:0.25:0.57:0.21:0.38:0.21:0.28:0.28:0.18:0.40"] = 345, -- Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault, Death's Rise, Nesingwary Base Camp + ["0.60:0.25:0.56:0.36:0.52:0.38:0.64:0.42"] = 176, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Ebon Watch + ["0.60:0.25:0.62:0.36:0.64:0.42:0.59:0.55"] = 229, -- Grom'arsh Crash-Site, K3, Ebon Watch, Venomspite + ["0.60:0.25:0.62:0.36:0.60:0.40"] = 125, -- Grom'arsh Crash-Site, K3, Sunreaver's Command + ["0.60:0.25:0.62:0.36:0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.59"] = 372, -- Grom'arsh Crash-Site, K3, Ebon Watch, Venomspite, Conquest Hold, Camp Winterhoof + ["0.60:0.25:0.56:0.36:0.52:0.34:0.31:0.43:0.29:0.54:0.15:0.57"] = 427, -- Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle, Warsong Camp, Taunka'le Village, Warsong Hold + ["0.60:0.25:0.57:0.21:0.49:0.21"] = 97, -- Grom'arsh Crash-Site, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.60:0.25:0.73:0.25:0.78:0.38:0.84:0.51"] = 276, -- Absturzstelle Grom'ash, Camp Tunka'lo, Zim'Torga, Camp Oneqwah + ["0.60:0.25:0.56:0.36:0.52:0.38:0.49:0.21"] = 224, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Argent Tournament Grounds + ["0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42"] = 175, -- Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach + ["0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 328, -- Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.60:0.25:0.56:0.36:0.52:0.34:0.49:0.21"] = 203, -- Absturzstelle Grom'ash, Die Argentumvorhut, Kreuzfahrerturm, Argentumturnierplatz + ["0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 224, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.60:0.25:0.62:0.36:0.64:0.42:0.59:0.55:0.70:0.55"] = 288, -- Grom'arsh Crash-Site, K3, Ebon Watch, Venomspite, Conquest Hold + ["0.60:0.25:0.56:0.36:0.52:0.34:0.31:0.43:0.29:0.54"] = 344, -- Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle, Warsong Camp, Taunka'le Village + ["0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51"] = 421, -- Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Oneqwah + ["0.60:0.25:0.56:0.36:0.52:0.34:0.31:0.43:0.29:0.54:0.17:0.53"] = 418, -- Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle, Warsong Camp, Taunka'le Village, Amber Ledge + ["0.60:0.25:0.57:0.21:0.38:0.21:0.31:0.43"] = 286, -- Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault, Warsong Camp + + -- Horde: The Storm Peaks: K3 + ["0.62:0.36:0.52:0.38"] = 72, -- K3, Dalaran + ["0.62:0.36:0.64:0.42:0.72:0.40"] = 107, -- K3, Ebon Watch, The Argent Stand + ["0.62:0.36:0.52:0.38:0.56:0.36"] = 94, -- K3, Dalaran, The Argent Vanguard + ["0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 272, -- K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.62:0.36:0.64:0.42:0.69:0.42"] = 89, -- K3, Ebon Watch, Light's Breach + ["0.62:0.36:0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 298, -- K3, Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.62:0.36:0.60:0.40"] = 38, -- K3, Sunreaver's Command + ["0.62:0.36:0.64:0.42:0.54:0.52"] = 134, -- K3, Ebon Watch, Wyrmrest Temple + ["0.62:0.36:0.64:0.42:0.59:0.55:0.45:0.51:0.29:0.54"] = 385, -- K3, Ebon Watch, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.62:0.36:0.72:0.29"] = 101, -- K3, Dun Nifflelem + ["0.62:0.36:0.73:0.25"] = 91, -- K3, Camp Tunka'lo + ["0.62:0.36:0.60:0.25:0.64:0.19"] = 127, -- K3, Grom'arsh Crash-Site, Ulduar + ["0.62:0.36:0.64:0.42"] = 44, -- K3, Ebon Watch + ["0.62:0.36:0.64:0.42:0.69:0.42:0.84:0.51"] = 193, -- K3, Ebon Watch, Light's Breach, Camp Oneqwah + ["0.62:0.36:0.52:0.38:0.31:0.43"] = 222, -- K3, Dalaran, Warsong Camp + ["0.62:0.36:0.52:0.38:0.24:0.40:0.28:0.28"] = 357, -- K3, Dalaran, River's Heart, Death's Rise + ["0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55"] = 163, -- K3, Ebon Watch, Light's Breach, Conquest Hold + ["0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47"] = 368, -- K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 406, -- K3, Dalaran, Vorposten der Kor'kron, Agmars Hammer, Taunka'le, Bernsteinflöz, Transitusschild + ["0.62:0.36:0.73:0.25:0.64:0.19"] = 163, -- K3, Camp Tunka'lo, Ulduar + ["0.62:0.36:0.52:0.38:0.52:0.34"] = 100, -- K3, Dalaran, Crusaders' Pinnacle + ["0.62:0.36:0.60:0.25:0.57:0.21"] = 112, -- K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.62:0.36:0.52:0.38:0.24:0.40"] = 272, -- K3, Dalaran, River's Heart + ["0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 185, -- K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.62:0.36:0.60:0.25"] = 76, -- K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.62:0.36:0.60:0.25:0.57:0.21:0.38:0.21"] = 226, -- K3, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault + ["0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 380, -- K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 219, -- K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.62:0.36:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 387, -- K3, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.62:0.36:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 241, -- K3, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.62:0.36:0.64:0.42:0.72:0.40:0.78:0.38"] = 148, -- K3, Ebon Watch, The Argent Stand, Zim'Torga + ["0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58"] = 187, -- K3, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.62:0.36:0.60:0.25:0.57:0.21:0.38:0.21:0.28:0.28"] = 302, -- K3, Grom'arsh Crash-Site, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 296, -- K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.62:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.70:0.55:0.84:0.51"] = 382, -- K3, Dalaran, Kor'koron Vanguard, Venomspite, Conquest Hold, Camp Oneqwah + ["0.62:0.36:0.52:0.38:0.48:0.44:0.59:0.55:0.85:0.73"] = 408, -- K3, Dalaran, Kor'koron Vanguard, Venomspite, New Agamand + ["0.62:0.36:0.52:0.38:0.52:0.34:0.38:0.21"] = 223, -- K3, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.62:0.36:0.52:0.38:0.48:0.44"] = 134, -- K3, Dalaran, Kor'koron Vanguard + ["0.62:0.36:0.52:0.38:0.24:0.40:0.18:0.40"] = 307, -- K3, Dalaran, River's Heart, Nesingwary Base Camp + ["0.62:0.36:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 201, -- K3, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.62:0.36:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 313, -- K3, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 310, -- K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.62:0.36:0.64:0.42:0.59:0.55"] = 142, -- K3, Ebon Watch, Venomspite + ["0.62:0.36:0.64:0.42:0.54:0.52:0.49:0.58:0.29:0.57"] = 318, -- K3, Ebon Watch, Wyrmrest Temple, Moa'ki, Unu'pe + ["0.62:0.36:0.52:0.38:0.24:0.40:0.18:0.47"] = 326, -- K3, Dalaran, River's Heart, Bor'gorok Outpost + ["0.62:0.36:0.52:0.38:0.54:0.52"] = 183, -- K3, Dalaran, Wyrmruhtempel + ["0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.29:0.57"] = 325, -- K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Unu'pe + ["0.62:0.36:0.52:0.38:0.52:0.34:0.28:0.28"] = 267, -- K3, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53"] = 371, -- K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.62:0.36:0.73:0.25:0.64:0.19:0.57:0.21"] = 212, -- K3, Camp Tunka'lo, Ulduar, Bouldercrag's Refuge + ["0.62:0.36:0.64:0.42:0.59:0.55:0.74:0.62"] = 240, -- K3, Ebon Watch, Venomspite, Apothecary Camp + ["0.62:0.36:0.52:0.38:0.54:0.52:0.45:0.51"] = 249, -- K3, Dalaran, Wyrmrest Temple, Agmar's Hammer + ["0.62:0.36:0.52:0.38:0.54:0.52:0.59:0.55:0.70:0.55"] = 289, -- K3, Dalaran, Wyrmrest Temple, Venomspite, Conquest Hold + ["0.62:0.36:0.60:0.25:0.57:0.21:0.49:0.21"] = 173, -- K3, Grom'arsh Crash-Site, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.62:0.36:0.64:0.42:0.59:0.55:0.70:0.55"] = 201, -- K3, Ebon Watch, Venomspite, Conquest Hold + ["0.62:0.36:0.73:0.25:0.78:0.38:0.84:0.51:0.84:0.59"] = 319, -- K3, Camp Tunka'lo, Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.62:0.36:0.52:0.38:0.56:0.36:0.38:0.21"] = 240, -- K3, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.62:0.36:0.52:0.38:0.49:0.21:0.57:0.21"] = 233, -- K3, Dalaran, Argent Tournament Grounds, Bouldercrag's Refuge + ["0.62:0.36:0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.59"] = 285, -- K3, Ebon Watch, Venomspite, Conquest Hold, Camp Winterhoof + + -- Horde: The Storm Peaks: Ulduar + ["0.64:0.19:0.73:0.25"] = 88, -- Ulduar, Camp Tunka'lo + ["0.64:0.19:0.78:0.38:0.82:0.31"] = 207, -- Ulduar, Zim'Torga, Gundrak + ["0.64:0.19:0.60:0.25"] = 44, -- Ulduar, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.64:0.19:0.60:0.25:0.56:0.36"] = 124, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard + ["0.64:0.19:0.60:0.25:0.62:0.36:0.52:0.38"] = 201, -- Ulduar, Grom'arsh Crash-Site, K3, Dalaran + ["0.64:0.19:0.72:0.29"] = 105, -- Ulduar, Dun Nifflelem + ["0.64:0.19:0.60:0.25:0.62:0.36"] = 130, -- Ulduar, Grom'arsh Crash-Site, K3 + ["0.64:0.19:0.78:0.38"] = 153, -- Ulduar, Zim'Torga + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.59:0.55"] = 272, -- Ulduar, Grom'arsh Crash-Site, K3, Ebon Watch, Venomspite + ["0.64:0.19:0.57:0.21:0.38:0.21"] = 161, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 599, -- Ulduar, Zim'Torga, Argentumwache, Schwarze Wacht, Wyrmruhtempel, Agmars + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38"] = 154, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran + ["0.64:0.19:0.57:0.21"] = 49, -- Ulduar, Bouldercrag's Refuge + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.24:0.40"] = 354, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, River's Heart + ["0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59:0.74:0.62"] = 340, -- Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof, Apothecary Camp + ["0.64:0.19:0.57:0.21:0.38:0.21:0.28:0.28:0.18:0.40"] = 356, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault, Death's Rise, Nesingwary Base Camp + ["0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59"] = 284, -- Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73"] = 363, -- Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.64:0.19:0.73:0.25:0.62:0.36"] = 202, -- Ulduar, Camp Tunka'lo, K3 + ["0.64:0.19:0.72:0.29:0.62:0.36:0.52:0.38"] = 262, -- Ulduar, Dun Nifflelem, K3, Dalaran + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44"] = 215, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard + ["0.64:0.19:0.57:0.21:0.38:0.21:0.52:0.34"] = 282, -- Ульдуар, Приют Глыбоскала, Мрачный Свод, Вершина Рыцарей + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42"] = 258, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55"] = 350, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Venomspite + ["0.64:0.19:0.78:0.38:0.84:0.51"] = 236, -- Ulduar, Zim'Torga, Camp Oneqwah + ["0.64:0.19:0.72:0.29:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 376, -- Ulduar, Dun Nifflelem, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 325, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 523, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42"] = 174, -- Ulduar, Absturzstelle Grom'ash, K3, Schwarze Wacht + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.34"] = 150, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle + ["0.64:0.19:0.57:0.21:0.38:0.21:0.31:0.43"] = 298, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault, Warsong Camp + ["0.64:0.19:0.73:0.25:0.62:0.36:0.52:0.38"] = 273, -- Ulduar, Camp Tunka'lo, K3, Dalaran + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 413, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36"] = 298, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, K3 + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42"] = 218, -- Ulduar, Lugar del accidente de Grom'arsh, K3, Puesto de Vigilancia de Ébano, Brecha de la Luz + ["0.64:0.19:0.78:0.38:0.72:0.40"] = 206, -- Ulduar, Zim'Torga, The Argent Stand + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55"] = 303, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold + ["0.64:0.19:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 558, -- Ulduar, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.64:0.19:0.78:0.38:0.84:0.51:0.95:0.63"] = 341, -- Ulduar, Zim'Torga, Camp Oneqwah, Vengeance Landing + ["0.64:0.19:0.60:0.25:0.62:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 315, -- Ulduar, Grom'arsh Crash-Site, K3, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.54:0.52"] = 265, -- Ulduar, Point d'impact de Grom'arsh, K3, Guet d'Ébène, Temple du Repos du ver + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 349, -- Ulduar, Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51"] = 266, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer + ["0.64:0.19:0.60:0.25:0.62:0.36:0.52:0.38:0.52:0.34:0.28:0.28"] = 397, -- Ulduar, Grom'arsh Crash-Site, K3, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38"] = 498, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Dalaran + ["0.64:0.19:0.57:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.29:0.57"] = 406, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault, Warsong Camp, Taunka'le Village, Unu'pe + ["0.64:0.19:0.57:0.21:0.38:0.21:0.28:0.28:0.18:0.40:0.18:0.47"] = 417, -- 울두아르 (폭풍우 봉우리), 바울더크랙의 은거처 (폭풍우 봉우리), 어둠의 무기고 (얼음왕관), 죽음의 마루 (얼음왕관), 네싱워리 주둔지 (숄라자르 분지), 보르고로크 전초기지 (북풍의 땅), 보르고로크 전초기지 (북풍의 땅) + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.31:0.43"] = 304, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Warsong Camp + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55"] = 292, -- Ulduar, Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold + ["0.64:0.19:0.60:0.25:0.56:0.36:0.38:0.21"] = 270, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, The Shadow Vault + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42"] = 230, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach + ["0.64:0.19:0.57:0.21:0.38:0.21:0.28:0.28:0.24:0.40"] = 355, -- Ulduar, Bergfels' Zuflucht, Das Schattengewölbe, Todesanhöhe, Flussnabel + ["0.64:0.19:0.78:0.38:0.84:0.51:0.84:0.59:0.74:0.62:0.74:0.71"] = 394, -- Ulduar, Zim'Torga, Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Kamagua + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.54:0.52:0.45:0.51"] = 332, -- Ulduar, Grom'arsh Crash-Site, K3, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.64:0.19:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62"] = 359, -- Ulduar, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 488, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.34:0.28:0.28"] = 317, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Crusaders' Pinnacle, Death's Rise + ["0.64:0.19:0.57:0.21:0.49:0.21"] = 109, -- Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.64:0.19:0.57:0.21:0.38:0.21:0.28:0.28"] = 239, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault, Death's Rise + ["0.64:0.19:0.57:0.21:0.49:0.21:0.52:0.38"] = 245, -- Ulduar, Refuge de Rochecombe, Enceinte du tournoi d'Argent, Dalaran + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.45:0.51:0.29:0.54"] = 377, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.64:0.19:0.60:0.25:0.62:0.36:0.52:0.38:0.24:0.40"] = 402, -- Ulduar, Grom'arsh Crash-Site, K3, Dalaran, River's Heart + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59"] = 377, -- Ulduar, Grom'arsh Crash-Site, K3, Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.49:0.58"] = 302, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Moa'ki + ["0.64:0.19:0.57:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.17:0.53:0.12:0.53"] = 488, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault, Warsong Camp, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.64:0.19:0.60:0.25:0.62:0.36:0.52:0.38:0.31:0.43"] = 352, -- Ulduar, Grom'arsh Crash-Site, K3, Dalaran, Warsong Camp + ["0.64:0.19:0.60:0.25:0.62:0.36:0.64:0.42:0.72:0.40"] = 237, -- Ulduar, Grom'arsh Crash-Site, K3, Ebon Watch, The Argent Stand + ["0.64:0.19:0.60:0.25:0.62:0.36:0.52:0.38:0.48:0.44"] = 263, -- Ulduar, Grom'arsh Crash-Site, K3, Dalaran, Kor'koron Vanguard + ["0.64:0.19:0.60:0.25:0.56:0.36:0.52:0.38:0.48:0.44:0.59:0.55"] = 304, -- Ulduar, Grom'arsh Crash-Site, The Argent Vanguard, Dalaran, Kor'koron Vanguard, Venomspite + ["0.64:0.19:0.57:0.21:0.38:0.21:0.31:0.43:0.29:0.54:0.15:0.57"] = 461, -- Ulduar, Bouldercrag's Refuge, The Shadow Vault, Warsong Camp, Taunka'le Village, Warsong Hold + + ---------------------------------------------------------------------- + -- Horde: Wintergrasp + ---------------------------------------------------------------------- + + -- Horde: Wintergrasp: Warsong Camp + ["0.31:0.43:0.24:0.40"] = 77, -- Warsong Camp, River's Heart + ["0.31:0.43:0.29:0.54"] = 81, -- Warsong Camp, Taunka'le Village + ["0.31:0.43:0.52:0.38"] = 141, -- Warsong Camp, Dalaran + ["0.31:0.43:0.24:0.40:0.18:0.47"] = 131, -- Warsong Camp, River's Heart, Bor'gorok Outpost + ["0.31:0.43:0.29:0.54:0.29:0.57"] = 109, -- Warsong Camp, Taunka'le Village, Unu'pe + ["0.31:0.43:0.29:0.54:0.17:0.53:0.12:0.53"] = 191, -- Warsong Camp, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.31:0.43:0.45:0.51:0.59:0.55:0.85:0.73"] = 371, -- Warsong Camp, Agmar's Hammer, Venomspite, New Agamand + ["0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 401, -- Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.31:0.43:0.45:0.51:0.49:0.58"] = 161, -- Warsong Camp, Agmar's Hammer, Moa'ki + ["0.31:0.43:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 365, -- Warsong Camp, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.31:0.43:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38"] = 312, -- Warsong Camp, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga + ["0.31:0.43:0.45:0.51"] = 101, -- Warsong Camp, Agmar's Hammer + ["0.31:0.43:0.29:0.54:0.18:0.47"] = 152, -- Warsong Camp, Taunka'le Village, Bor'gorok Outpost + ["0.31:0.43:0.52:0.38:0.56:0.36"] = 163, -- Warsong Camp, Dalaran, The Argent Vanguard + ["0.31:0.43:0.29:0.54:0.15:0.57"] = 164, -- Warsong Camp, Taunka'le Village, Warsong Hold + ["0.31:0.43:0.52:0.38:0.62:0.36:0.72:0.29"] = 287, -- Warsong Camp, Dalaran, K3, Dun Nifflelem + ["0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55"] = 243, -- Kriegshymnenlager, Agmars Hammer, Gallgrimm, Burg Siegeswall + ["0.31:0.43:0.29:0.54:0.17:0.53"] = 155, -- Warsong Camp, Taunka'le Village, Amber Ledge + ["0.31:0.43:0.52:0.38:0.62:0.36"] = 186, -- Warsong Camp, Dalaran, K3 + ["0.31:0.43:0.45:0.51:0.54:0.52"] = 149, -- Warsong Camp, Agmar's Hammer, Wyrmrest Temple + ["0.31:0.43:0.52:0.38:0.62:0.36:0.73:0.25"] = 277, -- Warsong Camp, Dalaran, K3, Camp Tunka'lo + ["0.31:0.43:0.52:0.38:0.64:0.42:0.69:0.42"] = 252, -- Warsong Camp, Dalaran, Ebon Watch, Light's Breach + ["0.31:0.43:0.38:0.21"] = 164, -- Warsong Camp, The Shadow Vault + ["0.31:0.43:0.52:0.38:0.62:0.36:0.60:0.25:0.64:0.19"] = 312, -- Warsong Camp, Dalaran, K3, Grom'arsh Crash-Site, Ulduar + ["0.31:0.43:0.24:0.40:0.18:0.40"] = 112, -- Warsong Camp, River's Heart, Nesingwary Base Camp + ["0.31:0.43:0.52:0.38:0.64:0.42"] = 208, -- Warsong Camp, Dalaran, Ebon Watch + ["0.31:0.43:0.52:0.34"] = 160, -- Kriegshymnenlager, Kreuzfahrerturm + ["0.31:0.43:0.52:0.38:0.54:0.52:0.59:0.55:0.74:0.62"] = 399, -- Warsong Camp, Dalaran, Wyrmrest Temple, Venomspite, Apothecary Camp + ["0.31:0.43:0.28:0.28"] = 113, -- Warsong Camp, Death's Rise + ["0.31:0.43:0.52:0.38:0.60:0.40"] = 188, -- Warsong Camp, Dalaran, Sunreaver's Command + ["0.31:0.43:0.52:0.38:0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 405, -- Warsong Camp, Dalaran, Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.31:0.43:0.45:0.51:0.49:0.58:0.74:0.71"] = 344, -- Warsong Camp, Agmar's Hammer, Moa'ki, Kamagua + ["0.31:0.43:0.45:0.51:0.48:0.44"] = 162, -- Warsong Camp, Agmar's Hammer, Kor'koron Vanguard + ["0.31:0.43:0.45:0.51:0.59:0.55"] = 186, -- Warsong Camp, Agmar's Hammer, Venomspite + ["0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.59"] = 328, -- Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold, Camp Winterhoof + ["0.31:0.43:0.52:0.38:0.64:0.42:0.72:0.40"] = 271, -- Warsong Camp, Dalaran, Ebon Watch, The Argent Stand + ["0.31:0.43:0.45:0.51:0.59:0.55:0.74:0.62"] = 283, -- Camp chanteguerre, Marteau d'Agmar, Vexevenin, Camp des Apothicaires + ["0.31:0.43:0.52:0.38:0.62:0.36:0.60:0.25"] = 262, -- Kriegshymnenlager, Dalaran, K3, Absturzstelle Grom'ash + ["0.31:0.43:0.38:0.21:0.49:0.21"] = 240, -- Warsong Camp, The Shadow Vault, Argent Tournament Grounds + ["0.31:0.43:0.45:0.51:0.59:0.55:0.70:0.55:0.84:0.51"] = 345, -- Warsong Camp, Agmar's Hammer, Venomspite, Conquest Hold, Camp Oneqwah + ["0.31:0.43:0.52:0.38:0.49:0.21"] = 255, -- Warsong Camp, Dalaran, Argent Tournament Grounds + ["0.31:0.43:0.52:0.38:0.56:0.36:0.60:0.25:0.64:0.19"] = 317, -- Warsong Camp, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Ulduar + ["0.31:0.43:0.45:0.51:0.59:0.55:0.74:0.62:0.74:0.71"] = 337, -- Warsong Camp, Agmar's Hammer, Venomspite, Apothecary Camp, Kamagua + ["0.31:0.43:0.52:0.38:0.64:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 396, -- Warsong Camp, Dalaran, Ebon Watch, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.31:0.43:0.38:0.21:0.57:0.21"] = 285, -- Warsong Camp, The Shadow Vault, Bouldercrag's Refuge + + ---------------------------------------------------------------------- + -- Horde: Zul'Drak + ---------------------------------------------------------------------- + + -- Horde: Zul'Drak: The Argent Stand + ["0.72:0.40:0.69:0.42"] = 25, -- The Argent Stand, Light's Breach + ["0.72:0.40:0.78:0.38"] = 42, -- The Argent Stand, Zim'Torga + ["0.72:0.40:0.78:0.38:0.82:0.31"] = 95, -- The Argent Stand, Zim'Torga, Gundrak + ["0.72:0.40:0.64:0.42"] = 53, -- The Argent Stand, Ebon Watch + ["0.72:0.40:0.64:0.42:0.52:0.38"] = 120, -- The Argent Stand, Ebon Watch, Dalaran + ["0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 141, -- The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.72:0.40:0.84:0.51:0.84:0.59"] = 148, -- The Argent Stand, Camp Oneqwah, Camp Winterhoof + ["0.72:0.40:0.84:0.51"] = 100, -- The Argent Stand, Camp Oneqwah + ["0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51"] = 212, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.72:0.40:0.84:0.51:0.95:0.63"] = 205, -- The Argent Stand, Camp Oneqwah, Vengeance Landing + ["0.72:0.40:0.84:0.51:0.70:0.55"] = 195, -- The Argent Stand, Camp Oneqwah, Conquest Hold + ["0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52"] = 196, -- The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple + ["0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 406, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.72:0.40:0.69:0.42:0.70:0.55"] = 98, -- The Argent Stand, Light's Breach, Conquest Hold + ["0.72:0.40:0.69:0.42:0.59:0.55"] = 145, -- The Argent Stand, Light's Breach, Venomspite + ["0.72:0.40:0.64:0.42:0.48:0.44:0.45:0.51"] = 213, -- The Argent Stand, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer + ["0.72:0.40:0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 596, -- The Argent Stand, Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 268, -- Le séjour d'Argent, Guet d'Ébène, Dalaran, Cime des Croisés, Le caveau des Ombres + ["0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38"] = 293, -- The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Dalaran + ["0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 208, -- The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.72:0.40:0.64:0.42:0.54:0.52"] = 144, -- The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 394, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.72:0.40:0.64:0.42:0.62:0.36"] = 94, -- The Argent Stand, Ebon Watch, K3 + ["0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 146, -- The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.72:0.40:0.84:0.51:0.95:0.63:0.85:0.73:0.74:0.71"] = 366, -- The Argent Stand, Camp Oneqwah, Vengeance Landing, New Agamand, Kamagua + ["0.72:0.40:0.69:0.42:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 445, -- The Argent Stand, Light's Breach, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.72:0.40:0.64:0.42:0.60:0.40"] = 79, -- The Argent Stand, Ebon Watch, Sunreaver's Command + ["0.72:0.40:0.78:0.38:0.72:0.29"] = 127, -- The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.72:0.40:0.64:0.42:0.48:0.44"] = 160, -- The Argent Stand, Ebon Watch, Kor'koron Vanguard + ["0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 318, -- The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.72:0.40:0.64:0.42:0.62:0.36:0.72:0.29"] = 194, -- Argentumwache, Schwarze Wacht, K3, Dun Niffelem + ["0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.31:0.43"] = 325, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Warsong Camp + ["0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51"] = 266, -- The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.72:0.40:0.64:0.42:0.62:0.36:0.60:0.25"] = 168, -- The Argent Stand, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.72:0.40:0.64:0.42:0.52:0.38:0.31:0.43"] = 267, -- Argentumwache, Schwarze Wacht, Dalaran, Kriegshymnenlager + ["0.72:0.40:0.84:0.51:0.84:0.59:0.74:0.62"] = 205, -- The Argent Stand, Camp Oneqwah, Camp Winterhoof, Apothecary Camp + ["0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62"] = 155, -- The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp + ["0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58"] = 196, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.72:0.40:0.78:0.38:0.64:0.19:0.57:0.21"] = 243, -- The Argent Stand, Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.72:0.40:0.78:0.38:0.73:0.25"] = 128, -- The Argent Stand, Zim'Torga, Camp Tunka'lo + ["0.72:0.40:0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.45:0.51"] = 402, -- The Argent Stand, Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.60:0.25"] = 243, -- The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 486, -- The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.72:0.40:0.69:0.42:0.59:0.55:0.49:0.58:0.52:0.38"] = 348, -- The Argent Stand, Light's Breach, Venomspite, Moa'ki, Dalaran + ["0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 461, -- The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 353, -- The Argent Stand, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.72:0.40:0.69:0.42:0.59:0.55:0.45:0.51"] = 277, -- The Argent Stand, Light's Breach, Venomspite, Agmar's Hammer + ["0.72:0.40:0.64:0.42:0.48:0.44:0.45:0.51:0.29:0.54:0.18:0.47"] = 395, -- The Argent Stand, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58:0.29:0.57"] = 327, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki, Unu'pe + ["0.72:0.40:0.84:0.51:0.70:0.55:0.59:0.55"] = 282, -- The Argent Stand, Camp Oneqwah, Conquest Hold, Venomspite + ["0.72:0.40:0.78:0.38:0.64:0.19"] = 195, -- The Argent Stand, Zim'Torga, Ulduar + ["0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.48:0.44"] = 262, -- The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 322, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 288, -- The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.72:0.40:0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38"] = 429, -- The Argent Stand, Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran + ["0.72:0.40:0.84:0.51:0.84:0.59:0.85:0.73"] = 227, -- The Argent Stand, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 397, -- The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.72:0.40:0.69:0.42:0.59:0.55:0.48:0.44:0.52:0.38"] = 320, -- The Argent Stand, Light's Breach, Venomspite, Kor'koron Vanguard, Dalaran + ["0.72:0.40:0.84:0.51:0.84:0.59:0.85:0.73:0.74:0.71"] = 300, -- The Argent Stand, Camp Oneqwah, Camp Winterhoof, New Agamand, Kamagua + ["0.72:0.40:0.69:0.42:0.70:0.55:0.84:0.59"] = 182, -- The Argent Stand, Light's Breach, Conquest Hold, Camp Winterhoof + ["0.72:0.40:0.64:0.42:0.59:0.55"] = 152, -- The Argent Stand, Ebon Watch, Venomspite + ["0.72:0.40:0.64:0.42:0.48:0.44:0.45:0.51:0.29:0.54:0.15:0.57"] = 408, -- The Argent Stand, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 432, -- Argentumwache, Schwarze Wacht, Wyrmruhtempel, Agmars Hammer, Taunka'le, Bernsteinflöz, Transitusschild + ["0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 313, -- Серебряная застава, Черная застава, Даларан, Вершина Рыцарей, Уступ Смерти + ["0.72:0.40:0.69:0.42:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47"] = 451, -- The Argent Stand, Light's Breach, Venomspite, Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.72:0.40:0.69:0.42:0.59:0.55:0.74:0.62:0.74:0.71"] = 296, -- The Argent Stand, Light's Breach, Venomspite, Apothecary Camp, Kamagua + ["0.72:0.40:0.64:0.42:0.52:0.38:0.49:0.21"] = 233, -- The Argent Stand, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.72:0.40:0.69:0.42:0.59:0.55:0.74:0.62:0.84:0.59:0.95:0.63"] = 376, -- The Argent Stand, Light's Breach, Venomspite, Apothecary Camp, Camp Winterhoof, Vengeance Landing + ["0.72:0.40:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 219, -- The Argent Stand, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.72:0.40:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 205, -- The Argent Stand, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21:0.28:0.28"] = 364, -- Argentumwache, Schwarze Wacht, Dalaran, Die Argentumvorhut, Das Schattengewölbe, Todesanhöhe + ["0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38:0.56:0.36:0.38:0.21"] = 461, -- The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Dalaran, The Argent Vanguard, The Shadow Vault + + -- Horde: Zul'Drak: Ebon Watch + ["0.64:0.42:0.69:0.42"] = 45, -- Ebon Watch, Light's Breach + ["0.64:0.42:0.72:0.40"] = 65, -- Ebon Watch, The Argent Stand + ["0.64:0.42:0.72:0.40:0.78:0.38"] = 105, -- Ebon Watch, The Argent Stand, Zim'Torga + ["0.64:0.42:0.52:0.38"] = 68, -- Ebon Watch, Dalaran (Andrew McIlwrath reported 35) + ["0.64:0.42:0.62:0.36"] = 41, -- Ebon Watch, K3 + ["0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62"] = 175, -- Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp + ["0.64:0.42:0.52:0.38:0.56:0.36"] = 89, -- Ebon Watch, Dalaran, The Argent Vanguard + ["0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.59"] = 242, -- Ebon Watch, Venomspite, Conquest Hold, Camp Winterhoof + ["0.64:0.42:0.59:0.55:0.70:0.55:0.84:0.59:0.95:0.63"] = 316, -- Ebon Watch, Venomspite, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.64:0.42:0.54:0.52:0.45:0.51"] = 159, -- Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.64:0.42:0.59:0.55"] = 99, -- Ebon Watch, Venomspite + ["0.64:0.42:0.54:0.52"] = 91, -- Ebon Watch, Wyrmrest Temple + ["0.64:0.42:0.59:0.55:0.85:0.73:0.84:0.59"] = 363, -- Ebon Watch, Venomspite, New Agamand, Camp Winterhoof + ["0.64:0.42:0.48:0.44"] = 108, -- Ebon Watch, Kor'koron Vanguard + ["0.64:0.42:0.69:0.42:0.84:0.51:0.95:0.63"] = 255, -- Ebon Watch, Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.64:0.42:0.60:0.40"] = 27, -- Ebon Watch, Sunreaver's Command + ["0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 381, -- Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.64:0.42:0.69:0.42:0.70:0.55"] = 119, -- Ebon Watch, Light's Breach, Conquest Hold + ["0.64:0.42:0.48:0.44:0.45:0.51"] = 160, -- Ebon Watch, Kor'koron Vanguard, Agmar's Hammer + ["0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 301, -- Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.64:0.42:0.54:0.52:0.49:0.58"] = 143, -- Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 341, -- Schwarze Wacht, Wyrmruhtempel, Agmars Hammer, Taunka'le, Bor'goroks Außenposten + ["0.64:0.42:0.69:0.42:0.84:0.51"] = 150, -- Черная застава, Разлом Света, Лагерь Уанква + ["0.64:0.42:0.59:0.55:0.74:0.62"] = 196, -- Ebon Watch, Venomspite, Apothecary Camp + ["0.64:0.42:0.69:0.42:0.84:0.51:0.84:0.59"] = 198, -- Ebon Watch, Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.64:0.42:0.62:0.36:0.72:0.29"] = 141, -- Ebon Watch, K3, Dun Nifflelem + ["0.64:0.42:0.59:0.55:0.70:0.55"] = 158, -- Schwarze Wacht, Gallgrimm, Burg Siegeswall + ["0.64:0.42:0.59:0.55:0.45:0.51"] = 232, -- Ebon Watch, Venomspite, Agmar's Hammer + ["0.64:0.42:0.54:0.52:0.49:0.58:0.29:0.57"] = 275, -- Ebon Watch, Wyrmrest Temple, Moa'ki, Unu'pe + ["0.64:0.42:0.62:0.36:0.73:0.25"] = 131, -- Ebon Watch, K3, Camp Tunka'lo + ["0.64:0.42:0.52:0.38:0.24:0.40"] = 266, -- Ebon Watch, Dalaran, River's Heart + ["0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 354, -- Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 270, -- Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 167, -- Черная застава, К-3, Место крушения Гром'арша, Ульдуар + ["0.64:0.42:0.59:0.55:0.85:0.73"] = 285, -- Ebon Watch, Venomspite, New Agamand + ["0.64:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 158, -- Ebon Watch, The Argent Stand, Zim'Torga, Gundrak + ["0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 267, -- Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.64:0.42:0.69:0.42:0.70:0.55:0.84:0.59"] = 203, -- Ebon Watch, Light's Breach, Conquest Hold, Camp Winterhoof + ["0.64:0.42:0.52:0.38:0.31:0.43"] = 215, -- Ebon Watch, Dalaran, Warsong Camp + ["0.64:0.42:0.52:0.38:0.52:0.34"] = 94, -- Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.64:0.42:0.62:0.36:0.60:0.25"] = 116, -- Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 344, -- Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.64:0.42:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 229, -- Ebon Watch, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.64:0.42:0.59:0.55:0.85:0.73:0.74:0.71"] = 360, -- Ebon Watch, Venomspite, New Agamand, Kamagua + ["0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 216, -- Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.64:0.42:0.52:0.38:0.49:0.21"] = 181, -- Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 261, -- Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.64:0.42:0.52:0.38:0.56:0.36:0.60:0.25"] = 190, -- Ebon Watch, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 153, -- Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + + -- Horde: Zul'Drak: Gundrak + ["0.82:0.31:0.78:0.38"] = 56, -- Gundrak, Zim'Torga + ["0.82:0.31:0.78:0.38:0.72:0.40"] = 109, -- Gundrak, Zim'Torga, The Argent Stand + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 227, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.82:0.31:0.78:0.38:0.84:0.51"] = 138, -- Gundrak, Zim'Torga, Camp Oneqwah + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.60:0.40"] = 187, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Sunreaver's Command + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42"] = 132, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 430, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58:0.29:0.57"] = 434, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki, Unu'pe + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.31:0.43"] = 374, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Warsong Camp + ["0.82:0.31:0.78:0.38:0.84:0.51:0.95:0.63"] = 244, -- Gundrak, Zim'Torga, Camp Oneqwah, Vengeance Landing + ["0.82:0.31:0.78:0.38:0.64:0.19"] = 210, -- Gundrak, Zim'Torga, Ulduar + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.45:0.51:0.29:0.54"] = 495, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Agmar's Hammer, Taunka'le Village + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55"] = 206, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.48:0.44:0.52:0.38"] = 428, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Kor'koron Vanguard, Dalaran + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 251, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42"] = 160, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58"] = 303, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52"] = 304, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.59:0.55:0.85:0.73:0.84:0.59"] = 522, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Venomspite, New Agamand, Camp Winterhoof + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.48:0.44"] = 268, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Kor'koron Vanguard + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 501, -- Gundrak, Zim'Torga, El Confín Argenta, Puesto de Vigilancia de Ébano, Templo del Reposo del Dragón, Martillo de Agmar, Poblado Taunka'le, Avanzada Bor'gorok + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 426, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 315, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36"] = 201, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, K3 + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 460, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 249, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.82:0.31:0.78:0.38:0.73:0.25:0.60:0.25:0.57:0.21"] = 278, -- Gundrak, Zim'Torga, Camp Tunka'lo, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55"] = 252, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Venomspite + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51"] = 319, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.82:0.31:0.78:0.38:0.84:0.51:0.70:0.55"] = 234, -- Gundrak, Zim'Torga, Camp Oneqwah, Conquest Hold + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 540, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge, Transitus Shield + ["0.82:0.31:0.78:0.38:0.84:0.51:0.84:0.59"] = 186, -- Gundrak, Zim'Torga, Camp Oneqwah, Lager der Winterhufe + ["0.82:0.31:0.78:0.38:0.64:0.19:0.57:0.21:0.38:0.21"] = 371, -- Gundrak, Zim'Torga, Ulduar, Bouldercrag's Refuge, The Shadow Vault + ["0.82:0.31:0.78:0.38:0.73:0.25"] = 142, -- Gundrak, Zim'Torga, Camp Tunka'lo + ["0.82:0.31:0.78:0.38:0.84:0.51:0.84:0.59:0.74:0.62:0.74:0.71"] = 296, -- Gundrak, Zim'Torga, Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Kamagua + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 504, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 555, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 253, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 513, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36"] = 444, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Dalaran, K3 + ["0.82:0.31:0.78:0.38:0.72:0.29"] = 140, -- Gundrak, Zim'Torga, Dun Niffelem + ["0.82:0.31:0.78:0.38:0.73:0.25:0.60:0.25"] = 241, -- Gundrak, Zim'Torga, Camp Tunka'lo, Absturzstelle Grom'ash + ["0.82:0.31:0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73"] = 265, -- Gundrak, Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.82:0.31:0.78:0.38:0.64:0.19:0.60:0.25"] = 253, -- Gundrak, Zim'Torga, Ulduar, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.82:0.31:0.78:0.38:0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38"] = 467, -- Gundrak, Zim'Torga, Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36:0.38:0.21"] = 395, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard, The Shadow Vault + ["0.82:0.31:0.78:0.38:0.84:0.51:0.95:0.63:0.85:0.73"] = 329, -- Gundrak, Zim'Torga, Camp Oneqwah, Vengeance Landing, New Agamand + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51"] = 373, -- Gundrak, Zim'Torga, Argentumwache, Lichtbresche, Gallgrimm, Wyrmruhtempel, Agmars Hammer + ["0.82:0.31:0.78:0.38:0.72:0.29:0.62:0.36:0.52:0.38"] = 299, -- Gundrak, Zim'Torga, Dun Nifflelem, K3, Dalaran + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.48:0.44:0.45:0.51:0.29:0.54:0.17:0.53"] = 506, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 420, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62"] = 262, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp + ["0.82:0.31:0.78:0.38:0.64:0.19:0.57:0.21:0.49:0.21"] = 318, -- Gundrak, Zim'Torga, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.82:0.31:0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38:0.24:0.40"] = 599, -- Gundrak, Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Dalaran, River's Heart + ["0.82:0.31:0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 376, -- Gundrak, Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + + -- Horde: Zul'Drak: Light's Breach + ["0.69:0.42:0.64:0.42"] = 41, -- Light's Breach, Ebon Watch + ["0.69:0.42:0.70:0.55"] = 75, -- Light's Breach, Conquest Hold + ["0.69:0.42:0.72:0.40"] = 44, -- Light's Breach, The Argent Stand + ["0.69:0.42:0.64:0.42:0.52:0.38"] = 107, -- Light's Breach, Ebon Watch, Dalaran + ["0.69:0.42:0.64:0.42:0.54:0.52:0.49:0.58"] = 183, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.69:0.42:0.64:0.42:0.54:0.52:0.49:0.58:0.29:0.57"] = 314, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Moa'ki, Unu'pe + ["0.69:0.42:0.64:0.42:0.54:0.52:0.49:0.58:0.74:0.71"] = 366, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Moa'ki, Kamagua + ["0.69:0.42:0.59:0.55"] = 122, -- Light's Breach, Venomspite + ["0.69:0.42:0.59:0.55:0.85:0.73"] = 308, -- Light's Breach, Venomspite, New Agamand + ["0.69:0.42:0.59:0.55:0.49:0.58"] = 204, -- Light's Breach, Venomspite, Moa'ki + ["0.69:0.42:0.64:0.42:0.54:0.52"] = 130, -- Light's Breach, Ebon Watch, Wyrmrest Temple + ["0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51"] = 199, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.69:0.42:0.59:0.55:0.45:0.51"] = 255, -- Light's Breach, Venomspite, Agmar's Hammer + ["0.69:0.42:0.59:0.55:0.54:0.52"] = 173, -- Light's Breach, Venomspite, Wyrmrest Temple + ["0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38"] = 270, -- Light's Breach, Venomspite, Wyrmrest Temple, Dalaran + ["0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 224, -- Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 393, -- Разлом Света, Черная застава, Храм Драконьего Покоя, Молот Агмара, Деревня Таунка'ле, Крепость Песни Войны + ["0.69:0.42:0.84:0.51:0.95:0.63"] = 210, -- Light's Breach, Camp Oneqwah, Vengeance Landing + ["0.69:0.42:0.72:0.40:0.78:0.38:0.82:0.31"] = 138, -- Light's Breach, The Argent Stand, Zim'Torga, Gundrak + ["0.69:0.42:0.84:0.51"] = 106, -- Light's Breach, Camp Oneqwah + ["0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 437, -- Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.69:0.42:0.72:0.40:0.78:0.38:0.72:0.29"] = 169, -- Light's Breach, The Argent Stand, Zim'Torga, Dun Nifflelem + ["0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 309, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51"] = 243, -- 圣光据点,祖达克, 怨毒镇,龙骨荒野, 龙眠神殿,龙骨荒野, 阿格玛之锤,龙骨荒野 + ["0.69:0.42:0.84:0.51:0.84:0.59"] = 153, -- Light's Breach, Camp Oneqwah, Camp Winterhoof + ["0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 428, -- Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.69:0.42:0.72:0.40:0.78:0.38"] = 84, -- Light's Breach, The Argent Stand, Zim'Torga + ["0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.28:0.28"] = 300, -- Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, Death's Rise + ["0.69:0.42:0.70:0.55:0.74:0.62"] = 131, -- Light's Breach, Conquest Hold, Apothecary Camp + ["0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 384, -- Light's Breach, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.69:0.42:0.64:0.42:0.48:0.44:0.45:0.51:0.29:0.54"] = 311, -- Light's Breach, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer, Taunka'le Village + ["0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71:0.49:0.58:0.45:0.51"] = 443, -- Light's Breach, Conquest Hold, Apothecary Camp, Kamagua, Moa'ki, Agmar's Hammer + ["0.69:0.42:0.70:0.55:0.84:0.59"] = 159, -- Light's Breach, Conquest Hold, Camp Winterhoof + ["0.69:0.42:0.84:0.51:0.84:0.59:0.74:0.62"] = 210, -- Light's Breach, Camp Oneqwah, Camp Winterhoof, Apothecary Camp + ["0.69:0.42:0.59:0.55:0.49:0.58:0.29:0.57:0.29:0.54:0.17:0.53"] = 431, -- Light's Breach, Venomspite, Moa'ki, Unu'pe, Taunka'le Village, Amber Ledge + ["0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34"] = 133, -- Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.31:0.43:0.24:0.40"] = 433, -- Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Warsong Camp, River's Heart + ["0.69:0.42:0.64:0.42:0.52:0.38:0.52:0.34:0.38:0.21"] = 255, -- Light's Breach, Ebon Watch, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.69:0.42:0.59:0.55:0.49:0.58:0.29:0.57"] = 335, -- Light's Breach, Venomspite, Moa'ki, Unu'pe + ["0.69:0.42:0.64:0.42:0.62:0.36"] = 80, -- Light's Breach, Ebon Watch, K3 + ["0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.64:0.19"] = 207, -- Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Ulduar + ["0.69:0.42:0.70:0.55:0.74:0.62:0.74:0.71"] = 185, -- Light's Breach, Conquest Hold, Apothecary Camp, Kamagua + ["0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25:0.57:0.21"] = 192, -- Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.69:0.42:0.70:0.55:0.84:0.59:0.95:0.63"] = 232, -- Light's Breach, Conquest Hold, Camp Winterhoof, Vengeance Landing + ["0.69:0.42:0.64:0.42:0.48:0.44"] = 148, -- Light's Breach, Ebon Watch, Kor'koron Vanguard + ["0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53:0.12:0.53"] = 420, -- Lichtbresche, Schwarze Wacht, Wyrmruhtempel, Agmars Hammer, Taunka'le, Bernsteinflöz, Transitusschild + ["0.69:0.42:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 381, -- Разлом Света, Черная застава, Храм Драконьего Покоя, Молот Агмара, Деревня Таунка'ле, Застава Бор'горока + ["0.69:0.42:0.59:0.55:0.48:0.44:0.52:0.38"] = 298, -- Light's Breach, Venomspite, Kor'koron Vanguard, Dalaran + ["0.69:0.42:0.59:0.55:0.54:0.52:0.48:0.44"] = 239, -- Light's Breach, Venomspite, Wyrmrest Temple, Kor'koron Vanguard + ["0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38:0.62:0.36:0.73:0.25"] = 403, -- Light's Breach, Venomspite, Wyrmrest Temple, Dalaran, K3, Camp Tunka'lo + ["0.69:0.42:0.59:0.55:0.49:0.58:0.29:0.57:0.15:0.57"] = 422, -- Light's Breach, Venomspite, Moa'ki, Unu'pe, Warsong Hold + ["0.69:0.42:0.72:0.40:0.78:0.38:0.64:0.19"] = 238, -- Brecha de la Luz, El Confín Argenta, Zim'Torga, Ulduar + ["0.69:0.42:0.64:0.42:0.62:0.36:0.60:0.25"] = 156, -- Light's Breach, Ebon Watch, K3, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36"] = 128, -- Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard + ["0.69:0.42:0.64:0.42:0.62:0.36:0.72:0.29"] = 180, -- Light's Breach, Ebon Watch, K3, Dun Nifflelem + ["0.69:0.42:0.64:0.42:0.60:0.40"] = 67, -- Light's Breach, Ebon Watch, Sunreaver's Command + ["0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38:0.52:0.34:0.38:0.21"] = 419, -- Light's Breach, Venomspite, Wyrmrest Temple, Dalaran, Crusaders' Pinnacle, The Shadow Vault + ["0.69:0.42:0.64:0.42:0.48:0.44:0.45:0.51"] = 200, -- Light's Breach, Ebon Watch, Kor'koron Vanguard, Agmar's Hammer + ["0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 425, -- Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.69:0.42:0.64:0.42:0.52:0.38:0.24:0.40"] = 305, -- Light's Breach, Ebon Watch, Dalaran, River's Heart + ["0.69:0.42:0.64:0.42:0.52:0.38:0.31:0.43"] = 255, -- Light's Breach, Ebon Watch, Dalaran, Warsong Camp + ["0.69:0.42:0.64:0.42:0.52:0.38:0.49:0.21"] = 220, -- Light's Breach, Ebon Watch, Dalaran, Argent Tournament Grounds + ["0.69:0.42:0.64:0.42:0.52:0.38:0.56:0.36:0.60:0.25:0.57:0.21"] = 267, -- Light's Breach, Ebon Watch, Dalaran, The Argent Vanguard, Grom'arsh Crash-Site, Bouldercrag's Refuge + ["0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54"] = 353, -- Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + + -- Horde: Zul'Drak: Zim'Torga + ["0.78:0.38:0.72:0.40"] = 54, -- Zim'Torga, The Argent Stand + ["0.78:0.38:0.72:0.40:0.69:0.42"] = 77, -- Zim'Torga, The Argent Stand, Light's Breach + ["0.78:0.38:0.72:0.40:0.64:0.42"] = 105, -- Zim'Torga, The Argent Stand, Ebon Watch + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 459, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.47"] = 424, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart, Bor'gorok Outpost + ["0.78:0.38:0.72:0.40:0.64:0.42:0.48:0.44"] = 213, -- Zim'Torga, The Argent Stand, Ebon Watch, Kor'koron Vanguard + ["0.78:0.38:0.84:0.51"] = 83, -- Zim'Torga, Camp Oneqwah + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54"] = 374, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village + ["0.78:0.38:0.84:0.51:0.69:0.42:0.64:0.42:0.52:0.38"] = 281, -- Zim'Torga, Camp Oneqwah, Light's Breach, Ebon Watch, Dalaran + ["0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73"] = 211, -- Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand + ["0.78:0.38:0.84:0.51:0.95:0.63"] = 188, -- Zim'Torga, Camp Oneqwah, Vengeance Landing + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38"] = 172, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran + ["0.78:0.38:0.84:0.51:0.70:0.55"] = 179, -- Zim'Torga, Camp Oneqwah, Conquest Hold + ["0.78:0.38:0.82:0.31"] = 54, -- Zim'Torga, Gundrak + ["0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55"] = 150, -- Zim'Torga, Argentumwache, Lichtbresche, Burg Siegeswall + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51"] = 318, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.15:0.57"] = 513, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Warsong Hold + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51"] = 263, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52"] = 196, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55"] = 197, -- Zim'Torga, El Confín Argenta, Brecha de la Luz, Rencor Venenoso + ["0.78:0.38:0.84:0.51:0.84:0.59:0.74:0.62:0.74:0.71"] = 241, -- Zim'Torga, Camp Oneqwah, Camp Winterhoof, Apothecary Camp, Kamagua + ["0.78:0.38:0.72:0.40:0.64:0.42:0.62:0.36"] = 146, -- Zim'Torga, The Argent Stand, Ebon Watch, K3 + ["0.78:0.38:0.72:0.29"] = 86, -- Zim'Torga, Dun Nifflelem + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 446, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73:0.95:0.63"] = 377, -- Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand, Vengeance Landing + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.52:0.38"] = 345, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Dalaran + ["0.78:0.38:0.84:0.51:0.84:0.59"] = 131, -- Zim'Torga, Camp Oneqwah, Camp Winterhoof + ["0.78:0.38:0.84:0.51:0.69:0.42"] = 176, -- Zim'Torga, Camp Oneqwah, Light's Breach + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40"] = 370, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart + ["0.78:0.38:0.72:0.40:0.69:0.42:0.70:0.55:0.74:0.62:0.85:0.73"] = 298, -- Zim'Torga, The Argent Stand, Light's Breach, Conquest Hold, Apothecary Camp, New Agamand + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.24:0.40:0.18:0.40"] = 405, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, River's Heart, Nesingwary Base Camp + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.74:0.62:0.84:0.59"] = 354, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Apothecary Camp, Camp Winterhoof + ["0.78:0.38:0.64:0.19"] = 154, -- Zim'Torga, Ulduar + ["0.78:0.38:0.64:0.19:0.60:0.25:0.62:0.36"] = 285, -- Zim'Torga, Ulduar, Grom'arsh Crash-Site, K3 + ["0.78:0.38:0.73:0.25:0.62:0.36:0.52:0.38"] = 272, -- Zim'Torga, Camp Tunka'lo, K3, Dalaran + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.49:0.58"] = 248, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Moa'ki + ["0.78:0.38:0.84:0.51:0.70:0.55:0.59:0.55:0.54:0.52:0.52:0.38"] = 412, -- Zim'Torga, Camp Oneqwah, Conquest Hold, Venomspite, Wyrmrest Temple, Dalaran + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.56:0.36"] = 193, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, The Argent Vanguard + ["0.78:0.38:0.84:0.51:0.84:0.59:0.85:0.73:0.74:0.71:0.49:0.58:0.29:0.57:0.29:0.54:0.18:0.47"] = 703, -- Zim'Torga, Camp Oneqwah, Camp Winterhoof, New Agamand, Kamagua, Moa'ki, Unu'pe, Taunka'le Village, Bor'gorok Outpost + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.31:0.43"] = 319, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Warsong Camp + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.85:0.73"] = 382, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, New Agamand + ["0.78:0.38:0.64:0.19:0.57:0.21"] = 202, -- Zim'Torga, Ulduar, Bouldercrag's Refuge + ["0.78:0.38:0.72:0.29:0.62:0.36:0.52:0.38"] = 244, -- Zim'Torga, Dun Nifflelem, K3, Dalaran + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 503, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.54:0.52:0.45:0.51:0.29:0.54:0.18:0.47"] = 500, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Bor'gorok Outpost + ["0.78:0.38:0.84:0.51:0.70:0.55:0.59:0.55:0.64:0.42:0.52:0.38:0.24:0.40"] = 612, -- Zim'Torga, Camp Oneqwah, Conquest Hold, Venomspite, Ebon Watch, Dalaran, River's Heart + ["0.78:0.38:0.72:0.40:0.64:0.42:0.54:0.52:0.45:0.51:0.29:0.54:0.17:0.53"] = 449, -- Zim'Torga, The Argent Stand, Ebon Watch, Wyrmrest Temple, Agmar's Hammer, Taunka'le Village, Amber Ledge + ["0.78:0.38:0.72:0.40:0.64:0.42:0.52:0.38:0.52:0.34"] = 198, -- Zim'Torga, The Argent Stand, Ebon Watch, Dalaran, Crusaders' Pinnacle + ["0.78:0.38:0.72:0.40:0.69:0.42:0.59:0.55:0.49:0.58:0.52:0.38"] = 400, -- Zim'Torga, The Argent Stand, Light's Breach, Venomspite, Moa'ki, Dalaran + ["0.78:0.38:0.73:0.25:0.60:0.25"] = 187, -- Zim'Torga, Camp Tunka'lo, Grom'arsh Crash-Site, Grom'arsh Crash-Site + ["0.78:0.38:0.64:0.19:0.60:0.25:0.62:0.36:0.52:0.38"] = 355, -- Zim'Torga, Ulduar, Grom'arsh Crash-Site, K3, Dalaran + ["0.78:0.38:0.73:0.25"] = 86, -- Zim'Torga, Camp Tunka'lo + ["0.78:0.38:0.64:0.19:0.57:0.21:0.49:0.21"] = 263, -- Zim'Torga, Ulduar, Bouldercrag's Refuge, Argent Tournament Grounds + ["0.78:0.38:0.64:0.19:0.60:0.25"] = 198, -- Zim'Torga, Ulduar, Point d'impact de Grom'arsh + + }, + + } + + end diff --git a/Leatrix_Plus_Library.lua b/Leatrix_Plus_Library.lua new file mode 100644 index 0000000..0ddd277 --- /dev/null +++ b/Leatrix_Plus_Library.lua @@ -0,0 +1,1678 @@ +---------------------------------------------------------------------- +-- L00: Leatrix Plus Library +---------------------------------------------------------------------- + +-- LibDBIcon 10.0.1: +-- 11: LibStub: (?s)-- LibStubStart\R?\K.*?(?=-- LibStubEnd) +-- 12: LibCallbackHandler: (?s)-- CallbackStart\R?\K.*?(?=-- CallbackEnd) +-- 13: LibDataBroker: (?s)-- DataBrokerStart\R?\K.*?(?=-- DataBrokerEnd) +-- 14: LibDBIcon: (?s)-- LibDBIconStart\R?\K.*?(?=-- LibDBIconEnd) + +-- LibChatAnims 10.0.1: +-- 15: LibChatAnims: (?s)-- LibChatAnimsStart\R?\K.*?(?=-- LibChatAnimsEnd) + +-- LibCandyBar 10.0.1: +-- 16: LibCandyBar: (?s)-- LibCandyBarStart\R?\K.*?(?=-- LibCandyBarEnd) + +local void, Leatrix_Plus = ... + +---------------------------------------------------------------------- +-- L11: LibDBIcon: LibStub +---------------------------------------------------------------------- + +local function LeaLibStub() + +-- LibStubStart +-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $ +-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info +-- LibStub is hereby placed in the Public Domain +-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke +local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! +local LibStub = _G[LIBSTUB_MAJOR] + +-- Check to see is this version of the stub is obsolete +if not LibStub or LibStub.minor < LIBSTUB_MINOR then + LibStub = LibStub or {libs = {}, minors = {} } + _G[LIBSTUB_MAJOR] = LibStub + LibStub.minor = LIBSTUB_MINOR + + -- LibStub:NewLibrary(major, minor) + -- major (string) - the major version of the library + -- minor (string or number ) - the minor version of the library + -- + -- returns nil if a newer or same version of the lib is already present + -- returns empty library object or old library object if upgrade is needed + function LibStub:NewLibrary(major, minor) + assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") + minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") + + local oldminor = self.minors[major] + if oldminor and oldminor >= minor then return nil end + self.minors[major], self.libs[major] = minor, self.libs[major] or {} + return self.libs[major], oldminor + end + + -- LibStub:GetLibrary(major, [silent]) + -- major (string) - the major version of the library + -- silent (boolean) - if true, library is optional, silently return nil if its not found + -- + -- throws an error if the library can not be found (except silent is set) + -- returns the library object if found + function LibStub:GetLibrary(major, silent) + if not self.libs[major] and not silent then + error(("Cannot find a library instance of %q."):format(tostring(major)), 2) + end + return self.libs[major], self.minors[major] + end + + -- LibStub:IterateLibraries() + -- + -- Returns an iterator for the currently registered libraries + function LibStub:IterateLibraries() + return pairs(self.libs) + end + + setmetatable(LibStub, { __call = LibStub.GetLibrary }) +end +-- LibStubEnd + +end +LeaLibStub() + +---------------------------------------------------------------------- +-- L12: LibDBIcon: CallbackHandler +---------------------------------------------------------------------- + +local function LeaCallbackHandler() + +-- CallbackStart +--[[ $Id: CallbackHandler-1.0.lua 26 2022-12-12 15:09:39Z nevcairiel $ ]] +local MAJOR, MINOR = "CallbackHandler-1.0", 8 +local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) + +if not CallbackHandler then return end -- No upgrade needed + +local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} + +-- Lua APIs +local securecallfunction, error = securecallfunction, error +local setmetatable, rawget = setmetatable, rawget +local next, select, pairs, type, tostring = next, select, pairs, type, tostring + + +local function Dispatch(handlers, ...) + local index, method = next(handlers) + if not method then return end + repeat + securecallfunction(method, ...) + index, method = next(handlers, index) + until not method +end + +-------------------------------------------------------------------------- +-- CallbackHandler:New +-- +-- target - target object to embed public APIs in +-- RegisterName - name of the callback registration API, default "RegisterCallback" +-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" +-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. + +function CallbackHandler.New(_self, target, RegisterName, UnregisterName, UnregisterAllName) + + RegisterName = RegisterName or "RegisterCallback" + UnregisterName = UnregisterName or "UnregisterCallback" + if UnregisterAllName==nil then -- false is used to indicate "don't want this method" + UnregisterAllName = "UnregisterAllCallbacks" + end + + -- we declare all objects and exported APIs inside this closure to quickly gain access + -- to e.g. function names, the "target" parameter, etc + + + -- Create the registry object + local events = setmetatable({}, meta) + local registry = { recurse=0, events=events } + + -- registry:Fire() - fires the given event/message into the registry + function registry:Fire(eventname, ...) + if not rawget(events, eventname) or not next(events[eventname]) then return end + local oldrecurse = registry.recurse + registry.recurse = oldrecurse + 1 + + Dispatch(events[eventname], eventname, ...) + + registry.recurse = oldrecurse + + if registry.insertQueue and oldrecurse==0 then + -- Something in one of our callbacks wanted to register more callbacks; they got queued + for event,callbacks in pairs(registry.insertQueue) do + local first = not rawget(events, event) or not next(events[event]) -- test for empty before. not test for one member after. that one member may have been overwritten. + for object,func in pairs(callbacks) do + events[event][object] = func + -- fire OnUsed callback? + if first and registry.OnUsed then + registry.OnUsed(registry, target, event) + first = nil + end + end + end + registry.insertQueue = nil + end + end + + -- Registration of a callback, handles: + -- self["method"], leads to self["method"](self, ...) + -- self with function ref, leads to functionref(...) + -- "addonId" (instead of self) with function ref, leads to functionref(...) + -- all with an optional arg, which, if present, gets passed as first argument (after self if present) + target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]]) + if type(eventname) ~= "string" then + error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2) + end + + method = method or eventname + + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + + if type(method) ~= "string" and type(method) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2) + end + + local regfunc + + if type(method) == "string" then + -- self["method"] calling style + if type(self) ~= "table" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2) + elseif self==target then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2) + elseif type(self[method]) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) self[method](self,arg,...) end + else + regfunc = function(...) self[method](self,...) end + end + else + -- function ref with self=object or self="addonId" or self=thread + if type(self)~="table" and type(self)~="string" and type(self)~="thread" then + error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) method(arg,...) end + else + regfunc = method + end + end + + + if events[eventname][self] or registry.recurse<1 then + -- if registry.recurse<1 then + -- we're overwriting an existing entry, or not currently recursing. just set it. + events[eventname][self] = regfunc + -- fire OnUsed callback? + if registry.OnUsed and first then + registry.OnUsed(registry, target, eventname) + end + else + -- we're currently processing a callback in this registry, so delay the registration of this new entry! + -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency + registry.insertQueue = registry.insertQueue or setmetatable({},meta) + registry.insertQueue[eventname][self] = regfunc + end + end + + -- Unregister a callback + target[UnregisterName] = function(self, eventname) + if not self or self==target then + error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2) + end + if type(eventname) ~= "string" then + error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2) + end + if rawget(events, eventname) and events[eventname][self] then + events[eventname][self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(events[eventname]) then + registry.OnUnused(registry, target, eventname) + end + end + if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then + registry.insertQueue[eventname][self] = nil + end + end + + -- OPTIONAL: Unregister all callbacks for given selfs/addonIds + if UnregisterAllName then + target[UnregisterAllName] = function(...) + if select("#",...)<1 then + error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2) + end + if select("#",...)==1 and ...==target then + error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2) + end + + + for i=1,select("#",...) do + local self = select(i,...) + if registry.insertQueue then + for eventname, callbacks in pairs(registry.insertQueue) do + if callbacks[self] then + callbacks[self] = nil + end + end + end + for eventname, callbacks in pairs(events) do + if callbacks[self] then + callbacks[self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(callbacks) then + registry.OnUnused(registry, target, eventname) + end + end + end + end + end + end + + return registry +end + + +-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it +-- try to upgrade old implicit embeds since the system is selfcontained and +-- relies on closures to work. + +-- CallbackEnd +end + +LeaCallbackHandler() + +---------------------------------------------------------------------- +-- L13: LibDBIcon: LibDataBroker +---------------------------------------------------------------------- + +local function LeaDataBroker() + +-- DataBrokerStart + +assert(LibStub, "LibDataBroker-1.1 requires LibStub") +assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0") + +local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4) +if not lib then return end +oldminor = oldminor or 0 + + +lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib) +lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {} +local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks + +if oldminor < 2 then + lib.domt = { + __metatable = "access denied", + __index = function(self, key) return attributestorage[self] and attributestorage[self][key] end, + } +end + +if oldminor < 3 then + lib.domt.__newindex = function(self, key, value) + if not attributestorage[self] then attributestorage[self] = {} end + if attributestorage[self][key] == value then return end + attributestorage[self][key] = value + local name = namestorage[self] + if not name then return end + callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self) + callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self) + callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self) + callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self) + end +end + +if oldminor < 2 then + function lib:NewDataObject(name, dataobj) + if self.proxystorage[name] then return end + + if dataobj then + assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table") + self.attributestorage[dataobj] = {} + for i,v in pairs(dataobj) do + self.attributestorage[dataobj][i] = v + dataobj[i] = nil + end + end + dataobj = setmetatable(dataobj or {}, self.domt) + self.proxystorage[name], self.namestorage[dataobj] = dataobj, name + self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj) + return dataobj + end +end + +if oldminor < 1 then + function lib:DataObjectIterator() + return pairs(self.proxystorage) + end + + function lib:GetDataObjectByName(dataobjectname) + return self.proxystorage[dataobjectname] + end + + function lib:GetNameByDataObject(dataobject) + return self.namestorage[dataobject] + end +end + +if oldminor < 4 then + local next = pairs(attributestorage) + function lib:pairs(dataobject_or_name) + local t = type(dataobject_or_name) + assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)") + + local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name + assert(attributestorage[dataobj], "Data object not found") + + return next, attributestorage[dataobj], nil + end + + local ipairs_iter = ipairs(attributestorage) + function lib:ipairs(dataobject_or_name) + local t = type(dataobject_or_name) + assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)") + + local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name + assert(attributestorage[dataobj], "Data object not found") + + return ipairs_iter, attributestorage[dataobj], 0 + end +end +-- DataBrokerEnd + +end +LeaDataBroker() + +---------------------------------------------------------------------- +-- L14: LibDBIcon: LibDBIcon +---------------------------------------------------------------------- + +local function LeaLibDBIcon() + +-- LibDBIconStart +--@curseforge-project-slug: libdbicon-1-0@ +----------------------------------------------------------------------- +-- LibDBIcon-1.0 +-- +-- Allows addons to easily create a lightweight minimap icon as an alternative to heavier LDB displays. +-- + +local DBICON10 = "LibDBIcon-1.0" +local DBICON10_MINOR = 45 -- Bump on changes +if not LibStub then error(DBICON10 .. " requires LibStub.") end +local ldb = LibStub("LibDataBroker-1.1", true) +if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end +local lib = LibStub:NewLibrary(DBICON10, DBICON10_MINOR) +if not lib then return end + +lib.objects = lib.objects or {} +lib.callbackRegistered = lib.callbackRegistered or nil +lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) +lib.notCreated = lib.notCreated or {} +lib.radius = lib.radius or 5 +local next, Minimap, CreateFrame = next, Minimap, CreateFrame +lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") +local isDraggingButton = false + +function lib:IconCallback(event, name, key, value) + if lib.objects[name] then + if key == "icon" then + lib.objects[name].icon:SetTexture(value) + elseif key == "iconCoords" then + lib.objects[name].icon:UpdateCoord() + elseif key == "iconR" then + local _, g, b = lib.objects[name].icon:GetVertexColor() + lib.objects[name].icon:SetVertexColor(value, g, b) + elseif key == "iconG" then + local r, _, b = lib.objects[name].icon:GetVertexColor() + lib.objects[name].icon:SetVertexColor(r, value, b) + elseif key == "iconB" then + local r, g = lib.objects[name].icon:GetVertexColor() + lib.objects[name].icon:SetVertexColor(r, g, value) + end + end +end +if not lib.callbackRegistered then + ldb.RegisterCallback(lib, "LibDataBroker_AttributeChanged__icon", "IconCallback") + ldb.RegisterCallback(lib, "LibDataBroker_AttributeChanged__iconCoords", "IconCallback") + ldb.RegisterCallback(lib, "LibDataBroker_AttributeChanged__iconR", "IconCallback") + ldb.RegisterCallback(lib, "LibDataBroker_AttributeChanged__iconG", "IconCallback") + ldb.RegisterCallback(lib, "LibDataBroker_AttributeChanged__iconB", "IconCallback") + lib.callbackRegistered = true +end + +local function getAnchors(frame) + local x, y = frame:GetCenter() + if not x or not y then return "CENTER" end + local hhalf = (x > UIParent:GetWidth()*2/3) and "RIGHT" or (x < UIParent:GetWidth()/3) and "LEFT" or "" + local vhalf = (y > UIParent:GetHeight()/2) and "TOP" or "BOTTOM" + return vhalf..hhalf, frame, (vhalf == "TOP" and "BOTTOM" or "TOP")..hhalf +end + +local function onEnter(self) + if isDraggingButton then return end + + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Stop() + button:SetAlpha(1) + end + end + + local obj = self.dataObject + if obj.OnTooltipShow then + lib.tooltip:SetOwner(self, "ANCHOR_NONE") + lib.tooltip:SetPoint(getAnchors(self)) + obj.OnTooltipShow(lib.tooltip) + lib.tooltip:Show() + elseif obj.OnEnter then + obj.OnEnter(self) + end +end + +local function onLeave(self) + lib.tooltip:Hide() + + if not isDraggingButton then + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Play() + end + end + end + + local obj = self.dataObject + if obj.OnLeave then + obj.OnLeave(self) + end +end + +-------------------------------------------------------------------------------- + +local onDragStart, updatePosition + +do + local minimapShapes = { + ["ROUND"] = {true, true, true, true}, + ["SQUARE"] = {false, false, false, false}, + ["CORNER-TOPLEFT"] = {false, false, false, true}, + ["CORNER-TOPRIGHT"] = {false, false, true, false}, + ["CORNER-BOTTOMLEFT"] = {false, true, false, false}, + ["CORNER-BOTTOMRIGHT"] = {true, false, false, false}, + ["SIDE-LEFT"] = {false, true, false, true}, + ["SIDE-RIGHT"] = {true, false, true, false}, + ["SIDE-TOP"] = {false, false, true, true}, + ["SIDE-BOTTOM"] = {true, true, false, false}, + ["TRICORNER-TOPLEFT"] = {false, true, true, true}, + ["TRICORNER-TOPRIGHT"] = {true, false, true, true}, + ["TRICORNER-BOTTOMLEFT"] = {true, true, false, true}, + ["TRICORNER-BOTTOMRIGHT"] = {true, true, true, false}, + } + + local rad, cos, sin, sqrt, max, min = math.rad, math.cos, math.sin, math.sqrt, math.max, math.min + function updatePosition(button, position) + local angle = rad(position or 225) + local x, y, q = cos(angle), sin(angle), 1 + if x < 0 then q = q + 1 end + if y > 0 then q = q + 2 end + local minimapShape = GetMinimapShape and GetMinimapShape() or "ROUND" + local quadTable = minimapShapes[minimapShape] + local w = (Minimap:GetWidth() / 2) + lib.radius + local h = (Minimap:GetHeight() / 2) + lib.radius + if quadTable[q] then + x, y = x*w, y*h + else + local diagRadiusW = sqrt(2*(w)^2)-10 + local diagRadiusH = sqrt(2*(h)^2)-10 + x = max(-w, min(x*diagRadiusW, w)) + y = max(-h, min(y*diagRadiusH, h)) + end + button:SetPoint("CENTER", Minimap, "CENTER", x, y) + end +end + +local function onClick(self, b) + if self.dataObject.OnClick then + self.dataObject.OnClick(self, b) + end +end + +local function onMouseDown(self) + self.isMouseDown = true + self.icon:UpdateCoord() +end + +local function onMouseUp(self) + self.isMouseDown = false + self.icon:UpdateCoord() +end + +do + local deg, atan2 = math.deg, math.atan2 + local function onUpdate(self) + local mx, my = Minimap:GetCenter() + local px, py = GetCursorPosition() + local scale = Minimap:GetEffectiveScale() + px, py = px / scale, py / scale + local pos = 225 + if self.db then + pos = deg(atan2(py - my, px - mx)) % 360 + self.db.minimapPos = pos + else + pos = deg(atan2(py - my, px - mx)) % 360 + self.minimapPos = pos + end + updatePosition(self, pos) + end + + function onDragStart(self) + self:LockHighlight() + self.isMouseDown = true + self.icon:UpdateCoord() + self:SetScript("OnUpdate", onUpdate) + isDraggingButton = true + lib.tooltip:Hide() + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Stop() + button:SetAlpha(1) + end + end + end +end + +local function onDragStop(self) + self:SetScript("OnUpdate", nil) + self.isMouseDown = false + self.icon:UpdateCoord() + self:UnlockHighlight() + isDraggingButton = false + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Play() + end + end +end + +local defaultCoords = {0, 1, 0, 1} +local function updateCoord(self) + local coords = self:GetParent().dataObject.iconCoords or defaultCoords + local deltaX, deltaY = 0, 0 + if not self:GetParent().isMouseDown then + deltaX = (coords[2] - coords[1]) * 0.05 + deltaY = (coords[4] - coords[3]) * 0.05 + end + self:SetTexCoord(coords[1] + deltaX, coords[2] - deltaX, coords[3] + deltaY, coords[4] - deltaY) +end + +local function createButton(name, object, db) + local button = CreateFrame("Button", "LibDBIcon10_"..name, Minimap) + button.dataObject = object + button.db = db + button:SetFrameStrata("MEDIUM") + -- button:SetFixedFrameStrata(true) + button:SetFrameLevel(8) + -- button:SetFixedFrameLevel(true) + button:SetSize(31, 31) + button:RegisterForClicks("anyUp") + button:RegisterForDrag("LeftButton") + button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" + if WOW_PROJECT_ID == WOW_PROJECT_MAINLINE then + local overlay = button:CreateTexture(nil, "OVERLAY") + overlay:SetSize(50, 50) + overlay:SetTexture(136430) --"Interface\\Minimap\\MiniMap-TrackingBorder" + overlay:SetPoint("TOPLEFT", button, "TOPLEFT", 0, 0) + local background = button:CreateTexture(nil, "BACKGROUND") + background:SetSize(24, 24) + background:SetTexture(136467) --"Interface\\Minimap\\UI-Minimap-Background" + background:SetPoint("CENTER", button, "CENTER", 0, 1) + local icon = button:CreateTexture(nil, "ARTWORK") + icon:SetSize(18, 18) + icon:SetTexture(object.icon) + icon:SetPoint("CENTER", button, "CENTER", 0, 1) + button.icon = icon + else + local overlay = button:CreateTexture(nil, "OVERLAY") + overlay:SetSize(53, 53) + overlay:SetTexture(136430) --"Interface\\Minimap\\MiniMap-TrackingBorder" + overlay:SetPoint("TOPLEFT") + local background = button:CreateTexture(nil, "BACKGROUND") + background:SetSize(20, 20) + background:SetTexture(136467) --"Interface\\Minimap\\UI-Minimap-Background" + background:SetPoint("TOPLEFT", 7, -5) + local icon = button:CreateTexture(nil, "ARTWORK") + icon:SetSize(17, 17) + icon:SetTexture(object.icon) + icon:SetPoint("TOPLEFT", 7, -6) + button.icon = icon + end + + button.isMouseDown = false + local r, g, b = button.icon:GetVertexColor() + button.icon:SetVertexColor(object.iconR or r, object.iconG or g, object.iconB or b) + + button.icon.UpdateCoord = updateCoord + button.icon:UpdateCoord() + + button:SetScript("OnEnter", onEnter) + button:SetScript("OnLeave", onLeave) + button:SetScript("OnClick", onClick) + if not db or not db.lock then + button:SetScript("OnDragStart", onDragStart) + button:SetScript("OnDragStop", onDragStop) + end + button:SetScript("OnMouseDown", onMouseDown) + button:SetScript("OnMouseUp", onMouseUp) + + button.fadeOut = button:CreateAnimationGroup() + local animOut = button.fadeOut:CreateAnimation("Alpha") + -- animOut:SetOrder(1) + -- animOut:SetDuration(0.2) + -- animOut:SetFromAlpha(1) + -- animOut:SetToAlpha(0) + -- animOut:SetStartDelay(1) + -- button.fadeOut:SetToFinalAlpha(true) + + lib.objects[name] = button + + if lib.loggedIn then + updatePosition(button, db and db.minimapPos) + if not db or not db.hide then + button:Show() + else + button:Hide() + end + end + lib.callbacks:Fire("LibDBIcon_IconCreated", button, name) -- Fire 'Icon Created' callback +end + +-- We could use a metatable.__index on lib.objects, but then we'd create +-- the icons when checking things like :IsRegistered, which is not necessary. +local function check(name) + if lib.notCreated[name] then + createButton(name, lib.notCreated[name][1], lib.notCreated[name][2]) + lib.notCreated[name] = nil + end +end + +-- Wait a bit with the initial positioning to let any GetMinimapShape addons +-- load up. +if not lib.loggedIn then + local f = CreateFrame("Frame") + f:SetScript("OnEvent", function(f) + for _, button in next, lib.objects do + updatePosition(button, button.db and button.db.minimapPos) + if not button.db or not button.db.hide then + button:Show() + else + button:Hide() + end + end + lib.loggedIn = true + f:SetScript("OnEvent", nil) + end) + f:RegisterEvent("PLAYER_LOGIN") +end + +local function getDatabase(name) + return lib.notCreated[name] and lib.notCreated[name][2] or lib.objects[name].db +end + +function lib:Register(name, object, db) + if not object.icon then error("Can't register LDB objects without icons set!") end + if lib.objects[name] or lib.notCreated[name] then error(DBICON10.. ": Object '".. name .."' is already registered.") end + if not db or not db.hide then + createButton(name, object, db) + else + lib.notCreated[name] = {object, db} + end +end + +function lib:Lock(name) + if not lib:IsRegistered(name) then return end + if lib.objects[name] then + lib.objects[name]:SetScript("OnDragStart", nil) + lib.objects[name]:SetScript("OnDragStop", nil) + end + local db = getDatabase(name) + if db then + db.lock = true + end +end + +function lib:Unlock(name) + if not lib:IsRegistered(name) then return end + if lib.objects[name] then + lib.objects[name]:SetScript("OnDragStart", onDragStart) + lib.objects[name]:SetScript("OnDragStop", onDragStop) + end + local db = getDatabase(name) + if db then + db.lock = nil + end +end + +function lib:Hide(name) + if not lib.objects[name] then return end + lib.objects[name]:Hide() +end + +function lib:Show(name) + check(name) + local button = lib.objects[name] + if button then + button:Show() + updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) + end +end + +function lib:IsRegistered(name) + return (lib.objects[name] or lib.notCreated[name]) and true or false +end + +function lib:Refresh(name, db) + check(name) + local button = lib.objects[name] + if db then + button.db = db + end + updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) + if not button.db or not button.db.hide then + button:Show() + else + button:Hide() + end + if not button.db or not button.db.lock then + button:SetScript("OnDragStart", onDragStart) + button:SetScript("OnDragStop", onDragStop) + else + button:SetScript("OnDragStart", nil) + button:SetScript("OnDragStop", nil) + end +end + +function lib:GetMinimapButton(name) + return lib.objects[name] +end + +do + local function OnMinimapEnter() + if isDraggingButton then return end + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Stop() + button:SetAlpha(1) + end + end + end + local function OnMinimapLeave() + if isDraggingButton then return end + for _, button in next, lib.objects do + if button.showOnMouseover then + button.fadeOut:Play() + end + end + end + Minimap:HookScript("OnEnter", OnMinimapEnter) + Minimap:HookScript("OnLeave", OnMinimapLeave) + + function lib:ShowOnEnter(name, value) + local button = lib.objects[name] + if button then + if value then + button.showOnMouseover = true + button.fadeOut:Stop() + button:SetAlpha(0) + else + button.showOnMouseover = false + button.fadeOut:Stop() + button:SetAlpha(1) + end + end + end +end + +function lib:GetButtonList() + local t = {} + for name in next, lib.objects do + t[#t+1] = name + end + return t +end + +function lib:SetButtonRadius(radius) + if type(radius) == "number" then + lib.radius = radius + for _, button in next, lib.objects do + updatePosition(button, button.db and button.db.minimapPos or button.minimapPos) + end + end +end + +function lib:SetButtonToPosition(button, position) + updatePosition(lib.objects[button] or button, position) +end + +-- Upgrade! +for name, button in next, lib.objects do + local db = getDatabase(name) + if not db or not db.lock then + button:SetScript("OnDragStart", onDragStart) + button:SetScript("OnDragStop", onDragStop) + end + button:SetScript("OnEnter", onEnter) + button:SetScript("OnLeave", onLeave) + button:SetScript("OnClick", onClick) + button:SetScript("OnMouseDown", onMouseDown) + button:SetScript("OnMouseUp", onMouseUp) + + if not button.fadeOut then -- Upgrade to 39 + button.fadeOut = button:CreateAnimationGroup() + local animOut = button.fadeOut:CreateAnimation("Alpha") + animOut:SetOrder(1) + animOut:SetDuration(0.2) + animOut:SetFromAlpha(1) + animOut:SetToAlpha(0) + animOut:SetStartDelay(1) + button.fadeOut:SetToFinalAlpha(true) + end +end +lib:SetButtonRadius(lib.radius) -- Upgrade to 40 +-- LibDBIconEnd + +end +-- LeaLibDBIcon() -- disabled in 3.3.5, was causing red things + + +---------------------------------------------------------------------- +-- L15: LibChatAnims (load on demand) +---------------------------------------------------------------------- + +function Leatrix_Plus:LeaPlusLCA() + +-- LibChatAnimsStart +--@curseforge-project-slug: libchatanims@ +local MAJOR, MINOR = "LibChatAnims", 4 -- Bump minor on changes +local LCA = LibStub:NewLibrary(MAJOR, MINOR) +if not LCA then return end -- No upgrade needed + +LCA.animations = LCA.animations or {} -- Animation storage +LCA.alerting = LCA.alerting or {} -- Chat tab alerting storage +local anims = LCA.animations +local alerting = LCA.alerting + +function LCA:IsAlerting(tab) + if alerting[tab] then + return true + end +end + +---------------------------------------------------- +-- Note, most of this code is simply replicated from +-- Blizzard's FloatingChatFrame.lua file. +-- The only real changes are the creation and use +-- of animations vs the use of UIFrameFlash. +-- + +--FCFDockOverflowButton_UpdatePulseState = function(self) +-- local dock = self:GetParent() +-- local shouldPulse = false +-- for _, chatFrame in pairs(FCFDock_GetChatFrames(dock)) do +-- local chatTab = _G[chatFrame:GetName().."Tab"] +-- if ( not chatFrame.isStaticDocked and chatTab.alerting) then +-- -- Make sure the rects are valid. (Not always the case when resizing the WoW client +-- if ( not chatTab:GetRight() or not dock.scrollFrame:GetRight() ) then +-- return false +-- end +-- -- Check if it's off the screen. +-- local DELTA = 3 -- Chosen through experimentation +-- if ( chatTab:GetRight() < (dock.scrollFrame:GetLeft() + DELTA) or chatTab:GetLeft() > (dock.scrollFrame:GetRight() - DELTA) ) then +-- shouldPulse = true +-- break +-- end +-- end +-- end +-- +-- local tex = self:GetHighlightTexture() +-- if shouldPulse then +-- if not anims[tex] then +-- anims[tex] = tex:CreateAnimationGroup() +-- +-- local fade1 = anims[tex]:CreateAnimation("Alpha") +-- fade1:SetDuration(1) +-- fade1:SetFromAlpha(0) +-- fade1:SetToAlpha(1) +-- fade1:SetOrder(1) +-- +-- local fade2 = anims[tex]:CreateAnimation("Alpha") +-- fade2:SetDuration(1) +-- fade2:SetFromAlpha(1) +-- fade2:SetToAlpha(0) +-- fade2:SetOrder(2) +-- end +-- tex:Show() +-- tex:SetAlpha(0) +-- anims[tex]:SetLooping("REPEAT") +-- anims[tex]:Play() +-- +-- self:LockHighlight() +-- self.alerting = true +-- else +-- if anims[tex] then +-- anims[tex]:Stop() +-- end +-- self:UnlockHighlight() +-- tex:SetAlpha(1) +-- tex:Show() +-- self.alerting = false +-- end +-- +-- if self.list:IsShown() then +-- FCFDockOverflowList_Update(self.list, dock) +-- end +-- return true +--end + +--FCFDockOverflowListButton_SetValue = function(button, chatFrame) +-- local chatTab = _G[chatFrame:GetName().."Tab"] +-- button.chatFrame = chatFrame +-- button:SetText(chatFrame.name) +-- +-- local colorTable = chatTab.selectedColorTable or DEFAULT_TAB_SELECTED_COLOR_TABLE +-- +-- if chatTab.selectedColorTable then +-- button:GetFontString():SetTextColor(colorTable.r, colorTable.g, colorTable.b) +-- else +-- button:GetFontString():SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b) +-- end +-- +-- button.glow:SetVertexColor(colorTable.r, colorTable.g, colorTable.b) +-- +-- if chatTab.conversationIcon then +-- button.conversationIcon:SetVertexColor(colorTable.r, colorTable.g, colorTable.b) +-- button.conversationIcon:Show() +-- else +-- button.conversationIcon:Hide() +-- end +-- +-- if chatTab.alerting then +-- button.alerting = true +-- if not anims[button.glow] then +-- anims[button.glow] = button.glow:CreateAnimationGroup() +-- +-- local fade1 = anims[button.glow]:CreateAnimation("Alpha") +-- fade1:SetDuration(1) +-- fade1:SetFromAlpha(0) +-- fade1:SetToAlpha(1) +-- fade1:SetOrder(1) +-- +-- local fade2 = anims[button.glow]:CreateAnimation("Alpha") +-- fade2:SetDuration(1) +-- fade2:SetFromAlpha(1) +-- fade2:SetToAlpha(0) +-- fade2:SetOrder(2) +-- end +-- button.glow:Show() +-- button.glow:SetAlpha(0) +-- anims[button.glow]:SetLooping("REPEAT") +-- anims[button.glow]:Play() +-- else +-- button.alerting = false +-- if anims[button.glow] then +-- anims[button.glow]:Stop() +-- end +-- button.glow:Hide() +-- end +-- button:Show() +--end + +FCF_StartAlertFlash = function(chatFrame) + local chatTab = _G[chatFrame:GetName().."Tab"] + + if chatFrame.minFrame then + if not anims[chatFrame.minFrame] then + anims[chatFrame.minFrame] = chatFrame.minFrame.glow:CreateAnimationGroup() + + local fade1 = anims[chatFrame.minFrame]:CreateAnimation("Alpha") + fade1:SetDuration(1) + fade1:SetFromAlpha(0) + fade1:SetToAlpha(1) + fade1:SetOrder(1) + + local fade2 = anims[chatFrame.minFrame]:CreateAnimation("Alpha") + fade2:SetDuration(1) + fade2:SetFromAlpha(1) + fade2:SetToAlpha(0) + fade2:SetOrder(2) + end + chatFrame.minFrame.glow:Show() + chatFrame.minFrame.glow:SetAlpha(0) + anims[chatFrame.minFrame]:SetLooping("REPEAT") + anims[chatFrame.minFrame]:Play() + --chatFrame.minFrame.alerting = true + alerting[chatFrame.minFrame] = true + end + + if not anims[chatTab.glow] then + anims[chatTab.glow] = chatTab.glow:CreateAnimationGroup() + + local fade1 = anims[chatTab.glow]:CreateAnimation("Alpha") + fade1:SetDuration(1) + fade1:SetFromAlpha(0) + fade1:SetToAlpha(1) + fade1:SetOrder(1) + + local fade2 = anims[chatTab.glow]:CreateAnimation("Alpha") + fade2:SetDuration(1) + fade2:SetFromAlpha(1) + fade2:SetToAlpha(0) + fade2:SetOrder(2) + end + chatTab.glow:Show() + chatTab.glow:SetAlpha(0) + anims[chatTab.glow]:SetLooping("REPEAT") + anims[chatTab.glow]:Play() + --chatTab.alerting = true + alerting[chatTab] = true + + + -- START function FCFTab_UpdateAlpha(chatFrame) + local mouseOverAlpha, noMouseAlpha = 0, 0 + if not chatFrame.isDocked or chatFrame == FCFDock_GetSelectedWindow(GENERAL_CHAT_DOCK) then + mouseOverAlpha = 1.0 --CHAT_FRAME_TAB_SELECTED_MOUSEOVER_ALPHA + noMouseAlpha = 0.4 -- CHAT_FRAME_TAB_SELECTED_NOMOUSE_ALPHA + else + mouseOverAlpha = 1.0 -- CHAT_FRAME_TAB_ALERTING_MOUSEOVER_ALPHA + noMouseAlpha = 1.0 -- CHAT_FRAME_TAB_ALERTING_NOMOUSE_ALPHA + end + if chatFrame.hasBeenFaded then + chatTab:SetAlpha(mouseOverAlpha) + else + chatTab:SetAlpha(noMouseAlpha) + end + --END function FCFTab_UpdateAlpha(chatFrame) + + --FCFDockOverflowButton_UpdatePulseState(GENERAL_CHAT_DOCK.overflowButton) +end + +FCF_StopAlertFlash = function(chatFrame) + local chatTab = _G[chatFrame:GetName().."Tab"] + + if chatFrame.minFrame then + if anims[chatFrame.minFrame] then + anims[chatFrame.minFrame]:Stop() + end + chatFrame.minFrame.glow:Hide() + --chatFrame.minFrame.alerting = false + alerting[chatFrame.minFrame] = nil + end + + if anims[chatTab.glow] then + anims[chatTab.glow]:Stop() + end + chatTab.glow:Hide() + --chatTab.alerting = false + alerting[chatTab] = nil + + -- START function FCFTab_UpdateAlpha(chatFrame) + local mouseOverAlpha, noMouseAlpha = 0, 0 + if not chatFrame.isDocked or chatFrame == FCFDock_GetSelectedWindow(GENERAL_CHAT_DOCK) then + mouseOverAlpha = 1.0 --CHAT_FRAME_TAB_SELECTED_MOUSEOVER_ALPHA + noMouseAlpha = 0.4 -- CHAT_FRAME_TAB_SELECTED_NOMOUSE_ALPHA + else + mouseOverAlpha = 0.6 --CHAT_FRAME_TAB_NORMAL_MOUSEOVER_ALPHA + noMouseAlpha = 0.2 --CHAT_FRAME_TAB_NORMAL_NOMOUSE_ALPHA + end + if chatFrame.hasBeenFaded then + chatTab:SetAlpha(mouseOverAlpha) + else + chatTab:SetAlpha(noMouseAlpha) + end + --END function FCFTab_UpdateAlpha(chatFrame) + + --FCFDockOverflowButton_UpdatePulseState(GENERAL_CHAT_DOCK.overflowButton) +end + +-- LibChatAnimsEnd + +end + +---------------------------------------------------------------------- +-- L16: LibDBIcon: LibCandyBar +---------------------------------------------------------------------- + +function Leatrix_Plus:LeaPlusCandyBar() + +-- LibCandyBarStart +--@curseforge-project-slug: libcandybar-3-0@ +--- **LibCandyBar-3.0** provides elegant timerbars with icons for use in addons. +-- It is based of the original ideas of the CandyBar and CandyBar-2.0 library. +-- In contrary to the earlier libraries LibCandyBar-3.0 provides you with a timerbar object with a simple API. +-- +-- Creating a new timerbar using the ':New' function will return a new timerbar object. This timerbar object inherits all of the barPrototype functions listed here. \\ +-- +-- @usage +-- local candy = LibStub("LibCandyBar-3.0") +-- local texture = "Interface\\AddOns\\MyAddOn\\statusbar" +-- local mybar = candy:New(texture, 100, 16) +-- mybar:SetLabel("Yay!") +-- mybar:SetDuration(60) +-- mybar:Start() +-- @class file +-- @name LibCandyBar-3.0 + +local GetTime, floor, next = GetTime, floor, next +local CreateFrame, error, setmetatable, UIParent = CreateFrame, error, setmetatable, UIParent + +if not LibStub then error("LibCandyBar-3.0 requires LibStub.") end +local cbh = LibStub:GetLibrary("CallbackHandler-1.0") +if not cbh then error("LibCandyBar-3.0 requires CallbackHandler-1.0") end +local lib = LibStub:NewLibrary("LibCandyBar-3.0", 100) -- Bump minor on changes +if not lib then return end +lib.callbacks = lib.callbacks or cbh:New(lib) +local cb = lib.callbacks +lib.dummyFrame = lib.dummyFrame or CreateFrame("Frame") +lib.barFrameMT = lib.barFrameMT or {__index = lib.dummyFrame} +lib.barPrototype = lib.barPrototype or setmetatable({}, lib.barFrameMT) +lib.barPrototype_mt = lib.barPrototype_mt or {__index = lib.barPrototype} +lib.barCache = lib.barCache or {} + +local barPrototype = lib.barPrototype +local barPrototype_meta = lib.barPrototype_mt +local barCache = lib.barCache + +local scripts = { + "OnUpdate", "OnDragStart", "OnDragStop", + "OnEnter", "OnLeave", "OnHide", + "OnShow", "OnMouseDown", "OnMouseUp", + "OnMouseWheel", "OnSizeChanged", "OnEvent" +} +local numScripts = #scripts +local GameFontHighlightSmallOutline = GameFontHighlightSmallOutline +local _fontName, _fontSize = GameFontHighlightSmallOutline:GetFont() +local _fontShadowX, _fontShadowY = GameFontHighlightSmallOutline:GetShadowOffset() +local _fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA = GameFontHighlightSmallOutline:GetShadowColor() +local SetWidth, SetHeight, SetSize = lib.dummyFrame.SetWidth, lib.dummyFrame.SetHeight, lib.dummyFrame.SetSize + +local function stopBar(bar) + bar.updater:Stop() + bar.data = nil + bar.funcs = nil + bar.running = nil + bar.paused = nil + bar:Hide() + bar:SetParent(UIParent) +end + +local tformat1 = "%d:%02d:%02d" +local tformat2 = "%d:%02d" +local tformat3 = "%.1f" +local tformat4 = "%.0f" +local function barUpdate(updater) + local bar = updater.parent + local t = GetTime() + if t >= bar.exp then + bar:Stop() + else + local time = bar.exp - t + bar.remaining = time + + bar.candyBarBar:SetValue(bar.fill and (t-bar.start)+bar.gap or time) + + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + bar.candyBarDuration:SetFormattedText(tformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + bar.candyBarDuration:SetFormattedText(tformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + bar.candyBarDuration:SetFormattedText(tformat3, time) + else -- 10 seconds to one minute + bar.candyBarDuration:SetFormattedText(tformat4, time) + end + + if bar.funcs then + for i = 1, #bar.funcs do + bar.funcs[i](bar) + end + end + end +end + +local atformat1 = "~%d:%02d:%02d" +local atformat2 = "~%d:%02d" +local atformat3 = "~%.1f" +local atformat4 = "~%.0f" +local function barUpdateApprox(updater) + local bar = updater.parent + local t = GetTime() + if t >= bar.exp then + bar:Stop() + else + local time = bar.exp - t + bar.remaining = time + + bar.candyBarBar:SetValue(bar.fill and (t-bar.start)+bar.gap or time) + + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + bar.candyBarDuration:SetFormattedText(atformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + bar.candyBarDuration:SetFormattedText(atformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + bar.candyBarDuration:SetFormattedText(atformat3, time) + else -- 10 seconds to one minute + bar.candyBarDuration:SetFormattedText(atformat4, time) + end + + if bar.funcs then + for i = 1, #bar.funcs do + bar.funcs[i](bar) + end + end + end +end + +-- ------------------------------------------------------------------------------ +-- Bar functions +-- + +local function restyleBar(self) + if not self.running then return end + self.candyBarIconFrame:ClearAllPoints() + self.candyBarBar:ClearAllPoints() + -- In the past we used a :GetTexture check here, but as of WoW v5 it randomly returns nil, so use our own trustworthy variable. + if self.candyBarIconFrame.icon then + self.candyBarIconFrame:SetWidth(self.height) + if self.iconPosition == "RIGHT" then + self.candyBarIconFrame:SetPoint("TOPRIGHT", self) + self.candyBarIconFrame:SetPoint("BOTTOMRIGHT", self) + self.candyBarBar:SetPoint("TOPRIGHT", self.candyBarIconFrame, "TOPLEFT") + self.candyBarBar:SetPoint("BOTTOMRIGHT", self.candyBarIconFrame, "BOTTOMLEFT") + self.candyBarBar:SetPoint("TOPLEFT", self) + self.candyBarBar:SetPoint("BOTTOMLEFT", self) + else + self.candyBarIconFrame:SetPoint("TOPLEFT") + self.candyBarIconFrame:SetPoint("BOTTOMLEFT") + self.candyBarBar:SetPoint("TOPLEFT", self.candyBarIconFrame, "TOPRIGHT") + self.candyBarBar:SetPoint("BOTTOMLEFT", self.candyBarIconFrame, "BOTTOMRIGHT") + self.candyBarBar:SetPoint("TOPRIGHT", self) + self.candyBarBar:SetPoint("BOTTOMRIGHT", self) + end + self.candyBarIconFrame:Show() + else + self.candyBarBar:SetPoint("TOPLEFT", self) + self.candyBarBar:SetPoint("BOTTOMRIGHT", self) + self.candyBarIconFrame:Hide() + end + if self.showLabel and self.candyBarLabel.text then + self.candyBarLabel:Show() + else + self.candyBarLabel:Hide() + end + if self.showTime then + self.candyBarDuration:Show() + else + self.candyBarDuration:Hide() + end +end + +--- Set whether the bar should drain (default) or fill up. +-- @param fill Boolean true/false +function barPrototype:SetFill(fill) + self.fill = fill +end +--- Adds a function to the timerbar. The function will run every update and will receive the bar as a parameter. +-- @param func Function to run every update. +-- @usage +-- -- The example below will print the time remaining to the chatframe every update. Yes, that's a whole lot of spam +-- mybar:AddUpdateFunction( function(bar) print(bar.remaining) end ) +function barPrototype:AddUpdateFunction(func) if not self.funcs then self.funcs = {} end; self.funcs[#self.funcs+1] = func end +--- Sets user data in the timerbar object. +-- @param key Key to use for the data storage. +-- @param data Data to store. +function barPrototype:Set(key, data) if not self.data then self.data = {} end; self.data[key] = data end +--- Retrieves user data from the timerbar object. +-- @param key Key to retrieve +function barPrototype:Get(key) return self.data and self.data[key] end +--- Sets the color of the bar. +-- This is basically a wrapper to SetStatusBarColor. +-- @paramsig r, g, b, a +-- @param r Red component (0-1) +-- @param g Green component (0-1) +-- @param b Blue component (0-1) +-- @param a Alpha (0-1) +function barPrototype:SetColor(...) self.candyBarBar:SetStatusBarColor(...) end +--- Sets the color of the bar label and bar duration text. +-- @paramsig r, g, b, a +-- @param r Red component (0-1) +-- @param g Green component (0-1) +-- @param b Blue component (0-1) +-- @param a Alpha (0-1) +function barPrototype:SetTextColor(...) + self.candyBarLabel:SetTextColor(...) + self.candyBarDuration:SetTextColor(...) +end +--- Sets the shadow color of the bar label and bar duration text. +-- @paramsig r, g, b, a +-- @param r Red component (0-1) +-- @param g Green component (0-1) +-- @param b Blue component (0-1) +-- @param a Alpha (0-1) +function barPrototype:SetShadowColor(...) + self.candyBarLabel:SetShadowColor(...) + self.candyBarDuration:SetShadowColor(...) +end +--- Sets the texture of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param texture Path to the bar texture. +function barPrototype:SetTexture(texture) + self.candyBarBar:SetStatusBarTexture(texture) + self.candyBarBackground:SetTexture(texture) +end +--- Sets the width of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param width Width of the bar. +function barPrototype:SetWidth(width) + self.width = width + SetWidth(self, width) +end +--- Sets the height of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param height Height of the bar. +function barPrototype:SetHeight(height) + self.height = height + SetHeight(self, height) + restyleBar(self) +end +--- Sets the size of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param width Width of the bar. +-- @param height Height of the bar. +function barPrototype:SetSize(width, height) + self.width = width + self.height = height + SetSize(self, width, height) + restyleBar(self) +end +--- Returns the label (text) currently set on the bar. +function barPrototype:GetLabel() + return self.candyBarLabel.text +end +--- Sets the label on the bar. +-- @param text Label text. +function barPrototype:SetLabel(text) + self.candyBarLabel.text = text + self.candyBarLabel:SetText(text) + if text then + self.candyBarLabel:Show() + else + self.candyBarLabel:Hide() + end +end +--- Returns the icon texture path currently set on the bar, if it has an icon set. +function barPrototype:GetIcon() + return self.candyBarIconFrame.icon +end +--- Sets the icon next to the bar. +-- @param icon Path to the icon texture or nil to not display an icon. +-- @param ... Optional icon coordinates for texture trimming. +function barPrototype:SetIcon(icon, ...) + self.candyBarIconFrame.icon = icon + self.candyBarIconFrame:SetTexture(icon) + if ... then + self.candyBarIconFrame:SetTexCoord(...) + else + self.candyBarIconFrame:SetTexCoord(0.07, 0.93, 0.07, 0.93) + end + restyleBar(self) +end +--- Sets which side of the bar the icon should appear. +-- @param position Position of the icon according to the bar, either "LEFT" or "RIGHT" as a string. Set to "LEFT" by default. +function barPrototype:SetIconPosition(position) + self.iconPosition = position + restyleBar(self) +end +--- Sets wether or not the time indicator on the right of the bar should be shown. +-- Time is shown by default. +-- @param bool true to show the time, false/nil to hide the time. +function barPrototype:SetTimeVisibility(bool) + self.showTime = bool + if bool then + self.candyBarDuration:Show() + else + self.candyBarDuration:Hide() + end +end +--- Sets wether or not the label on the left of the bar should be shown. +-- label is shown by default. +-- @param bool true to show the label, false/nil to hide the label. +function barPrototype:SetLabelVisibility(bool) + self.showLabel = bool + if bool then + self.candyBarLabel:Show() + else + self.candyBarLabel:Hide() + end +end +--- Sets the duration of the bar. +-- This can also be used while the bar is running to adjust the time remaining, within the bounds of the original duration. +-- @param duration Duration of the bar in seconds. +-- @param isApprox Boolean. True if you wish the time display to be an approximate "~5" instead of "5" +function barPrototype:SetDuration(duration, isApprox) self.remaining = duration; self.isApproximate = isApprox end +--- Shows the bar and starts it. +-- @param maxValue Number. If you don't wish your bar to start full, you can set a max value. A maxValue of 10 on a bar with a duration of 5 would start it at 50%. +function barPrototype:Start(maxValue) + self.running = true + local time = self.remaining + self.gap = maxValue and maxValue-time or 0 + restyleBar(self) + self.start = GetTime() + self.exp = self.start + time + + self.candyBarBar:SetMinMaxValues(0, maxValue or time) + self.candyBarBar:SetValue(self.fill and 0 or time) + + if self.isApproximate then + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + self.candyBarDuration:SetFormattedText(atformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + self.candyBarDuration:SetFormattedText(atformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + self.candyBarDuration:SetFormattedText(atformat3, time) + else -- 10 seconds to one minute + self.candyBarDuration:SetFormattedText(atformat4, time) + end + self.updater:SetScript("OnLoop", barUpdateApprox) + else + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + self.candyBarDuration:SetFormattedText(tformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + self.candyBarDuration:SetFormattedText(tformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + self.candyBarDuration:SetFormattedText(tformat3, time) + else -- 10 seconds to one minute + self.candyBarDuration:SetFormattedText(tformat4, time) + end + self.updater:SetScript("OnLoop", barUpdate) + end + self.updater:Play() + self:Show() +end +--- Pauses a running bar +function barPrototype:Pause() + if not self.paused then + self.updater:Pause() + self.paused = GetTime() + end +end +--- Resumes a paused bar +function barPrototype:Resume() + if self.paused then + local t = GetTime() + self.exp = t + self.remaining + self.start = self.start + (t-self.paused) + self.updater:Play() + self.paused = nil + end +end +--- Stops the bar. +-- This will stop the bar, fire the LibCandyBar_Stop callback, and recycle the bar into the candybar pool. +-- Note: make sure you remove all references to the bar in your addon upon receiving the LibCandyBar_Stop callback. +-- @usage +-- -- The example below shows the use of the LibCandyBar_Stop callback by printing the contents of the label in the chatframe +-- local function barstopped( callback, bar ) +-- print( bar:GetLabel(), "stopped") +-- end +-- LibStub("LibCandyBar-3.0"):RegisterCallback(myaddonobject, "LibCandyBar_Stop", barstopped) +-- @param ... Optional args to pass across in the LibCandyBar_Stop callback. +function barPrototype:Stop(...) + cb:Fire("LibCandyBar_Stop", self, ...) + stopBar(self) + barCache[self] = true +end + +-- ------------------------------------------------------------------------------ +-- Library functions +-- + +--- Creates a new timerbar object and returns it. Don't forget to set the duration, label and :Start the timer bar after you get a hold of it! +-- @paramsig texture, width, height +-- @param texture Path to the texture used for the bar. +-- @param width Width of the bar. +-- @param height Height of the bar. +-- @usage +-- mybar = LibStub("LibCandyBar-3.0"):New("Interface\\AddOns\\MyAddOn\\media\\statusbar", 100, 16) +function lib:New(texture, width, height) + local bar = next(barCache) + if not bar then + local frame = CreateFrame("Frame", nil, UIParent) + bar = setmetatable(frame, barPrototype_meta) + + local icon = bar:CreateTexture() + icon:SetPoint("TOPLEFT") + icon:SetPoint("BOTTOMLEFT") + icon:Show() + bar.candyBarIconFrame = icon + + local statusbar = CreateFrame("StatusBar", nil, bar) + statusbar:SetPoint("TOPRIGHT") + statusbar:SetPoint("BOTTOMRIGHT") + bar.candyBarBar = statusbar + + local bg = statusbar:CreateTexture(nil, "BACKGROUND") + bg:SetAllPoints() + bar.candyBarBackground = bg + + local backdrop = CreateFrame("Frame", nil, bar, "BackdropTemplate") -- Used by bar stylers for backdrops + backdrop:SetFrameLevel(0) + bar.candyBarBackdrop = backdrop + + local iconBackdrop = CreateFrame("Frame", nil, bar, "BackdropTemplate") -- Used by bar stylers for backdrops + iconBackdrop:SetFrameLevel(0) + bar.candyBarIconFrameBackdrop = iconBackdrop + + local duration = statusbar:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmallOutline") + duration:SetPoint("TOPLEFT", statusbar, "TOPLEFT", 2, 0) + duration:SetPoint("BOTTOMRIGHT", statusbar, "BOTTOMRIGHT", -2, 0) + bar.candyBarDuration = duration + + local label = statusbar:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmallOutline") + label:SetPoint("TOPLEFT", statusbar, "TOPLEFT", 2, 0) + label:SetPoint("BOTTOMRIGHT", statusbar, "BOTTOMRIGHT", -2, 0) + bar.candyBarLabel = label + + local updater = bar:CreateAnimationGroup() + updater:SetLooping("REPEAT") + updater.parent = bar + local anim = updater:CreateAnimation() + anim:SetDuration(0.04) + bar.updater = updater + bar.repeater = anim + else + barCache[bar] = nil + end + + bar:SetFrameStrata("MEDIUM") + bar:SetFrameLevel(100) -- Lots of room to create above or below this level + bar.candyBarBar:SetStatusBarTexture(texture) + bar.candyBarBackground:SetTexture(texture) + bar.width = width + bar.height = height + + -- RESET ALL THE THINGS! + bar.fill = nil + bar.showTime = true + bar.showLabel = true + bar.iconPosition = nil + for i = 1, numScripts do -- Update if scripts table is changed, faster than doing #scripts + bar:SetScript(scripts[i], nil) + end + + bar.candyBarBackground:SetVertexColor(0.5, 0.5, 0.5, 0.3) + bar.candyBarBar:SetStatusBarColor(0.5, 0.5, 0.5, 1) + bar:ClearAllPoints() + SetWidth(bar, width) + SetHeight(bar, height) + bar:SetMovable(1) + bar:SetScale(1) + bar:SetAlpha(1) + bar:SetClampedToScreen(false) + bar:EnableMouse(false) + + bar.candyBarLabel:SetTextColor(1,1,1,1) + bar.candyBarLabel:SetJustifyH("LEFT") + bar.candyBarLabel:SetJustifyV("MIDDLE") + bar.candyBarLabel:SetFont(_fontName, _fontSize) + bar.candyBarLabel:SetShadowOffset(_fontShadowX, _fontShadowY) + bar.candyBarLabel:SetShadowColor(_fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA) + + bar.candyBarDuration:SetTextColor(1,1,1,1) + bar.candyBarDuration:SetJustifyH("RIGHT") + bar.candyBarDuration:SetJustifyV("MIDDLE") + bar.candyBarDuration:SetFont(_fontName, _fontSize) + bar.candyBarDuration:SetShadowOffset(_fontShadowX, _fontShadowY) + bar.candyBarDuration:SetShadowColor(_fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA) + + + bar:SetLabel() + bar:SetIcon() + bar:SetDuration() + + return bar +end + +-- LibCandyBarEnd + +end + +-- L17: End diff --git a/Leatrix_Plus_Locale.lua b/Leatrix_Plus_Locale.lua new file mode 100644 index 0000000..badf8d2 --- /dev/null +++ b/Leatrix_Plus_Locale.lua @@ -0,0 +1,5922 @@ +---------------------------------------------------------------------- +-- Leatrix Plus Locale +---------------------------------------------------------------------- + +-- Create locale structure +local GameLocale = GetLocale() +local void, Leatrix_Plus = ... +local function localeFunc(L, key) return key end +local L = setmetatable({}, {__index = localeFunc}) +Leatrix_Plus.L = L + +if LeatrixGlobalDisableLocalisation then return end + +-- Locale override (enUS, zhCN, zhTW, ruRU, koKR, deDE, esMX, frFR, itIT, ptBR) +-- GameLocale = "enUS" + +-- zhCN: Simplified Chinese (People's Republic of China) +if GameLocale == "zhCN" then +L["+"] = "+" +L["A Donation of Mageweave"] = "捐献魔纹布" +L["A Donation of Runecloth"] = "捐献符文布" +L["A Donation of Silk"] = "捐献丝绸" +L["A Donation of Wool"] = "捐献毛料" +L["A friend request from"] = "你有一个好友申请,来自" +L["Accept available quests automatically"] = "自动接受任务" +L["Accept resurrection"] = "自动接受战复" +L["Accept summon"] = "自动接受召唤" +L["A'dal"] = "阿达尔" +L["Additional Runecloth"] = "更多的符文布" +L["Addon"] = "插件" +L["Aerie Peak"] = "鹰巢山" +L["Ahn'Qiraj"] = "安其拉" +L["ALT"] = "ALT" +L["Alterac Mountains"] = "奥特兰克山脉" +L["Anchor"] = "锚点" +L["Angelic"] = "主题:天使" +L["Arathi Highlands"] = "阿拉希高地" +L["Ashenvale"] = "灰谷" +L["Astranaar"] = "阿斯特兰纳" +L["Auberdine"] = "奥伯丁" +L["Auto loot is now enabled."] = "自动拾取已启用。" +L["AutoFollow"] = "自动跟随" +L["AutoFollow disabled."] = "已关闭自动跟随。" +L["Automate gossip"] = "对话自动交互" +L["Automate quests"] = "任务自动交接" +L["Automatic Release Cancelled"] = "自动释放已取消" +L["Automation"] = "自动交互" +L["Azshara"] = "艾萨拉" +L["Azuremyst Isle"] = "秘蓝岛" +L["B"] = "B" +L["Back to Main Menu"] = "返回" +L["Bad ID"] = "损坏的ID" +L["Badlands"] = "荒芜之地" +L["Barrens"] = "南贫瘠之地" +L["Battle"] = "主题:战争" +L["Battle of Warsong Gulch"] = "峡谷中的战斗" +L["Battlegrounds"] = "战场" +L["BCC"] = "燃烧的远征" +L["Black Morass"] = "黑暗沼泽" +L["Black Temple"] = "黑暗神殿" +L["Blackfathom Deeps"] = "黑暗深渊" +L["Blackrock Depths"] = "黑石深渊" +L["Blackwing Lair"] = "黑翼之巢" +L["Blade's Edge Mountains"] = "刀锋山" +L["Blasted Lands"] = "诅咒之地" +L["Block drunken spam"] = "屏蔽醉酒提示" +L["Block duel spam"] = "屏蔽决斗提示" +L["Block duels"] = "屏蔽决斗信息" +L["Block friend requests"] = "屏蔽好友申请" +L["Block party invites"] = "屏蔽队伍邀请" +L["Block spell links during combat"] = "屏蔽战斗中的法术链接" +L["Blocks"] = "屏蔽" +L["Bloodmyst Isle"] = "秘血岛" +L["Booty Bay"] = "藏宝海湾" +L["Bottom"] = "底部" +L["Brackenwall Village"] = "蕨墙村" +L["Buffs"] = "Buffs" +L["Burning Crusade"] = "燃烧的远征" +L["Burning Crusade Classic"] = "燃烧的远征-旧世经典" +L["Burning Steppes"] = "燃烧平原" +L["Buttons"] = "Buttons" +L["Buttons for the addons listed below will remain visible."] = "Buttons for the addons listed below will remain visible." +L["Buyout Only"] = "仅限一口价" +L["by Leatrix Plus"] = "by Leatrix Plus" +L["C"] = "披风" +L["Camera distance"] = "镜头距离" +L["Camp Mojache"] = "莫沙彻营地" +L["Camp Taurajo"] = "陶拉霍营" +L["Cannot announce in this zone."] = "无法在这个地区通报。" +L["Cannot find General chat channel."] = "无法找到可用的默认聊天频道。" +L["Cenarion Hold"] = "塞纳里奥要塞" +L["Chain style"] = "边框样式" +L["Character"] = "角色" +L["Chat"] = "聊天功能" +L["Chat Frame"] = "聊天窗口" +L["Checkbox labels are Ok."] = "复选框信息检查通过" +L["Chillwind Camp"] = "冰风岗" +L["Chillwind E'ko"] = "冰风魂精" +L["Chimes"] = "钟声" +L["Cinematics"] = "过场动画" +L["Claiming Arathi Basin"] = "占领阿拉希盆地" +L["Class colored frames"] = "框体职业染色" +L["Class icon portraits"] = "职业图标替换" +L["Classic"] = "经典" +L["click here for new selection"] = "点击此处跳转下一曲目" +L["Click to configure the settings for this option."] = "点击进行额外的选项设置" +L["Click to disable Titan Panel screen adjust. Your UI will be reloaded."] = "点击以禁用泰坦条窗口自适应,你的插件将重新载入。" +L["Click to reset the settings on this page."] = "点击重置此页面的设置。" +L["Click to resize the screen to fit between the top and bottom borders."] = "点击重设屏幕尺寸以适配上下边框" +L["Click to return to the main menu."] = "点击返回到主菜单" +L["Click to toggle the addon buttons editor."] = "Click to toggle the addon buttons editor." +L["Cloak"] = "披风" +L["Close"] = "关闭" +L["Cluster scale"] = "集群缩放" +L["Coilfang Reservoir"] = "盘牙水库" +L["Combat log cannot be hidden while undocked."] = "战斗记录窗口被分离时无法隐藏。" +L["Combat plates"] = "自动开关姓名板" +L["Combine addon buttons"] = "合并插件按钮" +L["Completed."] = "已完成。" +L["Concerted Efforts"] = "共同的努力" +L["Configuration Panel"] = "设置面板" +L["Connections for"] = "连接到" +L["Conquering Arathi Basin"] = "征服阿拉希盆地" +L["CONTROL"] = "CTRL" +L["Credits"] = "Credits" +L["Crossroads"] = "十字路口" +L["Cursor"] = "光标" +L["Cursor Left"] = "光标左侧" +L["Cursor Right"] = "光标右侧" +L["D"] = "地城" +L["Darkmoon Faire"] = "暗月马戏团" +L["Darkshire"] = "夜色镇" +L["Darkshore"] = "黑海岸" +L["Deadmines"] = "死亡矿井" +L["Deadwind Pass"] = "逆风小径" +L["Delay"] = "延迟" +L["Desolace"] = "凄凉之地" +L["Dire Maul"] = "厄运之槌" +L["Disable bag automation"] = "禁用自动背包" +L["Disable chat fade"] = "禁用聊天窗口淡出" +L["Disable loot warnings"] = "禁用拾取通报" +L["Disable screen effects"] = "禁用屏幕特效" +L["Disable screen glow"] = "禁用屏幕泛光" +L["Disable sticky chat"] = "禁用聊天频道粘滞" +L["Dismount me"] = "自动解散坐骑" +L["Dismount when casting a spell while moving"] = "移动中施法时解锁坐骑" +L["Dismount when clicking a flight destination"] = "选择飞行目的地时解锁坐骑" +L["Dismount when not enough rage, mana or energy"] = "当怒气、魔法或能量不足时解锁坐骑" +L["Dismount when the flight map opens"] = "当飞行地图打开时解散坐骑" +L["Drag the frame overlay to position the frame."] = "拖动框体边框来移动。" +L["Drag the frame overlay to position the frame.|n|nThis panel will close automatically if you enter combat."] = "拖动面板边框来移动它。|n|n这个面板会在进入战斗时自动隐藏。" +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "移动面板来定位框体。|n|n如果想要改变框体尺寸,你需选定面板,然后移动滑块来选择。|n|n你一旦进入战斗,这个框体会自动关闭。" +L["Drag to set the buffs frame scale."] = "拖动以调整Buff框体缩放。" +L["Drag to set the cluster scale.|n|nNote: Adjusting the cluster scale affects the entire cluster including frames attached to it such as the buffs frame and objectives tracker.|n|nIt will also cause the default UI right-side action bars to scale when you login. If you use the default UI right-side action bars, you may want to leave this at 100%."] = "拖动以设置小地图集群缩放。|n|n调整此选项会影响诸多依附于该集群的UI元素,比如Buff框体以及任务框体。|n|n这个也会在你登录游戏时影响默认的右侧动作条的缩放。如果你使用默认动作条,建议将此选项设置为100%。" +L["Drag to set the cursor X offset."] = "拖拽以设置光标横向偏移。" +L["Drag to set the cursor Y offset."] = "拖拽以设置光标纵向偏移。" +L["Drag to set the density of weather effects."] = "拖动以调整天气效果的密度。" +L["Drag to set the focus frame scale."] = "拖动以调整焦点框体尺寸。" +L["Drag to set the font size of book text."] = "拖动以调整文本字体的大小。" +L["Drag to set the font size of mail text."] = "拖动以调整邮件文本大小。" +L["Drag to set the font size of quest text."] = "拖动以调整任务文本大小。" +L["Drag to set the minimap scale.|n|nAdjusting this slider makes the minimap and all the elements bigger."] = "拖动以设置小地图缩放。|n|n调整这个滑块,会让小地图以及附着的相关元素同步缩放。" +L["Drag to set the number of milliseconds before you are automatically released.|n|nYou can hold down shift as the timer is ending to cancel the automatic release."] = "拖动以设置自动释放的延迟数值。|n|n你可以在延迟计时结束前按住Shift以终止本次释放。" +L["Drag to set the scale of the Leatrix Plus panel."] = "拖动以调整LeatrixPlus面板缩放。" +L["Drag to set the scale of the selected frame."] = "拖动以调整所选中面板的缩放。" +L["Drag to set the size of the bottom border."] = "拖动以调整底部边框。" +L["Drag to set the size of the left border."] = "拖动以调整左侧边框。" +L["Drag to set the size of the right border."] = "拖动以调整右侧边框。" +L["Drag to set the size of the top border."] = "拖动以调整顶部边框。" +L["Drag to set the square minimap size.|n|nAdjusting this slider makes the minimap bigger but keeps the elements the same size."] = "拖动以设置小地图尺寸。|n|n调整滑块可以修改小地图的尺寸,但是不会修改相关附着元素的尺寸。" +L["Drag to set the tooltip scale."] = "拖动以调整鼠标提示的缩放。" +L["Drag to set the transparency of the borders."] = "拖动以调整边框透明度。" +L["Drag to set the transparency of the Leatrix Plus panel."] = "拖动以调整LeatrixPlus面板的透明度。" +L["Drag to set the widget scale."] = "拖动以调整微件框体缩放。" +L["Drag to size"] = "拖动尺寸" +L["Dun Morogh"] = "丹莫罗" +L["Dungeons"] = "地下城" +L["Dup ID"] = "复制的ID" +L["durability"] = "耐久度" +L["Durability"] = "耐久度" +L["Duration"] = "持续时间" +L["Durotar"] = "杜隆塔尔" +L["Duskwood"] = "暮色森林" +L["Dustwallow Marsh"] = "尘泥沼泽" +L["Eastern Kingdoms"] = "东部王国" +L["Eastern Plaguelands"] = "东瘟疫之地" +L["Easy item destroy"] = "快速物品摧毁" +L["ELITE"] = "精英" +L["Elwynn Forest"] = "艾尔文森林" +L["Enable viewport"] = "画面视口" +L["Enhance dressup"] = "增强换装预览" +L["Enhance minimap"] = "小地图增强" +L["Enhance professions"] = "专业面板增强" +L["Enhance quest log"] = "任务面板拓展" +L["Enhance tooltip"] = "鼠标提示增强" +L["Enhance trainers"] = "增强训练面板" +L["Enhancements"] = "增强功能" +L["Enter"] = "输入" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "输入你想要监控的法术ID。|n|n如果这个法术来自于你的宠物,请勾选宠物复选框。|n|n法术图标会按职业进行保存。" +L["enter zone or track name"] = "输入区域或者曲目名称" +L["Error messages will be hidden"] = "错误信息已屏蔽。" +L["Error messages will be shown"] = "错误信息已显示。" +L["Events"] = "事件" +L["Everlook"] = "永望镇" +L["Eversong Woods"] = "永歌森林" +L["Exclude Alterac Valley"] = "不含奥特兰克山谷" +L["Exclude BugSack"] = "不含BugSack" +L["Exclude combat resurrection"] = "不包括战复" +L["Extras"] = "其他" +L["False"] = "错误" +L["Faster auto loot"] = "加速自动拾取" +L["Faster movie skip"] = "快速跳过短片" +L["Feathermoon"] = "羽月要塞" +L["Features"] = "功能" +L["Felwood"] = "费伍德森林" +L["Feralas"] = "菲拉斯" +L["Fight for Warsong Gulch"] = "战歌峡谷之战" +L["Filter chat messages"] = "过滤聊天信息" +L["Find Item"] = "查找物品" +L["Firewing Signets"] = "火翼徽记" +L["Fizzle"] = "嘶鸣" +L["Flame Crest"] = "烈焰峰" +L["Flight details"] = "飞行信息" +L["Focus"] = "焦点" +L["For all of the social options above, you can treat guild members as friends too."] = "对于上面的所有社交设置,你可以处理好友的方式处理公会成员。" +L["For Great Honor"] = "无上的荣耀" +L["Frames"] = "框体相关" +L["Freewind Post"] = "乱风岗" +L["Frostmaul E'ko"] = "霜槌魂精" +L["Frostsaber E'ko"] = "霜刃魂精" +L["Gadgetzan"] = "加基森" +L["Game Options"] = "游戏设置" +L["General"] = "通用" +L["Ghost"] = "灵魂状态框体" +L["Ghostlands"] = "幽魂之地" +L["Gloomy"] = "主题:阴暗" +L["Gnomeregan"] = "诺莫瑞根" +L["Gold Only"] = "仅输入金币" +L["Graphics and Sound"] = "界面和音效" +L["Grom'gol"] = "格罗姆高" +L["Groups"] = "队伍" +L["Guild"] = "公会" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "古拉巴什、邪枝和枯木硬币" +L["Gyrocopters"] = "螺旋机" +L["H"] = "头盔" +L["Hammerfall"] = "落锤镇" +L["Haunted"] = "主题:鬼怪" +L["Have mats?"] = "材料齐备" +L["Hellfire Peninsula"] = "地狱火半岛" +L["Hellfire Ramparts"] = "地狱火城墙" +L["Helm"] = "头盔" +L["Help"] = "帮助" +L["Hide action button text"] = "隐藏动作条文本" +L["Hide addon buttons"] = "隐藏插件按钮" +L["Hide chat buttons"] = "隐藏聊天窗口按钮" +L["Hide cooldown duration numbers (if enabled)"] = "隐藏冷却计时(若启用)" +L["Hide error messages"] = "隐藏错误信息" +L["Hide gryphons"] = "隐藏动作条狮鹫" +L["Hide portrait numbers"] = "隐藏头像数字" +L["Hide stance bar"] = "隐藏姿态条" +L["Hide the combat log"] = "隐藏战斗记录窗口" +L["Hide the world map button"] = "隐藏世界地图按钮" +L["Hide the zone text bar"] = "隐藏区域信息" +L["Hide the zoom buttons"] = "隐藏缩放按钮" +L["Hide tooltips for world units during combat"] = "战斗中隐藏窗口" +L["Hide zone text"] = "隐藏区域文本" +L["High"] = "高" +L["Hillsbrad Foothills"] = "希尔斯布莱德丘陵" +L["Hinterlands"] = "辛特兰" +L["Home"] = "主页" +L["Hover the pointer over a button."] = "在按钮上指向指示器。" +L["Hyjal Summit"] = "海加尔山" +L["Ice Thistle E'ko"] = "冰草魂精" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "勾选后,会在背包及银行界面显示搜索框。" +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "勾选后,一个按钮会显示在角色框体,其鼠标提示信息会显示身上的装备耐久度。|n|n当你死后,你的整体耐久度也会显示在聊天框体。" +L["If checked, a group invite will be sent to anyone who whispers you with a set keyword as long as you are ungrouped, group leader or raid assistant and not queued for a battleground.|n|nFriends who message the keyword using Battle.net will not be sent a group invite if they are appearing offline. They need to either change their online status or use character whispers."] = "勾选后,当你不在队伍中,或者有队伍管理权限时,自动邀请那些对你发送密语关键词的玩家。当你在处于随机队列中不生效。|n|n当好友处于隐身时发送战网消息,不会触发邀请。需要其修改在线状态或者使用角色密语时才能生效。" +L["If checked, a master volume slider will be shown in the character frame."] = "勾选后,一个音量调整滑块会显示在你角色页面。" +L["If checked, a power bar will be shown in the player frame when you are playing a shapeshifted druid."] = "勾选后,对于切换形态的德鲁伊,在玩家框体下方显示能量条。" +L["If checked, a repair summary will be shown in chat when your gear is automatically repaired."] = "勾选后,当你自动修理后会在聊天窗口打印本次修理结算。" +L["If checked, a vendor summary will be shown in chat when junk is automatically sold."] = "勾选后,当你的垃圾物品自动售出后会在聊天窗口打印本次售出结算。" +L["If checked, A'dal in Shattrath City will be muted."] = "勾选后,静音沙塔斯的阿达尔音效。" +L["If checked, additional font sizes will be available in the chat frame font size menu."] = "勾选后,你可以在聊天框设置更多的字体尺寸。" +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "勾选后,会增强你的拍卖行窗口。|n|n一口价:商品上架时自动同步起拍价和一口价。|n|n取整:自动将铜币与银币设置为99。|n|n搜索:搜索拍卖行中你正售卖的物品。|n|n额外的,拍卖持续时间将设置为账号共享。" +L["If checked, addon buttons will be combined into a single button frame which you can toggle by right-clicking the minimap.|n|nNote that enabling this option will lock out the 'Hide addon buttons' setting."] = "勾选后,插件按钮会被整合在一起,你可以右键点击小地图打开它。|n|n启用这个选项会锁定设置“隐藏插件按钮”。" +L["If checked, addon buttons will be hidden while the pointer is not over the minimap."] = "勾选后,插件按钮仅当你指向小地图时显示。" +L["If checked, alert frames will not be shown."] = "勾选后,通知提示框体不再显示。" +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "勾选后,当你访问商贩时将自动出售背包中的杂物。|n|n当你访问时按住Shift键,可以暂时忽略该功能。" +L["If checked, an animation slider will be shown in the dressing room."] = "勾选后,一个动画滑块会显示在试衣间。" +L["If checked, available quests will be accepted automatically."] = "勾选后,你将自动接受可用的任务。" +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "勾选后,信息窗口的边框会更改为蓝色(右方)或者红色(敌方)。" +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "勾选后,战网好友申请会自动屏蔽。|n|n启用后,当前待处理的申请会自动拒绝。" +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "勾选后,聊天窗口的按钮会被隐藏。|n|n点击窗口标签会自动显示最新的消息。|n|n使用鼠标滚轮可以查看历史消息。按住SHIFT进行消息页面跳转,按住CTRL将滚动至消息页首/页尾。" +L["If checked, chat text will not fade out after a time period."] = "勾选后,聊天信息不会在一定时间后淡出。" +L["If checked, class coloring will be used in the player frame, target frame and focus frame."] = "勾选后,会在玩家、目标和焦点面板启用职业颜色。" +L["If checked, class colors will be used in the chat frame."] = "勾选后,职业颜色将应用于聊天窗口。" +L["If checked, class icons will be shown in the portrait frames.|n|nNote that this option may reduce framerate while the target of target window is showing."] = "勾选后,职业图标会替换显示在头像框体上。|n|n当目标的目标显示时,这个选项可能会导致些许帧数下降。" +L["If checked, clock hourly chimes will be muted."] = "勾选后,静音每小时的钟声音效。" +L["If checked, completed quests will be turned-in automatically."] = "勾选后,已完成的任务会自动提交。" +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "勾选后,当你选择Roll点或者想要出售/邮寄一个可交易物品时,不再显示确认信息。" +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "勾选后,冷却计时数字不再显示。|n|n如果未勾选,在界面-动作条中启用冷却计时后,在相关的冷却中的法术图标会显示计时数字。" +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "勾选后,在玩家头像和宠物头像上的伤害及治疗数字不再显示。" +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "勾选后,对锁定的聊天窗口进行拖动,会使其竖直拉伸。|n|n对已解锁的聊天窗口进行拖动,会使其移动。" +L["If checked, drunken messages will be blocked unless they apply to your character.|n|nThis applies to the system channel."] = "勾选后,屏蔽他人的醉酒提示。|n|n这个生效于系统消息频道。" +L["If checked, duel requests will be blocked unless the player requesting the duel is a friend."] = "勾选后,屏蔽陌生人的决斗提示。" +L["If checked, duel victory and retreat messages will be blocked unless your character took part in the duel.|n|nThis applies to the system channel."] = "勾选后,屏蔽他人的决斗胜负信息。|n|n这个作用于系统消息频道。" +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "勾选后,当你休息或处于黑铁酒吧时,禁用表情音效。|n|n在其他状态下,将恢复表情音效。" +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "勾选后,敌对姓名板会在战斗中自动开启,离开战斗后关闭。" +L["If checked, flight times will be shown in the flight map and when you take a flight."] = "勾选后,当你使用飞行交通时,会在飞行地图上显示行程耗时。" +L["If checked, group invites will only be sent to friends.|n|nIf unchecked, group invites will be sent to everyone."] = "勾选后,仅对好友发送组队邀请。|n|n若未勾选,则发送邀请给所有人。" +L["If checked, guild ranks will be shown for players in your guild."] = "勾选后,显示公会成员的会阶等级。" +L["If checked, guild ranks will be shown for players who are not in your guild."] = "勾选后,显示非公会成员的会阶等级。" +L["If checked, gyrocopters will be muted.|n|nThis applies to the engineering flying machine mounts."] = "勾选后,螺旋机的音效将静音。|n|n这主要应用于工程的螺旋机坐骑。" +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "勾选后,会在角色面板显示头盔及披风的开关复选框。|n|n你可以按住Shift键的同时,右键点击复选框切换排列。" +L["If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman."] = "勾选后,节日事件声音将静音。|n|n这个应用于无头骑士。" +L["If checked, item buttons will be shown in the dressing room. You can click the item buttons to remove individual items from the model."] = "勾选后,在试衣间添加一个物品按钮。你可以点击该按钮从角色模型上移除物品。" +L["If checked, macro and keybind text will not be shown on action buttons."] = "勾选后,隐藏动作条上的宏及快捷键文本。" +L["If checked, members of your guild will be treated as friends for all of the options on this page."] = "勾选后,对于本页所有选项,你将以处理好友的方式处理公会成员。" +L["If checked, messages containing spell links will be blocked while you are in combat.|n|nThis is useful for blocking spell interrupt spam.|n|nThis applies to the say, party, raid, instance and emote channels."] = "勾选后,当你在战斗中时,屏蔽所有法术链接。|n|n这个主要用于屏蔽打断提示的刷屏。|n|n这个作用于说话、小队、团队、副本及表情频道。" +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "勾选后,除了部分特殊提示,大部分的错误信息(例如怒气不足)都不再显示。|n|n如果你启用了小地图按钮,你可以按住CTRL+鼠标右键来单独控制错误信息的开关。" +L["If checked, non-standard minimap buttons will be replaced with standard LibDBIcon buttons.|n|nThis will fix the problems with non-standard buttons such as not hiding automatically, not following the minimap shape and not being placed in the button frame.|n|nNote that enabling or disabling non-standard buttons may require a UI reload to take effect.|n|nMost addons already use the standard LibDBIcon library and will not be affected by this setting but a few addons still use non-standard buttons.|n|nPlease ask addon authors to use the standard LibDBIcon library for their minimap buttons then this setting won't be necessary."] = "勾选后,不标准的小地图按钮会以LibDBIcon为基准进行替换。|n|n主要用于修复无法自动隐藏,不会跟随地图形状移动的小地图图标。|n|n每次切换开关,你需要重新载入插件方可生效。|n|n对于绝大多数小地图图标,都是基于LibDBIcon的标准。|n|n请联系那些未使用LibDBIcon的插件作者改进这个情况。" +L["If checked, party invitations from friends will be automatically accepted unless you are queued for a battleground."] = "勾选后,当你不处于战场队列中时,自动接收来自好友的组队邀请。" +L["If checked, party invitations will be blocked unless the player inviting you is a friend."] = "勾选后,屏蔽陌生人的组队邀请。" +L["If checked, quest levels will be shown."] = "勾选后,显示任务等级。" +L["If checked, quests will be selected, accepted and turned-in automatically.|n|nQuests which have a gold requirement will not be turned-in automatically."] = "勾选后,任务会自动交接。|n|n需上缴金币的任务不会自动交接。" +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "勾选后,团队和副本聊天信息会改为蓝色(与小队一致)。" +L["If checked, resurrection requests will be accepted automatically."] = "勾选后,自动接收战复。" +L["If checked, resurrection requests will not be automatically accepted if the player resurrecting you is in combat."] = "勾选后,在战斗中自动接受战复。" +L["If checked, Screech will be muted.|n|nThis is a spell used by some flying pets."] = "勾选后,静音尖叫音效。|n|n这个用于一些飞行宠物的音效。" +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "勾选后,在Buff框体和目标头像下方的相关法术图标的鼠标提示框中,会显示它们的法术ID。" +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "勾选后,会禁用聊天频道的粘滞。|n|n此选项不会影响临时对话窗口。" +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "勾选后,当你不处于战斗状态时会自动接受召唤。" +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "勾选后,插件列表(游戏菜单处)会显示默认的对角色生效的插件。" +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "勾选后,自动拾取的耗时将会明显降低。" +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "勾选后,背包及银行的整理按钮不再显示。" +L["If checked, the BugSack addon minimap button will always be visible if you have BugSack installed and the minimap button enabled."] = "勾选后,BugSack图标将始终可见,不会被收纳进图标收集。" +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "勾选后,打开团队信息的按钮会显示在左侧团队管理框体的上方,而不是在其内部。|n|n此选项让你无需打开团队管理框体,就可以切换团队框体。" +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "勾选后,战斗记录会被隐藏。|n|n战斗记录窗口必须未被分离时才能生效。|n|n如果战斗记录窗口被分离了,你可以拖动其合并至主窗口(然后重载插件),或者在聊天设置中重置设置。" +L["If checked, the editbox will be moved to the top of the chat frame."] = "勾选后文本框会被移动至聊天窗口上方。" +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "勾选后,将关闭死亡后的灵魂世界特效和渐隐时的特殊光效。" +L["If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted."] = "勾选后,界面、聊天标签以及游戏菜单的按钮点击音效将静音。" +L["If checked, the main bar gryphons will not be shown."] = "勾选后,动作条两边的狮鹫不再显示。" +L["If checked, the minimap shape will be square."] = "勾选后,小地图尺寸调整为方形。" +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "勾选后,会在行囊图标处显示剩余背包空间。" +L["If checked, the player frame background will be shown in class color."] = "勾选后,玩家头像面板的背景将用职业颜色染色。" +L["If checked, the professions frame will be larger."] = "勾选后,将拓展专业面板。" +L["If checked, the ready check sound will be muted."] = "勾选后,去除就位确认的音效。" +L["If checked, the scale slider will apply to the entire minimap cluster.|n|nNote that if you are using the default action bars, rescaling the cluster will also rescale the right action bars at startup so you may want to leave the scale slider at 100%.|n|nIf unchecked, the scale slider will only apply to the minimap."] = "勾选后,缩放的滑块设置生效于小地图集群。|n|n如果你启用了默认的动作条,缩放小地图集群会同时修改右侧动作条的缩放。所以最好将缩放设置为100%。|n|n若未勾选,则缩放只生效于小地图。" +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "勾选后,屏幕泛光会被禁用。|n|n启用这个选项的同时,也会关闭醉酒时的泛光效果。" +L["If checked, the skill trainer frame will be larger and feature a train all skills button."] = "勾选后,拓宽训练师面板,并添加一个学习全部配方的按钮。" +L["If checked, the spell fizzle sounds will be muted."] = "勾选后,去除法术施放音效。" +L["If checked, the stance bar will not be shown."] = "勾选后,姿态条不再显示。" +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "勾选后,对话面板不再显示。|n|n当NPC与你交流时,该框体通常出现在界面下方。" +L["If checked, the target frame background and focus frame background will be shown in class color."] = "勾选后,目标和焦点框体的背景会以职业颜色显示。" +L["If checked, the target frame background will be shown in class color."] = "勾选后,目标头像面板的背景将用职业颜色染色。" +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "勾选后,鼠标信息会被着色,你可以设置他的布局和大小尺寸。" +L["If checked, the vendor price will be shown in item tooltips."] = "勾选后,将在物品的鼠标提示中显示其卖价。" +L["If checked, the world map button will be hidden."] = "勾选后,隐藏世界地图按钮。" +L["If checked, the zone text bar will be hidden."] = "勾选后,隐藏区域文本信息。" +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "勾选后,缩放按钮会被隐藏。你可以使用鼠标滚来来对小地图进行缩放。" +L["If checked, train sounds will be muted."] = "勾选后,去除火车音效。" +L["If checked, unit targets will be shown."] = "勾选后,目标的目标会显示在信息窗口上。" +L["If checked, when someone pings the minimap, their name will be shown. This does not apply to your pings."] = "勾选后,显示谁点击了小地图。如果是你自己点击的,则不显示相关信息。" +L["If checked, Wowhead links will go directly to the comments section."] = "勾选后,wowhead链接直接调整至备注。" +L["If checked, yawns from hunter pet cats will be muted."] = "勾选后,屏蔽猎人猫科宠物的打哈欠音效。" +L["If checked, you can block spell links, drunken spam and duel spam."] = "勾选后,你可以屏蔽法术链接,醉酒提示以及决斗信息。" +L["If checked, you can hold alt and drag the minimap to move it."] = "勾选后,你可以按住Alt键来拖动小地图。" +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "勾选后,你可以按住CTRL键,点击聊天标签来打开相应的历史记录窗口,以供复制。" +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "勾选后,你可以使用方向键移动文本框中的光标。|n|n如果未被勾选,方向键将保持它所绑定的按键功能。" +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "勾选后,你无需确认即可快速跳过过场短片。" +L["If checked, you will be able to change the font size of book text."] = "勾选后,你可以调整文本字体的大小。" +L["If checked, you will be able to change the font size of quest text."] = "勾选后,你可以调整任务文本的字体大小。" +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "勾选后,你可以更改邮件文本的字体大小。|n|n这个选项不会影响系统邮件模版(例如拍卖行的收据信息)。" +L["If checked, you will be able to change the position and scale of the buffs frame."] = "勾选后,你可以修改Buff框体的位置和缩放。" +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "勾选后,你可以修改微件框体的缩放和位置。|n|n微件框体通常用于显示PVP占点计时以及目标追踪等。" +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "勾选后,你会生成一个画面视口,这个可以在游戏界面周围增加黑色的边框背景。|n|n边框的层级是处于游戏界面和插件之间,所以你仍可以放置插件元素在上面。" +L["If checked, you will be able to customise the minimap."] = "勾选后,你可以开启小地图相关的自定义选项。" +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "勾选后,你可以把聊天窗口拖动到屏幕边缘。" +L["If checked, you will be able to mute a selection of game sounds."] = "勾选后,你可以去除部分游戏音效。" +L["If checked, you will be able to pan (right-button) and zoom (mousewheel) in the character frame, dressup frame and inspect frame.|n|nA toggle stats button will be shown in the character frame. You can also middle-click the character model to toggle stats.|n|nModel rotation controls will be hidden. Buttons to toggle gear will be added to the dressup frame."] = "If checked, you will be able to pan (right-button) and zoom (mousewheel) in the character frame, dressup frame and inspect frame.|n|nA toggle stats button will be shown in the character frame. You can also middle-click the character model to toggle stats.|n|nModel rotation controls will be hidden. Buttons to toggle gear will be added to the dressup frame." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "勾选后,你可以在目标框体上方监控至多5个的法术监控。" +L["If checked, you will be able to reposition the tooltip."] = "勾选后,你可以重新给鼠标提示框设置锚点。" +L["If checked, you will be able to set some additional rules for when your character is automatically dismounted."] = "勾选后,你可以为自动解锁坐骑设定一些额外的规则。" +L["If checked, you will be able to set the density of weather effects."] = "勾选后,你可以调整天气密度。" +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "勾选后,会在玩家框体显示稀有、精英或者稀有精英的边框。" +L["If checked, you will be able to zoom out to a greater distance."] = "勾选后,你可以加大镜头的缩放距离。" +L["If checked, you will be dismounted when you attempt to cast a non-instant cast spell while moving."] = "勾选后,当你处于移动中时,释放一个非瞬发法术会自动解锁坐骑。" +L["If checked, you will be dismounted when you attempt to cast a spell but don't have the rage, mana or energy to cast it."] = "勾选后,当你的职业资源不足以施法时,会自动解锁坐骑。" +L["If checked, you will be dismounted when you click a flight destination."] = "勾选后,当你选择一个飞行目的地时,自动解锁坐骑。" +L["If checked, you will be dismounted when you instruct a flight master to open the flight map."] = "勾选后,当你和飞行管理员对话,并打开飞行地图时,自动解锁坐骑。" +L["If checked, you will need to hold the override key down for quests to be automated.|n|nIf unchecked, holding the override key will prevent quests from being automated."] = "勾选后,你需要按住预设按键来自动交互任务。|n|n若未勾选,则按住预设键会阻止任务自动交接。" +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "勾选后,当你摧毁高品质物品时不再需要输入DELETE。|n|n同时,物品链接会显示在摧毁确认窗口。" +L["If checked, you will not release automatically in Alterac Valley."] = "勾选后,你不再在奥特兰克山谷中自动释放尸体。" +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "勾选后,当你在战场中阵亡时会自动进行释放。|n|n如果你有复生能力,则不会进行自动释放。" +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "勾选后,当你打开商贩、银行或者邮箱时,背包不会自动开启或者关闭。" +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "勾选后,你的聊天历史记录会增涨至4096行。如果未被勾选,会保持在默认的128行。|n|n启用这个设置可能会在登录时会隐藏一些聊天信息。" +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "勾选后,当你打开一个可供修理的商贩时,会自动修理身上的装备。|n|n当你打开商贩时,按住SHIFT键会让你当下忽略此项功能。" +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "勾选后,区域文本不再显示。" +L["If you use the 'Hide addon buttons' or 'Combine addon buttons' settings but you want some addon buttons to remain visible around the minimap, enter the addon names into the editbox separated by a comma.|n|nThe editbox tooltip shows the addon names that you can enter. The names must match exactly with the names shown in the editbox tooltip though case does not matter.|n|nChanges to the list will require a UI reload to take effect."] = "If you use the 'Hide addon buttons' or 'Combine addon buttons' settings but you want some addon buttons to remain visible around the minimap, enter the addon names into the editbox separated by a comma.|n|nThe editbox tooltip shows the addon names that you can enter. The names must match exactly with the names shown in the editbox tooltip though case does not matter.|n|nChanges to the list will require a UI reload to take effect." +L["Increase chat history"] = "增加聊天历史记录" +L["Interface"] = "界面设置" +L["Invaders of Alterac Valley"] = "奥特兰克的入侵者" +L["Invalid console variable."] = "无效控制台缓存。" +L["Invalid parameter."] = "无效参数" +L["Invalid quest ID."] = "无效的任务ID。" +L["Invalid sound ID"] = "无效的声音ID" +L["Invalid taint level."] = "无效的污染等级。" +L["Invalid target."] = "无效目标。" +L["Invite from whispers"] = "密语邀请" +L["Ironforge"] = "铁炉堡" +L["Kalimdor"] = "卡利姆多" +L["Karazhan"] = "卡拉赞" +L["Kargath"] = "卡加斯" +L["Keyword"] = "关键词" +L["Lakeshire"] = "湖畔镇" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "下次登出时不会清空LeatrixPlus的插件缓存。" +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "警告:你使用了错误的LeatrixPlus插件版本。" +L["Left"] = "左边" +L["Lifetime honorable kills"] = "荣誉击杀总数" +L["Light's Hope Chapel"] = "圣光之愿礼拜堂" +L["Links go directly to the comments section"] = "链接调整至备注" +L["Loch Modan"] = "洛克莫丹" +L["Lockout sharing"] = "成就共享锁定" +L["Low"] = "低" +L["M"] = "M" +L["Magic"] = "主题:魔法" +L["Magisters' Terrace"] = "魔导师平台" +L["Main Titles"] = "主题音乐" +L["Manage buffs"] = "Buff框体管理" +L["Manage focus"] = "焦点管理" +L["Manage frames"] = "管理框体面板" +L["Manage widget"] = "微件管理" +L["Managed by Leatrix Plus"] = "LeatrixPlus托管" +L["Map"] = "地图" +L["Maraudon"] = "玛拉顿" +L["Marks of Kil'jaeden"] = "基尔加丹印记" +L["Marks of Sargeras"] = "萨格拉斯印记" +L["Marshal's Refuge"] = "马绍尔营地" +L["Max camera zoom"] = "最大镜头距离" +L["Mechanics"] = "特性设置" +L["Mechstriders"] = "机械陆行鸟" +L["Media"] = "媒体" +L["Medium"] = "中" +L["Memory Usage"] = "内存占用" +L["Menethil Harbor"] = "米奈希尔港" +L["message shown."] = "信息显示。" +L["Messages"] = "消息" +L["messages shown."] = "信息显示。" +L["Misc"] = "杂项" +L["Missing console variable."] = "丢失控制台缓存。" +L["Missing mount name."] = "坐骑名字缺失。" +L["Missing movie ID."] = "影片编号不存在。" +L["Missing quest ID."] = "缺少任务ID。" +L["Missing sound file parameter."] = "缺失音频文件参数" +L["Missing sound ID."] = "缺少声音ID。" +L["Molten Core"] = "熔火之心" +L["Moonglade"] = "月光林地" +L["More Firewing Signets"] = "更多火翼徽记" +L["More font sizes"] = "更多字体尺寸" +L["More Marks of Kil'jaeden"] = "更多基尔加丹印记" +L["More Marks of Sargeras"] = "更多萨格拉斯印记" +L["More Sunfury Signets"] = "更多日怒徽记" +L["Morgan's Vigil"] = "摩根的岗哨" +L["Mount not found."] = "无法找到该坐骑。" +L["Mounts"] = "坐骑" +L["Move editbox to top"] = "把文本框移动上方" +L["Movie not playable."] = "无法播放该影片。" +L["Movie number"] = "影片编号" +L["Movies"] = "电影" +L["Mulgore"] = "莫高雷" +L["Music"] = "音乐" +L["Musical Moments"] = "音乐主题时刻" +L["Mute game sounds"] = "去除游戏音效" +L["Mystery"] = "主题:神秘" +L["N"] = "N" +L["Nagrand"] = "纳格兰" +L["Narration"] = "旁白" +L["Naxxramas"] = "纳克萨玛斯" +L["Nethergarde Keep"] = "守望堡" +L["Netherstorm"] = "虚空风暴" +L["Nijel's Point"] = "尼耶尔前哨站" +L["No bad sound IDs found."] = "没有发现损坏的ID。" +L["No help is available for this page."] = "此页面没有帮助信息。" +L["No items with durability equipped."] = "尚未装备任何带有耐久度的物品。" +L["No media duplicates found."] = "没有发现媒体的副本。" +L["No supported addons."] = "No supported addons." +L["No tooltip showing."] = "目前没有任何提示信息。" +L["None"] = "无" +L["Not completed."] = "未完成。" +L["Note that this will not reset settings that require a UI reload."] = "这个不会重置那些需要重载插件的设置。" +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "注意!|n你必须重新启动游戏客户端才可以正确加载新版本的Leatrix Plus。" +L["Nude"] = "隐藏着装" +L["Okay, disable screen adjust for me"] = "好的,禁用窗口自适应" +L["Old Hillsbrad Foothills"] = "旧希尔斯布莱德丘陵" +L["Onyxia's Lair"] = "奥妮克希亚的巢穴" +L["or click the minimap button to open Leatrix Plus."] = "或点击小地图按钮打开Leatrix Maps。" +L["Orgrimmar"] = "奥格瑞玛" +L["Outland"] = "外域" +L["Overall"] = "总计" +L["Overlay"] = "边框" +L["Override key"] = "预设功能键" +L["Particle density"] = "粒子密度" +L["Party from friends"] = "好友组队邀请" +L["Pet"] = "宠物" +L["Pets"] = "宠物" +L["Player"] = "玩家框体" +L["Please ask the addon author to use LibDBIcon."] = "请联系插件作者支持LibDBIcon库。" +L["Power"] = "能量" +L["Press CTRL/C to copy."] = "按住CTRL+C复制" +L["Queue from friends"] = "好友队列申请" +L["R"] = "R" +L["Ragefire Chasm"] = "怒焰裂谷" +L["Raid"] = "团队副本" +L["Raid frame toggle"] = "切换团队框体" +L["Random"] = "随机" +L["RARE"] = "稀有" +L["RARE ELITE"] = "稀有精英" +L["Ratchet"] = "棘齿城" +L["Razorfen Downs"] = "剃刀高地" +L["Razorfen Kraul"] = "剃刀沼泽" +L["Ready"] = "已就位" +L["Recent chat window"] = "临时聊天窗口" +L["Redridge Mountains"] = "赤脊山" +L["Refuge Pointe"] = "避难谷地" +L["Release in PvP"] = "PvP自动释放尸体" +L["Reload"] = "重载插件" +L["Remember Alterac Valley!"] = "铭记奥特兰克!" +L["Remove all items"] = "移除所有物品" +L["Remove tabard"] = "移除战袍" +L["Repair automatically"] = "自动修理装备" +L["Repaired for"] = "修理花费" +L["Replace non-standard buttons"] = "替换不标准按钮" +L["Reposition the tooltip"] = "重设提示框锚点" +L["Require override key for quest automation"] = "需要按住预设功能键来自动交互" +L["Requires UI reload."] = "需要重载插件" +L["Reset"] = "重置" +L["Resize book text"] = "文本字体调整" +L["Resize mail text"] = "重设邮件文本" +L["Resize quest text"] = "重设任务文本" +L["Resize Screen"] = "屏幕缩放" +L["Rested bubbles"] = "休息气泡信息" +L["Restrict to friends"] = "好友限定" +L["result"] = "结果" +L["results"] = "结果" +L["Return"] = "返回" +L["Revantusk Village"] = "恶齿村" +L["Right"] = "右边" +L["Right-click to close"] = "右键关闭" +L["Right-click to close."] = "右键点击关闭。" +L["right-click to go back"] = "右键点击返回" +L["Ruins of Ahn'Qiraj"] = "安其拉废墟" +L["Rut'theran Village"] = "鲁瑟兰村" +L["Sacred"] = "主题:恐怖" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "沙怒、碎颅和血顶硬币" +L["Scale"] = "尺寸" +L["Scale entire cluster"] = "缩放整个集群" +L["Scarlet Monastery"] = "血色修道院" +L["Scholomance"] = "通灵学院" +L["Screech"] = "尖啸" +L["Search"] = "搜索" +L["Search mats?"] = "搜索材料" +L["Searing Gorge"] = "灼热峡谷" +L["seconds"] = "秒" +L["seconds does not match the saved flight time of"] = "耗时不匹配预设的飞行计时" +L["Select the settings that you want to use."] = "选择你想启用的设置。" +L["Selection of music tracks"] = "音乐列表的选择" +L["Self Markers Allowed"] = "允许自我标记" +L["Self Markers Blocked"] = "屏蔽自我标记" +L["Sell junk automatically"] = "自动出售杂物" +L["SELLING JUNK"] = "出售杂物" +L["Sentinel Hill"] = "哨兵岭" +L["Set weather density"] = "调整天气密度" +L["Settings"] = "设置" +L["Shaders"] = "阴影" +L["Shadowfang Keep"] = "影牙城堡" +L["Shadowmoon Valley"] = "影月谷" +L["Shadowprey Village"] = "葬影村" +L["Shardtooth E'ko"] = "碎齿魂精" +L["SHIFT"] = "SHIFT" +L["Show animation slider"] = "显示动效滑块" +L["Show auction controls"] = "显示拍卖行控制" +L["Show bag search box"] = "显示背包搜索框" +L["Show character addons"] = "显示角色插件" +L["Show cooldowns"] = "显示冷却计时" +L["Show cooldowns above the player frame"] = "Show cooldowns above the player frame" +L["Show druid power bar"] = "显示德鲁伊能量条" +L["Show durability status"] = "显示耐久度" +L["Show flight times"] = "显示飞行时间" +L["Show free bag slots"] = "显示背包剩余空间" +L["Show guild names"] = "显示公会名字" +L["Show guild ranks for other guilds"] = "显示非公会成员会阶" +L["Show guild ranks for your guild"] = "显示公会会阶" +L["Show item buttons"] = "显示物品按钮" +L["Show me"] = "显示玩家" +L["Show minimap button"] = "显示小地图按钮" +L["Show player chain"] = "显示玩家边框" +L["Show player frame in class color"] = "玩家头像职业染色" +L["Show quest levels"] = "显示任务等级" +L["Show raid button"] = "显示团队按钮" +L["Show repair summary in chat"] = "显示修理结算" +L["Show target model"] = "显示目标模型" +L["Show the spell ID in buff icon tooltips"] = "显示法术ID" +L["Show unit targets"] = "显示单位目标" +L["Show vanity controls"] = "显示模型控制" +L["Show vendor price"] = "显示物品卖价" +L["Show vendor summary in chat"] = "显示垃圾售卖结算" +L["Show volume slider"] = "显示音量控制" +L["Show who pinged"] = "显示谁点击小地图" +L["Show Wowhead links"] = "显示wowhead链接" +L["Silence rested emotes"] = "表情禁音" +L["Silithus"] = "希利苏斯" +L["Silverpine Forest"] = "银松森林" +L["Single Mark of Sargeras"] = "单枚萨格拉斯印记" +L["Single Sunfury Signet"] = "单枚日怒徽记" +L["Social"] = "社交信息" +L["Sold junk for"] = "杂物出售总计" +L["Sound system restarted."] = "声音系统已重启。" +L["Southshore"] = "南海镇" +L["Spell ID"] = "法术ID" +L["Splintertree Post"] = "碎木岗哨" +L["Spooky"] = "主题:阴森" +L["Square minimap"] = "方形地图" +L["Square size"] = "方形尺寸" +L["Stockade"] = "暴风城监狱" +L["Stonard"] = "斯通纳德" +L["Stonetalon Mountains"] = "石爪山脉" +L["Stonetalon Peak"] = "石爪峰" +L["Stop"] = "停止" +L["Stormwind"] = "暴风城" +L["Stranglethorn Vale"] = "荆棘谷" +L["Stratholme"] = "斯坦索姆" +L["Sun Rock Retreat"] = "烈日石居" +L["Sunfury Signets"] = "日怒徽记" +L["Sunken Temple"] = "沉没的神庙" +L["Sunwell Plateau"] = "太阳之井高地" +L["Support"] = "帮助支持" +L["Supported Addons"] = "Supported Addons" +L["Swamp"] = "主题:沼泽" +L["Swamp of Sorrows"] = "悲伤沼泽" +L["System"] = "系统设置" +L["T"] = "T" +L["Tabard"] = "隐藏战袍" +L["Taint level: Basic (1)."] = "污染等级:基本(1)。" +L["Taint level: Disabled (0)."] = "污染等级:禁用(0)。" +L["Taint level: Full (2)."] = "污染等级:全面(2)。" +L["Talonbranch Glade"] = "刺枝林地" +L["Talrendis Point"] = "塔伦迪斯营地" +L["Tanaris"] = "塔纳利斯" +L["Target"] = "目标框体" +L["Target Tracking Disabled"] = "禁用目标追踪" +L["Target Tracking Enabled"] = "启用目标追踪" +L["Tarren Mill"] = "塔伦米尔" +L["Teldrassil"] = "泰达希尔" +L["Tempest Keep"] = "风暴要塞" +L["Temple of Ahn'Qiraj"] = "安其拉神殿" +L["Temple of Atal'Hakkar"] = "阿塔哈卡神庙" +L["Ten Years of Warcraft"] = "魔兽十周年" +L["Terokkar Forest"] = "泰罗卡森林" +L["Text"] = "文本信息" +L["Text size"] = "字体尺寸" +L["Text Size"] = "字体尺寸" +L["Thalanaar"] = "萨兰纳尔" +L["The game will dismount you if you successfully cast a spell without addons. These settings let you set some additional dismount rules."] = "游戏内自带设置即可让你施法时自动解锁坐骑。这个选项让你可以添加一些额外规则。" +L["The Sepulcher"] = "瑟伯切尔" +L["The square minimap will always show the new covenant button."] = "方形地图将始终显示新盟约图标。" +L["The summon from"] = "召唤来自" +L["Thelsamar"] = "塞尔萨玛" +L["Themes"] = "主题" +L["Theramore"] = "塞拉摩" +L["There is a helpful guide on leatrix.com."] = "你可以在leatrix.com上查看帮助。" +L["This flight does not exist in the database."] = "这次的飞行尚未记录在数据库中。" +L["This flight does not have a saved duration in the database."] = "这次的飞行时间尚未记录在数据库中。" +L["This flight's actual time of"] = "这次飞行的真实耗时" +L["This is a custom button."] = "这是一个自定义按钮。" +L["This panel will close automatically if you enter combat."] = "此面板在你进入战斗后自动关闭。" +L["This slider requires 'Square minimap' to be enabled."] = "这个滑块需要启用“方形地图”选项。" +L["Thorium Point"] = "瑟银哨塔" +L["Thousand Needles"] = "千针石林" +L["Thunder Bluff"] = "雷霆崖" +L["Timer"] = "计时框体" +L["Tirisfal Glades"] = "提瑞斯法林地" +L["Titan Panel screen adjust needs to be disabled for the frame to be saved correctly."] = "为了能正确的保存此框体,泰坦框体自适应需要被禁用。" +L["to"] = "至" +L["To begin, choose an options page."] = "请选择一项开始使用" +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "你需要禁用ElvUI的聊天模块以隐藏战斗记录。" +L["To move the minimap, hold down the alt key and drag it."] = "按住Alt键并点击拖动小地图。" +L["To move the minimap, hold down the alt key and drag it.|n|nIf you toggle an addon minimap button, you may need to reload your UI for the change to take effect. This only affects a few addons that use custom buttons.|n|nThis panel will close automatically if you enter combat."] = "你可以按住Alt键并点击以拖动小地图。|n|n如果你开关一个小地图按钮,你需要重载插件以生效改动。这个只影响部分使用自定义图标的插件。|n|n当你进入战斗后,这个面板会自动关闭。" +L["To use the Find Item button, you need to deselect the WoW Token category."] = "你必须取消魔兽货币分类以启用寻找物品的按钮。" +L["Toggle buttons"] = "开关按钮" +L["Toggle character stats"] = "Toggle character stats" +L["took"] = "花费" +L["Tooltip"] = "鼠标信息窗口" +L["Tooltip title color"] = "鼠标提示信息颜色" +L["Top"] = "顶部" +L["Top Center"] = "顶级中心" +L["Tracing started."] = "追踪开始。" +L["Tracing stopped."] = "追踪停止。" +L["Trains"] = "火车" +L["Transparency"] = "透明度" +L["True"] = "正确" +L["Turn-in completed quests automatically"] = "自动提交任务" +L["Uldaman"] = "奥达曼" +L["Unclamp chat frame"] = "不限制窗口位置" +L["Undercity"] = "幽暗城" +L["Un'Goro Crater"] = "安戈洛环形山" +L["Universal group color"] = "统一队伍颜色" +L["Unlock the minimap"] = "解锁小地图" +L["Use arrow keys in chat"] = "允许使用方向键" +L["Use class colors in chat"] = "聊天窗口启用职业颜色" +L["Use easy resizing"] = "使用简单拉伸" +L["Valormok"] = "瓦罗莫克" +L["Value must be a number."] = "该参数必须为数字。" +L["Various"] = "其他" +L["Vendors"] = "商贩" +L["Version"] = "版本" +L["Very Low"] = "低" +L["Video"] = "视频" +L["Visibility"] = "可见性" +L["Wailing Caverns"] = "哀嚎洞穴" +L["Warning"] = "警告" +L["was automatically declined."] = "已经自动拒绝。" +L["Weather density"] = "天气密度" +L["Welcome to Leatrix Plus."] = "欢迎使用Leatrix Plus" +L["Western Plaguelands"] = "西瘟疫之地" +L["Westfall"] = "西部荒野" +L["Wetlands"] = "湿地" +L["Widget"] = "窗口小部件" +L["Wildkin E'ko"] = "枭兽魂精" +L["will be automatically accepted in 10 seconds unless cancelled."] = "将在10秒内自动接受(除非主动取消)。" +L["Winter"] = "冬日" +L["Winterfall E'ko"] = "寒水魂精" +L["Winterspring"] = "冬泉谷" +L["World of Warcraft"] = "魔兽世界" +L["X Offset"] = "横向偏移" +L["Y Offset"] = "纵向偏移" +L["Yawns"] = "打哈欠" +L["YOU"] = "你" +L["You cannot do that in combat."] = "你无法在战斗中进行该项操作。" +L["You have"] = "你有" +L["You need to be group leader."] = "需要你是队长。" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "你需要进行重载插件后才能使部分设置生效。|n|n你无需立即点击重载插件按钮,但是你完成设置并希望其生效时,必须点击它。" +L["Your UI needs to be reloaded."] = "你的插件需要重新载入。" +L["Zangarmarsh"] = "赞加沼泽" +L["Zones"] = "区域" +L["Zoram'gar Outpost"] = "佐拉姆加前哨站" +L["Zul'Aman"] = "祖阿曼" +L["Zul'Farrak"] = "祖尔法拉克" +L["Zul'Gurub"] = "祖尔格拉布" +L["Zulian, Razzashi, and Hakkari Coins"] = "祖利安、拉扎什和哈卡莱硬币" +L["Zygor addon not found."] = "你尚未安装Zygor插件。" + +end + +-- zhTW: Traditional Chinese (Taiwan) +if GameLocale == "zhTW" then +L["+"] = "+" +L["A Donation of Mageweave"] = "捐獻魔紋布" +L["A Donation of Runecloth"] = "捐獻符文布" +L["A Donation of Silk"] = "捐獻絲綢" +L["A Donation of Wool"] = "捐獻毛料" +L["A friend request from"] = "你有一個好友申請,來自" +L["Accept available quests automatically"] = "自動接受可用任務" +L["Accept resurrection"] = "自動接受復活" +L["Accept summon"] = "自動接受召喚" +L["A'dal"] = "阿達歐" +L["Additional Runecloth"] = "更多的符文布" +L["Addon"] = "插件" +L["Aerie Peak"] = "鷹巢山" +L["Ahn'kahet (Old Kingdom)"] = "安卡罕特:古王國" +L["Ahn'Qiraj"] = "安其拉" +L["ALT"] = "ALT" +L["Alterac Mountains"] = "奧特蘭克山脈" +L["Anchor"] = "定位點" +L["Angelic"] = "天使" +L["Announce rare"] = "通告稀有" +L["Arathi Highlands"] = "阿拉希高地" +L["Ashenvale"] = "梣谷" +L["Astranaar"] = "阿斯特蘭納" +L["Auberdine"] = "奧伯丁" +L["Auto loot is now enabled."] = "自動拾取現在已啟動。" +L["AutoFollow"] = "自動跟隨" +L["AutoFollow disabled."] = "自動跟隨已停用。" +L["Automate gossip"] = "自動對話" +L["Automate quests"] = "任務自動化" +L["Automatic Release Cancelled"] = "自動釋放已被取消" +L["Automation"] = "自動化" +L["Azjol-Nerub"] = "阿茲歐奈幽" +L["Azshara"] = "艾薩拉" +L["Azuremyst Isle"] = "藍謎島" +L["B"] = "B" +L["Back to Main Menu"] = "返回" +L["Bad ID"] = "損壞的ID" +L["Badlands"] = "荒蕪之地" +L["Barrens"] = "南貧瘠之地" +L["Battle"] = "戰爭" +L["Battle of Warsong Gulch"] = "峽谷之戰" +L["Battlegrounds"] = "戰場" +L["BCC"] = "BCC" +L["Bikes"] = "摩托車" +L["Black Morass"] = "黑暗沼澤" +L["Black Temple"] = "黑暗神廟" +L["Blackfathom Deeps"] = "黑澗深淵" +L["Blackrock Depths"] = "黑石深淵" +L["Blackwing Lair"] = "黑翼之巢" +L["Blade's Edge Mountains"] = "劍刃山脈" +L["Blasted Lands"] = "詛咒之地" +L["Block drunken spam"] = "阻擋酒醉訊息" +L["Block duel spam"] = "阻擋決鬥訊息" +L["Block duels"] = "拒絕決鬥" +L["Block friend requests"] = "封鎖好友邀請" +L["Block party invites"] = "封鎖隊伍邀請" +L["Block shared quests"] = "阻擋任務分享" +L["Block spell links during combat"] = "阻擋法術連結當戰鬥中" +L["Blocks"] = "封鎖" +L["Bloodmyst Isle"] = "血謎島" +L["Booty Bay"] = "藏寶海灣" +L["Borean Tundra"] = "北風凍原" +L["Bottom"] = "底部" +L["Brackenwall Village"] = "蕨牆村" +L["Brooms"] = "掃帚" +L["Buffs"] = "增益" +L["Burning Crusade"] = "燃燒的遠征" +L["Burning Crusade Classic"] = "經典-燃燒的遠征" +L["Burning Steppes"] = "燃燒平原" +L["Buttons"] = "按鈕" +L["Buttons for the addons listed below will remain visible."] = "下面列出的插件按鈕將保持可見。" +L["Buyout Only"] = "僅限直購價" +L["by Leatrix Plus"] = "由 Leatrix Plus" +L["C"] = "披" +L["Camera distance"] = "鏡頭距離" +L["Camp Mojache"] = "莫沙徹營地" +L["Camp Taurajo"] = "陶拉祖營地" +L["Cannot announce in this zone."] = "無法在此區域通告。" +L["Cannot be sold"] = "無法出售" +L["Cannot find General chat channel."] = "無法找到綜合聊天頻道。" +L["Cannot use this with your locale."] = "不能在您的語言環境中使用它。" +L["Cenarion Hold"] = "塞納里奧城堡" +L["Chain style"] = "邊框樣式" +L["Character"] = "角色" +L["Chat"] = "聊天功能" +L["Chat Frame"] = "聊天視窗" +L["Checkbox labels are Ok."] = "複選框標籤是OK的。" +L["Chillwind Camp"] = "冰風崗" +L["Chillwind E'ko"] = "冰風魂精" +L["Chimes"] = "鐘聲" +L["Cinematics"] = "過場動畫" +L["Claiming Arathi Basin"] = "資源競賽" +L["Class colored frames"] = "框架職業染色" +L["Class icon portraits"] = "職業圖示頭像" +L["Classic"] = "經典" +L["click here for new selection"] = "點擊這裡跳轉新選擇" +L["Click to close the currently active flight progress bar."] = "點擊以關閉當前啟用的飛行進度條。" +L["Click to configure the settings for this option."] = "點擊進行額外的選項設置" +L["Click to disable Titan Panel screen adjust. Your UI will be reloaded."] = "點擊來取消泰坦面板的螢幕調整。您的介面將會重載。" +L["Click to mute sounds in the list."] = "點擊來使列表中的聲音靜音。" +L["Click to reset the settings on this page."] = "點擊重置此頁面的設置。" +L["Click to resize the screen to fit between the top and bottom borders."] = "點擊來重設螢幕大小以適配上下邊框。" +L["Click to return to the main menu."] = "點擊返回到主選單" +L["Click to toggle the addon buttons editor."] = "點擊以切換插件按鈕編輯器。" +L["Click to toggle the frame alignment grid."] = "點擊以切換框架對齊網格。" +L["Click to unmute sounds in the list."] = "點擊來使列表中的聲音解除靜音。" +L["Cloak"] = "披風" +L["Close"] = "關閉" +L["Close Bar"] = "關閉條" +L["Cluster scale"] = "群組縮放" +L["CMD (MAC)"] = "指令 (MAC)" +L["Coilfang Reservoir"] = "盤牙水庫" +L["Collapse"] = "收起" +L["Combat log cannot be hidden while undocked."] = "戰鬥記錄視窗被分離時無法隱藏。" +L["Combat plates"] = "自動開關姓名板" +L["Combine addon buttons"] = "合併插件按鈕" +L["Completed."] = "已完成。" +L["Concerted Efforts"] = "共同的努力" +L["Configuration Panel"] = "設置面板" +L["Connections for"] = "連結在" +L["Conquering Arathi Basin"] = "戰爭的動力" +L["Contribute"] = "貢獻" +L["CONTROL"] = "CTRL" +L["Copied to clipboard."] = "複製到剪貼簿。" +L["Credits"] = "有功人員" +L["Crossroads"] = "十字路口" +L["Crystalsong Forest"] = "水晶之歌森林" +L["Culling of Stratholme"] = "淨化斯坦索姆" +L["Cursor"] = "鼠標" +L["Cursor Left"] = "鼠標左側" +L["Cursor Right"] = "鼠標右側" +L["D"] = "地城" +L["Darkmoon Faire"] = "暗月馬戲團" +L["Darkshire"] = "夜色鎮" +L["Darkshore"] = "黑海岸" +L["Deadmines"] = "死亡礦坑" +L["Deadwind Pass"] = "逆風小徑" +L["Delay"] = "延遲" +L["Desolace"] = "淒涼之地" +L["Dire Maul"] = "厄運之槌" +L["Disable bag automation"] = "停用背包自動開啟" +L["Disable chat fade"] = "停用聊天視窗淡出" +L["Disable loot warnings"] = "停用拾取通報" +L["Disable screen effects"] = "停用螢幕特效" +L["Disable screen glow"] = "停用螢幕光暈" +L["Disable sticky chat"] = "停用聊天頻道粘附" +L["Dismount me"] = "讓我下坐騎" +L["Dismount when casting a spell while moving"] = "移動中施法時下坐騎" +L["Dismount when clicking a flight destination"] = "點擊一個飛行點目的地時下坐騎" +L["Dismount when not enough rage, mana or energy"] = "怒氣、法力或能量不足時下坐騎" +L["Dismount when the flight map opens"] = "當開啟飛行地圖時下坐騎" +L["Do you want to use Leatrix Plus Enhanced Minimap or ElvUI Minimap?"] = "你想使用Leatrix Plus來增強小地圖還是ElvUI小地圖呢?" +L["Drag the frame overlay to position the frame."] = "拖曳框架的遮罩以定位此框架。" +L["Drag the frame overlay to position the frame.|n|nThis panel will close automatically if you enter combat."] = "拖動框架圖層以定位框架。|n|n如果您進入戰鬥,此面板將自動關閉。" +L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] = "使用左鍵拖動框架圖層以自由定位,或使用右鍵使用對齊網格進行定位。" +L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid.|n|nThis panel will close automatically if you enter combat."] = "使用左鍵拖動框架圖層以自由定位,或使用右鍵使用對齊網格來定位它。|n|n如果您進入戰鬥,此面板將自動關閉。" +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "移動面板來定位框架。|n|n如果想要改變框架尺寸,你需選定面板,然後移動滑塊來選擇。|n|n你一旦進入戰鬥,這個框架會自動關閉。" +L["Drag the frame overlays with the left button to position them freely or with the right button to position them using snap-to-grid.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "使用左鍵拖動框架圖層以自由定位它們,或使用右鍵使用對齊網格來定位它們。|n|n要更改框架的大小,請單擊它以選擇它,然後調整縮放卷軸。| n|n如果您進入戰鬥,此面板將自動關閉。" +L["Drag to set the buffs frame scale."] = "拖拉來設定增益框架大小。" +L["Drag to set the cluster scale.|n|nNote: Adjusting the cluster scale affects the entire cluster including frames attached to it such as the buffs frame and objectives tracker.|n|nIt will also cause the default UI right-side action bars to scale when you login. If you use the default UI right-side action bars, you may want to leave this at 100%."] = "拖動以設置群組縮放。|n|n注意:調整群組縮放會影響整個群組,包括附加到它的框架,例如增益框架和任務目標追蹤器。|n|n當你登入時它還會導致預設的UI右側動作列縮放。如果您使用預設的UI右側動作列,您可能希望將其保留為 100%。" +L["Drag to set the cluster scale.|n|nNote: Adjusting the cluster scale affects the entire cluster including frames attached to it such as the quest watch frame.|n|nIt will also cause the default UI right-side action bars to scale when you login. If you use the default UI right-side action bars, you may want to leave this at 100%."] = "拖動以設置群組規模。|n|n注意:調整群組規模會影響整個群組,包括附加到它的框架,例如任務監控框架。|n|n當您登入時,它還會導致預設的介面右側動作列縮放。如果您使用預設的介面右側動作列,您可能希望將其保留為 100%。" +L["Drag to set the cursor X offset."] = "拖拉來設置鼠標水平偏移量。" +L["Drag to set the cursor Y offset."] = "拖拉來設置鼠標垂直偏移量。" +L["Drag to set the density of weather effects."] = "拖動來設定天氣效果的密度。" +L["Drag to set the durability frame scale."] = "拖動以設置耐久度框架縮放。" +L["Drag to set the flight progress bar scale."] = "拖動以設置飛行進度條縮放大小。" +L["Drag to set the flight progress bar width."] = "拖動以設置飛行進度條寬度。" +L["Drag to set the focus frame scale."] = "拖動以設置焦點框架大小。" +L["Drag to set the font size of book text."] = "拖拉來設定書籍文字大小。" +L["Drag to set the font size of mail text."] = "拖動以設置郵件文字的字體大小。" +L["Drag to set the font size of quest text."] = "拖動以設置任務文字的字體大小。" +L["Drag to set the minimap scale.|n|nAdjusting this slider makes the minimap and all the elements bigger."] = "拖動以設置小地圖縮放比例。|n|n調整此卷軸會使小地圖和所有元件變大。" +L["Drag to set the number of milliseconds before you are automatically released.|n|nYou can hold down shift as the timer is ending to cancel the automatic release."] = "拖動以設置自動釋放之前的毫秒數。|n|n您可以在計時器結束時按住 shift 以取消自動釋放。" +L["Drag to set the scale of the Leatrix Plus panel."] = "拖動以設置Leatrix Plus面板的縮放比例。" +L["Drag to set the scale of the selected frame."] = "拖動以設置所選框架的縮放比例。" +L["Drag to set the size of the bottom border."] = "拖動以設置底部邊框的大小。" +L["Drag to set the size of the left border."] = "拖動以設置左側邊框的大小。" +L["Drag to set the size of the right border."] = "拖動以設置右側邊框的大小。" +L["Drag to set the size of the top border."] = "拖動以設置頂部邊框的大小。" +L["Drag to set the square minimap size.|n|nAdjusting this slider makes the minimap bigger but keeps the elements the same size."] = "拖動以設置方形小地圖大小。|n|n調整此卷軸會使小地圖更大,但元件保持相同大小。" +L["Drag to set the timer bar scale."] = "拖動以設置計時器框架縮放。" +L["Drag to set the tooltip scale."] = "拖動以設置工具提示的縮放比例。" +L["Drag to set the transparency of the borders."] = "拖動以設置邊框的透明度。" +L["Drag to set the transparency of the Leatrix Plus panel."] = "拖動以設置Leatrix Plus面板的透明度。" +L["Drag to set the widget scale."] = "拖動以設置組件大小。" +L["Drag to size"] = "拖拉改變大小" +L["Dragonblight"] = "龍骨荒野" +L["Drak'Tharon Keep"] = "徳拉克薩隆要塞" +L["Dun Morogh"] = "丹莫洛" +L["Dungeons"] = "地下城" +L["Dup ID"] = "重複的ID" +L["Duplicates"] = "重複" +L["durability"] = "耐久度" +L["Durability"] = "耐久度" +L["Duration"] = "耗時" +L["Durotar"] = "杜洛塔" +L["Duskwood"] = "暮色森林" +L["Dustwallow Marsh"] = "塵泥沼澤" +L["Eastern Kingdoms"] = "東部王國" +L["Eastern Plaguelands"] = "東瘟疫之地" +L["Easy item destroy"] = "簡易物品摧毀" +L["Editor"] = "編輯器" +L["Eight minutes"] = "八分鐘" +L["ELITE"] = "精英" +L["ElvUI"] = "ElvUI" +L["Elwynn Forest"] = "艾爾文森林" +L["Enable viewport"] = "啟用視窗背景" +L["Enhance dressup"] = "增強試衣間" +L["Enhance minimap"] = "增強小地圖" +L["Enhance professions"] = "增強專業" +L["Enhance quest log"] = "增強任務日誌" +L["Enhance tooltip"] = "增強工具提示" +L["Enhance trainers"] = "加強技能訓練" +L["Enhancements"] = "增強功能" +L["Enter"] = "進入" +L["Enter item IDs separated by commas. Item IDs can be found in item tooltips while this panel is showing.|n|nJunk items entered here will not be sold automatically.|n|nWhite items entered here will be sold automatically.|n|nThe editbox tooltip will show you more information about the items you have entered."] = "輸入以逗號分隔的物品ID。顯示此面板時,可以在物品工具提示中找到物品ID。|n|n此處輸入的垃圾物品不會自動出售。|n|n此處輸入的白色物品將自動出售。|n|n編輯框工具提示將顯示有關您輸入的物品的更多訊息。" +L["Enter junk item IDs separated by commas."] = "輸入垃圾物品ID並以逗號分隔。" +L["Enter sound file IDs separated by comma then click the Mute button.|n|nIf you wish, you can enter a brief note for each file ID but do not include numbers in your notes.|n|nFor example, you can enter 'DevAura 569679, RetAura 568744' to mute the Devotion Aura and Retribution Aura spells.|n|nUse Leatrix Sounds to find, test and play sound file IDs."] = "輸入以逗號分隔的聲音檔案ID,然後單擊靜音按鈕。|n|n如果願意,您可以為每個檔案ID輸入一個簡短的註釋,但不要在註釋中包含數字。|n|n例如,您可以輸入“DevAura 569679、RetAura 568744”來靜音 Devotion Aura 和 Retribution Aura 法術。|n|n使用 Leatrix Sounds 查找、測試和播放聲音檔案ID。" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "輸入您要查看的冷卻圖示的法術ID。|n|n如果想要寵物框架下正常出現冷卻圖示,請選中寵物複選框。|n|n冷卻圖示會依據您的職業保存。" +L["enter zone or track name"] = "輸入區域或曲目名稱" +L["Error messages will be hidden"] = "錯誤訊息將會隱藏" +L["Error messages will be shown"] = "錯誤訊息將會顯示" +L["Events"] = "事件" +L["Everlook"] = "永望鎮" +L["Eversong Woods"] = "永歌森林" +L["Exclude Alterac Valley"] = "排除奧特蘭山谷" +L["Exclude BugSack"] = "排除 BugSack" +L["Exclude combat resurrection"] = "排除戰鬥復活" +L["Exclusions"] = "例外" +L["Expand"] = "擴展" +L["Extras"] = "其他" +L["Eye of Eternity"] = "永恆之眼" +L["False"] = "虛假" +L["Faster auto loot"] = "加速自動拾取" +L["Faster movie skip"] = "快速動畫跳過" +L["Feathermoon"] = "羽月要塞" +L["Features"] = "功能" +L["Felwood"] = "費伍德森林" +L["Feralas"] = "菲拉斯" +L["Fight for Warsong Gulch"] = "自然屏障" +L["Fill instead of drain"] = "填滿而非排空" +L["Filter chat messages"] = "過濾聊天訊息" +L["Find Item"] = "搜尋物品" +L["Firewing Signets"] = "火翼徽章" +L["Five minutes"] = "五分鐘" +L["Fizzle"] = "嘶叫聲" +L["Flame Crest"] = "烈焰峰" +L["Flight commenced."] = "飛航開始。" +L["Flight details"] = "飛航詳情" +L["Focus"] = "焦點" +L["For all of the social options above, you can treat guild members as friends too."] = "對於所有以上社交選項,您也可以將公會成員和社群成員視為好友。" +L["For Great Honor"] = "無上的榮耀" +L["Forge of Souls"] = "眾魂熔爐" +L["Four minutes"] = "四分鐘" +L["Frames"] = "框架相關" +L["Freewind Post"] = "亂風崗" +L["Frostmaul E'ko"] = "霜槌魂精" +L["Frostsaber E'ko"] = "霜刃魂精" +L["Gadgetzan"] = "加基森" +L["Game Options"] = "游戲設置" +L["General"] = "一般" +L["Ghost"] = "靈魂狀態框架" +L["Ghostlands"] = "鬼魂之地" +L["Gloomy"] = "黑暗" +L["Gnomeregan"] = "諾姆瑞根" +L["Gold Only"] = "僅輸入金幣" +L["Graphics and Sound"] = "圖形和音效" +L["Grizzly Hills"] = "灰白之丘" +L["Grom'gol"] = "格羅姆高" +L["Groups"] = "隊伍" +L["Guild"] = "公會" +L["Gundrak"] = "剛德拉克" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "古拉巴什、邪枝和枯木硬幣" +L["Gyrocopters"] = "直升機" +L["H"] = "頭" +L["Halls of Lightning"] = "雷光大廳" +L["Halls of Reflection"] = "鏡像大廳" +L["Halls of Stone"] = "石之大廳" +L["Hammerfall"] = "落錘鎮" +L["Haunted"] = "鬧鬼的" +L["Have mats?"] = "有材料?" +L["Hellfire Peninsula"] = "地獄火半島" +L["Hellfire Ramparts"] = "地獄火城牆" +L["Helm"] = "頭盔" +L["Help"] = "幫助" +L["Help contribute flight times"] = "幫助提供飛行時間" +L["Hide action button text"] = "隱藏動作列按鈕文字" +L["Hide addon buttons"] = "隱藏插件按鈕" +L["Hide alerts"] = "隱藏警告" +L["Hide chat buttons"] = "隱藏聊天視窗按鈕" +L["Hide cooldown duration numbers (if enabled)"] = "隱藏冷卻持續時間數字(如果啟用)" +L["Hide error messages"] = "隱藏錯誤訊息" +L["Hide gryphons"] = "隱藏動作條獅鷲" +L["Hide keybind text"] = "隱藏快捷鍵文字" +L["Hide macro text"] = "隱藏巨集文字" +L["Hide portrait numbers"] = "隱藏頭像數字" +L["Hide stance bar"] = "隱藏姿態條" +L["Hide the combat log"] = "隱藏戰鬥記錄視窗" +L["Hide the health bar"] = "隱藏血量條" +L["Hide the tracking button"] = "隱藏追蹤按鈕" +L["Hide the world map button"] = "隱藏世界地圖按鈕" +L["Hide the zone text bar"] = "隱藏區域文字列" +L["Hide the zoom buttons"] = "隱藏縮放按紐" +L["Hide tooltips for world units during combat"] = "戰鬥中隱藏視窗" +L["Hide zone text"] = "隱藏區域文字" +L["High"] = "高" +L["Hillsbrad Foothills"] = "希爾斯布萊德丘陵" +L["Hinterlands"] = "辛特蘭" +L["Home"] = "首頁" +L["Hover the pointer over a button."] = "將指針停留在按鈕上。" +L["Howling Fjord"] = "凜風峽灣" +L["Hyjal Summit"] = "海加爾山之戰" +L["Ice Thistle E'ko"] = "冰草魂精" +L["Icecrown"] = "寒冰皇冠" +L["Icecrown Citadel"] = "冰冠城寨" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "勾選後,背包搜尋框會顯示在背包與銀行視窗上。" +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "勾選後,一個按鈕會顯示在角色框架,其鼠標提示訊息會顯示身上的裝備耐久度。|n|n當你死後,你的整體耐久度也會顯示在聊天框架。" +L["If checked, a cancel form button will be shown on the flight map while you are playing as a shapeshifted druid or shaman."] = "勾選後,當您玩變形的德魯伊或薩滿時,飛行地圖上會顯示一個取消變形按鈕。" +L["If checked, a group invite will be sent to anyone who whispers you with a set keyword as long as you are ungrouped, group leader or raid assistant and not queued for a battleground.|n|nFriends who message the keyword using Battle.net will not be sent a group invite if they are appearing offline. They need to either change their online status or use character whispers."] = "勾選後,當你未組隊或為隊長或團隊助理,並且沒有在地下城與團隊的佇列中時,任何密語你預設的關鍵字的人將會被組隊邀請。|n|n使用戰網發送關鍵字訊息的好友如果處於離線狀態,將不會收到組隊邀請。他們需要更改在線狀態或使用角色密語。" +L["If checked, a master volume slider will be shown in the character frame."] = "勾選後,主要聲道的調整滑桿將出現在角色視窗。" +L["If checked, a minimap button will be available.|n|nClick - Toggle options panel.|n|nSHIFT-click - Toggle music.|n|nALT-click - Toggle errors (if enabled).|n|nCTRL/SHIFT-click - Toggle Zygor (if installed).|n|nCTRL/ALT-click - Toggle windowed mode."] = "勾選後,小地圖按鈕將可用。|n|n單擊 - 切換選項面板。|n|nSHIFT-單擊 - 切換音樂。|n|nALT-單擊 - 切換錯誤(如果啟用)。|n|nCTRL/SHIFT-單擊 - 切換 Zygor(如果已安裝)。|n|nCTRL/ALT-單擊 - 切換視窗模式。" +L["If checked, a power bar will be shown in the player frame when you are playing a shapeshifted druid."] = "勾選後,當您玩變形的德魯伊時,玩家框架中將顯示一個能量條。" +L["If checked, a repair summary will be shown in chat when your gear is automatically repaired."] = "勾選後,當您的裝備自動修理時,將在聊天中顯示修理總結。" +L["If checked, a timer will be shown under the PvP encounter ready frame so that you know how long you have left to click the enter button."] = "勾選後,在 PvP 開戰準備確認框架下方將顯示一個計時器,以便您知道您可以點擊進入按鈕還有多長時間。" +L["If checked, a train all skills button will be shown in the skill trainer frame allowing you to train all available skills instantly."] = "勾選後,訓練所有技能按鈕將顯示在技能訓練視窗中,讓您可以立即訓練所有可用技能。" +L["If checked, a vendor summary will be shown in chat when junk is automatically sold."] = "勾選後,當您的垃圾自動出售時,將在聊天中顯示商店總結。" +L["If checked, A'dal in Shattrath City will be muted."] = "勾選後,撒塔斯城的阿達歐將被靜音。" +L["If checked, additional font sizes will be available in the chat frame font size menu."] = "勾選後,聊天框字體大小選單中將提供額外字體尺寸。" +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "勾選後,拍賣場將加入額外功能。|n|n僅限直購 - 在不填寫起始價格的情況下建立直購拍賣。|n|n僅限金幣 - 將銅和銀價格定在99,以加快新的拍賣。|n|n搜尋物品 - 在拍賣行搜尋您正在銷售的商品。|n|n除此以外,拍賣持續時間設置將保存為帳戶通用。" +L["If checked, addon buttons will be combined into a single button frame which you can toggle by right-clicking the minimap.|n|nNote that enabling this option will lock out the 'Hide addon buttons' setting."] = "勾選後,插件按鈕將合併為一個按鈕框架,您可以通過右鍵單擊小地圖來切換該框架。|n|n請注意,啟用此選項將鎖定“隱藏插件按鈕”設置。" +L["If checked, addon buttons will be hidden while the pointer is not over the minimap."] = "勾選後,當指針不在小地圖上時,插件按鈕將被隱藏。" +L["If checked, adjusting the cluster scale will not affect the minimap scale."] = "勾選後,調整群組縮放不會影響小地圖縮放。" +L["If checked, alert frames will not be shown."] = "勾選後,警告框架將不會顯示。" +L["If checked, alert frames will not be shown.|n|nWhen you earn an achievement, a message will be shown in chat instead."] = "勾選後,警告框架將不顯示。n|n當您獲得成就時,會在聊天中顯示一條訊息。" +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "勾選後,當你訪問商販時將自動出售背包中的垃圾。|n|n當你訪問時按住Shift鍵,可以暫時忽略該功能。" +L["If checked, an animation slider will be shown in the dressing room."] = "勾選後,試衣間中將顯示動作卷軸。" +L["If checked, available quests will be accepted automatically."] = "勾選後,可用的任務將會自動接受。" +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "勾選後,訊息視窗的邊框會更改為藍色(友方)或者紅色(敵方)。" +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "勾選後,戰網好友邀請會自動拒絕。|n|n啟用後,當前待處理的邀請會自動拒絕。" +L["If checked, bike mount sounds will be muted.|n|nThis applies to Mekgineer's Chopper and Mechano-hog."] = "勾選後,摩托車坐騎聲音將被靜音。|n|n這會套用於機械工程摩托車以及機械豬。" +L["If checked, broom mounts will be muted."] = "勾選後,掃帚坐騎將被靜音。" +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "勾選後,聊天視窗的按鈕會被隱藏。|n|n點擊視窗標簽會自動顯示最新的消息。|n|n使用鼠標滾輪可以查看歷史訊息。按住SHIFT進行訊息頁面跳轉,按住CTRL將滾動至訊息頁首/頁尾。" +L["If checked, chat text will not fade out after a time period."] = "勾選後,聊天訊息不會在一定時間後淡出。" +L["If checked, class coloring will be used in the player frame, target frame and focus frame."] = "勾選後,玩家、目標以及焦點框架將使用職業著色。" +L["If checked, class colors will be used in the chat frame."] = "勾選後,聊天框架將使用職業著色。" +L["If checked, class icons will be shown in the portrait frames.|n|nNote that this option may reduce framerate while the target of target window is showing."] = "勾選後,頭像框架將會顯示職業圖示。|n|n請注意,此選項可能會在顯示目標的目標視窗時降低幀數。" +L["If checked, clock hourly chimes will be muted."] = "勾選後,整點的鐘聲將被靜音。" +L["If checked, completed quests will be turned-in automatically."] = "勾選後,完成的任務會自動交付。" +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "勾選後,當你選擇一個擲骰選項或是試圖出售或郵寄可交易物品將不再確認。" +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "勾選後,冷卻持續時間數字將不顯示在冷卻上。|n|n取消勾選後,冷卻持續時間數字將會顯示在冷卻上如果已在遊戲選項面板中啟用('動作條'選單)。" +L["If checked, cooldown icons will be shown above the player frame instead of the target frame.|n|nIf unchecked, cooldown icons will be shown above the target frame."] = "勾選後,冷卻圖示將顯示在玩家框架而不是目標框架上方。|n|n如未勾選,冷卻圖示將顯示在目標框架上方。" +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "勾選後,在玩家頭像和寵物頭像上的傷害及治療數字不再顯示。" +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "勾選後,對鎖定的聊天視窗進行拖動,會使其豎直拉伸。|n|n對已解鎖的聊天視窗進行拖動,會使其移動。" +L["If checked, drunken messages will be blocked unless they apply to your character.|n|nThis applies to the system channel."] = "勾選後,酒醉訊息將被阻擋,除非是生效於您的角色。|n|n這適用於系統頻道。" +L["If checked, duel requests will be blocked unless the player requesting the duel is a friend."] = "勾選後,除非請求決鬥的玩家是好友,否則決鬥請求將被阻擋。" +L["If checked, duel victory and retreat messages will be blocked unless your character took part in the duel.|n|nThis applies to the system channel."] = "勾選後,除非您的角色參加了決鬥,否則決鬥勝利和落敗消息將被阻擋。|n|n這適用於系統頻道。" +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "勾選後,當您的角色在黑鐵酒吧休息時表情音效將靜音。|n|n其他所有時間都會啟用表情音效。" +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "勾選後,敵對姓名板會在戰鬥中自動開啟,離開戰鬥後關閉。" +L["If checked, flight times will be shown in the flight map and when you take a flight."] = "勾選後,飛行時間將顯示在飛行地圖和您搭乘的時間。" +L["If checked, footsteps for mechanical mounts will be muted."] = "勾選後,機械坐騎的腳步聲將被靜音。" +L["If checked, group invites will only be sent to friends.|n|nIf unchecked, group invites will be sent to everyone."] = "勾選後,隊伍邀請只會發送給好友。|n|n如果取消勾選,隊伍邀請將發送給所有人。" +L["If checked, guild ranks will be shown for players in your guild."] = "勾選後,將為您公會中的玩家顯示公會等級。" +L["If checked, guild ranks will be shown for players who are not in your guild."] = "勾選後,那些不在你公會中的玩家也會顯示公會階級。" +L["If checked, gyrocopters will be muted.|n|nThis applies to the engineering flying machine mounts."] = "勾選後,直升機的音效將靜音。|n|n這主要應用於工程的直升機坐騎。" +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "勾選後,角色視窗會顯示頭盔與披風切換複選框。|n|n您可以按住Shift以及右鍵點擊複選框來切換布局。" +L["If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman."] = "勾選後,節日事件音效將被靜音。|n|n這會套用在無頭騎士上。" +L["If checked, item buttons will be shown in the dressing room. You can click the item buttons to remove individual items from the model."] = "勾選後,物品按鈕將顯示在試衣間中。您可以點擊物品按鈕從模型中刪除單個物品。" +L["If checked, keybind text will not be shown on action buttons."] = "勾選後,動作列上的快捷鍵文字將不顯示。" +L["If checked, login screen sounds will be muted when you logout of the game.|n|nNote that login screen sounds will not be muted when you initially launch the game.|n|nThey will only be muted when you logout of the game. This includes manually logging out as well as being forcefully logged out by the game server for reasons such as being away for an extended period of time.|n|nNo more dragons roaring when you fall asleep while the game is running!"] = "勾選後,當您登出遊戲時,登入螢幕聲音將被靜音。|n|n請注意,當您最初啟動遊戲時,登入螢幕的聲音不會被靜音。|n|n只有當您退出遊戲時,它們才會被靜音。包括手動退出,以及因長時間離開等原因被遊戲服務器強制退出。|n|n當您在遊戲運行時睡著時不再有巨龍咆哮!" +L["If checked, macro and keybind text will not be shown on action buttons."] = "勾選後,巨集和按鍵綁定文字不會顯示在動作列按鈕上。" +L["If checked, macro text will not be shown on action buttons."] = "勾選後,動作列上的巨集文字將不顯示。" +L["If checked, mechanostriders will be quieter."] = "勾選後,機械陸行鳥會更安靜。" +L["If checked, members of your guild will be treated as friends for all of the options on this page."] = "勾選後,對於此頁面上的所有選項,您的公會成員將被視為好友。" +L["If checked, messages containing spell links will be blocked while you are in combat.|n|nThis is useful for blocking spell interrupt spam.|n|nThis applies to the say, party, raid, instance and emote channels."] = "勾選後,當您在戰鬥中時,包含法術連結的訊息將被阻擋。|n|n這對於阻擋法術打斷刷頻訊息很有用。|n|n這適用於說、小隊、團隊、副本和表情頻道。" +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "勾選後,大部分錯誤訊息將不顯示(像是'沒有足夠的怒氣')。部分重要錯誤將排除在外。|n|n如果你有啟用小地圖按鈕,你可以按下CTRL+右鍵來切換錯誤訊息的顯示而不管此設置。" +L["If checked, netherdrakes will be quieter."] = "勾選後,幽冥龍會更安靜。" +L["If checked, non-standard minimap buttons will be replaced with standard LibDBIcon buttons.|n|nThis will fix the problems with non-standard buttons such as not hiding automatically, not following the minimap shape and not being placed in the button frame.|n|nNote that enabling or disabling non-standard buttons may require a UI reload to take effect.|n|nMost addons already use the standard LibDBIcon library and will not be affected by this setting but a few addons still use non-standard buttons.|n|nPlease ask addon authors to use the standard LibDBIcon library for their minimap buttons then this setting won't be necessary."] = "勾選後,非標準的小地圖按鈕將被標準的 LibDBIcon 按鈕替換。|n|n這將解決非標準按鈕的問題,例如不自動隱藏、不跟隨小地圖形狀和未放置在按鈕框架中。|n|n請注意,啟用或禁用非標準按鈕可能需要重新載入UI才能生效。|n|n大多數插件已經使用標準 LibDBIcon 庫並且不會受到此設置的影響,但一些插件仍然使用非標準按鈕。|n |n請詢問插件作者為他們的小地圖按鈕使用標準的 LibDBIcon 庫,那麼這個設置就沒有必要了。" +L["If checked, party invitations from friends will be automatically accepted unless you are queued for a battleground."] = "勾選後,除非您在尋求組隊佇列中,否則來自好友的隊伍邀請將被自動接受。" +L["If checked, party invitations will be blocked unless the player inviting you is a friend."] = "勾選後,除非邀請您的玩家是好友,否則隊伍邀請將被阻擋。" +L["If checked, quest levels will be shown."] = "勾選後,任務等級將會顯示。" +L["If checked, quests will be selected, accepted and turned-in automatically.|n|nQuests which have a gold requirement will not be turned-in automatically."] = "勾選後,任務將被自動選擇、接受和完成。|n|n有金幣要求的任務不會自動完成。" +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "勾選後,團隊和副本聊天訊息會改為藍色(與小隊一致)。" +L["If checked, recent chat will be restored when you reload your interface."] = "勾選後,重新載入界面時將恢復最近的聊天。" +L["If checked, repair costs will be taken from guild funds for characters that are guilded and have permission to repair."] = "勾選後,對於已加入公會並有權維修的角色,維修費用將從公會資金中扣除。" +L["If checked, resurrection requests will be accepted automatically."] = "勾選後,復活請求將被自動接受。" +L["If checked, resurrection requests will not be automatically accepted if the player resurrecting you is in combat."] = "勾選後,如果復活您的玩家在戰鬥中,則不會自動接受復活請求。" +L["If checked, Screech will be muted.|n|nThis is a spell used by some flying pets."] = "勾選後,尖嘯聲將被靜音。|n|n這是某些飛行寵物使用的法術。" +L["If checked, shared quests will be declined unless the player sharing the quest is a friend."] = "勾選後,除非分享任務的玩家是好友,否則任務分享將被拒絕。" +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "勾選後,位於增益框架與目標框架之下的增益圖標提示會顯示法術ID。" +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "勾選後,會停用聊天頻道的粘附。|n|n此選項不會影響臨時視窗的對話。" +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "勾選後,當你不處於戰鬥狀態時會自動接受召喚。" +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "勾選後,插件列表(游戲選單處)會顯示預設的對角色生效的插件。" +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "勾選後,自動拾取所需的時間將大幅減少。" +L["If checked, the Arcanite Ripper guitar sound will be muted."] = "勾選後,Arcanite Ripper 吉他聲音將被靜音。" +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "勾選後,背包及銀行的整理按鈕不再顯示。" +L["If checked, the BugSack addon minimap button will always be visible if you have BugSack installed and the minimap button enabled."] = "勾選後,如果您安裝了BugSack並啟用了小地圖按鈕,則BugSack插件小地圖按鈕將始終可見。" +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "勾選後,打開團隊訊息的按鈕會顯示在左側團隊管理框架的上方,而不是在其內部。|n|n此選項讓你無需打開團隊管理框架,就可以切換團隊框架。" +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "勾選後,戰鬥記錄會被隱藏。|n|n戰鬥記錄視窗必須未被分離時才能生效。|n|n如果戰鬥記錄視窗被分離了,你可以拖動其合併至主視窗(然後重載插件),或者在聊天設置中重置設置。" +L["If checked, the editbox will be moved to the top of the chat frame."] = "勾選後輸入框會被移動至聊天視窗上方。" +L["If checked, the flight progress bar background texture will be shown."] = "勾選後,將顯示飛行進度條背景材質。" +L["If checked, the flight progress bar background will fill instead of drain."] = "勾選後,飛行進度條背景將為填滿而不是排空。" +L["If checked, the flight progress bar destination will be shown."] = "勾選後,將顯示目的地的飛行進度條。" +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "勾選後,死亡後的灰色螢幕以及靈魂世界特效將會停用。" +L["If checked, the health bar will not be shown."] = "勾選後,血量調將不顯示。" +L["If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted."] = "勾選後,介面按鈕音效,聊天框架標籤點及音效以及遊戲選單切換音效都將被靜音。" +L["If checked, the main bar gryphons will not be shown."] = "勾選後,動作條兩邊的獅鷲不再顯示。" +L["If checked, the mechanical guild vault idle sound will be muted."] = "勾選後,機械公會金庫的空閒聲音將被靜音。" +L["If checked, the minimap shape will be square."] = "勾選後,小地圖形狀將是方形的。" +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "勾選後,背包的空餘格數會顯示在背包按鈕以及提示上。" +L["If checked, the player frame background will be shown in class color."] = "勾選後,玩家框架背景將會顯示職業顏色。" +L["If checked, the professions frame will be larger."] = "勾選後,專業技能視窗將會放大。" +L["If checked, the quest difficulty will be shown next to the quest level in the quest log list.|n|nThis will indicate whether the quest requires a group (+), dungeon (D), raid (R) or PvP (P).|n|nThe quest difficulty will always be shown in the quest log detail pane regardless of this setting."] = "勾選後,任務難度將顯示在任務日誌列表中的任務級別旁邊。|n|n這將指示任務是否需要隊伍 (+)、地下城 (D)、團隊 (R) 或 PvP (P)。|n|n無論此設置如何,任務難度都將始終顯示在任務日誌詳細訊息視窗中。" +L["If checked, the quest log frame will be taller."] = "勾選後,任務日誌框架會更高。" +L["If checked, the ready check sound will be muted."] = "勾選後,準備確認音效將被靜音。" +L["If checked, the remaining flight time will be spoken using text to speech.|n|nChanges to this setting will take effect on the next flight you take."] = "勾選後,剩餘的飛行時間將使用文字轉語音進行。|n|n此設置的更改將於您採用的下階段航班生效。" +L["If checked, the scale slider will apply to the entire minimap cluster.|n|nNote that if you are using the default action bars, rescaling the cluster will also rescale the right action bars at startup so you may want to leave the scale slider at 100%.|n|nIf unchecked, the scale slider will only apply to the minimap."] = "勾選後,縮放卷軸將應用於整個小地圖群組。|n|n請注意,如果您使用預設動作列,重新縮放群組也會在啟動時重新縮放正常的動作列,因此您可能希望將縮放卷軸保留為 100%。|n|n如果未勾選,縮放卷軸將僅適用於小地圖。" +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "勾選後,螢幕光暈將停用。|n|n啟用此選項同時也停用醉酒霧霾效果。" +L["If checked, the skill trainer frame will be larger and feature a train all skills button."] = "勾選後,技能學習框架將會略為放大,並且加入一個全部學習的按鈕。" +L["If checked, the spell fizzle sounds will be muted."] = "勾選後,法術嘶嘶聲將被靜音。" +L["If checked, the stance bar will not be shown."] = "勾選後,姿態條不再顯示。" +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "勾選後,對話面板不再顯示。|n|n當NPC與你交流時,該框架通常出現在界面下方。" +L["If checked, the target frame background and focus frame background will be shown in class color."] = "勾選後,目標框架背景和焦點框架背景將以職業顏色顯示。" +L["If checked, the target frame background will be shown in class color."] = "勾選後,目標框架背景將會顯示職業顏色。" +L["If checked, the toggle headers button will be shown."] = "勾選後,將顯示切換標題按鈕。" +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "勾選後,提示訊息會被著色,你可以設置他的佈局和大小尺寸。" +L["If checked, the tracking button will be hidden while the pointer is not over the minimap."] = "勾選後,當指針不在小地圖上時,跟踪按鈕將被隱藏。" +L["If checked, the vendor price will be shown in item tooltips."] = "勾選後,物品提示中將顯示商店售價。" +L["If checked, the world map button will be hidden."] = "勾選後,世界地圖按鈕將被隱藏。" +L["If checked, the zone text bar will be hidden."] = "勾選後,區域文字條將被隱藏。" +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "勾選後,縮放按鈕將隱藏。無論此設置如何,您都可以使用滑鼠滾輪進行縮放。" +L["If checked, tooltips for world units will be hidden during combat."] = "勾選後,世界單位的工具提示將在戰鬥中隱藏。" +L["If checked, train sounds will be muted."] = "勾選後,火車音效將被靜音。" +L["If checked, traveling merchant greetings and farewells will be muted.|n|nThis applies to Traveler's Tundra Mammoth."] = "勾選後,旅行商人的問候和告別將被靜音。|n|n這適用於旅行者的凍原猛獁象。" +L["If checked, unit targets will be shown."] = "勾選後,目標的目標會顯示在訊息視窗上。" +L["If checked, when someone pings the minimap, their name will be shown. This does not apply to your pings."] = "勾選後,當有人敲擊小地圖時,會顯示他們的名字。這不適用於您的敲擊。" +L["If checked, Wowhead links will be shown in the world map frame and the achievements frame."] = "勾選後,Wowhead 鏈接將顯示在世界地圖框架和成就框架中。" +L["If checked, Wowhead links will go directly to the comments section."] = "勾選後,Wowhead連結將直接轉到評論部分。" +L["If checked, yawns from hunter pet cats will be muted."] = "勾選後,獵人寵物貓的哈欠將被靜音。" +L["If checked, you can block spell links, drunken spam and duel spam."] = "勾選後,您可以阻擋法術連結、酒醉以及決鬥垃圾訊息。" +L["If checked, you can hold alt and drag the minimap to move it."] = "勾選後,你可以按住 alt 並拖動小地圖來移動它。" +L["If checked, you can hold down the alt key while opening a gossip window to automatically select a single gossip item.|n|nIf the gossip item type is banker, taxi, trainer, vendor, battlemaster or stable master, gossip will be skipped without needing to hold the alt key. You can hold the shift key down to prevent this."] = "勾選後,您可以在打開對話窗口時按住 alt 鍵自動選擇單個對話項目。|n|n如果對話項目類型是銀行員、鳥點、訓練師、商店、戰鬥大師或獸欄,對話將被跳過而無需按住 alt 鍵。您可以按住 shift 鍵來防止這種情況發生。" +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "勾選後,你可以在點擊聊天標籤時按下Ctrl鍵,在易於複製的視窗中查看最近的聊天。" +L["If checked, you can hold shift while tooltips are hidden to show them temporarily."] = "勾選後,您可以在隱藏工具提示時按住shift以暫時顯示它們。" +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "勾選後,你可以使用方向鍵移動聊天框中的輸入點。|n|n如果未被勾選,方向鍵將保持它所綁定的按鍵功能。" +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "勾選後,你可以取消動畫而不經確認。" +L["If checked, you will be able to change the font size of book text."] = "勾選後,您將可以更改書籍中文字的大小。" +L["If checked, you will be able to change the font size of quest text."] = "勾選後,您將可以改變任務文字的字體大小。" +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "勾選後,你可以更改郵件文字的字體大小。|n|n這個選項不會影響使用系統範本的郵件(例如拍賣行的收據訊息)。" +L["If checked, you will be able to change the position and scale of the armored man durability frame."] = "勾選後,您將能夠更改裝甲人形耐久度框架的位置和縮放大小。" +L["If checked, you will be able to change the position and scale of the buffs frame."] = "勾選後,您將可以改變增益框架的位置與大小。" +L["If checked, you will be able to change the position and scale of the focus frame.|n|nNote that enabling this option will prevent you from using the default UI to move the focus frame."] = "勾選後,您將能夠更改焦點框架的位置和比例。|n|n請注意,啟用此選項將阻止您使用預設介面移動焦點框架。" +L["If checked, you will be able to change the position and scale of the player frame and target frame.|n|nNote that enabling this option will prevent you from using the default UI to move the player and target frames."] = "勾選後,您將能夠更改玩家框架和目標框架的位置和比例。|n|n請注意,啟用此選項將阻止您使用預設介面來移動玩家和目標框架。" +L["If checked, you will be able to change the position and scale of the timer bar.|n|nThe timer bar is used for showing remaining breath when underwater as well as other things."] = "勾選後,您將能夠更改計時器條的位置和大小。|n|n計時器條用於顯示水下時的剩餘呼吸以及其他內容。" +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "勾選後,您將可以改變組件框架的位置與大小。|n|n此組件框架通常用於顯示PvP分數和追蹤的任務目標。" +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "勾選後,你會生成一個視窗背景,這個可以在游戲界面周圍增加黑色的邊框背景。|n|n邊框的層級是處於游戲界面和插件之間,所以你仍可以放置插件元素在上面。" +L["If checked, you will be able to customise the minimap."] = "勾選後,您將可以自定義小地圖。" +L["If checked, you will be able to customise the quest log frame."] = "勾選後,您將能夠自定義任務日誌框架。" +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "勾選後,你可以把聊天視窗拖動到屏幕邊緣。" +L["If checked, you will be able to mute a selection of game sounds."] = "勾選後,您將可以靜音某些選擇的遊戲音效。" +L["If checked, you will be able to mute your own choice of sounds."] = "勾選後,您將能夠將自己選擇的聲音靜音。" +L["If checked, you will be able to pan (right-button) and zoom (mousewheel) in the character frame, dressup frame and inspect frame.|n|nA toggle stats button will be shown in the character frame. You can also middle-click the character model to toggle stats.|n|nModel rotation controls will be hidden. Buttons to toggle gear will be added to the dressup frame."] = "勾選後,您將能夠在角色視窗、試衣框架和觀察框架中平移(右鍵)和縮放(滑鼠滾輪)。|n|n一個切換統計按鈕將顯示在角色視窗中。您還可以中鍵單擊角色模型來切換屬性。|n|n模型旋轉控件將被隱藏。切換裝備的按鈕將添加到試衣框架中。" +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "勾選後,你可以在目標框架上放置最多5個有用的冷卻圖標。" +L["If checked, you will be able to reposition the tooltip."] = "勾選後,您可以重新定位工具提示。" +L["If checked, you will be able to set some additional rules for when your character is automatically dismounted."] = "勾選後,您將能夠為您的角色何時自動下坐騎設置一些額外的規則。" +L["If checked, you will be able to set the density of weather effects."] = "勾選後,您將可以設置天氣效果的密度。" +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "勾選後,會在玩家框架顯示稀有、精英或者稀有精英的邊框。" +L["If checked, you will be able to zoom out to a greater distance."] = "勾選後,你可以將鏡頭拉遠到更遠的距離。" +L["If checked, you will be dismounted when you attempt to cast a non-instant cast spell while moving."] = "勾選後,當您在移動時嘗試施放非即時施法法術時將會下坐騎。" +L["If checked, you will be dismounted when you attempt to cast a spell but don't have the rage, mana or energy to cast it."] = "勾選後,當您嘗試施展法術但沒有足夠的怒氣、法力或能量來施法時,將會下坐騎。" +L["If checked, you will be dismounted when you click a flight destination."] = "勾選後,當您點擊飛行目的地時將會下坐騎。" +L["If checked, you will be dismounted when you instruct a flight master to open the flight map."] = "勾選後,當您互動飛行管理員打開飛行地圖時,將會下坐騎。" +L["If checked, you will be prompted to submit missing flight times."] = "勾選後,系統將提示您提交缺失的航班時間。" +L["If checked, you will need to hold the override key down for quests to be automated.|n|nIf unchecked, holding the override key will prevent quests from being automated."] = "勾選後,您需要按住覆蓋鍵才能自動執行任務。|n|n如果未勾選,按住覆蓋鍵將阻止任務自動執行。" +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "勾選後,您在摧毀優良物品時無須再輸入delete。|n|n此外,物品連結將顯示在所有物品摧毀確認視窗中。" +L["If checked, you will not release automatically in Alterac Valley."] = "勾選後,您將不會在奧特蘭山谷中自動釋放。" +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "勾選後,您在戰場死亡時將會自動釋放。|n|n如果您具有自我復活的技能,則不會自動釋放。" +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "勾選後,當你打開商店、銀行或者郵箱時,背包不會自動開啟或者關閉。" +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "勾選後,你的聊天歷史記錄會增漲至4096行。如果未被勾選,會保持在預設的128行。|n|n啟用這個設置可能會在登錄時會隱藏一些聊天訊息。" +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "勾選後,當你訪問適用的商店時,裝備將自動修理。|n|n當你開啟商店時可以按下Shift鍵以無視此設置。" +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "勾選後,區域文字不再顯示。" +L["If you use the 'Hide addon buttons' or 'Combine addon buttons' settings but you want some addon buttons to remain visible around the minimap, enter the addon names into the editbox separated by a comma.|n|nThe editbox tooltip shows the addon names that you can enter. The names must match exactly with the names shown in the editbox tooltip though case does not matter.|n|nChanges to the list will require a UI reload to take effect."] = "如果您使用“隱藏插件按鈕”或“合併插件按鈕”設置,但希望一些插件按鈕在小地圖周圍保持可見,請在編輯框中輸入插件名稱,以逗號分隔。|n|n編輯框工具提示顯示您可以輸入的插件名稱。儘管大小寫無關緊要,但名稱必須與編輯框工具提示中顯示的名稱完全匹配。|n|n對列表的更改需要重載 UI 才能生效。" +L["If you want to listen to a sound file, enter the sound file ID into the editbox and click the play button.|n|nYou can scroll the mousewheel over the editbox to play neighbouring sound files."] = "如果要收聽聲音文件,請在編輯框中輸入聲音檔案ID,然後單擊播放按鈕。|n|n您可以在編輯框上滾動鼠標滾輪來播放相鄰的聲音文件。" +L["Incompatible"] = "不相容" +L["Increase chat history"] = "增加聊天歷史記錄" +L["Interface"] = "界面設置" +L["Invaders of Alterac Valley"] = "奧特蘭克的入侵者" +L["Invalid console variable."] = "無效控制台變量。" +L["Invalid parameter."] = "無效參數" +L["Invalid quest ID."] = "無效任務ID。" +L["Invalid sound ID"] = "無效聲音ID" +L["Invalid taint level."] = "無效的汙染等級。" +L["Invalid target."] = "無效的目標。" +L["Invite from whispers"] = "密語邀請" +L["Ironforge"] = "鐵爐堡" +L["Item"] = "物品" +L["Item ID"] = "物品ID" +L["Item IDs can be found in item toolips."] = "物品ID可以在物品工具提示上找到。" +L["Kalimdor"] = "卡林多" +L["Karazhan"] = "卡拉贊" +L["Kargath"] = "卡加斯" +L["Keep"] = "保留" +L["Keyword"] = "關鍵字" +L["Lakeshire"] = "湖畔鎮" +L["Leatrix Plus"] = "Leatrix Plus" +L["Leatrix Plus needs to be updated with the flight details. Press CTRL/C to copy the flight details below then paste them into an email to flight@leatrix.com. When your report is received, Leatrix Plus will be updated and you will never see this window again for this flight."] = "Leatrix Plus 需要更新飛航詳細資訊。按 CTRL/C 複製下面的飛航詳細訊息,然後將它們粘貼到電子郵件中至 flight@leatrix.com。收到您的報告後,Leatrix Plus 將更新,您將永遠不會再看到此航班的視窗。" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "Leatrix Plus將會在下次登出時覆寫LeaPlus數據庫。" +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX PLUS: 安裝了錯誤的版本!" +L["Left"] = "左側" +L["Lifetime honorable kills"] = "榮譽擊殺總數" +L["Light's Hope Chapel"] = "聖光之願禮拜堂" +L["Link will search Wowhead"] = "連結將搜尋Wowhead" +L["Links go directly to the comments section"] = "連結直接轉到評論部分" +L["Loch Modan"] = "洛克莫丹" +L["Lockout sharing"] = "成就共享鎖定" +L["Login"] = "登入" +L["Low"] = "低" +L["M"] = "M" +L["Magic"] = "魔法" +L["Magisters' Terrace"] = "博學者殿堂" +L["Main Titles"] = "主標題" +L["Manage buffs"] = "管理增益" +L["Manage durability"] = "管理耐久度" +L["Manage focus"] = "操控焦點" +L["Manage frames"] = "管理框架面板" +L["Manage timer"] = "管理計時條" +L["Manage widget"] = "管理組件" +L["Managed by Leatrix Plus"] = "由Leatrix Plus管理" +L["Map"] = "地圖" +L["Maraudon"] = "瑪拉頓" +L["Marks of Kil'jaeden"] = "基爾加丹印記" +L["Marks of Sargeras"] = "薩格拉斯印記" +L["Marshal's Refuge"] = "馬紹爾營地" +L["Max camera zoom"] = "最大鏡頭縮放" +L["Mechanics"] = "特性設置" +L["Mechsteps"] = "機械腳步" +L["Mechstriders"] = "機械陸行鳥" +L["Media"] = "音樂" +L["Medium"] = "中" +L["Memory Usage"] = "記憶體占用" +L["Menethil Harbor"] = "米奈希爾港" +L["message"] = "訊息" +L["message from previous session"] = "上個階段的訊息" +L["message shown."] = "顯示訊息。" +L["Messages"] = "訊息" +L["messages from previous session"] = "上個階段的訊息" +L["messages shown."] = "顯示訊息。" +L["Misc"] = "雜項" +L["Missing console variable."] = "缺少控制台變量。" +L["Missing mount name."] = "缺少坐騎名稱。" +L["Missing movie ID."] = "缺少動畫ID。" +L["Missing quest ID."] = "缺少任務ID。" +L["Missing sound file parameter."] = "缺少聲音檔案參數。" +L["Missing sound ID."] = "缺少聲音ID。" +L["Molten Core"] = "熔火之心" +L["Moonglade"] = "月光林地" +L["More Firewing Signets"] = "更多的火翼徽章" +L["More font sizes"] = "更多文字尺寸" +L["More Marks of Kil'jaeden"] = "更多的基爾加丹印記" +L["More Marks of Sargeras"] = "更多的薩格拉斯印記" +L["More Sunfury Signets"] = "更多的日怒徽章" +L["Morgan's Vigil"] = "摩根的崗哨" +L["Mount not found."] = "坐騎未找到。" +L["Mounts"] = "坐騎" +L["Move editbox to top"] = "輸入框移動至頂部" +L["Movie not playable."] = "動畫不可播放。" +L["Movie number"] = "動畫編號" +L["Movies"] = "動畫" +L["Mulgore"] = "莫高雷" +L["Music"] = "音樂" +L["Musical Moments"] = "音樂時刻" +L["Mute"] = "靜音" +L["Mute custom sounds"] = "靜音自定義聲音" +L["Mute game sounds"] = "遊戲音效靜音" +L["Muted"] = "已靜音" +L["Mystery"] = "秘法" +L["N"] = "N" +L["Nagrand"] = "納葛蘭" +L["Narration"] = "解說" +L["Naxxramas"] = "納克薩瑪斯" +L["Netherdrakes"] = "幽冥龍" +L["Nethergarde Keep"] = "守望堡" +L["Netherstorm"] = "虛空風暴" +L["Nijel's Point"] = "尼耶爾前哨站" +L["Nine minutes"] = "九分鐘" +L["No bad sound IDs found."] = "沒有發現損壞的聲音ID。" +L["No help is available for this page."] = "此頁面沒有幫助訊息。" +L["No items with durability equipped."] = "沒有裝備有耐久度的物品。" +L["No media duplicates found."] = "未找到重複的媒體檔。" +L["No supported addons."] = "不支援的插件。" +L["No tooltip showing."] = "目前沒有任何提示訊息。" +L["None"] = "無" +L["Not completed."] = "未完成。" +L["Not minimap"] = "不是小地圖" +L["Note that this will not reset settings that require a UI reload."] = "請注意,這不會重置需要重新載入UI的設定。" +L["Note that this will not reset your exclusions list."] = "請注意,這不會重置您的例外清單。" +L["Nothing to see here."] = "這沒東西可看。" +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "警示!|n您必須完全重新啟動遊戲客戶端才能使用此版本的Leatrix Plus。" +L["NPC"] = "NPC" +L["Nude"] = "脫光" +L["Obsidian Sanctum"] = "黑曜聖所" +L["Oculus"] = "奧核之眼" +L["Okay, disable screen adjust for me"] = "好的,為我禁用螢幕調整" +L["Old Hillsbrad Foothills"] = "希爾斯布萊德丘陵舊址" +L["One minute"] = "一分鐘" +L["Onyxia's Lair"] = "奧妮克希亞的巢穴" +L["or click the minimap button to open Leatrix Plus."] = "或是點擊小地圖按鈕來開啟Leatrix Maps。" +L["Orgrimmar"] = "奧格瑪" +L["Outland"] = "外域" +L["Overall"] = "整體" +L["Overlay"] = "覆蓋" +L["Override key"] = "覆蓋鍵" +L["Particle density"] = "粒子密度" +L["Party from friends"] = "好友組隊邀請" +L["Pet"] = "寵物" +L["Pets"] = "寵物" +L["Pit of Saron"] = "薩隆陷坑" +L["Play"] = "播放" +L["Player"] = "玩家框架" +L["Please ask the addon author to use LibDBIcon."] = "請要求插件作者使用LibDB圖示。" +L["Power"] = "能量" +L["Press CTRL/C to copy."] = "按下CTRL/C來複製。" +L["Queue from friends"] = "好友佇列申請" +L["R"] = "團隊" +L["Ragefire Chasm"] = "怒焰裂谷" +L["Raid"] = "團隊副本" +L["Raid frame toggle"] = "切換團隊框架" +L["Random"] = "隨機" +L["RARE"] = "稀有" +L["RARE ELITE"] = "稀有精英" +L["Ratchet"] = "棘齒城" +L["Razorfen Downs"] = "剃刀高地" +L["Razorfen Kraul"] = "剃刀沼澤" +L["Ready"] = "預備" +L["Recent chat window"] = "最近聊天視窗" +L["Redridge Mountains"] = "赤脊山" +L["Refuge Pointe"] = "避難谷地" +L["Release in PvP"] = "PvP自動釋放屍體" +L["Reload"] = "重載插件" +L["Remember Alterac Valley!"] = "銘記奧特蘭克!" +L["Remove all items"] = "移除全部物品" +L["Remove tabard"] = "移除外袍" +L["Repair automatically"] = "自動修理裝備" +L["Repair using guild funds if available"] = "使用公會資金進行維修(如果有權限)" +L["Repaired for"] = "修理花費" +L["Replace non-standard buttons"] = "更換非標準按鈕" +L["Reposition the tooltip"] = "重新定位工具提示" +L["Require override key for quest automation"] = "任務自動化需要覆蓋鍵" +L["Requires UI reload."] = "需要重載插件" +L["Reset"] = "重置" +L["Resize book text"] = "書籍文字大小改變" +L["Resize mail text"] = "重設郵件文字" +L["Resize quest text"] = "重設任務文字" +L["Resize Screen"] = "螢幕縮放" +L["Rested bubbles"] = "休息氣泡訊息" +L["Restore chat messages"] = "恢復聊天訊息" +L["Restored"] = "已恢復" +L["Restrict to friends"] = "僅限好友" +L["result"] = "結果" +L["results"] = "結果" +L["Return"] = "返回" +L["Revantusk Village"] = "惡齒村" +L["Right"] = "右側" +L["Right-click to close"] = "右鍵點擊來關閉" +L["Right-click to close."] = "右鍵點擊來關閉。" +L["right-click to go back"] = "右鍵點擊返回" +L["Ruby Sanctum"] = "晶紅聖所" +L["Ruins of Ahn'Qiraj"] = "安琪拉廢墟" +L["Rut'theran Village"] = "魯瑟蘭村" +L["Sacred"] = "神聖" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "沙怒、劈顱和血頂硬幣" +L["Scale"] = "尺寸" +L["Scale entire cluster"] = "縮放整個群組" +L["Scarlet Monastery"] = "血色修道院" +L["Scholomance"] = "通靈學院" +L["Screech"] = "尖嘯" +L["Search"] = "搜尋" +L["Search mats?"] = "搜尋材料?" +L["Searing Gorge"] = "灼熱峽谷" +L["seconds"] = "秒" +L["seconds does not match the saved flight time of"] = "保存的飛行時間秒數不符合" +L["Select the settings that you want to use."] = "選擇你想啟用的設置。" +L["Selection of music tracks"] = "選擇的音樂曲目" +L["Self Markers Allowed"] = "允許自身標記" +L["Self Markers Blocked"] = "阻擋自身標記" +L["Sell"] = "出售" +L["Sell junk automatically"] = "自動出售垃圾" +L["SELLING JUNK"] = "出售垃圾" +L["Sentinel Hill"] = "哨兵嶺" +L["Set weather density"] = "設置天氣效果密度" +L["Settings"] = "設置" +L["Seven minutes"] = "七分鐘" +L["Shaders"] = "陰影" +L["Shadowfang Keep"] = "影牙城堡" +L["Shadowmoon Valley"] = "影月谷" +L["Shadowprey Village"] = "葬影村" +L["Shardtooth E'ko"] = "碎齒魂精" +L["SHIFT"] = "SHIFT" +L["Sholazar Basin"] = "休拉薩盆地" +L["Show animation slider"] = "顯示動作卷軸" +L["Show auction controls"] = "顯示拍賣行控制" +L["Show background"] = "顯示背景" +L["Show bag search box"] = "顯示背包搜尋框" +L["Show cancel form button on flight map"] = "在飛行地圖上顯示取消變形按鈕" +L["Show character addons"] = "顯示角色插件" +L["Show cooldowns"] = "顯示冷卻" +L["Show cooldowns above the player frame"] = "在玩家框架上方顯示冷卻時間" +L["Show destination"] = "顯示目的地" +L["Show druid power bar"] = "顯示德魯伊能量條" +L["Show durability status"] = "顯示耐久度" +L["Show flight times"] = "顯示飛行時間" +L["Show free bag slots"] = "顯示背包空餘格數" +L["Show guild names"] = "顯示公會名稱" +L["Show guild ranks for other guilds"] = "顯示其他公會的公會階級" +L["Show guild ranks for your guild"] = "顯示您公會的公會等級" +L["Show item buttons"] = "顯示物品按鈕" +L["Show me"] = "顯示我" +L["Show minimap button"] = "顯示小地圖按鈕" +L["Show player chain"] = "顯示玩家邊框" +L["Show player frame in class color"] = "玩家框架顯示職業顏色" +L["Show quest difficulty in quest log list"] = "在任務日誌列表中顯示任務難度" +L["Show quest levels"] = "顯示任務等級" +L["Show raid button"] = "顯示團隊按鈕" +L["Show ready timer"] = "顯示準備確認計時器" +L["Show repair summary in chat"] = "在聊天中顯示修理總結" +L["Show target frame and focus frame in class color"] = "以職業顏色顯示目標框和焦點框" +L["Show target model"] = "顯示目標模組" +L["Show the spell ID in buff icon tooltips"] = "在增益圖標提示顯示法術ID" +L["Show toggle headers button"] = "顯示切換標題按鈕" +L["Show tooltips with shift key"] = "使用shift鍵顯示工具提示" +L["Show train all skills button"] = "顯示訓練所有技能按鈕" +L["Show unit targets"] = "顯示單位目標" +L["Show vanity controls"] = "顯示外觀控制鍵" +L["Show vendor price"] = "顯示商店售價" +L["Show vendor summary in chat"] = "在聊天中顯示商店總結" +L["Show volume slider"] = "顯示音量控制" +L["Show web link"] = "顯示網頁連結" +L["Show who pinged"] = "顯示誰敲擊小地圖" +L["Show Wowhead links"] = "顯示Wowhead連結" +L["Silence rested emotes"] = "表情靜音" +L["Silithus"] = "希利蘇斯" +L["Silverpine Forest"] = "銀松森林" +L["Single Mark of Sargeras"] = "一個薩格拉斯印記" +L["Single Sunfury Signet"] = "一個日怒徽章" +L["Six minutes"] = "六分鐘" +L["Social"] = "社交訊息" +L["Sold junk for"] = "賣出垃圾為" +L["sound"] = "聲音" +L["Sound system restarted."] = "聲音系統已重啟。" +L["Southshore"] = "南海鎮" +L["Speak the remaining time"] = "說出剩餘時間" +L["Spell"] = "法術" +L["Spell ID"] = "法術ID" +L["Splintertree Post"] = "碎木崗哨" +L["Spooky"] = "幽靈" +L["Square minimap"] = "方形小地圖" +L["Square size"] = "方形大小" +L["Stockade"] = "暴風城監獄" +L["Stonard"] = "斯通納德" +L["Stonetalon Mountains"] = "石爪山脈" +L["Stonetalon Peak"] = "石爪峰" +L["Stop"] = "停止" +L["Storm Peaks"] = "風暴群山" +L["Stormwind"] = "暴風城" +L["Stranglethorn Vale"] = "荊棘谷" +L["Stratholme"] = "斯坦索姆" +L["Sun Rock Retreat"] = "烈日石居" +L["Sunfury Signets"] = "日怒徽章" +L["Sunken Temple"] = "沉沒的神廟" +L["Sunwell Plateau"] = "太陽之井高地" +L["Support"] = "支援" +L["Supported Addons"] = "支援的插件" +L["Swamp"] = "沼澤" +L["Swamp of Sorrows"] = "悲傷沼澤" +L["System"] = "系統設置" +L["T"] = "T" +L["Tabard"] = "隱藏戰袍" +L["Taint level: Basic (1)."] = "汙染等級:基本(1)" +L["Taint level: Disabled (0)."] = "汙染等級:停用(0)" +L["Taint level: Full (2)."] = "汙染等級:完整(2)" +L["Taller quest log frame"] = "更高的任務日誌框架" +L["Talonbranch Glade"] = "刺枝林地" +L["Talrendis Point"] = "塔倫迪斯營地" +L["Tanaris"] = "塔納利斯" +L["Target"] = "目標框架" +L["Target Tracking Disabled"] = "停用目標追蹤" +L["Target Tracking Enabled"] = "啟用目標追蹤" +L["Tarren Mill"] = "塔倫米爾" +L["Teldrassil"] = "泰達希爾" +L["Tempest Keep"] = "風暴要塞" +L["Temple of Ahn'Qiraj"] = "安琪拉神廟" +L["Temple of Atal'Hakkar"] = "阿塔哈卡神廟" +L["Ten minutes"] = "十分鐘" +L["Ten seconds"] = "十秒" +L["Ten Years of Warcraft"] = "魔獸十周年" +L["Terokkar Forest"] = "泰洛卡森林" +L["Text"] = "文字訊息" +L["Text size"] = "字體尺寸" +L["Text Size"] = "字體尺寸" +L["Thalanaar"] = "薩蘭納爾" +L["The Burning Crusade"] = "燃燒的遠征" +L["The game will dismount you if you successfully cast a spell without addons. These settings let you set some additional dismount rules."] = "在沒有插件下如果您成功施放法術,遊戲將使您下坐騎。這些設置讓您可以設置一些額外的下坐騎規則。" +L["The Sepulcher"] = "瑟伯切爾" +L["The square minimap will always show the new covenant button."] = "方形小地圖將始終顯示新誓盟按鈕。" +L["The summon from"] = "召喚來自" +L["Thelsamar"] = "塞爾薩瑪" +L["Themes"] = "主題" +L["Theramore"] = "塞拉摩" +L["There is a helpful guide on leatrix.com."] = "leatrix.com 上有一個有用的指南。" +L["These items will not be sold."] = "這些物品將不會出售。" +L["Thirty seconds"] = "三十秒" +L["This flight does not exist in the database."] = "該航班在數據庫中不存在。" +L["This flight does not have a saved duration in the database."] = "此航班在數據庫中沒有保存的持續時間。" +L["This flight's actual time of"] = "該航班的實際時間" +L["This is a custom button."] = "這是一個自定義按鈕。" +L["This panel will close automatically if you enter combat."] = "此面板將在你進入戰鬥後自動關閉。" +L["This slider requires 'Square minimap' to be enabled."] = "此卷軸需要啟用 '方形小地圖'。" +L["Thorium Point"] = "瑟銀哨塔" +L["Thousand Needles"] = "千針石林" +L["Three minutes"] = "三分鐘" +L["Thunder Bluff"] = "雷霆崖" +L["Timer"] = "計時框架" +L["Tirisfal Glades"] = "提里斯法林地" +L["Titan Panel screen adjust needs to be disabled for the frame to be saved correctly."] = "需要禁用 Titan Panel 螢幕調整才能正確保存框架。" +L["to"] = "到" +L["To begin, choose an options page."] = "請選擇一個選項開始使用" +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "你需要禁用ElvUI的聊天模塊以隱藏戰鬥記錄。" +L["To move the minimap, hold down the alt key and drag it."] = "要移動小地圖,請按住 alt 鍵並拖動它。" +L["To move the minimap, hold down the alt key and drag it.|n|nIf you toggle an addon minimap button, you may need to reload your UI for the change to take effect. This only affects a few addons that use custom buttons.|n|nThis panel will close automatically if you enter combat."] = "要移動小地圖,請按住 alt 鍵並拖動它。|n|n如果您切換插件小地圖按鈕,您可能需要重新載入UI以使更改生效。這只會影響一些使用自定義按鈕的插件。|n|n如果您進入戰鬥,此面板將自動關閉。" +L["To use the Find Item button, you need to deselect the WoW Token category."] = "要使用此搜尋物品按鈕,您需要取消選擇WoW的代幣類別" +L["Toggle buttons"] = "切換按鈕" +L["Toggle character stats"] = "切換角色屬性" +L["Toggle Grid"] = "切換對齊網格" +L["Toggle panel"] = "切換面板" +L["took"] = "接著" +L["Tooltip"] = "提示訊息" +L["Tooltip title color"] = "鼠標提示訊息顏色。" +L["Top"] = "頂部" +L["Top Center"] = "頂級中心" +L["Tracing started."] = "追蹤已開始。" +L["Tracing stopped."] = "追蹤已停止。" +L["Trains"] = "火車" +L["Transparency"] = "透明度" +L["Travelers"] = "旅行商人" +L["True"] = "真實" +L["Turn-in completed quests automatically"] = "自動交付完成的任務" +L["Twenty seconds"] = "二十秒" +L["Two minutes"] = "二分鐘" +L["Uldaman"] = "奧達曼" +L["Ulduar"] = "奧杜亞" +L["Unclamp chat frame"] = "不限制視窗位置" +L["Undercity"] = "幽暗城" +L["Un'Goro Crater"] = "安戈洛環形山" +L["Universal group color"] = "通用的隊伍著色" +L["Unlock the minimap"] = "解鎖小地圖" +L["Unmute"] = "未靜音" +L["Use arrow keys in chat"] = "允許使用方向鍵" +L["Use class colors in chat"] = "在聊天中使用職業著色" +L["Use easy resizing"] = "使用簡單拉伸" +L["Utgarde Keep"] = "俄特加德要塞" +L["Utgarde Pinnacle"] = "俄特加德之巔" +L["Valormok"] = "瓦羅莫克" +L["Value must be a number."] = "值必須為數字。" +L["Various"] = "雜項" +L["Vault of Archavon"] = "亞夏梵穹殿" +L["Vaults"] = "金庫" +L["Vendors"] = "商店" +L["Version"] = "版本" +L["Very Low"] = "非常低" +L["Video"] = "影像" +L["Visibility"] = "可見性" +L["Wailing Caverns"] = "哀嚎洞穴" +L["Warning"] = "警告" +L["was automatically declined."] = "已經自動拒絕。" +L["Weather density"] = "天氣密度" +L["Welcome to Leatrix Plus."] = "歡迎使用Leatrix Plus" +L["Western Plaguelands"] = "西瘟疫之地" +L["Westfall"] = "西部荒野" +L["Wetlands"] = "濕地" +L["Widget"] = "窗口小部件" +L["Width"] = "寬度" +L["Wildkin E'ko"] = "梟獸魂精" +L["will be automatically accepted in 10 seconds unless cancelled."] = "除非取消否則將會在10秒內自動接受。" +L["Winter"] = "寒冬" +L["Winterfall E'ko"] = "寒水魂精" +L["Wintergrasp"] = "冬之握" +L["Winterspring"] = "冬泉谷" +L["World of Warcraft"] = "魔獸世界" +L["Wrath of the Lich King"] = "巫妖王之怒" +L["Wrath of the Lich King Classic"] = "巫妖王之怒經典版" +L["X Offset"] = "水平偏移" +L["Y Offset"] = "垂直偏移" +L["Yawns"] = "哈欠" +L["YOU"] = "你" +L["You cannot do that in combat."] = "你無法在戰鬥中進行該項操作。" +L["You have"] = "你有" +L["You need to be group leader."] = "你需要成為隊長。" +L["You should keybind web link!"] = "你應該按鍵綁定網頁連結!" +L["You should set a keybind for the web link feature. It's very useful.|n|nOpen the key bindings window (accessible from the game menu) and click Leatrix Plus.|n|nSet a keybind for Show web link.|n|nNow when your pointer is over an item, NPC or spell (and more), press your keybind to get a web link."] = "您應該為網頁連結功能設置一個按鍵綁定。它非常有用。|n|n打開按鍵綁定視窗(可從遊戲選單訪問)並單擊Leatrix Plus。|n|n為顯示網頁連結設置按鍵綁定。|n|n現在,當您的指針在物品、NPC 或法術(以及更多)上時,按下您的按鍵綁定以獲取網頁連結。" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "你需要進行重載插件後才能使部分設置生效。|n|n你無需立即點擊重載插件按鈕,但是你完成設置並希望其生效時,必須點擊它。" +L["Your UI needs to be reloaded."] = "你的插件需要重新載入。" +L["Zangarmarsh"] = "贊格沼澤" +L["Zones"] = "區域" +L["Zoram'gar Outpost"] = "左拉姆加前哨站" +L["Zul'Aman"] = "祖阿曼" +L["Zul'Drak"] = "祖爾德拉克" +L["Zul'Farrak"] = "祖爾法拉克" +L["Zul'Gurub"] = "祖爾格拉布" +L["Zulian, Razzashi, and Hakkari Coins"] = "祖利安、拉札希和哈卡萊硬幣" +L["Zygor addon not found."] = "你尚未安裝Zygor插件。" + +end + +-- ruRU: Russian +if GameLocale == "ruRU" then +L["+"] = "Г" +L["A Donation of Mageweave"] = "Пожертвование: магическая ткань" +L["A Donation of Runecloth"] = "Пожертвование: рунная ткань" +L["A Donation of Silk"] = "Пожертвование: шелк" +L["A Donation of Wool"] = "Пожертвование: шерсть" +L["A friend request from"] = "Запрос дружбы от" +L["Accept available quests automatically"] = "Принимать доступные квесты автоматически" +L["Accept resurrection"] = "Принятие воскрешения" +L["Accept summon"] = "Принятие призыва" +L["A'dal"] = "А'дал" +L["Additional Runecloth"] = "Больше рунной ткани" +L["Addon"] = "Модификация" +L["Aerie Peak"] = "Заоблачный пик" +L["Ahn'kahet (Old Kingdom)"] = "Ан'кахет (Старое Королевство)" +L["Ahn'Qiraj"] = "Ан'Кираж" +L["ALT"] = "ALT" +L["Alterac Mountains"] = "Альтеракские горы" +L["Anchor"] = "Якорь" +L["Angelic"] = "Ангельский" +L["Announce rare"] = "Оповещать о рарниках" +L["Arathi Highlands"] = "Нагорье Арати" +L["Ashenvale"] = "Ясеневый лес" +L["Astranaar"] = "Астранаар" +L["Auberdine"] = "Аубердин" +L["Auto loot is now enabled."] = "Автоматическая добыча включена." +L["AutoFollow"] = "Автоматическое следование" +L["AutoFollow disabled."] = "Автоматическое следование выключено" +L["Automate gossip"] = "Автоматизация общения" +L["Automate quests"] = "Автоматизация квестов" +L["Automatic Release Cancelled"] = "Отмена авто. воскрешения" +L["Automation"] = "Автоматизация" +L["Azjol-Nerub"] = "Азжол-Неруб" +L["Azshara"] = "Азшара" +L["Azuremyst Isle"] = "Остров Лазурной Дымки" +L["B"] = "B" +L["Back to Main Menu"] = "В главное меню" +L["Bad ID"] = "Плохой id" +L["Badlands"] = "Бесплодные земли" +L["Barrens"] = "Южные степи" +L["Battle"] = "Боевой" +L["Battle of Warsong Gulch"] = "Битва за Ущелье Песни Войны" +L["Battlegrounds"] = "Поля боя" +L["BCC"] = "BCC" +L["Bikes"] = "Мотоцикл" +L["Black Morass"] = "Черные топи" +L["Black Temple"] = "Черный храм" +L["Blackfathom Deeps"] = "Непроглядная Пучина" +L["Blackrock Depths"] = "Глубины Черной горы" +L["Blackwing Lair"] = "Логово Крыла Тьмы" +L["Blade's Edge Mountains"] = "Острогорье" +L["Blasted Lands"] = "Выжженные земли" +L["Block drunken spam"] = "Блок пьяного спама" +L["Block duel spam"] = "Блок спама дуэли" +L["Block duels"] = "Блок дуэлей" +L["Block friend requests"] = "Блок запросов дружбы" +L["Block party invites"] = "Блок приглашений в группу" +L["Block shared quests"] = "Заблокировать предложение заданий" +L["Block spell links during combat"] = "Блок ссылок на заклинания во время боя" +L["Blocks"] = "Блокировки" +L["Bloodmyst Isle"] = "Остров Кровавой Дымки" +L["Booty Bay"] = "Пиратская бухта" +L["Borean Tundra"] = "Борейская тундра" +L["Bottom"] = "Нижняя" +L["Brackenwall Village"] = "Деревня Гиблотопь" +L["Brooms"] = "Метлы" +L["Buffs"] = "Бафы" +L["Burning Crusade"] = "Burning Crusade" +L["Burning Crusade Classic"] = "Burning Crusade Classic" +L["Burning Steppes"] = "Пылающие степи" +L["Buttons"] = "Кнопки" +L["Buttons for the addons listed below will remain visible."] = "Кнопки для перечисленных ниже аддонов останутся видимыми." +L["Buyout Only"] = "Только выкуп" +L["by Leatrix Plus"] = "от Leatrix Plus" +L["C"] = "C" +L["Camera distance"] = "Дистанция камеры" +L["Camp Mojache"] = "Лагерь Мохаче" +L["Camp Taurajo"] = "Лагерь Таурахо" +L["Cannot announce in this zone."] = "Не могу объявить в этой зоне." +L["Cannot be sold"] = "Не может быть продан" +L["Cannot find General chat channel."] = "Не удаётся найти общий канал чата." +L["Cannot use this with your locale."] = "Невозможно использовать с вашей локализацией." +L["Cenarion Hold"] = "Крепость Кенария" +L["Chain style"] = "Стиль контура" +L["Character"] = "Персонаж" +L["Chat"] = "Чат" +L["Chat Frame"] = "Окно чата" +L["Checkbox labels are Ok."] = "Сокращать описания." +L["Chillwind Camp"] = "Лагерь Промозглого Ветра" +L["Chillwind E'ko"] = "Э'ко стылодыхов" +L["Chimes"] = "Куранты" +L["Cinematics"] = "Видеоролики" +L["Claiming Arathi Basin"] = "Завоевание Низины Арати" +L["Class colored frames"] = "Фон имени в цвете класса" +L["Class icon portraits"] = "Изображение класса в портрете" +L["Classic"] = "Классик" +L["click here for new selection"] = "Нажмите сюда для создания новой подборки" +L["Click to close the currently active flight progress bar."] = "Нажмите, чтобы закрыть текущий индикатор времени полета." +L["Click to configure the settings for this option."] = "Нажмите, чтобы перейти к интерфейсу дополнительных параметров этой настройки." +L["Click to disable Titan Panel screen adjust. Your UI will be reloaded."] = "Нажмите, чтобы отключить подстройку экрана от Титан Панели. Ваш интерфейс будет перезагружен." +L["Click to reset the settings on this page."] = "Нажмите, чтобы сбросить настройки на этой странице." +L["Click to resize the screen to fit between the top and bottom borders."] = "Нажмите, чтобы оптимизировать размер экрана." +L["Click to return to the main menu."] = "Нажмите, чтобы вернуться в главное меню." +L["Click to toggle the addon buttons editor."] = "Нажмите, чтобы переключить редактор кнопок аддонов." +L["Click to toggle the frame alignment grid."] = "Нажмите, чтобы переключить сетку выравнивания." +L["Cloak"] = "Плащ" +L["Close"] = "Закрыть" +L["Close Bar"] = "Закрыть панель" +L["Cluster scale"] = "Масштаб кластера" +L["CMD (MAC)"] = "CMD" +L["Coilfang Reservoir"] = "Резервуар Кривого Клыка" +L["Collapse"] = "Коллапс" +L["Combat log cannot be hidden while undocked."] = "Журнал боя не может быть скрыт, пока он не закреплен" +L["Combat plates"] = "Индикаторы" +L["Combine addon buttons"] = "Объединить кнопки аддона" +L["Completed."] = "Завершено." +L["Concerted Efforts"] = "В едином порыве" +L["Configuration Panel"] = "Панель настроек" +L["Connections for"] = "Соединения с" +L["Conquering Arathi Basin"] = "Завоевание Низины Арати" +L["Contribute"] = "Способствовать" +L["CONTROL"] = "CONTROL" +L["Copied to clipboard."] = "Скопировано в буфер обмена." +L["Credits"] = "Благодарности" +L["Crossroads"] = "Перекресток" +L["Crystalsong Forest"] = "Лес Хрустальной Песни" +L["Culling of Stratholme"] = "Очищение Стратхольма" +L["Cursor"] = "Курсор" +L["Cursor Left"] = "Курсор слева" +L["Cursor Right"] = "Курсор вправо" +L["D"] = "П" +L["Darkmoon Faire"] = "Ярмарка Новолуния" +L["Darkshire"] = "Темнолесье" +L["Darkshore"] = "Темные берега" +L["Deadmines"] = "Пещеры Стенаний" +L["Deadwind Pass"] = "Перевал Мертвого Ветра" +L["Delay"] = "Задержка" +L["Desolace"] = "Пустоши" +L["Dire Maul"] = "Забытый Город" +L["Disable bag automation"] = "Деавтоматизация сумок" +L["Disable chat fade"] = "Откл. исчезание текста" +L["Disable loot warnings"] = "Отключить предупреждения о добыче" +L["Disable screen effects"] = "Откл. экранные эффекты" +L["Disable screen glow"] = "Откл. свечение экрана" +L["Disable sticky chat"] = "Отключить липкий чат" +L["Dismount me"] = "Спешивать меня" +L["Dismount when casting a spell while moving"] = "При произнесении заклинания во время движения" +L["Dismount when clicking a flight destination"] = "При выборе конечной точки перелёта" +L["Dismount when not enough rage, mana or energy"] = "Если не достаточно ярости, маны или энергии" +L["Dismount when the flight map opens"] = "При открытии окна карты" +L["Do you want to use Leatrix Plus Enhanced Minimap or ElvUI Minimap?"] = "Вы хотите использовать улучшенную миникарту Leatrix Plus или миникарту ElvUI?" +L["Drag the frame overlay to position the frame."] = "Переместите рамку, чтобы изменить позицию фрейма." +L["Drag the frame overlay to position the frame.|n|nThis panel will close automatically if you enter combat."] = "Перемещайте слой фрейма, чтобы установить его положение.|n|nЭта панель закроется автоматически, если вы вступите в бой." +L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."] = "Переместите рамку, с помощью левой кнопки, для свободного перемещения, или с помощью правой кнопки, для перемещения с использованием привязки к сетке." +L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid.|n|nThis panel will close automatically if you enter combat."] = "Переместите рамку, с помощью левой кнопки, для свободного перемещения, или с помощью правой кнопки, для перемещения с использованием привязки к сетке.|n|nЭта панель скроется автоматически, если вы вступите в бой." +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "Перетащите фрейм, чтобы изменить позицию. Чтобы изменить масштаб окна, щелкните по его рамке, а затем отрегулируйте масштаб ползунком на странице настроек.Эта панель закроется автоматически, если Вы начнёте бой." +L["Drag the frame overlays with the left button to position them freely or with the right button to position them using snap-to-grid.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "Переместите рамку, с помощью левой кнопки, для свободного перемещения, или с помощью правой кнопки, для перемещения с использованием привязки к сетке.|n|nЧтобы изменить масштаб рамки, щелкните по ней, чтобы выделить, а затем отрегулируйте ползунок масштаба.|n|nЭта панель закроется автоматически, если вы вступите в бой." +L["Drag to set the buffs frame scale."] = "Переместите ползунок влево или вправо, чтобы установить размер фрейма баффов" +L["Drag to set the cluster scale.|n|nNote: Adjusting the cluster scale affects the entire cluster including frames attached to it such as the buffs frame and objectives tracker.|n|nIt will also cause the default UI right-side action bars to scale when you login. If you use the default UI right-side action bars, you may want to leave this at 100%."] = "Переместите ползунок, чтобы установить масштаб кластера.|n|nПримечание: Настройка масштаба кластера влияет на весь кластер, включая прикрепленные к нему фреймы, такие как фрейм баффов и трекер целей.|n|nЭто также приведет к изменению масштаба правых панелей действий пользовательского интерфейса по умолчанию при входе в систему. Если вы используете стандартные правые панели действий пользовательского интерфейса, вам лучше оставить значение 100%." +L["Drag to set the cursor X offset."] = "Переместите ползунок влево или вправо, чтобы установить смещение курсора по оси X." +L["Drag to set the cursor Y offset."] = "Переместите ползунок влево или вправо, чтобы установить смещение курсора по оси Y." +L["Drag to set the density of weather effects."] = "Переместите ползунок влево или вправо, чтобы установить желаемую плотность погодных эффектов." +L["Drag to set the durability frame scale."] = "Переместите, чтобы установить масштаб прочности." +L["Drag to set the flight progress bar scale."] = "Переместите, чтобы установить масштаб панели полёта." +L["Drag to set the flight progress bar width."] = "Переместите, чтобы установить ширину панели полёта." +L["Drag to set the focus frame scale."] = "Перемещайте ползунок, чтобы установить масштаб фрейма." +L["Drag to set the font size of book text."] = "Переместите ползунок влево или вправо, чтобы установить размер шрифта текста книги." +L["Drag to set the font size of mail text."] = "Переместите ползунок влево или вправо, чтобы установить размер шрифта для текста почтовых сообщений" +L["Drag to set the font size of quest text."] = "Переместите ползунок влево или вправо, чтобы установить размер шрифта для текста квестов." +L["Drag to set the minimap scale.|n|nAdjusting this slider makes the minimap and all the elements bigger."] = "Переместите ползунок, чтобы установить масштаб миникарты.|n|nПри перемещении этого ползунка и сама миникарта и все её элементы становятся больше." +L["Drag to set the number of milliseconds before you are automatically released.|n|nYou can hold down shift as the timer is ending to cancel the automatic release."] = "Переместите ползунок влево или вправо, чтобы установить задержку перед автоматическим оживлением в миллисекундах.|n|nВы можете удерживать нажатой клавишу Shift до истечения таймера, чтобы отменить автоматическое воскрешение." +L["Drag to set the scale of the Leatrix Plus panel."] = "Переместите ползунок влево или вправо, чтобы установить масштаб панели Leatrix Plus." +L["Drag to set the scale of the selected frame."] = "Переместите ползунок влево или вправо, чтобы установить масштаб выбранного фрейма." +L["Drag to set the size of the bottom border."] = "Перемещайте, чтобы установить размер нижней границы." +L["Drag to set the size of the left border."] = "Перемещайте, чтобы установить размер левой границы." +L["Drag to set the size of the right border."] = "Перемещайте, чтобы установить размер правой границы." +L["Drag to set the size of the top border."] = "Перемещайте, чтобы установить размер верхней границы." +L["Drag to set the square minimap size.|n|nAdjusting this slider makes the minimap bigger but keeps the elements the same size."] = "Переместите ползунок, чтобы установить размер квадратной миникарты.|n|nПри перемещении этого ползунка сама миникарта становится больше, но её элементы остаются прежнего размера." +L["Drag to set the timer bar scale."] = "Переместите, чтобы установить масштаб таймера." +L["Drag to set the tooltip scale."] = "Переместите ползунок влево или вправо, чтобы установить масштаб всплывающей подсказки." +L["Drag to set the transparency of the borders."] = "Переместите ползунок влево или вправо, чтобы установить прозрачность границ." +L["Drag to set the transparency of the Leatrix Plus panel."] = "Переместите ползунок влево или вправо, чтобы установить прозрачность панели Leatrix Plus." +L["Drag to set the widget scale."] = "Переместите ползунок, чтобы установить масштаб виджета." +L["Drag to size"] = "Перетащите до размера" +L["Dragonblight"] = "Драконий Погост" +L["Drak'Tharon Keep"] = "Крепость Драк'Тарон" +L["Dun Morogh"] = "Дун Морог" +L["Dungeons"] = "Подземелья" +L["Dup ID"] = "Копия id" +L["Duplicates"] = "Дубликаты" +L["durability"] = "прочность" +L["Durability"] = "Прочность" +L["Duration"] = "Продолжительность" +L["Durotar"] = "Дуротар" +L["Duskwood"] = "Сумеречный лес" +L["Dustwallow Marsh"] = "Пылевые топи" +L["Eastern Kingdoms"] = "Восточные королевства" +L["Eastern Plaguelands"] = "Восточные Чумные земли" +L["Easy item destroy"] = "Лёгкое уничтожение" +L["Eight minutes"] = "Восемь минут" +L["ELITE"] = "Элитный" +L["ElvUI"] = "ElvUI" +L["Elwynn Forest"] = "Элвиннский лес" +L["Enable viewport"] = "Включить полосы" +L["Enhance dressup"] = "Улучшить примерочную" +L["Enhance minimap"] = "Улучшить миникарту" +L["Enhance professions"] = "Улучшить окно профессий" +L["Enhance quest log"] = "Улучшить журнал заданий" +L["Enhance tooltip"] = "Улучшить подсказки" +L["Enhance trainers"] = "Улучшить окно тренера" +L["Enhancements"] = "Улучшения" +L["Enter"] = "Войти" +L["Enter item IDs separated by commas. Item IDs can be found in item tooltips while this panel is showing.|n|nJunk items entered here will not be sold automatically.|n|nWhite items entered here will be sold automatically.|n|nThe editbox tooltip will show you more information about the items you have entered."] = "Введите ID предметов, разделенные запятыми. ID предметов можно найти в вслывающей подсказке предметов во время отображения этой панели.|n|nХлам, введенный здесь, не будет продаваться автоматически.|n|nБелые предметы, введенные здесь, будут продаваться автоматически.|n|Всплывающая nподсказка окна редактирования, покажет вам более подробную информацию о введенных вами предметах." +L["Enter junk item IDs separated by commas."] = "Введите ID хлама, разделенного запятыми." +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "Введите ID заклинаний, иконки которых хотите видеть. Если значок перезарядки появляется под рамкой питомца, то нажмите галочку. Иконки восстановления сохраняются для вашего класса." +L["enter zone or track name"] = "введите название зоны или трека" +L["Error messages will be hidden"] = "Сообщения об ошибках будут скрыты" +L["Error messages will be shown"] = "Сообщения об ошибках будут показаны" +L["Events"] = "События" +L["Everlook"] = "Круговзор" +L["Eversong Woods"] = "Леса Вечной Песни" +L["Exclude Alterac Valley"] = "Иключить Альтеракскую Долину" +L["Exclude BugSack"] = "Исключить BugSack" +L["Exclude combat resurrection"] = "Исключить воскрешение в бою" +L["Exclusions"] = "Исключения" +L["Expand"] = "Раскрыть" +L["Extras"] = "Дополнения" +L["Eye of Eternity"] = "Око Вечности" +L["False"] = "Ложь" +L["Faster auto loot"] = "Быстрый сбор добычи" +L["Faster movie skip"] = "Пропуск видеороликов" +L["Feathermoon"] = "Лунное Перо" +L["Features"] = "Особенности" +L["Felwood"] = "Оскверненный лес" +L["Feralas"] = "Фералас" +L["Fight for Warsong Gulch"] = "Битва за Ущелье Песни Войны" +L["Fill instead of drain"] = "Заполнить вместо слива" +L["Filter chat messages"] = "Фильтр сообщений чата" +L["Find Item"] = "Найти предмет" +L["Firewing Signets"] = "Перстни Огнекрылов" +L["Five minutes"] = "Пять минут" +L["Fizzle"] = "Шипение" +L["Flame Crest"] = "Пламенеющий Стяг" +L["Flight commenced."] = "Полет начался." +L["Flight details"] = "Детали полета" +L["Focus"] = "Фокус" +L["For all of the social options above, you can treat guild members as friends too."] = "Во всех вышеперечисленных социальных опциях вы можете рассматривать членов гильдий и членов ваших сообществ как друзей." +L["For Great Honor"] = "Ради славы" +L["Forge of Souls"] = "Кузня Душ" +L["Four minutes"] = "Четыре минуты" +L["Frames"] = "Фреймы" +L["Freewind Post"] = "Застава Вольного Ветра" +L["Frostmaul E'ko"] = "Э'ко великанов" +L["Frostsaber E'ko"] = "Э'ко ледопардов" +L["Gadgetzan"] = "Прибамбасск" +L["Game Options"] = "Настройки игры" +L["General"] = "Основное" +L["Ghost"] = "Призрак" +L["Ghostlands"] = "Призрачные земли" +L["Gloomy"] = "Угрюмый" +L["Gnomeregan"] = "Гномреган" +L["Gold Only"] = "Только золото" +L["Graphics and Sound"] = "Графика и звук" +L["Grizzly Hills"] = "Седые холмы" +L["Grom'gol"] = "Лагерь Гром'гол" +L["Groups"] = "Группы" +L["Guild"] = "Гильдия" +L["Gundrak"] = "Гундрак" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "Монеты племен: Гурубаши, Порочная Ветвь и Сухокожие" +L["Gyrocopters"] = "Гирокоптеры" +L["H"] = "H" +L["Halls of Lightning"] = "Чертоги Молний" +L["Halls of Reflection"] = "Залы Отражений" +L["Halls of Stone"] = "Чертоги Камня" +L["Hammerfall"] = "Павший Молот" +L["Haunted"] = "Преследуемый" +L["Have mats?"] = "Есть ингредиенты?" +L["Hellfire Peninsula"] = "Полуостров Адского Пламени" +L["Hellfire Ramparts"] = "Бастионы Адского Пламени" +L["Helm"] = "Шлем" +L["Help"] = "Справка" +L["Help contribute flight times"] = "Помогите внести информацию о времени полета" +L["Hide action button text"] = "Скрыть текст кнопки действия" +L["Hide addon buttons"] = "Скрыть кнопки аддона" +L["Hide alerts"] = "Скрыть оповещения" +L["Hide chat buttons"] = "Скрыть кнопки чата" +L["Hide cooldown duration numbers (if enabled)"] = "Скрыть длительность перезарядки (если включено)" +L["Hide error messages"] = "Скр. сообщ. об ошибках" +L["Hide gryphons"] = "Скрыть грифонов" +L["Hide keybind text"] = "Скрыть текст привязки" +L["Hide macro text"] = "Скрыть название макроса" +L["Hide portrait numbers"] = "Скрыть числа на портрете" +L["Hide stance bar"] = "Скрыть панель стоек" +L["Hide the combat log"] = "Скрыть журнал боя" +L["Hide the health bar"] = "Скрыть полосу здоровья" +L["Hide the tracking button"] = "Скрыть кнопку отслеживания" +L["Hide the world map button"] = "Скрыть кнопку мировой карты" +L["Hide the zone text bar"] = "Скрыть текстовую панель с названием зоны" +L["Hide the zoom buttons"] = "Скрыть кнопки масштабирования" +L["Hide tooltips for world units during combat"] = "Скрыть подсказки для мировых боссов во время боя" +L["Hide zone text"] = "Скрыть название зоны" +L["High"] = "Высокая" +L["Hillsbrad Foothills"] = "Предгорья Хилсбрада" +L["Hinterlands"] = "Внутренние земли" +L["Home"] = "Главная" +L["Hover the pointer over a button."] = "Наведите указатель на кнопку" +L["Howling Fjord"] = "Ревущий Фьорд" +L["Hyjal Summit"] = "Вершина Хиджала" +L["Ice Thistle E'ko"] = "Э'ко йети" +L["Icecrown"] = "Ледяная Корона" +L["Icecrown Citadel"] = "Цитадель Ледяной Короны" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "Если флажок установлен, в рюкзаке и банке будет отображаться строка поиска в сумке." +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "Если флажок установлен, то в окне отображения информации о персонаже будет добавлена кнопка, при наведении указателя мыши на которую, будет показана прочность всей экипировки персонжа.|n|nКроме того, при смерти вашего персонажа, общий процент прочности будет показан сообщением в окне чата." +L["If checked, a group invite will be sent to anyone who whispers you with a set keyword as long as you are ungrouped, group leader or raid assistant and not queued for a battleground.|n|nFriends who message the keyword using Battle.net will not be sent a group invite if they are appearing offline. They need to either change their online status or use character whispers."] = "Если флажок установлен, то приглашение в группу будет отправлено любому кто шепнёт вам ключевое (предустановленное) слово, при условии, что вы не находитесь в группе, либо находитесь в группе но являетесь её лидером, либо находитесь в группе рейда и имеете назначенное право помощника рейд-лидера, и при этом не находитесь в очереди на поле боя.|n|nВаши друзья отправившие вам ключевое слово средствами чата Battle.net, не получат приглашения в группу, если они находятся в автономном (скрытом) режиме. Им нужно либо изменить свой сетевой статус, либо воспользоваться внутриигровым чатом, шепнув вам ключевое слово от имени своего персонажа." +L["If checked, a master volume slider will be shown in the character frame."] = "Если флажок установлен, то в окне отображения информации о персонаже будет отображаться регулятор (ползунок) общей громкости." +L["If checked, a minimap button will be available.|n|nClick - Toggle options panel.|n|nSHIFT-click - Toggle music.|n|nALT-click - Toggle errors (if enabled).|n|nCTRL/SHIFT-click - Toggle Zygor (if installed).|n|nCTRL/ALT-click - Toggle windowed mode."] = "Если флажок установлен, появится кнопка у миникарты.|n|nКлик - переключает панель параметров.|n|nSHIFT-клик - переключение музыки.|n|nCTRL-клик - переключить отслеживание целей на миникарте.|n|nALT-клик - переключение ошибок (если включено).|n|nCTRL/SHIFT-клик - переключить Zygor (если он установлен).|n|nCTRL/ALT-клик - переключение в оконный режим." +L["If checked, a power bar will be shown in the player frame when you are playing a shapeshifted druid."] = "Если флажок установлен, в фрейме персонажа будет отображаться панель силы, когда вы играете друидом в соответствующей форме." +L["If checked, a repair summary will be shown in chat when your gear is automatically repaired."] = "Если флажок установлен, то в чате будет отображаться сводная информация о ремонте вашей экипировки, после того как она будет автоматически отремонтирована." +L["If checked, a timer will be shown under the PvP encounter ready frame so that you know how long you have left to click the enter button."] = "Если флажок установлен, будет отображаться таймер под рамкой готовности к PvP, чтобы вы знали, сколько времени у вас осталось, чтобы нажать кнопку входа." +L["If checked, a vendor summary will be shown in chat when junk is automatically sold."] = "Если флажок установлен, то в чате будет отображаться сводная информация о мусоре, автоматически проданном вами продавцу." +L["If checked, additional font sizes will be available in the chat frame font size menu."] = "Если флажок установлен, то в меню выбора размера шрифта чата будут доступны дополнительные размеры." +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "Если флажок установлен, то на аукцион будут добавлены новые функции:|n|nТолько выкуп - создание аукционов выкупа без указания начальной цены.|n|nТолько золото - установите цены на медь и серебро 99, чтобы ускорить продажу новых лотов.|n|nНайти предмет - найдите в аукционе предмет, который вы продаете.|n|nКроме того, настройка длительности лотов будет сохранена для всего аккаунта." +L["If checked, addon buttons will be combined into a single button frame which you can toggle by right-clicking the minimap.|n|nNote that enabling this option will lock out the 'Hide addon buttons' setting."] = "Если флажок установлен, кнопки аддонов будут объединены в одну рамку, отображение которой можно переключать щелчком правой кнопки мыши по миникарте.|n|nОбратите внимание, что включение этой опции заблокирует настройку Скрывать кнопки аддонов." +L["If checked, addon buttons will be hidden while the pointer is not over the minimap."] = "Если флажок установлен, кнопки аддонов будут скрыты, пока указатель мыши не будет находиться над картой." +L["If checked, alert frames will not be shown."] = "Если флажок установлен, то фреймы с предупреждениями не будут отображаться." +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Если флажок установлен, то все предметы серого качества, находящиеся в ваших сумках, будут автоматически проданы при посещении торговца.|n|nВы можете удерживать клавишу SHIFT во время общения с торговцем для временного игнорирования этой опции." +L["If checked, an animation slider will be shown in the dressing room."] = "Если флажок установлен, в окне примерочной будет показан слайдер анимации." +L["If checked, available quests will be accepted automatically."] = "Если установлен этот флажок, доступные для вас квесты будут приниматься автоматически" +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "Если флажок установлен, то фон подсказки будет синим (дружественная цель) или красным (враждебная цель)." +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "Если флажок установлен, то запросы дружбы по BattleTag и Real ID будут автоматически отклоняться.|n|nВключение этого параметра автоматически отклонит любые ожидающие запросы." +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "Если флажок установлен, то кнопки чата будут скрыты.|n|nКлик по вкладке чата автоматически покажет последние сообщения.|n|nИспользуйте колесо мыши для прокрутки истории чата. Удерживайте клавишу SHIFT для перехода на другую страницу чата или CTRL, для перехода к верхней или нижней части истории чата." +L["If checked, chat text will not fade out after a time period."] = "Если флажок установлен, то текст чата не будет исчезать спустя некоторое время." +L["If checked, class coloring will be used in the player frame, target frame and focus frame."] = "Если флажок установлен, то имена персонажей, в окне персонажа, цели и фокуса, будет выделена цветом их класса." +L["If checked, class colors will be used in the chat frame."] = "Если флажок установлен, то имена персонажей, в окне чата, будут выделены цветом их класса." +L["If checked, class icons will be shown in the portrait frames.|n|nNote that this option may reduce framerate while the target of target window is showing."] = "Если флажок установлен, то в фреймах персонажей, вместо портретов, будут отображаться значки классов.|n|nУчтите, то это может снизить частоту кадров, если вы используете режим отображения цель цели." +L["If checked, clock hourly chimes will be muted."] = "Если флажок установлен, то куранты больше не будут беспокоить вас своим боем каждый час." +L["If checked, completed quests will be turned-in automatically."] = "Если установлен этот флажок, выполненные квесты будут сдаваться автоматически" +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "Если флажок установлен, то больше не будет предупреждений когда вы разыгрываете (роллите) предмет или пересылаете по почте предмет, который можно передать." +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "Если флажок установлен, то не будут отображаться цифры длительности перезарядки.|n|nЕсли не установлен, то длительность перезарядки будет показываться в перезарядках, если они включены в настройках игры." +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "Если флажок установлен, то цифры урона и лечения на фреймах игрока и питомца будут скрыты." +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "Если флажок установлен, то перетаскивание вкладки Общий чата, когда окно чата заблокировано, развернет окно чата.|n|nЕсли окно чата разблокировано, то перетаскивание вкладки Общий приведет к перемещению окна чата." +L["If checked, drunken messages will be blocked unless they apply to your character.|n|nThis applies to the system channel."] = "Если флажок установлен, пьяные сообщения будут блокироваться, если они не относятся к вашему персонажу.|n|nЭто относится к системному каналу." +L["If checked, duel requests will be blocked unless the player requesting the duel is a friend."] = "Если флажок установлен, то все вызовы на дуэль, кроме брошенных вам от ваших друзей, - будут блокироваться." +L["If checked, duel victory and retreat messages will be blocked unless your character took part in the duel.|n|nThis applies to the system channel."] = "Если флажок установлен, все сообщения о победах и поражениях в дуэлях будут блокироваться, если это не ваш персонаж участвовал в дуэли.|n|nЭто относится к системному каналу." +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "Если флажок установлен, то звуки эмоций будут заглушаться, пока ваш персонаж отдыхает или находится в Трактире Угрюмый обжора.|n|nВ любое другое время звуки будут включены." +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "Если флажок установлен, то индикаторы здоровья будут отображены только во время боя и скрыты после его завершения." +L["If checked, flight times will be shown in the flight map and when you take a flight."] = "Если флажок установлен, время полета будет отображаться как на карте полетов, так и во время вашего полёта." +L["If checked, group invites will only be sent to friends.|n|nIf unchecked, group invites will be sent to everyone."] = "Если флажок установлен, то приглашения в группу будут отправляться только друзьям.|n|nЕсли флажок снят, приглашения в группу будут отправляться всем." +L["If checked, guild ranks will be shown for players in your guild."] = "Если этот флажок установлен, для игроков в вашей гильдии будут отображаться ранги гильдии." +L["If checked, guild ranks will be shown for players who are not in your guild."] = "Если этот флажок установлен, для игроков не являющихся членами вашей гильдии будут отображаться ваши гильдейские ранги." +L["If checked, gyrocopters will be muted.|n|nThis applies to the engineering flying machine mounts."] = "Если флажок установлен, то у гирокоптера будет отключен звук.|n|nЭто затронет всех инженерских летающих маунтов." +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "Если флажок установлен, флажки переключения головы и плаща будут отображаться на листе символов.|n|nВы можете удерживать клавишу SHIFT и щелкнуть правой кнопкой мыши по флажкам, чтобы переключить раскладки." +L["If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman."] = "Если этот флажок установлен, звуки праздничных событий будут отключены.|n|nЭто относится к Всаднику без головы." +L["If checked, item buttons will be shown in the dressing room. You can click the item buttons to remove individual items from the model."] = "Если флажок установлен, то в окне примерочной будут отображаться кнопки предметов. Вы можете нажать на кнопки предметов, чтобы удалить отдельные предметы из модели." +L["If checked, macro and keybind text will not be shown on action buttons."] = "Если флажок установлен, то текст макроса и сопоставления (биндинга) клавиш не будет отображаться на кнопках действий." +L["If checked, mechanostriders will be quieter."] = "Если флажок установлен, механодолгоноги будут тише." +L["If checked, members of your guild will be treated as friends for all of the options on this page."] = "Если флажок установлен, члены вашей гильдии будут рассматриваться как друзья для всех опций на этой странице." +L["If checked, messages containing spell links will be blocked while you are in combat.|n|nThis is useful for blocking spell interrupt spam.|n|nThis applies to the say, party, raid, instance and emote channels."] = "Если флажок установлен, сообщения содержащие ссылки на заклинания, будут блокироваться, пока вы находитесь в бою.|n|nЭто полезно для блокирования спама, связанного с прерыванием заклинаний.|n|nЭто относится к каналам: сказать, группа, рейд, подземелье и эмоция." +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "Если флажок установлен, то большинство сообщений об ошибках (например, «Недостаточно ярости») не будут отображаться. Некоторые важные ошибки останутся.|n|nЕсли у вас включена кнопка у миникарты, вы сможете удерживать CTRL и нажать ПКМ, чтобы вкл выкл сообщения об ошибках, не изменяя данную настройку." +L["If checked, non-standard minimap buttons will be replaced with standard LibDBIcon buttons.|n|nThis will fix the problems with non-standard buttons such as not hiding automatically, not following the minimap shape and not being placed in the button frame.|n|nNote that enabling or disabling non-standard buttons may require a UI reload to take effect.|n|nMost addons already use the standard LibDBIcon library and will not be affected by this setting but a few addons still use non-standard buttons.|n|nPlease ask addon authors to use the standard LibDBIcon library for their minimap buttons then this setting won't be necessary."] = "Если флажок установлен, нестандартные кнопки миникарты будут заменены на стандартные кнопки библиотеки LibDBIcon.|n|nЭто устранит проблемы с нестандартными кнопками, такие как отсутствие автоматического скрытия, несоблюдение формы миникарты и не размещение в рамке кнопки.|n|nОбратите внимание, что включение или отключение нестандартных кнопок может потребовать перезагрузки пользовательского интерфейса для вступления в силу.|n|nБольшинство аддонов уже используют стандартную библиотеку LibDBIcon и не будут затронуты этой настройкой, но некоторые аддоны все еще используют собственные нестандартные кнопки.|n|nПросьба к авторам аддонов использовать стандартную библиотеку LibDBIcon для своих кнопок миникарты, чтобы эта настройка не понадобилась." +L["If checked, party invitations from friends will be automatically accepted unless you are queued for a battleground."] = "Если флажок установлен, то приглашения в группу от друзей будут приниматься автоматически, если вы не стоите в очереди на поле боя." +L["If checked, party invitations will be blocked unless the player inviting you is a friend."] = "Если флажок установлен, приглашения в группу будут блокироваться, если приглашающий вас игрок не является вашим другом." +L["If checked, quest levels will be shown."] = "Если флажок установлен, то для заданий будет отображаться их уровень." +L["If checked, quests will be selected, accepted and turned-in automatically.|n|nQuests which have a gold requirement will not be turned-in automatically."] = "Если флажок установлен, задания будут автоматически выбираться, приниматься и сдаваться|n|nЗадания требующие от вас отдать некоторое количество золотых монет - не будут сдаваться автоматически!" +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "Если флажок установлен, то чаты рейдов и подземелий будут окрашены в синий цвет (чтобы они сочетались по цвету)." +L["If checked, resurrection requests will be accepted automatically."] = "Если флажок установлен, запросы на воскрешение будут приниматься автоматически." +L["If checked, resurrection requests will not be automatically accepted if the player resurrecting you is in combat."] = "Если флажок установлен, запросы на воскрешение не будут автоматически приниматься, если воскрешающий вас игрок находится в бою." +L["If checked, Screech will be muted.|n|nThis is a spell used by some flying pets."] = "Если флажок установлен, крик будет приглушен.|n|nЭто заклинание используют некоторые летающие питомцы." +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "Если флажок установлен, то во всплывающих подсказках на фрейме с бафами, а также на целях персонажа будут отображаться ID заклинаний." +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "Если флажок установлен, то липкий чат будет отключен.|n|nПримечание: эта настройка не будет работать для временных чатов." +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "Если флажок установлен и вы не находитесь в бою, то запрос на ваш призыв будет принят автоматически." +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "Если флажок установлен, то список модификаций (доступный из меню игры) будет отображать по умолчанию список модификации для этого персонажа." +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "Если флажок установлен, то время необходимое для поднятие добычи значительно сократится." +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "Если флажок установлен, то кнопка сортировки вещей в сумках и в банке не будет отображаться." +L["If checked, the BugSack addon minimap button will always be visible if you have BugSack installed and the minimap button enabled."] = "Если флажок установлен, кнопка миникарты аддона BugSack будет видна всегда, если у вас установлен этот аддон и включено отображение его кнопки миникарты." +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "Если флажок установлен, то кнопка для переключения контейнера рейда будет отображена над его окном управления (c левой стороны), а не на самом окне управления.|n|nЭто позволит переключать рамку контейнера рейда без необходимости открывать окно его управления." +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "Если флажок установлен, то закладка Журнал боя в окне чата будет скрыта.|n|nЧтобы эта настройка сработала, закладка Журнал боя должна находиться в окне чата.|n|n Если закладка откреплена, Вы можете закрепить её перетащив на вкладку чата (после этого необходимо перезагрузить UI) или сбросить настройки окна чата (из соответствующего меню)." +L["If checked, the editbox will be moved to the top of the chat frame."] = "Если флажок установлен, то поле ввода текста будет перемещено в верхнюю часть окна чата. По умолчанию, оно находится в нижней части." +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "Если флажок установлен, то серый экран смерти и другие эффекты будут отключены." +L["If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted."] = "Если этот флажок установлен, звук кнопки интерфейса, звук щелчка по вкладке окна чата и звук переключения игрового меню будет отключен." +L["If checked, the main bar gryphons will not be shown."] = "Если флажок установлен, то панель с грифонами не будет отображаться." +L["If checked, the minimap shape will be square."] = "Если флажок установлен, форма окна миникарты будет квадратной." +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "Если флажок установлен, количество свободных мест в сумке будет отображаться в значке кнопки рюкзака и во всплывающей подсказке." +L["If checked, the player frame background will be shown in class color."] = "Если флажок установлен, фон окна игрока будет отображаться в цвете класса." +L["If checked, the professions frame will be larger."] = "Если флажок установлен, то окно профессий будет больше." +L["If checked, the quest log frame will be taller."] = "Если флажок установлен, рамка журнала заданий будет выше." +L["If checked, the ready check sound will be muted."] = "Если флажок установлен, то будет отключен звук проверки готовности." +L["If checked, the scale slider will apply to the entire minimap cluster.|n|nNote that if you are using the default action bars, rescaling the cluster will also rescale the right action bars at startup so you may want to leave the scale slider at 100%.|n|nIf unchecked, the scale slider will only apply to the minimap."] = "Если флажок установлен, ползунок масштаба будет применяться ко всему кластеру (зоне) мини-карты.n|nОбратите внимание, что если вы используете стандартные панели действий, изменение масштаба кластера также изменит масштаб правых панелей действий при запуске, поэтому вы можете пожелать оставить ползунок масштаба на уровне 100%.|n|nЕсли флажок не установлен, изменение масштаба этим ползунком будет применяться только к мини-карте." +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "Если флажок установлен, то свечение экрана будет отключено.|n|nВключение этой опции также отключит эффект пьяной дымки." +L["If checked, the skill trainer frame will be larger and feature a train all skills button."] = "Если флажок установлен, рамка тренера навыков будет больше и будет иметь кнопку обучения всем навыкам." +L["If checked, the spell fizzle sounds will be muted."] = "Если этот флажок установлен, шипящие звуки заклинаний будут отключены." +L["If checked, the stance bar will not be shown."] = "Если флажок установлен, то панель стоек не будет отображаться." +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "Если флажок установлен, то окно разговоров не будет показываться.|n|nОкно разговоров появляется обычно в нижней части экрана, в процессе общения с некоторыми НПС." +L["If checked, the target frame background and focus frame background will be shown in class color."] = "Если флажок установлен, фон рамок цели и фокуса будет отображаться по цвету класса." +L["If checked, the target frame background will be shown in class color."] = "Если флажок установлен, фон окна цели будет отображаться в цвете класса цели." +L["If checked, the toggle headers button will be shown."] = "Если флажок установлен, будет отображаться кнопка переключения заголовков." +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "Если флажок установлен, то всплывающие подсказки будут выделяться цветом, и у Вас появится возможность менять их расположение и размер." +L["If checked, the tracking button will be hidden while the pointer is not over the minimap."] = "Если флажок установлен, кнопка отслеживания будет скрыта, пока указатель мыши не находится на мини-карте." +L["If checked, the vendor price will be shown in item tooltips."] = "Если флажок установлен, то во всплывающих подсказках предметов будет отображаться цена у продавца." +L["If checked, the world map button will be hidden."] = "Если флажок установлен, кнопка карты мира будет скрыта." +L["If checked, the zone text bar will be hidden."] = "Если флажок установлен, текстовая панель с названием зоны будет скрыта." +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "Если флажок установлен, то кнопки увеличения и уменьшения масштаба у миникарты будут скрыты. Независимо от этой настройки, вы сможете использовать колесо мыши для изменения масштаба." +L["If checked, tooltips for world units will be hidden during combat."] = "Если флажок установлен, всплывающие подсказки для мировых юнитов будут скрыты во время боя." +L["If checked, train sounds will be muted."] = "Если этот флажок установлен, звуки поезда будут отключены." +L["If checked, traveling merchant greetings and farewells will be muted.|n|nThis applies to Traveler's Tundra Mammoth."] = "Если флажок установлен, приветствия и прощания странствующего торговца будут отключены.|n|nЭто относится к тундровому мамонту путешественника." +L["If checked, unit targets will be shown."] = "Если флажок установлен, то будет отображаться цель цели." +L["If checked, Wowhead links will go directly to the comments section."] = "Если флажок установлен, ссылки на Wowhead будут вести непосредственно в раздел комментариев." +L["If checked, yawns from hunter pet cats will be muted."] = "Если флажок установлен, то домашние кошки охотников будут зевать молча." +L["If checked, you can block spell links, drunken spam and duel spam."] = "Если флажок установлен, вы можете блокировать ссылки на заклинания, пьяный спам и спам от дуэлей." +L["If checked, you can hold alt and drag the minimap to move it."] = "Если флажок установлен, вы сможете перемещать карту удерживая одновременно кнопку Alt и кнопку мыши (перетаскивание)." +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "Если флажок установлен, то удерживая нажатой клавишу CTRL и щелкнув по закладке чата, вы сможете просмотреть последние записи чата в отдельном окне, из которого сможете легко скопировать текст." +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "Если флажок установлен, то Вы сможете нажимать кнопки со стрелками для перемещения курсора влево и вправо, в строке ввода текста, в окне чата.|n|nЕсли флажок снят, то клавиши со стрелками будут использовать настройки назначения клавиш по умолчанию." +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "Если флажок установлен, то вы сможете пропускать ролики без подтверждения." +L["If checked, you will be able to change the font size of book text."] = "Если флажок установлен, вы сможете изменять размер шрифта текста в книгах." +L["If checked, you will be able to change the font size of quest text."] = "Если флажок установлен, вы сможете изменять размер шрифта текста квестов." +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "Если флажок установлен, вы сможете изменить размер шрифта текста в почтовых сообщениях (письмах).|n|nЭта настройка не будет иметь силы для писем созданных по шаблону (к примеру писем с аукциона)." +L["If checked, you will be able to change the position and scale of the buffs frame."] = "Если этот флажок установлен, у вас будет возможность изменять расположение и размеры фрейма баффов" +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "Если флажок установлен, то вы сможете управлять положением и масштабом виджетов.|n|nВиджеты обычно используются для отображения результатов PvP и отслеживания целей." +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "Если флажок установлен, вы сможете создать зону видимости. Создание такой зоны - добавляет сверху и снизу основного экрана игры черные полосы.|n|nНа этих полосах вы сможете разместить элементы интерфейса, тем самым не перекрывая обзор основного экрана игры." +L["If checked, you will be able to customise the minimap."] = "Если флажок установлен, вы сможете настроить миникарту." +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "Если флажок установлен, то вы сможете переместить фрейм чата к краю экрана." +L["If checked, you will be able to mute a selection of game sounds."] = "Если этот флажок установлен, вы сможете отключить некоторые звуки игры." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "Если флажок установлен, вы сможете разместить над фреймом цели дополнительно до пяти пиктограмм отображающих таймеры восстановления." +L["If checked, you will be able to reposition the tooltip."] = "Если флажок установлен, вы сможете изменить положение всплывающей подсказки." +L["If checked, you will be able to set some additional rules for when your character is automatically dismounted."] = "Если флажок установлен, вы сможете установить дополнительные условия, при которых ваш персонаж должен будет автоматически спешиваться." +L["If checked, you will be able to set the density of weather effects."] = "Если флажок установлен, вы сможете установить плотность погодных эффектов." +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "Если флажок установлен, то вы сможете изменить контур рамки своего персонажа с обычного на редкий, элитный или редко-элитный." +L["If checked, you will be able to zoom out to a greater distance."] = "Если флажок установлен, вы сможете максимально далеко отдалять камеру.|nПримечание: Это может приводить к неожиданным результатам, так как мир классического WoW не был на это рассчитан." +L["If checked, you will be dismounted when you attempt to cast a non-instant cast spell while moving."] = "Если флажок установлен, вы будете автоматически спешиваться в случае если вы попытаетесь произнести не моментальное заклинание в движении." +L["If checked, you will be dismounted when you attempt to cast a spell but don't have the rage, mana or energy to cast it."] = "Если флажок установлен, вы будете автоматически спешиваться в случае если вы попытаетесь произнести заклинание, но у вас будет не достаточно для этого ярости, маны или энергии." +L["If checked, you will be dismounted when you click a flight destination."] = "Если флажок установлен, вы будете автоматически спешиваться в случае если вы выберете конечную точку вашего перелёта на карте полётов." +L["If checked, you will be dismounted when you instruct a flight master to open the flight map."] = "Если флажок установлен, вы будете автоматически спешиваться в случае если вы попросите мастера полётов открыть карту полётов." +L["If checked, you will be prompted to submit missing flight times."] = "Если флажок установлен, вам будет предложено указать пропущенное время полета." +L["If checked, you will need to hold the override key down for quests to be automated.|n|nIf unchecked, holding the override key will prevent quests from being automated."] = "Если флажок установлен, то для автоматизации сдачи и/или принятия квестов вам нужно будет удерживать клавишу замены.|n|nЕсли флажок снят, удерживание клавиши замены запретит автоматизацию квестов." +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "Если флажок установлен, то вам больше не потребуется вводить слово УДАЛИТЬ в отдельных всплывающих окнах подтверждения уничтожения предметов высшего качества.|n|nКроме того, во всех таких окнах подтверждения удаления - будут отображаться ссылки на эти предметы." +L["If checked, you will not release automatically in Alterac Valley."] = "Если флажок установлен, на поле боя Альтеракская Долина - вы никогда не будете воскрешены автоматически." +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "Если флажок установлен, то вы будете автоматически покидать тело после смерти на поле битвы.|n|nОднако, вы не возродитесь автоматически, если у вас есть возможность самовоскрешения (камень души, реинкарнация и т. д.)." +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "Если флажок установлен, то ваши сумки не будут открываться или закрываться автоматически, когда вы взаимодействуете с торговцами, банком или почтовым ящиком." +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "Если флажок установлен, история чата увеличится до 4096 строк. Если флажок снят, будут использовать настройки по умолчанию (128 строк).|n|nВключение этой настройки может помешать отображению некоторого текста во время входа в игру." +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Если флажок установлен, то ваше снаряжение будет починено автоматически, когда вы поговорите с подходящим торговцем.|n|nВы можете удерживать клавишу SHIFT, перед разговором, чтобы временно игнорировать эту настройку." +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "Если флажок установлен, то текст названия зоны не будет отображаться (например Стальгорн)." +L["If you use the 'Hide addon buttons' or 'Combine addon buttons' settings but you want some addon buttons to remain visible around the minimap, enter the addon names into the editbox separated by a comma.|n|nThe editbox tooltip shows the addon names that you can enter. The names must match exactly with the names shown in the editbox tooltip though case does not matter.|n|nChanges to the list will require a UI reload to take effect."] = "Если вы используете настройку Скрыть кнопки аддонов или Объединить кнопки аддонов, но вы хотите, чтобы некоторые кнопки аддонов остались видимыми вокруг миникарты, введите название аддонов в поле редактирования, разделенные запятой.|n|nВо всплывающей подсказке окна редактирования отображаются имена аддонов, которые вы можете ввести. Названия должны точно совпадать с названиями, показанными во всплывающей подсказке окна редактирования, регистр значения не имеет.|n|nИзменение в списке потребует перезагрузки UI." +L["Incompatible"] = "Несовместимо" +L["Increase chat history"] = "Увеличить историю чата" +L["Interface"] = "Интерфейс" +L["Invaders of Alterac Valley"] = "Вторжение в Альтеракскую долину" +L["Invalid console variable."] = "Недопустимая консольная переменная." +L["Invalid parameter."] = "Неверный параметр." +L["Invalid quest ID."] = "Неверный id квеста" +L["Invalid sound ID"] = "Неверный id звука" +L["Invalid taint level."] = "Неверный уровень taint." +L["Invalid target."] = "Неверная цель." +L["Invite from whispers"] = "Приглашать по шепоту" +L["Ironforge"] = "Стальгорн" +L["Item"] = "Предмет" +L["Item ID"] = "ID предмета" +L["Item IDs can be found in item toolips."] = "ID предмета может быть найдено в всплывающей подсказке." +L["Kalimdor"] = "Калимдор" +L["Karazhan"] = "Каражан" +L["Kargath"] = "Каргат" +L["Keep"] = "Хранить" +L["Keyword"] = "Ключевое слово" +L["Lakeshire"] = "Приозерье" +L["Leatrix Plus"] = "Leatrix Plus" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "Leatrix Plus не будет перезаписывать LeaPlusDB при следующем выходе из системы." +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX MAPS: УСТАНОВЛЕНА НЕПРАВИЛЬНАЯ ВЕРСИЯ!" +L["Left"] = "Левая" +L["Lifetime honorable kills"] = "Всего почетных побед" +L["Light's Hope Chapel"] = "Часовня Последней Надежды" +L["Link will search Wowhead"] = "Ссылка для поиска на Wowhead" +L["Links go directly to the comments section"] = "Ссылки в раздел комментариев" +L["Loch Modan"] = "Лок Модан" +L["Lockout sharing"] = "Совместная блокировка" +L["Low"] = "Низкий" +L["M"] = "M" +L["Magic"] = "Магия" +L["Magisters' Terrace"] = "Терраса Магистров" +L["Main Titles"] = "Главные названия" +L["Manage buffs"] = "Управление баффами" +L["Manage durability"] = "Управление прочностью" +L["Manage focus"] = "Управление фокусом" +L["Manage frames"] = "Управление рамками" +L["Manage timer"] = "Управление таймером" +L["Manage widget"] = "Управление виджетами" +L["Managed by Leatrix Plus"] = "Настройки Leatrix Plus" +L["Map"] = "Карта" +L["Maraudon"] = "Мародон" +L["Marks of Kil'jaeden"] = "Знаки Кил'джедена" +L["Marks of Sargeras"] = "Знаки Саргераса" +L["Marshal's Refuge"] = "Укрытие Маршалла" +L["Max camera zoom"] = "Max отдаление камеры" +L["Mechanics"] = "Механики" +L["Mechsteps"] = "Мехошаги" +L["Mechstriders"] = "Механодолгоноги" +L["Media"] = "Медиа" +L["Medium"] = "Средняя" +L["Memory Usage"] = "Использовано памяти" +L["Menethil Harbor"] = "Гавань Менетилов" +L["message"] = "сообщение" +L["message from previous session"] = "сообщение с предыдущей сессии" +L["message shown."] = "сообщение показано." +L["Messages"] = "Сообщения" +L["messages from previous session"] = "сообщения с предыдущей сессии" +L["messages shown."] = "сообщения показаны." +L["Misc"] = "Разное" +L["Missing console variable."] = "Отсутствует переменная консоли." +L["Missing mount name."] = "Отсутствует имя маунта." +L["Missing movie ID."] = "Отсутствует ID видео-ролика." +L["Missing quest ID."] = "Отсутствует идентификатор квеста." +L["Missing sound file parameter."] = "Отсутствует параметр звукового файла." +L["Missing sound ID."] = "ID ролика не найден." +L["Molten Core"] = "Огненные Недра" +L["Moonglade"] = "Лунная поляна" +L["More Firewing Signets"] = "Больше перстней Огнекрылов" +L["More font sizes"] = "Доп.размеры шрифта" +L["More Marks of Kil'jaeden"] = "Больше знаков Кил'джедена" +L["More Marks of Sargeras"] = "Больше знаков Саргераса" +L["More Sunfury Signets"] = "Больше перстней Ярости Солнца" +L["Morgan's Vigil"] = "Дозор Моргана" +L["Mount not found."] = "Маунт не найден." +L["Mounts"] = "Маунты" +L["Move editbox to top"] = "Поле ввода над чатом" +L["Movie not playable."] = "Видео-ролик не может быть воспроизведён." +L["Movie number"] = "Номер видео-ролика" +L["Movies"] = "Видео-ролики" +L["Mulgore"] = "Мулгор" +L["Music"] = "Музыка" +L["Musical Moments"] = "Музыкальные Моменты" +L["Mute game sounds"] = "Отключить звуки игры" +L["Mystery"] = "Тайна" +L["N"] = "N" +L["Nagrand"] = "Награнд" +L["Narration"] = "Повествование" +L["Naxxramas"] = "Наксрамас" +L["Netherdrakes"] = "Драконы Пустоты" +L["Nethergarde Keep"] = "Крепость Стражей Пустоты" +L["Netherstorm"] = "Пустоверть" +L["Nexus"] = "Нексус" +L["Nijel's Point"] = "Высота Найджела" +L["Nine minutes"] = "Девять минут" +L["No bad sound IDs found."] = "Не найдено неверных звуковых id." +L["No help is available for this page."] = "Справка недоступна для этой страницы." +L["No items with durability equipped."] = "Нет экипированных предметов с прочностью." +L["No media duplicates found."] = "Дубликаты медиа не найдены." +L["No supported addons."] = "Нет поддерживаемых аддонов." +L["No tooltip showing."] = "Подсказки не показываются." +L["None"] = "Нет" +L["Not completed."] = "Не завершено." +L["Not minimap"] = "Не миникарта" +L["Note that this will not reset settings that require a UI reload."] = "Обратите внимание, что при этом не сбрасываются настройки, требующие перезагрузки пользовательского интерфейса." +L["Note that this will not reset your exclusions list."] = "Обратите внимание, что это не приведет к сбросу вашего списка исключений." +L["Nothing to see here."] = "Здесь нечего смотреть." +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "ВНИМАНИЕ!|nВы должны полностью перезапустить свой игровой клиент, прежде чем использовать эту версию Leatrix Plus." +L["NPC"] = "NPC" +L["Nude"] = "Снять" +L["Obsidian Sanctum"] = "Обсидиановое святилище" +L["Oculus"] = "Окулус" +L["Okay, disable screen adjust for me"] = "Хорошо, отключи для меня настройку экрана" +L["Old Hillsbrad Foothills"] = "Старые предгорья Хилсбрада" +L["One minute"] = "Одна минута" +L["Onyxia's Lair"] = "Логово Ониксии" +L["or click the minimap button to open Leatrix Plus."] = "или нажмите на кнопку у миникарты, чтобы открыть Leatrix Plus." +L["Orgrimmar"] = "Оргриммар" +L["Outland"] = "Запределье" +L["Overall"] = "Всего" +L["Overlay"] = "Оверлей" +L["Override key"] = "Кнопка замены" +L["Particle density"] = "Плотность частиц" +L["Party from friends"] = "Приглашения от друзей" +L["Pet"] = "Питомец" +L["Pets"] = "Питомцы" +L["Pit of Saron"] = "Яма Сарона" +L["Player"] = "Персонаж" +L["Please ask the addon author to use LibDBIcon."] = "Обратитесь к разработчику аддона, чтобы он начал использовать библиотеку LibDBIcon." +L["Power"] = "Мощность" +L["Press CTRL/C to copy."] = "Нажмите CTRL C, чтобы скопировать." +L["Queue from friends"] = "Очереди от друзей" +L["R"] = "Р" +L["Ragefire Chasm"] = "Огненная Пропасть" +L["Raid"] = "Рейд" +L["Raid frame toggle"] = "Вкл выкл рейдовые рамки" +L["Random"] = "Случайно" +L["RARE"] = "Редкий" +L["RARE ELITE"] = "Редкий элитный" +L["Ratchet"] = "Кабестан" +L["Razorfen Downs"] = "Курганы Иглошкурых" +L["Razorfen Kraul"] = "Лабиринты Иглошкурых" +L["Ready"] = "Готовность" +L["Recent chat window"] = "Окно недавнего чата" +L["Redridge Mountains"] = "Красногорье" +L["Refuge Pointe"] = "Опорный пункт" +L["Release in PvP"] = "Покидание тела в PvP" +L["Reload"] = "Перезагрузить" +L["Remember Alterac Valley!"] = "Помни Альтеракскую долину!" +L["Remove all items"] = "Убрать все предметы" +L["Remove tabard"] = "Убрать накидку" +L["Repair automatically"] = "Ремонт снаряжения" +L["Repair using guild funds if available"] = "Ремонт за счет средств гильдии, если возможно" +L["Repaired for"] = "Стоимость ремонта" +L["Replace non-standard buttons"] = "Замена нестандартный кнопок" +L["Reposition the tooltip"] = "Переместите подсказку" +L["Require override key for quest automation"] = "Требуется кнопка замены для автоматизации квестов" +L["Requires UI reload."] = "Требуется перезагрузка интерфейса (UI)." +L["Reset"] = "Сброс настроек" +L["Resize book text"] = "Изменить размер книги" +L["Resize mail text"] = "Размер текста писем" +L["Resize quest text"] = "Размер текста заданий" +L["Resize Screen"] = "Изменить размер экрана" +L["Rested bubbles"] = "Бонус отдыха" +L["Restore chat messages"] = "Восстановление сообщений в чате" +L["Restored"] = "Восстановлено" +L["Restrict to friends"] = "Ограничение для друзей" +L["result"] = "Результат" +L["results"] = "Результаты" +L["Return"] = "Назад" +L["Revantusk Village"] = "Деревня Сломанного Клыка" +L["Right"] = "Правая" +L["Right-click to close"] = "Щелчок ПКМ, чтобы закрыть" +L["Right-click to close."] = "Щелчок ПКМ, чтобы закрыть." +L["right-click to go back"] = "Щелчок ПКМ, чтобы вернуться" +L["Ripper"] = "Потрошитель" +L["Ruby Sanctum"] = "Рубиновое святилище" +L["Ruins of Ahn'Qiraj"] = "Руины Ан'Киража" +L["Rut'theran Village"] = "Деревня Рут'теран" +L["Sacred"] = "Священный" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "Монеты племен: Песчаная Буря, Дробители Черепов и Кровавый Скальп" +L["Scale"] = "Масштаб" +L["Scale entire cluster"] = "Масштаб всего кластера" +L["Scarlet Monastery"] = "Монастырь Алого ордена" +L["Scholomance"] = "Некроситет" +L["Screech"] = "Крик" +L["Search"] = "Поиск" +L["Search mats?"] = "Искать ингредиенты?" +L["Searing Gorge"] = "Тлеющее ущелье" +L["seconds"] = "секунд" +L["seconds does not match the saved flight time of"] = "секунд не соответствует сохраненному времени полета" +L["Select the settings that you want to use."] = "Выберите параметры, которые вы хотите использовать." +L["Selection of music tracks"] = "Подборка музыкальных треков" +L["Self Markers Allowed"] = "Разрешены самомаркировки" +L["Self Markers Blocked"] = "Самомаркировки запрещены" +L["Sell"] = "Продавать" +L["Sell junk automatically"] = "Продажа хлама из сумок" +L["SELLING JUNK"] = "Продаю хлам" +L["Sentinel Hill"] = "Сторожевой холм" +L["Set weather density"] = "Плотность погодных эффектов" +L["Settings"] = "Параметры" +L["Seven minutes"] = "Семь минут" +L["Shaders"] = "Тени" +L["Shadowfang Keep"] = "Крепость Темного Клыка" +L["Shadowmoon Valley"] = "Долина Призрачной Луны" +L["Shadowprey Village"] = "Деревня Ночных Охотников" +L["Shardtooth E'ko"] = "Э'ко щербозубов" +L["SHIFT"] = "SHIFT" +L["Sholazar Basin"] = "Низина Шолазар" +L["Show animation slider"] = "Показать ползунок анимации" +L["Show auction controls"] = "Отображать элементы управления аукционом" +L["Show background"] = "Показать фон" +L["Show bag search box"] = "Показать строку поиска в сумки" +L["Show cancel form button on flight map"] = "Показать кнопку отмены формы на карте полета" +L["Show character addons"] = "Показывать модификации персонажа" +L["Show cooldowns"] = "Показать кулдауны" +L["Show cooldowns above the player frame"] = "Показывать кулдауны над рамкой игрока." +L["Show destination"] = "Показать пункт назначения" +L["Show druid power bar"] = "Отображать панель силы друида" +L["Show durability status"] = "Прочность экипировки" +L["Show flight times"] = "Показывать время перелёта" +L["Show free bag slots"] = "Показать свободные слоты для сумок" +L["Show guild names"] = "Показать названия гильдий" +L["Show guild ranks for other guilds"] = "Показывать ранги гильдии для других гильдий." +L["Show guild ranks for your guild"] = "Показать звания гильдии для вашей гильдии" +L["Show item buttons"] = "Показать кнопки предметов" +L["Show me"] = "Показать мне" +L["Show minimap button"] = "Кнопка у миникарты" +L["Show player chain"] = "Контур рамки персонажа" +L["Show player frame in class color"] = "Показать окно персонажа в цвете класса" +L["Show quest difficulty in quest log list"] = "Отображать сложность в списке заданий" +L["Show quest levels"] = "Показывать уровень заданий" +L["Show raid button"] = "Показать кнопку рейда" +L["Show ready timer"] = "Показать таймер готовности" +L["Show repair summary in chat"] = "Информация о ремонте в чат" +L["Show target frame and focus frame in class color"] = "Показывать фреймы цели и фокуса в цвете класса" +L["Show target model"] = "Показать модель цели" +L["Show the spell ID in buff icon tooltips"] = "Отображать ID заклинаний в подсказках" +L["Show toggle headers button"] = "Показать кнопку переключения заголовков" +L["Show tooltips with shift key"] = "Показывать всплывающие подсказки с помощью клавиши Shift" +L["Show train all skills button"] = "Показать кнопку изучить все навыки" +L["Show unit targets"] = "Показывать цели врагов" +L["Show vanity controls"] = "Показать настройки тщеславия" +L["Show vendor price"] = "Показывать цену у торговца" +L["Show vendor summary in chat"] = "Информация о продаже в чат" +L["Show volume slider"] = "Регулятор громкости" +L["Show web link"] = "Показать веб-ссылку" +L["Show who pinged"] = "Показать кто щелкает по миникарте" +L["Show Wowhead links"] = "Ссылки на Wowhead" +L["Silence rested emotes"] = "Заглушать звуки эмоций" +L["Silithus"] = "Силитус" +L["Silverpine Forest"] = "Серебряный бор" +L["Single Mark of Sargeras"] = "Знак Саргераса" +L["Single Sunfury Signet"] = "Перстень Ярости Солнца" +L["Six minutes"] = "Шесть минут" +L["Social"] = "Общение" +L["Sold junk for"] = "Продать мусор за" +L["Sound system restarted."] = "Звуковая система перезапустилась." +L["Southshore"] = "Южнобережье" +L["Speak the remaining time"] = "Говорить оставшееся время" +L["Spell"] = "Заклинание" +L["Spell ID"] = "ID заклинания" +L["Splintertree Post"] = "Застава Расщепленного Дерева" +L["Spooky"] = "Ужасный" +L["Square minimap"] = "Квадратная миникарта" +L["Square size"] = "Размер квадрата" +L["Stockade"] = "Тюрьма" +L["Stonard"] = "Каменор" +L["Stonetalon Mountains"] = "Когтистые горы" +L["Stonetalon Peak"] = "Пик Каменного Когтя" +L["Stop"] = "Стоп" +L["Storm Peaks"] = "Грозовая гряда" +L["Stormwind"] = "Штормград" +L["Stranglethorn Vale"] = "Тернистая долина" +L["Stratholme"] = "Стратхольм" +L["Sun Rock Retreat"] = "Приют у Солнечного Камня" +L["Sunfury Signets"] = "Перстни Ярости Солнца" +L["Sunken Temple"] = "Затонувший храм" +L["Sunwell Plateau"] = "Плато Солнечного Колодца" +L["Support"] = "Поддержка" +L["Supported Addons"] = "Поддерживаемые аддоны" +L["Swamp"] = "Болотный" +L["Swamp of Sorrows"] = "Болото печали" +L["System"] = "Система" +L["T"] = "T" +L["Tabard"] = "Накидка" +L["Taint level: Basic (1)."] = "Уровень заражения: Базовый (1)." +L["Taint level: Disabled (0)."] = "Уровень заражения: Отключен (0)." +L["Taint level: Full (2)."] = "Уровень заражения: Полный (2)." +L["Taller quest log frame"] = "Более высокий фрейм заданий" +L["Talonbranch Glade"] = "Поляна Когтистых Ветвей" +L["Talrendis Point"] = "Застава Талрендис" +L["Tanaris"] = "Танарис" +L["Target"] = "Цель" +L["Target Tracking Disabled"] = "Отслеживание цели отключено" +L["Target Tracking Enabled"] = "Отслеживание цели включено" +L["Tarren Mill"] = "Мельница Таррен" +L["Teldrassil"] = "Тельдрассил" +L["Tempest Keep"] = "Крепость Бурь" +L["Temple of Ahn'Qiraj"] = "Храм Ан'Кираж" +L["Temple of Atal'Hakkar"] = "Храм Атал'Хаккара" +L["Ten minutes"] = "Десять минут" +L["Ten seconds"] = "Десять секунд" +L["Ten Years of Warcraft"] = "Десять лет варкрафта" +L["Terokkar Forest"] = "Лес Тероккар" +L["Text"] = "Текст" +L["Text size"] = "Размер текста" +L["Text Size"] = "Размер текста" +L["Thalanaar"] = "Таланаар" +L["The Burning Crusade"] = "The Burning Crusade" +L["The game will dismount you if you successfully cast a spell without addons. These settings let you set some additional dismount rules."] = "Игра и без дополнительных аддонов спешивает вашего персонажа в том случае, если вы успешно произнесете заклинание. Эти настройки позволяют вам установить некоторые дополнительные правила спешивания." +L["The Sepulcher"] = "Гробница" +L["The square minimap will always show the new covenant button."] = "Прямоугольная миникарта будет всегда показывать новую кнопку ковенантов." +L["The summon from"] = "Призыв для" +L["Thelsamar"] = "Телcамар" +L["Themes"] = "Темы" +L["Theramore"] = "Терамор" +L["There is a helpful guide on leatrix.com."] = "На сайте leatrix.com есть полезное руководство." +L["These items will not be sold."] = "Эти предметы не будут проданы." +L["Thirty seconds"] = "Тридцать секунд" +L["This flight does not exist in the database."] = "Этот маршрут не существует в базе данных." +L["This flight does not have a saved duration in the database."] = "У этого маршрута еще нет сохраненной информации о продолжительности в базе данных." +L["This flight's actual time of"] = "Фактическое время полета" +L["This is a custom button."] = "Это настраиваемая кнопка." +L["This panel will close automatically if you enter combat."] = "Это окно будет автоматически закрыто, если Вы вступите в бой." +L["This slider requires 'Square minimap' to be enabled."] = "Этот переключатель требует включенного режима квадратной миникарты" +L["Thorium Point"] = "Лагерь Братства Тория" +L["Thousand Needles"] = "Тысяча Игл" +L["Three minutes"] = "Три минуты" +L["Thunder Bluff"] = "Громовой Утес" +L["Timer"] = "Таймер" +L["Tirisfal Glades"] = "Тирисфальские леса" +L["Titan Panel screen adjust needs to be disabled for the frame to be saved correctly."] = "Чтобы настройки фрэйма были правильно сохранены, нужно отключить настройку экрана от аддона Титан Панель." +L["to"] = "до" +L["To begin, choose an options page."] = "Чтобы начать, выберите страницу настроек." +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "Чтобы скрыть журнал боя, вам нужно отключить модуль чата в ElvUI." +L["To move the minimap, hold down the alt key and drag it."] = "Чтобы переместить миникарту, перемещайте её при помощи мыши и одновременно удерживая клавишу Alt." +L["To move the minimap, hold down the alt key and drag it.|n|nIf you toggle an addon minimap button, you may need to reload your UI for the change to take effect. This only affects a few addons that use custom buttons.|n|nThis panel will close automatically if you enter combat."] = "Чтобы переместить миникарту, переместите её мышью, удерживайте нажатой клавишу alt.|n|nЕсли вы переключите кнопку аддона на миникарте, вам может потребоваться перезагрузить пользовательский интерфейс, чтобы изменения вступили в силу. Это касается только некоторых аддонов, использующих кнопки собственной разработки, а не из системной библиотеки.|n|nЭта панель автоматически закроется, если вы вступите в бой." +L["To use the Find Item button, you need to deselect the WoW Token category."] = "Чтобы использовать кнопку «Найти предмет», вам нужно отменить выбор категории токена." +L["Toggle buttons"] = "Переключение кнопок" +L["Toggle character stats"] = "Переключить характеристики персонажа" +L["Toggle Grid"] = "Переключить сетку" +L["Toggle panel"] = "Переключить панель" +L["took"] = "взять" +L["Tooltip"] = "Подсказка" +L["Tooltip title color"] = "Цвет заголовка подсказки" +L["Top"] = "Верхняя" +L["Top Center"] = "Верхний центральный" +L["Tracing started."] = "Отслеживание началось." +L["Tracing stopped."] = "Слежение остановилась." +L["Trains"] = "Поезда" +L["Transparency"] = "Прозрачность" +L["Travelers"] = "Путешественники" +L["True"] = "Правда" +L["Turn-in completed quests automatically"] = "Сдавать выполненные квесты автоматически" +L["Twenty seconds"] = "Двадцать секунд" +L["Two minutes"] = "Две минуты" +L["Uldaman"] = "Ульдаман" +L["Ulduar"] = "Ульдуар" +L["Unclamp chat frame"] = "Открепить окно чата" +L["Undercity"] = "Подгород" +L["Un'Goro Crater"] = "Кратер Ун'Горо" +L["Universal group color"] = "Единый цвет текста групп" +L["Unlock the minimap"] = "Разблокировать миникарту" +L["Use arrow keys in chat"] = "Клавиши курсора в чате" +L["Use class colors in chat"] = "Имена в цвете класса" +L["Use easy resizing"] = "Лёгкое изменение размера" +L["Utgarde Keep"] = "Крепость Утгард" +L["Utgarde Pinnacle"] = "Вершина Утгард" +L["Valormok"] = "Храбростан" +L["Value must be a number."] = "Значение должно быть числом." +L["Various"] = "Разное" +L["Vault of Archavon"] = "Хранилище Аркавона" +L["Vaults"] = "Хранилища" +L["Vendors"] = "Торговцы" +L["Version"] = "Версия" +L["Very Low"] = "Очень низко" +L["Video"] = "Видео" +L["Visibility"] = "Видимость" +L["Wailing Caverns"] = "Пещеры Стенаний" +L["Warning"] = "Предупреждение" +L["was automatically declined."] = "был автоматически отклонён." +L["Weather density"] = "Плотность погодных эффектов" +L["Welcome to Leatrix Plus."] = "Добро пожаловать в Leatrix Plus." +L["Western Plaguelands"] = "Западные Чумные земли" +L["Westfall"] = "Западный Край" +L["Wetlands"] = "Болотина" +L["Widget"] = "Виджет" +L["Width"] = "Ширина" +L["Wildkin E'ko"] = "Э'ко диких совухов" +L["will be automatically accepted in 10 seconds unless cancelled."] = "будет автоматически принят в течение 10 секунд, если не будет отменен." +L["Winter"] = "Зима" +L["Winterfall E'ko"] = "Э'ко фурболгов племени Зимней Спячки" +L["Wintergrasp"] = "Озеро Ледяных Оков" +L["Winterspring"] = "Зимние Ключи" +L["World of Warcraft"] = "World of Warcraft" +L["Wrath of the Lich King"] = "Гнев Короля Лича" +L["Wrath of the Lich King Classic"] = "Гнев Короля Лича Классика" +L["X Offset"] = "Х Смещение" +L["Y Offset"] = "Y Смещение" +L["Yawns"] = "Зевание" +L["YOU"] = "ВЫ" +L["You cannot do that in combat."] = "Вы не можете сделать это в бою." +L["You have"] = "У Вас" +L["You need to be group leader."] = "Вы должны быть лидером группы" +L["You should keybind web link!"] = "Вы должны привязать веб-ссылку!" +L["You should set a keybind for the web link feature. It's very useful.|n|nOpen the key bindings window (accessible from the game menu) and click Leatrix Plus.|n|nSet a keybind for Show web link.|n|nNow when your pointer is over an item, NPC or spell (and more), press your keybind to get a web link."] = "Вы должны привязать клавишу для функции веб-ссылки. Это очень полезно.|n|nОткройте окно привязки клавиш (доступно из меню игры) и нажмите Leatrix Plus.|n|nПривяжите клавишу для отображения веб-ссылки.|n|nТеперь, когда ваш указатель находится над предметом, NPC, заклинанием (и многим другим), нажмите привязанную клавишу, чтобы получить веб-ссылку." +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "Вам нужно перезагрузить пользовательский интерфейс (UI), чтобы некоторые внесенные вами изменения вступили в силу.|n|nВы можете выполнить перезагрузку не сразу, а когда полностью завершите работу с настройками." +L["Your UI needs to be reloaded."] = "Вам необходимо перезагрузить пользовательский интерфейс." +L["Zangarmarsh"] = "Зангартопь" +L["Zones"] = "Зоны" +L["Zoram'gar Outpost"] = "Застава Зорам'гар" +L["Zul'Aman"] = "Зул'Аман" +L["Zul'Drak"] = "Зул'Драк" +L["Zul'Farrak"] = "Зул'Фаррак" +L["Zul'Gurub"] = "Зул'Гуруб" +L["Zulian, Razzashi, and Hakkari Coins"] = "Монеты племен: Зулиан, Раззаши и Хаккари" +L["Zygor addon not found."] = "Модификация Zygor не найдена." + +end + +-- koKR: Korean +if GameLocale == "koKR" then +L["+"] = "+" +L["A Donation of Mageweave"] = "마법 옷감 기부" +L["A Donation of Runecloth"] = "룬무늬 옷감 기부" +L["A Donation of Silk"] = "비단 옷감 기부" +L["A Donation of Wool"] = "양모 옷감 기부" +L["A friend request from"] = "친구 신청" +L["Accept available quests automatically"] = "퀘스트 자동 수락" +L["Accept resurrection"] = "부활 수락" +L["Accept summon"] = "소환 수락" +L["Additional Runecloth"] = "룬무늬 옷감 추가 기부" +L["Addon"] = "애드온" +L["Aerie Peak"] = "맹금의 봉우리" +L["Ahn'Qiraj"] = "안퀴라즈" +L["Alterac Mountains"] = "알터랙 산맥" +L["Anchor"] = "이동" +L["Angelic"] = "천사" +L["Arathi Highlands"] = "아라시 고원" +L["Ashenvale"] = "잿빛 골짜기" +L["Astranaar"] = "아스트라나르" +L["Auberdine"] = "아우버다인" +L["Auto loot is now enabled."] = "자동 전리품이 활성화되었습니다." +L["AutoFollow"] = "따라가기 설정됨" +L["AutoFollow disabled."] = "따라가기 해제." +L["Automate gossip"] = "대화 자동 넘김" +L["Automate quests"] = "퀘스트 자동 수락" +L["Automation"] = "자동화" +L["Azshara"] = "아즈샤라" +L["Azuremyst Isle"] = "하늘안개섬" +L["Back to Main Menu"] = "주 메뉴로 돌아가기" +L["Bad ID"] = "잘못된 ID" +L["Badlands"] = "황야의 땅" +L["Barrens"] = "남부 불모의 땅" +L["Battle"] = "전투" +L["Battle of Warsong Gulch"] = "전쟁노래 협곡 전투" +L["Battlegrounds"] = "전장" +L["Black Morass"] = "검은늪" +L["Black Temple"] = "검은사원" +L["Blackfathom Deeps"] = "검은 심연 나락" +L["Blackrock Depths"] = "검은바위 나락" +L["Blackwing Lair"] = "검은날개 둥지" +L["Blade's Edge Mountains"] = "칼날산맥" +L["Blasted Lands"] = "저주받은 땅" +L["Block duels"] = "결투 차단" +L["Block friend requests"] = "친구요청 차단" +L["Block party invites"] = "파티초대 차단" +L["Blocks"] = "차단" +L["Bloodmyst Isle"] = "핏빛안개 섬" +L["Booty Bay"] = "무법항" +L["Bottom"] = "하단" +L["Brackenwall Village"] = "담쟁이 마을" +L["Buffs"] = "버프" +L["Burning Crusade"] = "불타는 성전" +L["Burning Crusade Classic"] = "불타는 성전 클래식" +L["Burning Steppes"] = "불타는 평원" +L["Buyout Only"] = "즉시구입가 만!" +L["by Leatrix Plus"] = "by Leatrix Plus" +L["C"] = "C" +L["Camera distance"] = "카메라 거리" +L["Camp Mojache"] = "모자케 야영지" +L["Camp Taurajo"] = "타우라조 야영지" +L["Cannot announce in this zone."] = "이곳에서는 알림을 사용할수 없습니다." +L["Cannot find General chat channel."] = "일반 채팅 채널을 찾을 수 없습니다." +L["Cenarion Hold"] = "세나리온 요새" +L["Chain style"] = "테두리 스타일" +L["Character"] = "캐릭터" +L["Chat"] = "채팅" +L["Chat Frame"] = "채팅창" +L["Checkbox labels are Ok."] = "체크박스를 확인합니다." +L["Chillwind Camp"] = "서리바람 야영지" +L["Chillwind E'ko"] = "서리바람 키메라의 에코" +L["Cinematics"] = "시네마틱" +L["Claiming Arathi Basin"] = "아라시 분지 공격" +L["Class colored frames"] = "유닛프레임 직업색상" +L["Class icon portraits"] = "초상화 직업아이콘" +L["Classic"] = "클래식" +L["click here for new selection"] = "목록을 갱신하려면 여기를 클릭하세요." +L["Click to configure the settings for this option."] = "설정을 구성하려면 클릭합니다." +L["Click to reset the settings on this page."] = "이 페이지를 재설정 하려면 클릭합니다." +L["Click to resize the screen to fit between the top and bottom borders."] = "상,하단간 화면에 맞게 화면 크기를 설정합니다. " +L["Click to return to the main menu."] = "주 메뉴 돌아가기 클릭" +L["Cloak"] = "망토" +L["Coilfang Reservoir"] = "갈퀴송곳니 저수지" +L["Combat log cannot be hidden while undocked."] = "** 창(일반 전투) 연결이 해제되면 숨길수 없습니다." +L["Combat plates"] = "전투시 이름표 표시" +L["Completed."] = "완료" +L["Concerted Efforts"] = "공동의 노력" +L["Configuration Panel"] = "설정창" +L["Connections for"] = "연결된 서버" +L["Conquering Arathi Basin"] = "아라시 분지 정복" +L["Credits"] = "크레딧" +L["Crossroads"] = "십자로" +L["Cursor"] = "커서" +L["Cursor Left"] = "커서 왼쪽" +L["Cursor Right"] = "커서 오른쪽" +L["D"] = "D" +L["Darkmoon Faire"] = "다크문 축제" +L["Darkshire"] = "다크샤이어" +L["Darkshore"] = "어둠해안" +L["Deadmines"] = "죽음의 폐광" +L["Deadwind Pass"] = "죽음의 고개" +L["Desolace"] = "잊혀진 땅" +L["Dire Maul"] = "혈투의 전장" +L["Disable bag automation"] = "가방 자동열림 비활성" +L["Disable chat fade"] = "챗 사라짐 비활성" +L["Disable loot warnings"] = "전리품 경고 비활성" +L["Disable screen effects"] = "이펙트 비활성" +L["Disable screen glow"] = "빛 효과 비활성" +L["Disable sticky chat"] = "채널고정 사용안함" +L["Drag the frame overlay to position the frame."] = "위치 변경은 프레임 드레그 이동하세요." +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "위치는 드레그 이동, 크기는 슬라이더 조정 설정." +L["Drag to set the buffs frame scale."] = "버프 프레임 스케일을 설정하려면 드래그하십시오." +L["Drag to set the cursor X offset."] = "드래그하여 커서 X 오프셋을 설정합니다." +L["Drag to set the cursor Y offset."] = "드래그하여 커서 Y 오프셋을 설정합니다." +L["Drag to set the density of weather effects."] = "날씨효과 밀도를 설정합니다." +L["Drag to set the font size of book text."] = "책 텍스트의 글꼴 크기를 설정하려면 드래그하십시오." +L["Drag to set the font size of mail text."] = "드래그하여 우편 글꼴 크기를 설정하십시오." +L["Drag to set the font size of quest text."] = "드래그하여 퀘스트 글꼴 크기를 설정하십시오." +L["Drag to set the scale of the Leatrix Plus panel."] = "드래그하여 Leatrix Plus 패널 크기를 설정하십시오." +L["Drag to set the scale of the selected frame."] = "드래그하여 선택된 프레임의 크기를 설정하십시오." +L["Drag to set the size of the bottom border."] = "드래그하여 아래쪽 테두리의 크기를 설정하십시오." +L["Drag to set the size of the left border."] = "드래그하여 왼쪽 테두리의 크기를 설정하십시오." +L["Drag to set the size of the right border."] = "드래그하여 오른쪽 테두리의 크기를 설정하십시오." +L["Drag to set the size of the top border."] = "드래그하여 윗쪽 테두리의 크기를 설정하십시오." +L["Drag to set the tooltip scale."] = "드래그하여 툴팁 크기를 설정하십시오." +L["Drag to set the transparency of the borders."] = "드래그하여 테두리의 투명도를 설정하십시오." +L["Drag to set the transparency of the Leatrix Plus panel."] = "드래그하여 Leatrix Plus 패널의 투명도를 설정하십시요." +L["Drag to size"] = "Drag to size" +L["Dun Morogh"] = "던 모로" +L["Dungeons"] = "던전" +L["Dup ID"] = "중복ID" +L["durability"] = "당신의" +L["Durability"] = "내구도" +L["Durotar"] = "듀로타" +L["Duskwood"] = "그늘숲" +L["Dustwallow Marsh"] = "먼지진흙 습지대" +L["Eastern Kingdoms"] = "동부 왕국" +L["Eastern Plaguelands"] = "동부 역병지대" +L["Easy item destroy"] = "쉬운 아이템 파괴" +L["ELITE"] = "정예" +L["Elwynn Forest"] = "엘윈 숲" +L["Enable viewport"] = "뷰포트 사용" +L["Enhance dressup"] = "미리보기 설정" +L["Enhance minimap"] = "미니맵 설정" +L["Enhance professions"] = "전문기술창 확장" +L["Enhance quest log"] = "퀘스트창 확장" +L["Enhance tooltip"] = "툴팁 설정" +L["Enhance trainers"] = "트레이너 확장" +L["Enhancements"] = "기능 향상" +L["Enter"] = "Enter" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "표시할 주문 ID를 입력하세요.|n|n소환수 프레임 아래 표시하려면 소환수 박스를 체크하세요.|n|n쿨다운아이콘은 직업으로 저장됩니다." +L["enter zone or track name"] = "지역 또는 트랙이름을 입력하세요." +L["Error messages will be hidden"] = "오류메시지 숨김" +L["Error messages will be shown"] = "오류메시지 표시" +L["Events"] = "이벤트" +L["Everlook"] = "눈망루 마을" +L["Eversong Woods"] = "영원노래 숲" +L["Extras"] = "기타" +L["False"] = "거짓" +L["Faster auto loot"] = "빠른 전리품 획득" +L["Faster movie skip"] = "빠른 무비 넘김" +L["Feathermoon"] = "페더문 요새" +L["Features"] = "특징" +L["Felwood"] = "악령숲" +L["Feralas"] = "페랄라스" +L["Fight for Warsong Gulch"] = "전쟁노래 협곡 전투" +L["Find Item"] = "아이템찾기" +L["Firewing Signets"] = "불꽃날개 인장" +L["Flame Crest"] = "화염 마루" +L["For Great Honor"] = "커다란 영광을 위하여" +L["Frames"] = "프레임" +L["Freewind Post"] = "높새바람 봉우리" +L["Frostmaul E'ko"] = "서리망치거인의 에코" +L["Frostsaber E'ko"] = "눈호랑이의 에코" +L["Gadgetzan"] = "가젯잔" +L["Game Options"] = "게임 설정" +L["Ghost"] = "유령" +L["Ghostlands"] = "유령의 땅" +L["Gloomy"] = "Gloomy" +L["Gnomeregan"] = "놈리건" +L["Gold Only"] = "골드 만!" +L["Graphics and Sound"] = "그래픽,소리" +L["Grom'gol"] = "그롬골" +L["Groups"] = "그룹" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "구루바시, 썩은가지, 마른나무껍질부족 주화" +L["H"] = "H" +L["Hammerfall"] = "망치 주둔지" +L["Haunted"] = "Haunted" +L["Hellfire Peninsula"] = "지옥불 반도" +L["Hellfire Ramparts"] = "지옥불 성루" +L["Helm"] = "투구" +L["Help"] = "도움말" +L["Hide chat buttons"] = "채팅 버튼 숨김" +L["Hide cooldown duration numbers (if enabled)"] = "주문 지속시간 숨김" +L["Hide error messages"] = "에러메시지 숨김" +L["Hide gryphons"] = "그리핀 문양 숨김" +L["Hide portrait numbers"] = "초상화 전투수치 숨김" +L["Hide stance bar"] = "태세바 숨김" +L["Hide the combat log"] = "전투기록 숨김" +L["Hide the zone text bar"] = "지역명 숨김" +L["Hide the zoom buttons"] = "확대축소 버튼 숨김" +L["Hide tooltips for world units during combat"] = "전투중 월드유닛 툴팁 숨김" +L["Hide zone text"] = "지역명 숨김" +L["High"] = "높음" +L["Hillsbrad Foothills"] = "언덕마루 구릉지" +L["Hinterlands"] = "동부 내륙지" +L["Home"] = "홈" +L["Hyjal Summit"] = "하이잘 정상" +L["Ice Thistle E'ko"] = "얼음엉겅퀴설인의 에코" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "가방 검색 창이 가방 프레임과 은행 프레임에 표시됩니다." +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "케릭창에 내구도 정보 추가" +L["If checked, a master volume slider will be shown in the character frame."] = "마스터 볼륨 조절이 케릭터 정보 하단에 표시됩니다." +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "경매창의 추가 기능. |n|n즉시구입가 만! :시작가 없이 즉구가 입력만 생성.|n|n골드 만! :경매 99은99동 자동입력. |n|n아이템찾기 :경매에 아이템찾기 버튼 생성. |n|n경매 유형,기간 설정은 계정전체에 저장됩니다." +L["If checked, alert frames will not be shown."] = "경고,알림 프레임이 표시되지 않습니다." +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "상인과 대화시 가방에 있는 모든 회색템이 자동 판매됩니다. |n|n이 설정을 무시하려면 shift 누르고 대화 합니다." +L["If checked, available quests will be accepted automatically."] = "사용 가능한 퀘스트는 자동으로 수락됩니다." +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "적대적-붉은색, 우호적-파란색" +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "BattleTag과 실명ID 친구 요청이 자동으로 거절됩니다." +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "채팅창의 버튼을 숨깁니다. 최근메시지 표시-탭 클릭. 마우스휠 사용가능." +L["If checked, chat text will not fade out after a time period."] = "채팅글이 일정시간후 사라짐 비활성." +L["If checked, class coloring will be used in the player frame, target frame and focus frame."] = "직업 색상은 플레이어, 대상, 주시 프레임에서 사용됩니다." +L["If checked, class colors will be used in the chat frame."] = "이 옵션을 선택하면 채팅 프레임에서 직업색상이 사용됩니다." +L["If checked, completed quests will be turned-in automatically."] = "퀘스트 자동 완료(..." +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "전리품 판매,우편발송 시 확인경고 표시안함." +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "주문 지속시간 숨김" +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "유닛프레임 초상화에 표시되는 데미지,힐 수치 표시 숨김." +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "채팅창 잠긴 경우 탭(일반 전투)드레그로 위쪽을 길이 조절 할수있습니다." +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "케릭터가 다음 경우 감정표현이 음소거:|n|n- 휴식.|n- 애완동물 대전.|n- 언덕골 시장.|n- 주정뱅이 선술집.|n|n감정표현 소리는 위의 상황에 적용되지 않을때 활성화 됩니다." +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "전투시에만 이름표가 표시되고 비전투시 표시되지 않습니다." +L["If checked, guild ranks will be shown for players in your guild."] = "길드에 속한 플레이어의 길드 등급이 표시됩니다." +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "투구(H) 및 망토(C) 전환 체크박스가 케릭터 정보창에 표시됩니다. 체크박스를 Shift + 마우스 오른쪽 버튼으로 클릭하여 레이아웃을 변경 할 수 있습니다." +L["If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman."] = "주간 이벤트 소리가 음소거됩니다.|n이것은 저주받은 기사(할로윈 축제) 에게 적용됩니다." +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "오류 메시지를 숨깁니다.(예:잘못된 대상입니다.)|n|n몇가지 중요한 오류는 제외됩니다." +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "파티,공격대 챗색상 모두 같은색(파티)으로" +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "버프,디버프 툴팁에 주문id 표시" +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "길드,파티,공격대..대화채널을 고정 되지 않게합니다." +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "비전투시 소환 자동수락" +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "게임옵션의 애드온 열때 해당 케릭터의 목록 표시(기본-전체)" +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "자동 전리품 획득 시간이 크게 줄어듭니다." +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "소지품,은행 정리버튼 숨김" +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "블리자드 공격대 프레임을 토글(숨김 표시)하는 버튼을 공격대 관리 창 (화면의 왼쪽) 위에 표시됩니다." +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "전투 로그 창을 숨깁니다." +L["If checked, the editbox will be moved to the top of the chat frame."] = "채팅입력창을 프레임 상단으로 이동 설정됩니다." +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "죽음시 회색화면과 netherworld 효과가 비활성화됩니다." +L["If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted."] = "인터페이스 버튼 소리, 채팅창 탭 클릭 소리 및 게임 메뉴 토글 소리가 음소거됩니다." +L["If checked, the main bar gryphons will not be shown."] = "스킬바의 그리핀 문양 제거" +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "사용 가능한 가방 슬롯 수는 배낭 버튼 아이콘 및 툴팁에 표시됩니다." +L["If checked, the player frame background will be shown in class color."] = "플레이어 프레임이 클래스 색상으로 표시됩니다." +L["If checked, the professions frame will be larger."] = "전문기술창이 더 커집니다." +L["If checked, the ready check sound will be muted."] = "준비 확인 소리가 음소거됩니다." +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "빛 효과가 비활성 됩니다.|n|n사용시 술취한 어지럼 효과가 비활성 됩니다." +L["If checked, the spell fizzle sounds will be muted."] = "스킬 연타? 소리가 음소거됩니다." +L["If checked, the stance bar will not be shown."] = "태세바 숨김.(전사,도적,성기사,드루...)" +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "화면 하단의 NPC 대화 프레임 숨김" +L["If checked, the target frame background will be shown in class color."] = "대상 프레임이 클래스 색상으로 표시됩니다." +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "툴팁의 크기,위치,배경색 설정" +L["If checked, the vendor price will be shown in item tooltips."] = "상점 판매 가격이 아이템 툴팁에 표시 됩니다." +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "줌 버튼을 숨깁니다.설정과 상관없이 마우스휠로 확대 축소 할수있습니다." +L["If checked, train sounds will be muted."] = "기차 소리가 음소거됩니다." +L["If checked, unit targets will be shown."] = "대상의 대상 표시" +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "Ctrl키를 누른 상태에서 채팅창 탭을 클릭하면 복사하기 쉬운 최근의 채팅을 볼수 있습니다." +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "채팅 입력에서 삽입 포인터를 방향키로 이동 할수 있습니다." +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "재생 중지 확인 없이 무비를 취소 할수 있습니다." +L["If checked, you will be able to change the font size of book text."] = "책 텍스트의 글꼴 크기를 변경할 수 있습니다." +L["If checked, you will be able to change the font size of quest text."] = "퀘스트 텍스트의 글꼴 크기를 변경할 수 있습니다." +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "우편글자 크기를 변경할수 있습니다." +L["If checked, you will be able to change the position and scale of the buffs frame."] = "버프 프레임의 위치와 스케일을 변경할 수 있습니다." +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "위젯 프레임의 위치와 크기를 변경할 수 있습니다. |n위젯 프레임은 일반적으로 PvP 점수 및 추적 목표를 표시하는 데 사용됩니다." +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "UI배치를 위한 상.하 검은색 배경 생성" +L["If checked, you will be able to customise the minimap."] = "미니맵을 사용자 정의 할 수 있습니다." +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "화면 모서리로 채팅창을 옮길수 있습니다." +L["If checked, you will be able to mute a selection of game sounds."] = "선택한 게임 소리를 음소거 할 수 있습니다." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "대상창(기본프레임) 위에 최대 5개의 쿨다운(버프류) 아이콘을 배치 할 수 있습니다." +L["If checked, you will be able to reposition the tooltip."] = "툴팁의 위치를 변경할수 있습니다." +L["If checked, you will be able to set the density of weather effects."] = "날씨 효과의 밀도를 설정할 수 있습니다." +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "플레이어 프레임에 희귀,정예 문양 표시" +L["If checked, you will be able to zoom out to a greater distance."] = "사용시 게임설정-시점-최대시야거리: Max 고정." +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "아이템을 파괴 할 때 지금파괴. 입력없이 사용할수 있습니다. |n|n아이템 파괴 확인 창에 아이템 링크가 표시됩니다." +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "전장에서 사망 한 후 자동으로 해제됩니다. |n|n 자기 부활 능력이 있으면 자동으로 해제되지 않습니다." +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "상인,은행 NPC 대화 할때" +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "기본 128행을 4096행으로 증가" +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "상인을 방문 할때 장비가 자동으로 수리됩니다.|n|nShift키 누른채 대화시 자동 무시." +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "화면 가운데 표시되는 지역명 숨김. (예: 아이언포지)" +L["Increase chat history"] = "채팅 기록 증가" +L["Interface"] = "인터페이스" +L["Invaders of Alterac Valley"] = "알터랙 계곡의 침략자" +L["Invalid console variable."] = "잘못된 콘솔 변수." +L["Invalid parameter."] = "잘못된 매개변수" +L["Invalid quest ID."] = "잘못된 퀘스트ID" +L["Invalid sound ID"] = "잘못된 사운드 ID" +L["Invalid taint level."] = "잘못된 오염 레벨입니다." +L["Invalid target."] = "잘못된 대상" +L["Invite from whispers"] = "귓속말 초대" +L["Ironforge"] = "아이언포지" +L["Kalimdor"] = "칼림도어" +L["Karazhan"] = "카라잔" +L["Kargath"] = "카르가스" +L["Keyword"] = "키워드" +L["Lakeshire"] = "레이크샤이어" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "Leatrix Plus는 다음 로그 아웃시 LeaPlusDB를 덮어 쓰지 않습니다." +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX PLUS : 잘못된 버전이 설치되었습니다!" +L["Left"] = "왼쪽" +L["Lifetime honorable kills"] = "전체 명예 승수" +L["Light's Hope Chapel"] = "희망의 빛 예배당" +L["Loch Modan"] = "모단 호수" +L["Lockout sharing"] = "업적공유 잠금" +L["Low"] = "Low" +L["Magic"] = "Magic" +L["Magisters' Terrace"] = "마법학자의 정원" +L["Main Titles"] = "메인 타이틀" +L["Manage buffs"] = "버프 설정" +L["Manage focus"] = "주시 설정" +L["Manage frames"] = "프레임 설정" +L["Manage widget"] = "위젯 설정" +L["Managed by Leatrix Plus"] = "Leatrix Plus 에서 설정" +L["Map"] = "지도" +L["Maraudon"] = "마라우돈" +L["Marks of Kil'jaeden"] = "킬제덴의 징표" +L["Marks of Sargeras"] = "살게라스의 징표" +L["Marshal's Refuge"] = "마샬의 야영지" +L["Max camera zoom"] = "시야거리 최대 고정" +L["Mechanics"] = "기능" +L["Media"] = "미디어" +L["Medium"] = "중간" +L["Memory Usage"] = "메모리 사용" +L["Menethil Harbor"] = "메네실 항구" +L["message shown."] = "메시지가 표시됩니다." +L["Messages"] = "메시지" +L["messages shown."] = "메시지가 표시됩니다." +L["Missing console variable."] = "누락된 콘솔 변수." +L["Missing mount name."] = "누락된 탈거." +L["Missing movie ID."] = "잘못된 무비 ID." +L["Missing quest ID."] = "퀘스트ID 없음" +L["Missing sound file parameter."] = "소리 파일 매개변수 에러" +L["Missing sound ID."] = "누락 된 사운드 ID." +L["Molten Core"] = "화산 심장부" +L["Moonglade"] = "달의 숲" +L["More Firewing Signets"] = "불꽃날개 인장 추가 수집" +L["More Marks of Kil'jaeden"] = "킬제덴의 징표 추가 수집" +L["More Marks of Sargeras"] = "살게라스의 징표 추가 수집" +L["More Sunfury Signets"] = "성난태양 인장 추가 수집" +L["Morgan's Vigil"] = "모건의 망루" +L["Mount not found."] = "탈거를 찾을수 없습니다." +L["Move editbox to top"] = "입력창 상단" +L["Movie not playable."] = "무비를 재생할수 없습니다." +L["Movie number"] = "무비 번호" +L["Movies"] = "무비" +L["Mulgore"] = "멀고어" +L["Music"] = "배경음악" +L["Musical Moments"] = "Musical Moments" +L["Mute game sounds"] = "게임 소리 음소거" +L["Mystery"] = "Mystery" +L["Nagrand"] = "나그란드" +L["Narration"] = "Narration" +L["Naxxramas"] = "낙스라마스" +L["Nethergarde Keep"] = "네더가드 요새" +L["Netherstorm"] = "황천의 폭풍" +L["Nijel's Point"] = "나이젤의 야영지" +L["No bad sound IDs found."] = "잘못된 ID를 찾을수 없습니다." +L["No help is available for this page."] = "도움말을 사용할수 없습니다." +L["No items with durability equipped."] = "내구성 갖춘 아이템이 없습니다." +L["No media duplicates found."] = "중복된 미디어가 없습니다." +L["No tooltip showing."] = "툴팁이 없습니다." +L["None"] = "없음" +L["Not completed."] = "미완료" +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "주의!|nLeatrix Plus 이 버전을 적용하려면 게임 클라이언트를 다시 시작해야합니다." +L["Nude"] = "옷벗기" +L["Old Hillsbrad Foothills"] = "옛 언덕마루 구릉지" +L["Onyxia's Lair"] = "오닉시아의 둥지" +L["or click the minimap button to open Leatrix Plus."] = "미니 맵 버튼을 클릭하여 Leatrix Maps를 엽니 다." +L["Orgrimmar"] = "오그리마" +L["Outland"] = "아웃랜드" +L["Overall"] = "전체" +L["Overlay"] = "오버레이" +L["Particle density"] = "입자 밀도" +L["Party from friends"] = "친구의 파티" +L["Pet"] = "소환수" +L["Player"] = "플레이어" +L["Power"] = "파워" +L["Press CTRL/C to copy."] = "Ctrl C 를 눌러 복사." +L["Queue from friends"] = "친구의 대기열" +L["R"] = "R" +L["Ragefire Chasm"] = "성난불길 협곡" +L["Raid"] = "공격대" +L["Raid frame toggle"] = "레이드 프레임 토글" +L["Random"] = "무작위 재생" +L["RARE"] = "희귀" +L["RARE ELITE"] = "희귀 정예" +L["Ratchet"] = "톱니항" +L["Razorfen Downs"] = "가시덩굴 구릉" +L["Razorfen Kraul"] = "가시덩굴 우리" +L["Recent chat window"] = "최근 채팅 창" +L["Redridge Mountains"] = "붉은마루 산맥" +L["Refuge Pointe"] = "임시 주둔지" +L["Release in PvP"] = "PvP지역 부활 수락 해제" +L["Reload"] = "리로드" +L["Remember Alterac Valley!"] = "잊지 말자, 알터랙 계곡!" +L["Repair automatically"] = "자동 수리" +L["Repaired for"] = "수리비" +L["Reposition the tooltip"] = "툴팁 위치 설정" +L["Requires UI reload."] = "UI 리로드 필요." +L["Reset"] = "재설정" +L["Resize book text"] = "책 글꼴크기 변경" +L["Resize mail text"] = "우편 글자 설정" +L["Resize quest text"] = "퀘스트 글자 설정" +L["Resize Screen"] = "화면 크기 조정" +L["Rested bubbles"] = "휴식 버블" +L["result"] = "결과" +L["results"] = "결과들" +L["Revantusk Village"] = "깨진엄니 마을" +L["Right"] = "오른쪽" +L["Right-click to close"] = "창닫기:우클릭." +L["Right-click to close."] = "창닫기:우클릭. ." +L["right-click to go back"] = "마우스 오른쪽 클릭으로 뒤로 이동." +L["Ruins of Ahn'Qiraj"] = "안퀴라즈 폐허" +L["Rut'theran Village"] = "루테란 마을" +L["Sacred"] = "Sacred" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "성난모래, 백골가루, 붉은머리부족 주화" +L["Scale"] = "크기" +L["Scarlet Monastery"] = "붉은십자군 수도원" +L["Scholomance"] = "스칼로맨스" +L["Search"] = "검색" +L["Searing Gorge"] = "이글거리는 협곡" +L["Select the settings that you want to use."] = "사용하려는 설정을 선택합니다." +L["Selection of music tracks"] = "음악 트랙 선택" +L["Self Markers Allowed"] = "전술 징표 허용 " +L["Self Markers Blocked"] = "전술 징표 차단" +L["Sell junk automatically"] = "회색템 자동 판매" +L["SELLING JUNK"] = "자동판매" +L["Sentinel Hill"] = "감시의 언덕" +L["Set weather density"] = "날씨 밀도 설정" +L["Settings"] = "설정" +L["Shaders"] = "쉐이더" +L["Shadowfang Keep"] = "그림자송곳니 성채" +L["Shadowmoon Valley"] = "어둠달 골짜기" +L["Shadowprey Village"] = "그늘수렵 마을" +L["Shardtooth E'ko"] = "톱니이빨곰의 에코" +L["Show auction controls"] = "경매 추가 기능" +L["Show bag search box"] = "가방 검색창 표시" +L["Show character addons"] = "케릭터 애드온 표시" +L["Show cooldowns"] = "쿨다운 아이콘 표시" +L["Show cooldowns above the player frame"] = "Show cooldowns above the player frame" +L["Show durability status"] = "내구도 표시" +L["Show free bag slots"] = "가방 빈칸 수 표시" +L["Show guild names"] = "길드명 표시" +L["Show guild ranks for your guild"] = "길드등급 표시" +L["Show minimap button"] = "미니맵 버튼 표시" +L["Show player chain"] = "플레이어 테두리 표시" +L["Show player frame in class color"] = "플레이어 프레임 직업색상 표시" +L["Show raid button"] = "공격대 버튼 표시" +L["Show the spell ID in buff icon tooltips"] = "툴팁 주문ID 표시" +L["Show unit targets"] = "Show unit targets" +L["Show vanity controls"] = "투구,망토 설정 표시" +L["Show vendor price"] = "상점 판매가 표시" +L["Show volume slider"] = "소리 조절 표시" +L["Show Wowhead links"] = "와우헤드 링크 표시" +L["Silence rested emotes"] = "감정표현 음소거" +L["Silithus"] = "실리더스" +L["Silverpine Forest"] = "은빛소나무 숲" +L["Single Mark of Sargeras"] = "살게라스의 징표 하나" +L["Single Sunfury Signet"] = "성난태양 인장 하나" +L["Social"] = "소셜" +L["Sold junk for"] = "회색템 판매" +L["Sound system restarted."] = "사운드 시스템 재시작." +L["Southshore"] = "사우스쇼어" +L["Spell ID"] = "주문 ID" +L["Splintertree Post"] = "토막나무 주둔지" +L["Spooky"] = "Spooky" +L["Stockade"] = "스톰윈드 지하감옥" +L["Stonard"] = "스토나드" +L["Stonetalon Mountains"] = "돌발톱 산맥" +L["Stonetalon Peak"] = "돌발톱 봉우리" +L["Stop"] = "중지" +L["Stormwind"] = "스톰윈드" +L["Stranglethorn Vale"] = "가시덤불 골짜기" +L["Stratholme"] = "스트라솔름" +L["Sun Rock Retreat"] = "해바위 야영지" +L["Sunfury Signets"] = "성난태양 인장" +L["Sunken Temple"] = "가라앉은 사원" +L["Sunwell Plateau"] = "태양샘 고원" +L["Support"] = "지원" +L["Swamp"] = "Swamp" +L["Swamp of Sorrows"] = "슬픔의 늪" +L["System"] = "시스템" +L["Tabard"] = "휘장숨김" +L["Taint level: Basic (1)."] = "오염 레벨: Basic (1)" +L["Taint level: Disabled (0)."] = "오염 레벨: 비활성(0)" +L["Taint level: Full (2)."] = "오염 레벨: Full (2)" +L["Talonbranch Glade"] = "갈퀴가지 숲" +L["Talrendis Point"] = "탈렌디스 초소" +L["Tanaris"] = "타나리스" +L["Target"] = "대상" +L["Target Tracking Disabled"] = "대상 추적 사용안함" +L["Target Tracking Enabled"] = "대상 추적 사용" +L["Tarren Mill"] = "타렌 제분소" +L["Teldrassil"] = "텔드랏실" +L["Tempest Keep"] = "폭풍우 요새" +L["Temple of Ahn'Qiraj"] = "안퀴라즈" +L["Temple of Atal'Hakkar"] = "아탈학카르 신전" +L["Ten Years of Warcraft"] = "워크래프트 10주년" +L["Terokkar Forest"] = "테로카르 숲" +L["Text"] = "글자" +L["Text size"] = "글자 크기" +L["Text Size"] = "글자 크기" +L["Thalanaar"] = "탈라나르" +L["The Sepulcher"] = "공동묘지" +L["The summon from"] = "당신을 소환하는 자" +L["Thelsamar"] = "텔사마" +L["Themes"] = "테마" +L["Theramore"] = "테라모어 섬" +L["This panel will close automatically if you enter combat."] = "전투시 자동으로 닫힙니다." +L["Thorium Point"] = "토륨 거점" +L["Thousand Needles"] = "버섯구름 봉우리" +L["Thunder Bluff"] = "썬더 블러프" +L["Timer"] = "미러바" +L["Tirisfal Glades"] = "티리스팔 숲" +L["To begin, choose an options page."] = "설정 페이지를 선택합니다." +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "전투 기록을 숨기려면 ElvUI에서 채팅 모듈을 비활성화해야합니다." +L["To use the Find Item button, you need to deselect the WoW Token category."] = "아이템찾기 사용하려면, 'WoW토큰' 카테고리 선택을 취소 해야 합니다. " +L["Tooltip"] = "툴팁" +L["Tooltip title color"] = "툴팁 제목 색상" +L["Top"] = "상단" +L["Top Center"] = "탑 센터" +L["Tracing started."] = "추적 시작." +L["Tracing stopped."] = "추적 중지." +L["Transparency"] = "투명도" +L["True"] = "참된" +L["Turn-in completed quests automatically"] = "퀘스트 자동 완료" +L["Uldaman"] = "울다만" +L["Unclamp chat frame"] = "채팅창 고정 해제" +L["Undercity"] = "언더시티" +L["Un'Goro Crater"] = "운고로 분화구" +L["Universal group color"] = "그룹 색상 통합" +L["Use arrow keys in chat"] = "방향키 사용" +L["Use class colors in chat"] = "채팅 직업색상 사용" +L["Use easy resizing"] = "쉬운 크기조절" +L["Valormok"] = "발로르모크" +L["Value must be a number."] = "값은 숫자 이여야 합니다." +L["Various"] = "기타" +L["Vendors"] = "상인" +L["Version"] = "버전" +L["Very Low"] = "아주 낮음" +L["Video"] = "비디오" +L["Visibility"] = "가시성" +L["Wailing Caverns"] = "통곡의 동굴" +L["was automatically declined."] = "자동으로 거절되었습니다." +L["Weather density"] = "기상 밀도" +L["Welcome to Leatrix Plus."] = "Leatrix Plus 에 오신 것을 환영합니다." +L["Western Plaguelands"] = "서부 역병지대" +L["Westfall"] = "서부 몰락지대" +L["Wetlands"] = "저습지" +L["Widget"] = "위젯" +L["Wildkin E'ko"] = "올빼미야수의 에코" +L["will be automatically accepted in 10 seconds unless cancelled."] = "취소하지 않으면 10 초 후에 자동으로 수락됩니다." +L["Winter"] = "겨울" +L["Winterfall E'ko"] = "눈사태일족의 에코" +L["Winterspring"] = "여명의 설원" +L["World of Warcraft"] = "월드 오브 워크래프트" +L["X Offset"] = "X 오프셋" +L["Y Offset"] = "Y 오프셋" +L["YOU"] = "당신" +L["You cannot do that in combat."] = "전투중으로 할수 없습니다." +L["You have"] = "장비 내구도" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "일부 변경사항을 적용하려면 UI를 다시 로드 하여야 합니다. 요구시 리로드 버튼 활성화." +L["Your UI needs to be reloaded."] = "당신의 UI는 다시 로드 해야 합니다." +L["Zangarmarsh"] = "장가르 습지대" +L["Zones"] = "지역" +L["Zoram'gar Outpost"] = "조람가르 전초기지" +L["Zul'Aman"] = "줄아만" +L["Zul'Farrak"] = "줄파락" +L["Zul'Gurub"] = "줄구룹" +L["Zulian, Razzashi, and Hakkari Coins"] = "줄리안, 래즈자쉬, 학카리부족 주화" +L["Zygor addon not found."] = "Zygor 애드온 찾을수 없음." + +end + +-- esMX: Spanish (Mexico) +if GameLocale == "esMX" then +L["+"] = "+" +L["A Donation of Mageweave"] = "Un donativo de tejido mágico" +L["A Donation of Runecloth"] = "Un donativo de paño rúnico" +L["A Donation of Silk"] = "Un donativo de seda" +L["A Donation of Wool"] = "Un donativo de lana" +L["A friend request from"] = "Una solicitud de amistad de" +L["Accept available quests automatically"] = "Aceptar misiones disponibles automáticamente" +L["Accept resurrection"] = "Aceptar resucitación" +L["Accept summon"] = "Aceptar invocación" +L["Additional Runecloth"] = "Un donativo extra de paño rúnico" +L["Addon"] = "Addon" +L["Aerie Peak"] = "Pico Nidal" +L["Ahn'Qiraj"] = "Ahn'Qiraj" +L["Alterac Mountains"] = "Montañas de Alterac" +L["Anchor"] = "Anclar" +L["Angelic"] = "Angélico" +L["Arathi Highlands"] = "Tierras Altas de Arathi" +L["Ashenvale"] = "Vallefresno" +L["Auto loot is now enabled."] = "Despojar automáticamente se ha habilitado." +L["AutoFollow"] = "Seguir automáticamente" +L["AutoFollow disabled."] = "Seguir automáticamente se ha deshabilitado" +L["Automate gossip"] = "Automatizar diálogo" +L["Automate quests"] = "Automatizar misiones" +L["Automation"] = "Automatizar" +L["Azshara"] = "Azshara" +L["Azuremyst Isle"] = "Isla Bruma Azur" +L["Back to Main Menu"] = "Volver a menú principal" +L["Bad ID"] = "ID inválida" +L["Badlands"] = "Tierras Inhóspitas" +L["Barrens"] = "Los Baldíos" +L["Battle"] = "Batalla" +L["Battle of Warsong Gulch"] = "La batalla por Garganta Grito de Guerra" +L["Battlegrounds"] = "Campos de Batalla" +L["Black Morass"] = "La Ciénaga Negra" +L["Black Temple"] = "Templo Oscuro" +L["Blackfathom Deeps"] = "Cavernas de Brazanegra" +L["Blackrock Depths"] = "Profundidades de Roca Negra" +L["Blackwing Lair"] = "Guarida de Alanegra" +L["Blade's Edge Mountains"] = "Montañas Filospada" +L["Blasted Lands"] = "Las Tierras Devastadas" +L["Block duels"] = "Duelos" +L["Block friend requests"] = "Solicitudes de amistad" +L["Block party invites"] = "Invitaciones de grupo" +L["Blocks"] = "Rechazar" +L["Bloodmyst Isle"] = "Isla Bruma de Sangre" +L["Booty Bay"] = "Bahía del Botín" +L["Bottom"] = "Inferior" +L["Brackenwall Village"] = "Poblado Murohelecho" +L["Buffs"] = "Buffs" +L["Burning Crusade"] = "Burning Crusade" +L["Burning Crusade Classic"] = "Burning Crusade Clásico" +L["Burning Steppes"] = "Las Estepas Ardientes" +L["Buyout Only"] = "Sola compra" +L["by Leatrix Plus"] = "por Leatrix Plus" +L["C"] = "C" +L["Camera distance"] = "Distancia de cámara" +L["Camp Mojache"] = "Campamento Mojache" +L["Camp Taurajo"] = "Campamento Taurajo" +L["Cannot announce in this zone."] = "No se puede anunciar en esta zona." +L["Cannot find General chat channel."] = "No se puede encontrar el canal de chat general." +L["Cenarion Hold"] = "Fuerte Cenarion" +L["Chain style"] = "Estilo de cadena" +L["Character"] = "Personaje" +L["Chat"] = "Chat" +L["Chat Frame"] = "Marco de chat" +L["Checkbox labels are Ok."] = "Las etiquetas de las casillas de verificación están bien." +L["Chillwind Camp"] = "Campamento del Orvallo" +L["Chillwind E'ko"] = "E'ko Orvallo" +L["Cinematics"] = "Cinemáticas" +L["Claiming Arathi Basin"] = "Reclamo por la Cuenca de Arathi" +L["Class colored frames"] = "Marcos coloreados" +L["Class icon portraits"] = "Retratos de clase" +L["Classic"] = "Clásico" +L["click here for new selection"] = "haga clic para nueva selección" +L["Click to configure the settings for this option."] = "Haga clic para configurar la configuración para esta opción" +L["Click to reset the settings on this page."] = "Haga clic para restablecer la configuración en esta página" +L["Click to resize the screen to fit between the top and bottom borders."] = "Haga clic para cambiar el tamaño de la pantalla para que se ajuste entre los bordes superior e inferior." +L["Click to return to the main menu."] = "Haga clic para volver al menú principal" +L["Cloak"] = "Espalda" +L["Coilfang Reservoir"] = "Reserva de Colmillo Torcido" +L["Combat log cannot be hidden while undocked."] = "El registro de combate no se puede ocultar mientras está desacoplado." +L["Combat plates"] = "Placas de combate" +L["Completed."] = "Completado." +L["Concerted Efforts"] = "Esfuerzos concertados" +L["Configuration Panel"] = "Panel de Configuración" +L["Connections for"] = "Conexiones de" +L["Conquering Arathi Basin"] = "La conquista de la Cuenca de Arathi" +L["Credits"] = "Créditos" +L["Crossroads"] = "El Cruce" +L["Cursor"] = "Cursor" +L["Cursor Left"] = "Cursor izquierdo" +L["Cursor Right"] = "Cursor derecho" +L["D"] = "C" +L["Darkmoon Faire"] = "Feria de la Luna Negra" +L["Darkshire"] = "Villa Oscura" +L["Darkshore"] = "Costa Oscura" +L["Deadmines"] = "Minas de la Muerte" +L["Deadwind Pass"] = "Paso de la Muerte" +L["Desolace"] = "Desolace" +L["Dire Maul"] = "La Masacre" +L["Disable bag automation"] = "Bolsas" +L["Disable chat fade"] = "Desvanecimiento" +L["Disable loot warnings"] = "Advertencias del botín" +L["Disable screen effects"] = "Efectos de pantalla" +L["Disable screen glow"] = "Brillo de pantalla" +L["Disable sticky chat"] = "Chat pegajoso" +L["Drag the frame overlay to position the frame."] = "Arrastra la superposición del marco para colocar el marco." +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "Arrastra la superposición de los marco para colocar los marcos.|n|nPara cambiar la escala de un marco, haga clic para seleccionarlo y luego ajuste el control deslizante de escala.|n|nEste panel se cerrará automáticamente si entras en combate." +L["Drag to set the buffs frame scale."] = "Arrastra para establecer la escala del marco de los bufos." +L["Drag to set the cursor X offset."] = "Arrastra para establecer el desplazamiento del cursor X." +L["Drag to set the cursor Y offset."] = "Arrastra para establecer el desplazamiento del cursor Y." +L["Drag to set the density of weather effects."] = "Arrastra para establecer la densidad de los efectos entornos." +L["Drag to set the font size of book text."] = "Arrastra para establecer el tamaño de fuente del texto de libro." +L["Drag to set the font size of mail text."] = "Arrastra para establecer el tamaño de fuente del texto de correo." +L["Drag to set the font size of quest text."] = "Arrastra para establecer el tamaño de fuente del texto de misión." +L["Drag to set the scale of the Leatrix Plus panel."] = "Arrastra para establecer la escala del panel Leatrix Plus." +L["Drag to set the scale of the selected frame."] = "Arrastra para establecer la escala del marco seleccionado." +L["Drag to set the size of the bottom border."] = "Arrastra para establecer el tamaño del borde inferior." +L["Drag to set the size of the left border."] = "Arrastra para establecer el tamaño del borde izquierdo." +L["Drag to set the size of the right border."] = "Arrastra para establecer el tamaño del borde derecho." +L["Drag to set the size of the top border."] = "Arrastra para establecer el tamaño del borde superior." +L["Drag to set the tooltip scale."] = "Arrastra para establecer la escala del tooltip." +L["Drag to set the transparency of the borders."] = "Arrastra para establecer la transparencia de los bordes." +L["Drag to set the transparency of the Leatrix Plus panel."] = "Arrastra para establecer la transparencia del panel Leatrix Plus." +L["Drag to size"] = "Arrastra para ajustar el tamaño" +L["Dun Morogh"] = "Dun Morogh" +L["Dungeons"] = "Calabozos" +L["Dup ID"] = "ID Copia" +L["durability"] = "durabilidad" +L["Durability"] = "Durabilidad" +L["Durotar"] = "Durotar" +L["Duskwood"] = "Bosque del Ocaso" +L["Dustwallow Marsh"] = "Marjal Revolcafango" +L["Eastern Kingdoms"] = "Reinos del Este" +L["Eastern Plaguelands"] = "Tierras de la Peste del Este" +L["Easy item destroy"] = "Fácil eliminación de objetos" +L["ELITE"] = "ÉLITE" +L["Elwynn Forest"] = "Bosque de Elwynn" +L["Enable viewport"] = "Vista de ventana" +L["Enhance dressup"] = "Probador" +L["Enhance minimap"] = "Minimapa" +L["Enhance professions"] = "Profesiones" +L["Enhance quest log"] = "Registro de misiones" +L["Enhance tooltip"] = "Tooltip" +L["Enhance trainers"] = "Instructores" +L["Enhancements"] = "Mejoras" +L["Enter"] = "Entrar" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "Entra la ID de hechizo para los iconos de reutilización que desea ver.|n|nSi normalmente aparece un icono de reutilización debajo del marco de la mascota, marca la casilla de verificación mascota.|n|Los iconos de reutilización se guardan en tu clase." +L["enter zone or track name"] = "entra zona o rastrea el nombre" +L["Error messages will be hidden"] = "Mensajes de error se ocultarán" +L["Error messages will be shown"] = "Mensajes de error se mostrarán" +L["Events"] = "Eventos" +L["Everlook"] = "Vista Eterna" +L["Eversong Woods"] = "Bosque Cancion Eterna" +L["Extras"] = "Excesos" +L["False"] = "Falso" +L["Faster auto loot"] = "Despojar rápido" +L["Faster movie skip"] = "Saltar película rápido" +L["Feathermoon"] = "Plumaluna" +L["Features"] = "Caracteristicas" +L["Felwood"] = "Frondavil" +L["Feralas"] = "Feralas" +L["Fight for Warsong Gulch"] = "Lucha por Garganta Grito de Guerra" +L["Find Item"] = "Buscar objeto" +L["Firewing Signets"] = "Sellos Ala de Fuego" +L["Flame Crest"] = "Peñasco Llamarada" +L["For Great Honor"] = "Cuestión de honor" +L["Frames"] = "Marcos" +L["Freewind Post"] = "Poblado Viento Libre" +L["Frostmaul E'ko"] = "E'ko de los Machacahielo" +L["Frostsaber E'ko"] = "E'ko de sable de hielo" +L["Game Options"] = "Opciones de juego" +L["Ghost"] = "Fantasma" +L["Ghostlands"] = "Tierras Fantasmas" +L["Gloomy"] = "Melancólico" +L["Gnomeregan"] = "Gnomeregan" +L["Gold Only"] = "Solo oro" +L["Graphics and Sound"] = "Gráficos y sonido" +L["Groups"] = "Grupos" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "Las monedas Gurubashi, Vilrama y Secacorteza" +L["H"] = "H" +L["Hammerfall"] = "Sentencia" +L["Haunted"] = "Encantado" +L["Hellfire Peninsula"] = "Peninsula de Fuego infernal" +L["Hellfire Ramparts"] = "Murallas del Fuego Infernal" +L["Helm"] = "Cabeza" +L["Help"] = "Ayuda" +L["Hide chat buttons"] = "Botones de chat" +L["Hide cooldown duration numbers (if enabled)"] = "Ocultar números de reutilización (si habilitado)" +L["Hide error messages"] = "Mensajes de error" +L["Hide gryphons"] = "Grifos" +L["Hide portrait numbers"] = "Números del retrato" +L["Hide stance bar"] = "Barra de actitud" +L["Hide the combat log"] = "Registro de combate" +L["Hide the zone text bar"] = "Ocultar texto de zona" +L["Hide the zoom buttons"] = "Ocultar los botones de acercar alejar" +L["Hide tooltips for world units during combat"] = "Ocultar tooltips para unidades del mundo si estés en combate" +L["Hide zone text"] = "Texto de zona" +L["High"] = "Alto" +L["Hillsbrad Foothills"] = "Laderas de Trabalomas" +L["Hinterlands"] = "Tierras del Interior" +L["Home"] = "Principal" +L["Hyjal Summit"] = "La Cima Hyjal" +L["Ice Thistle E'ko"] = "E'ko de los Cardo Nevado" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "Si está seleccionado, se mostrará un cuadro de búsqueda de bolsas en el marco de la mochila y el marco del banco." +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "Si está seleccionado, se agregará un botón a la información del personaje que mostrará la durabilidad de su equipo cuando pase el puntero sobre él.|n|nAdemás, se mostrará un porcentaje general en el marco del chat cuando muera." +L["If checked, a master volume slider will be shown in the character frame."] = "Si está seleccionado, se mostrará un control deslizante de volumen maestro en la información del personaje." +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "Si está seleccionado, se agregará funcionalidad adicional a la casa de subastas.|n|nSolo compra: cree subastas de compra sin completar el precio inicial.|n|nSolo oro: establezca los precios del cobre y la plata en 99 para acelerar las nuevas subastas.|n|nBuscar objeto: busca en la casa de subastas el objeto que estás vendiendo.|n|nAdemás, la configuración de duración de la subasta se guardará en toda la cuenta." +L["If checked, alert frames will not be shown."] = "Si está seleccionado, no se mostrarán los marcos de alerta." +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Si está seleccionado, todos los objetos de calidad pobre en sus bolsas se venderán automáticamente cuando visite a un mercader.|n|nPuede mantener presionada la tecla shift cuando hable con un mercader para anular esta configuración." +L["If checked, available quests will be accepted automatically."] = "Si está seleccionado, las misiones disponibles se aceptarán automáticamente." +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "Si está seleccionado, los fondos se teñirán de azul (amigable) o rojo (hostil)." +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "Si está seleccionado, las solicitudes de amistad de BattleTag y Real ID se rechazarán automáticamente.|n|nHabilitar esta opción rechazará automáticamente cualquier solicitud pendiente." +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "Si está seleccionado, los botones del marco de chat estarán ocultos.|n|nAl hacer clic en las pestañas de chat, se mostrarán automáticamente los últimos mensajes.|n|nUsa la rueda del ratón para desplazarse por el historial de chat. Mantenga presionada la tecla shift para saltar de página o Ctrl para saltar a la parte superior o inferior del historial de chat." +L["If checked, chat text will not fade out after a time period."] = "Si está seleccionado, el texto del chat no se desvanecerá después de un período de tiempo." +L["If checked, class coloring will be used in the player frame, target frame and focus frame."] = "Si está marcada, se utilizará el color de la clase en el marco del jugador, en el marco del objetivo y en el marco de enfoque." +L["If checked, class colors will be used in the chat frame."] = "Si está seleccionado, los colores de la clase se usarán en el marco del chat." +L["If checked, completed quests will be turned-in automatically."] = "Si está seleccionado, las misiones completadas se entregarán automáticamente." +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "Si está seleccionado, las confirmaciones ya no aparecerán cuando elija una opción de botín o cuando intente vender o enviar un objeto comercializable." +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "Si está seleccionado, los números de reutilización no se mostrarán sobre el hechizo.|n|nSi no está marcado, los números de reutilización se mostrarán sobre el hechizo si están habilitados en el panel de opciones del juego (menú 'Barras de Acción')." +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "Si está seleccionado, se ocultarán los números de daño y sanación en los marcos de retrato de jugador y mascota." +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "Si está seleccionado, arrastrando la pestaña de chat General mientras el marco de chat está bloqueado expandirá el marco de chat hacia arriba.|n|nSi el marco de chat está desbloqueado, arrastrando la pestaña de chat General se moverá el marco de chat." +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "Si está seleccionado, los sonidos de emoción se silenciarán mientras tu personaje esté descansando o en El Tragapenas.|n|nLos sonidos de emoción se habilitarán en cualquier otro momento." +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "Si está seleccionado, las placas identificativas del enemigo se mostrarán durante el combate y se ocultarán cuando finalice el combate." +L["If checked, guild ranks will be shown for players in your guild."] = "Si está seleccionado, los rangos de la hermandad se mostrarán para los jugadores de tu hermandad." +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "Si está seleccionado, las casillas de alternar cabeza y espalda se mostrarán en la información del personaje.|n|nPuede mantener presionada la tecla shift y hacer clic con el botón derecho en las casillas de verificación para cambiar de visualización." +L["If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman."] = "Si se marca, los sonidos de los eventos festivos se silenciarán.|n|nEsto se aplica a Jinete decapitado." +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "Si está seleccionado, la mayoría de los mensajes de error (como 'No tienes suficiente ira') no se mostrarán. Se excluyen algunos errores importantes.|n|nSi tiene habilitado el botón de minimapa, puede mantener presionada la tecla de control y hacer clic con el botón derecho para alternar los mensajes de error sin afectar esta configuración." +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "Si está seleccionado, el chat de banda y el chat de instancia serán de color azul (para que coincida con el color predeterminado del chat del grupo)." +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "Si está seleccionado, la ID de hechizo se mostrarán en el tooltip del icono de buff ubicado en el marco de buff y debajo del marco de objetivo." +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "Si está seleccionado, el chat pegajoso se deshabilitará.|n|nTenga en cuenta que esto no se aplica a las ventanas de chat temporales." +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "Si está seleccionado, las solicitudes de invocación serán aceptadas automáticamente a menos que estés en combate." +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "Si está seleccionado, la lista de addons (accesible desde el menú del juego) mostrará addons basados en personajes de forma predeterminada." +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "Si está seleccionado, el tiempo que se tarda en despojar automáticamente a las criaturas se reducirá significativamente." +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "Si está seleccionado, el botón de limpieza de la mochila y el botón de limpieza del marco del banco no se mostrarán." +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "Si está seleccionado, el botón para alternar el marco del contenedor de banda se mostrará justo encima del marco de administración de banda (lado izquierdo de la pantalla) en lugar de en el marco de administración de banda en sí.|n|nEsto le permite alternar el marco del contenedor de banda sin necesidad de abrir el marco de administración de banda." +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "Si está seleccionado, el registro de combate estará oculto.|n|nEl registro de combate debe estar acoplado para que esta opción funcione.|n|nSi el registro de combate está desacoplado, puedes acoplarlo arrastrando la pestaña (y recargando tu IU) o restableciendo las ventanas de chat (desde el menú de chat)." +L["If checked, the editbox will be moved to the top of the chat frame."] = "Si está seleccionado, el cuadro de edición se moverá a la parte superior del marco de chat." +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "Si está seleccionado, la pantalla gris de la muerte y el efecto del inframundo se deshabilitarán." +L["If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted."] = "Si está seleccionado, el sonido del botón de la interfaz, el sonido del clic de la pestaña del marco del chat y el sonido de alternancia del menú del juego se silenciarán." +L["If checked, the main bar gryphons will not be shown."] = "Si está seleccionado, no se mostrarán los grifos de la barra principal." +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "Si está seleccionado, la cantidad de casillas para bolsas disponibles se mostrará en el icono del botón de la mochila y en el tooltip." +L["If checked, the player frame background will be shown in class color."] = "Si está seleccionado, el fondo del marco del jugador se mostrará en color de clase." +L["If checked, the professions frame will be larger."] = "Si está seleccionado, el marco de profesiones será más grande." +L["If checked, the ready check sound will be muted."] = "Si está seleccionado, el sonido de comprobación de listo se silenciará." +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "Si está seleccionado, el brillo de la pantalla se deshabilitará.|n|nHabilitar esta opción también deshabilitará el efecto de borracho." +L["If checked, the spell fizzle sounds will be muted."] = "Si está seleccionado, los sonidos del hechizo fizzle serán silenciados." +L["If checked, the stance bar will not be shown."] = "Si está seleccionado, la barra de actitud no mostrará." +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "Si está seleccionado, el marco de conversación no se mostrará.|n|nEl marco de conversación normalmente aparece en la parte inferior de la pantalla cuando ciertos PNJs se comunican con usted." +L["If checked, the target frame background will be shown in class color."] = "Si está seleccionado, el fondo del marco de objetivo se mostrará en color de clase." +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "Si está seleccionado, el tooltip estará codificada por colores y podrá modificar la visualización y la escala del tooltip." +L["If checked, the vendor price will be shown in item tooltips."] = "Si está seleccionado, el precio de venta se mostrará en el tooltip del objeto." +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "Si está seleccionado, los botones de acercar alejar estarán ocultos. Puede usar la rueda del ratón para acercar independientemente de esta configuración." +L["If checked, train sounds will be muted."] = "Si está seleccionado, los sonidos del tren se silenciarán." +L["If checked, unit targets will be shown."] = "Si está seleccionado, se mostrarán los objetivos de la unidad." +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "Si está seleccionado, puede mantener presionada la tecla de control y hacer clic en una pestaña de chat para ver el chat reciente en una ventana fácil de copiar." +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "Si está seleccionado, puede presionar las teclas de flecha para mover el punto de inserción hacia la izquierda y hacia la derecha en el marco del chat.|n|nSi no está marcado, las teclas de flecha utilizarán la configuración predeterminada del teclado." +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "Si está seleccionado, podrá cancelar cinemáticas sin que se le solicite confirmación." +L["If checked, you will be able to change the font size of book text."] = "Si está seleccionado, podrá cambiar el tamaño de fuente del texto de libro." +L["If checked, you will be able to change the font size of quest text."] = "Si está seleccionado, podrá cambiar el tamaño de fuente del texto de misión." +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "Si está seleccionado, podrá cambiar el tamaño de fuente del texto de correo.|n|nEsto no afecta el correo creado con plantillas (como las facturas de la casa de subastas)." +L["If checked, you will be able to change the position and scale of the buffs frame."] = "Si está seleccionado, podrá cambiar la posición y la escala del marco de los bufos." +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "Si está marcado, podrá cambiar la posición y la escala del marco del artilugio.|n|nEl marco del artilugio se usa comúnmente para mostrar las puntuaciones JcJ y los objetivos de seguimiento." +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "Si está seleccionado, podrá crear una ventana de vista. Una ventana de vista agrega bordes negros ajustables alrededor del mundo del juego.|n|nLos bordes se colocan en la parte superior del mundo del juego pero debajo de la interfaz de usuario para que pueda colocar elementos de la interfaz de usuario sobre ellos." +L["If checked, you will be able to customise the minimap."] = "Si está seleccionado, podrá personalizar el minimapa." +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "Si está seleccionado, podrá arrastrar el marco del chat al borde de la pantalla." +L["If checked, you will be able to mute a selection of game sounds."] = "Si está seleccionado, podrá silenciar una selección de sonidos del juego." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "Si está seleccionado, podrá colocar hasta cinco iconos de reutilización sobre el marco del objetivo." +L["If checked, you will be able to reposition the tooltip."] = "Si está seleccionado, podrá reposicionar el tooltip." +L["If checked, you will be able to set the density of weather effects."] = "Si está seleccionado, podrá establecer la densidad de los efectos entornos." +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "Si está seleccionado, podrá mostrar una cadena de élite rara, élite o rara alrededor del marco del jugador." +L["If checked, you will be able to zoom out to a greater distance."] = "Si está seleccionado, podrá alejarse a una distancia mayor." +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "Si está marcado, ya no necesitará escribir eliminar al destruir un objeto de calidad superior.|n|nAdemás, los enlaces de objetos se mostrarán en todas las ventanas de confirmación de eliminación de objetos." +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "Si está seleccionado, liberarás automáticamente después de morir en un campo de batalla.|n|nNo lo liberarás automáticamente si tienes la capacidad de resucitarte a ti mismo." +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "Si está seleccionado, sus bolsas no se abrirán o cerrarán automáticamente cuando interactúe con un mercader, banco o buzón." +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "Si está seleccionado, su historial de chat aumentará a 4096 líneas. Si no está marcado, se usará el valor predeterminado (128 líneas).|n|nHabilitar esta opción puede evitar que se muestre texto de chat durante el inicio de sesión." +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Si está seleccionado, su equipo se reparará automáticamente cuando visite a un mercader adecuado.|n|nPuede mantener presionada la tecla shift cuando hable con un mercader para anular esta configuración." +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "Si está seleccionado, el texto de la zona no se mostrará (por ejemplo, 'Forjaz')." +L["Increase chat history"] = "Aumentar el historial" +L["Interface"] = "Interfaz" +L["Invaders of Alterac Valley"] = "Invasores del Valle de Alterac" +L["Invalid console variable."] = "Consola variable inválida." +L["Invalid parameter."] = "Parámetro inválido" +L["Invalid quest ID."] = "ID de misión inválida" +L["Invalid sound ID"] = "ID de sonido inválida" +L["Invalid taint level."] = "Nivel de contaminación inválido." +L["Invalid target."] = "Objetivo inválido" +L["Invite from whispers"] = "Invitación de susurros" +L["Ironforge"] = "Forjaz" +L["Kalimdor"] = "Kalimdor" +L["Karazhan"] = "Karazhan" +L["Keyword"] = "Palabra clave" +L["Lakeshire"] = "Villa del Lago" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "Leatrix Plus no sobrescribirá LeaPlusDB en el próximo cierre de sesión." +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX PLUS: ¡VERSIÓN INCORRECTA INSTALADA!" +L["Left"] = "Izquierdo" +L["Lifetime honorable kills"] = "Muertes con honor de vida" +L["Light's Hope Chapel"] = "Capilla de la Esperanza de la Luz" +L["Loch Modan"] = "Loch Modan" +L["Lockout sharing"] = "Bloquear compartiendo" +L["Low"] = "Bajo" +L["Magic"] = "Magia" +L["Magisters' Terrace"] = "Bancal del Magister" +L["Main Titles"] = "Títulos principales" +L["Manage buffs"] = "Gestionar bufos" +L["Manage focus"] = "Gestionar enfoque" +L["Manage frames"] = "Gestionar marcos" +L["Manage widget"] = "Gestionar artilugio" +L["Managed by Leatrix Plus"] = "Gestionado por LeatrixPlus" +L["Map"] = "Mapa" +L["Maraudon"] = "Maraudon" +L["Marks of Kil'jaeden"] = "Marcas de Kil'jaeden" +L["Marks of Sargeras"] = "Marcas de Sargeras" +L["Marshal's Refuge"] = "Refugio de Marshal" +L["Max camera zoom"] = "Distancia máxima de cámara" +L["Mechanics"] = "Mecánicas" +L["Media"] = "Media" +L["Medium"] = "Medio" +L["Memory Usage"] = "Uso de Memoria" +L["Menethil Harbor"] = "Puerto de Menethil" +L["message shown."] = "mensaje mostrado." +L["Messages"] = "Mensajes" +L["messages shown."] = "mensajes mostrados." +L["Missing console variable."] = "Falta variable de consola" +L["Missing mount name."] = "Falta nombre de montura" +L["Missing movie ID."] = "Falta ID de película" +L["Missing quest ID."] = "Falta ID de hechizo" +L["Missing sound file parameter."] = "Falta el parámetro del archivo de sonido." +L["Missing sound ID."] = "Falta ID de sonido." +L["Molten Core"] = "Núcleo de Magma" +L["Moonglade"] = "Claro de la Luna" +L["More Firewing Signets"] = "Más sellos Ala de Fuego" +L["More Marks of Kil'jaeden"] = "Más marcas de Kil'jaeden" +L["More Marks of Sargeras"] = "Más marcas de Sargeras" +L["More Sunfury Signets"] = "Más sellos Furia del Sol" +L["Morgan's Vigil"] = "Vigilia de Morgan" +L["Mount not found."] = "No se busca montura." +L["Move editbox to top"] = "Cuadro de edición" +L["Movie not playable."] = "Película no jugable." +L["Movie number"] = "Número de la película" +L["Movies"] = "Películas" +L["Mulgore"] = "Mulgore" +L["Music"] = "Música" +L["Musical Moments"] = "Momentos musicales" +L["Mute game sounds"] = "Silenciar los sonidos del juego" +L["Mystery"] = "Misterio" +L["Nagrand"] = "Nangrand" +L["Narration"] = "Narración" +L["Naxxramas"] = "Naxxramas" +L["Nethergarde Keep"] = "Castillo de Nethergarde" +L["Netherstorm"] = "Tormenta Abisal" +L["Nijel's Point"] = "Punta de Nijel" +L["No bad sound IDs found."] = "No se encontraron ID de sonido inválidos." +L["No help is available for this page."] = "No hay ayuda disponible para esta página." +L["No items with durability equipped."] = "No hay objetos con durabilidad equipados." +L["No media duplicates found."] = "No se encontraron duplicados de medios." +L["No tooltip showing."] = "No se muestra tooltip." +L["None"] = "Ninguno" +L["Not completed."] = "No completado." +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "¡AVISO!|nDebe reiniciar completamente su cliente de juego antes de poder usar esta versión de Leatrix Plus." +L["Nude"] = "Nudo" +L["Old Hillsbrad Foothills"] = "Antiguas Laderas de Trabalomas" +L["Onyxia's Lair"] = "Guarida de Onyxia" +L["or click the minimap button to open Leatrix Plus."] = "o haga clic el botón minimapa para abrir Leatrix Plus." +L["Orgrimmar"] = "Orgrimmar" +L["Outland"] = "Terrallende" +L["Overall"] = "Todo" +L["Overlay"] = "Superposición" +L["Particle density"] = "Densidad de particula" +L["Party from friends"] = "Grupo de amigos" +L["Pet"] = "Mascota" +L["Player"] = "Jugador" +L["Power"] = "Poder" +L["Press CTRL/C to copy."] = "Pulsa Ctrl C para copiar." +L["Queue from friends"] = "Cola de amigos" +L["R"] = "B" +L["Ragefire Chasm"] = "Sima Ígnea" +L["Raid"] = "Banda" +L["Raid frame toggle"] = "Marco de banda" +L["Random"] = "Aleatorio" +L["RARE"] = "RARO" +L["RARE ELITE"] = "ÉLITE RARO" +L["Ratchet"] = "Trinquete" +L["Razorfen Downs"] = "Zahúrda Rajacieno" +L["Razorfen Kraul"] = "Horado Rajacieno" +L["Recent chat window"] = "Chat reciente" +L["Redridge Mountains"] = "Montañas Crestagrana" +L["Refuge Pointe"] = "Refugio de la Zaga" +L["Release in PvP"] = "Liberar espíritu en JcJ" +L["Reload"] = "Recargar" +L["Remember Alterac Valley!"] = "¡Recuerda el Valle de Alterac!" +L["Repair automatically"] = "Reparar" +L["Repaired for"] = "Reparado por" +L["Reposition the tooltip"] = "Reposicionar el tooltip" +L["Requires UI reload."] = "Requiere recargar la IU." +L["Reset"] = "Restablecer" +L["Resize book text"] = "Texto de libro" +L["Resize mail text"] = "Texto de correo" +L["Resize quest text"] = "Texto de misión" +L["Resize Screen"] = "Redimensionar pantalla" +L["Rested bubbles"] = "Burbujas descansadas" +L["result"] = "resultado" +L["results"] = "resultados" +L["Revantusk Village"] = "Poblado Sañadiente" +L["Right"] = "Derecho" +L["Right-click to close"] = "Haga clic derecho para cerrar" +L["Right-click to close."] = "Haga clic derecho para cerrar." +L["right-click to go back"] = "haga clic derecho para volver" +L["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj" +L["Rut'theran Village"] = "Aldea Rut'theran" +L["Sacred"] = "Sagrado" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "Las monedas Furiarena, Machacacráneos y Sangrapellejo" +L["Scale"] = "Escala" +L["Scarlet Monastery"] = "Monasterio Escarlata" +L["Scholomance"] = "Scholomance" +L["Search"] = "Buscar" +L["Searing Gorge"] = "La Garganta de Fuego" +L["Select the settings that you want to use."] = "Selecciona la configuración que desea usar." +L["Selection of music tracks"] = "Selección de pistas de música" +L["Self Markers Allowed"] = "Auto marcadores permitidos" +L["Self Markers Blocked"] = "Auto marcadores bloqueados" +L["Sell junk automatically"] = "Vender objetos pobres" +L["SELLING JUNK"] = "Vendiendo objetos pobres" +L["Sentinel Hill"] = "Colina del Centinela" +L["Set weather density"] = "Densidad del entorno" +L["Settings"] = "Configuración" +L["Shaders"] = "Sombreadores" +L["Shadowfang Keep"] = "Castillo de Colmillo Oscuro" +L["Shadowmoon Valley"] = "Valle Sombraluna" +L["Shadowprey Village"] = "Aldea Cazasombras" +L["Shardtooth E'ko"] = "E'ko Dentoesquirla" +L["Show auction controls"] = "Subasta" +L["Show bag search box"] = "Búsqueda de bolsas" +L["Show character addons"] = "Addons del personaje" +L["Show cooldowns"] = "Reutilización" +L["Show cooldowns above the player frame"] = "Mostrar tiempos de reutilización sobre el marco del jugador" +L["Show durability status"] = "Durabilidad" +L["Show free bag slots"] = "Casillas de bolsas vacías" +L["Show guild names"] = "Mostrar nombres de hermandad" +L["Show guild ranks for your guild"] = "Mostrar rangos de hermandad para tu hermandad" +L["Show minimap button"] = "Botón del minimapa" +L["Show player chain"] = "Cadena de jugador" +L["Show player frame in class color"] = "Mostrar marco de jugador en color de clase" +L["Show raid button"] = "Mostrar botón de banda" +L["Show the spell ID in buff icon tooltips"] = "Mostrar ID de hechizo en tooltips del icono de buff" +L["Show unit targets"] = "Mostrar objetivos de unidad" +L["Show vanity controls"] = "Vanidad" +L["Show vendor price"] = "Precio de venta" +L["Show volume slider"] = "Volumen" +L["Show Wowhead links"] = "Enlaces de Wowhead" +L["Silence rested emotes"] = "Emociones de descanso" +L["Silithus"] = "Silithus" +L["Silverpine Forest"] = "Bosque de Argénteos" +L["Single Mark of Sargeras"] = "Marca de Sargeras única" +L["Single Sunfury Signet"] = "Sello Furia del Sol único" +L["Social"] = "Social" +L["Sold junk for"] = "Objetos pobres vendido por" +L["Sound system restarted."] = "Sistema de sonido reiniciado." +L["Southshore"] = "Costasur" +L["Spell ID"] = "ID de hechizo" +L["Splintertree Post"] = "Puesto del Hachazo" +L["Spooky"] = "Escalofriante" +L["Stockade"] = "Las Mazmorras" +L["Stonard"] = "Rocal" +L["Stonetalon Mountains"] = "Sierra Espolón" +L["Stonetalon Peak"] = "Cima del Espolón" +L["Stop"] = "Parar" +L["Stormwind"] = "Ventormenta" +L["Stranglethorn Vale"] = "Vega de Tuercespina" +L["Stratholme"] = "Stratholme" +L["Sun Rock Retreat"] = "Refugio Roca del Sol" +L["Sunfury Signets"] = "Sellos Furia del Sol" +L["Sunken Temple"] = "Templo Sumergido" +L["Sunwell Plateau"] = "Meseta de la Fuente del Sol" +L["Support"] = "Soporte" +L["Swamp"] = "Pantano" +L["Swamp of Sorrows"] = "Pantano de las Penas" +L["System"] = "Sistema" +L["Tabard"] = "Tabardo" +L["Taint level: Basic (1)."] = "Nivel de contaminación: básico (1)." +L["Taint level: Disabled (0)."] = "Nivel de contaminación: deshabilitado (0)." +L["Taint level: Full (2)."] = "Nivel de contaminación: lleno (2)." +L["Talonbranch Glade"] = "Claro Ramaespolón" +L["Talrendis Point"] = "Punta Talrendis" +L["Tanaris"] = "Tanaris" +L["Target"] = "Objetivo" +L["Target Tracking Disabled"] = "Rastreo de objetivo se ha deshabilitado" +L["Target Tracking Enabled"] = "Rastreo de objetivo se ha habilitado" +L["Tarren Mill"] = "Molino Tarren" +L["Teldrassil"] = "Teldrassil" +L["Tempest Keep"] = "El Castillo de la Tempestad" +L["Temple of Ahn'Qiraj"] = "Templo de Ahn'Qiraj" +L["Temple of Atal'Hakkar"] = "Templo de Atal'Hakkar" +L["Ten Years of Warcraft"] = "Diez años de Warcraft" +L["Terokkar Forest"] = "Bosque de Terrokar" +L["Text"] = "Texto" +L["Text size"] = "Tamaño de texto" +L["Text Size"] = "Tamaño de texto" +L["The Sepulcher"] = "El Sepulcro" +L["The summon from"] = "La invocación de" +L["Themes"] = "Temas" +L["This panel will close automatically if you enter combat."] = "Este panel se cerrará automáticamente si entras en combate." +L["Thorium Point"] = "Puesto del Torio" +L["Thousand Needles"] = "Las Mil Agujas" +L["Thunder Bluff"] = "Cima del Trueno" +L["Timer"] = "Temporizador" +L["Tirisfal Glades"] = "Claros de Tirisfal" +L["To begin, choose an options page."] = "Para comenzar, elija una pestaña de opciones." +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "Para ocultar el registro de combate, debes deshabilitar el módulo de chat en ElvUI." +L["To use the Find Item button, you need to deselect the WoW Token category."] = "Para usar el botón Buscar objeto, debe anular la selección de la categoría Token de WoW." +L["Tooltip"] = "Tooltip" +L["Tooltip title color"] = "Color de título del tooltip" +L["Top"] = "Superior" +L["Top Center"] = "Central Superior" +L["Tracing started."] = "El seguimiento comenzó." +L["Tracing stopped."] = "El seguimiento se detuvo." +L["Transparency"] = "Transparencia" +L["True"] = "Cierto" +L["Turn-in completed quests automatically"] = "Entregar misiones completadas automáticamente" +L["Uldaman"] = "Uldaman" +L["Unclamp chat frame"] = "Desbloquear el marco" +L["Undercity"] = "Entrañas" +L["Un'Goro Crater"] = "Cráter de Un'Goro" +L["Universal group color"] = "Color de grupo universal" +L["Use arrow keys in chat"] = "Teclas de flecha" +L["Use class colors in chat"] = "Colores de clase" +L["Use easy resizing"] = "Cambio de tamaño" +L["Value must be a number."] = "Valor debe ser un número." +L["Various"] = "Varios" +L["Vendors"] = "Vendedores" +L["Version"] = "Versión" +L["Very Low"] = "Muy Bajo" +L["Video"] = "Vídeo" +L["Visibility"] = "Visibilidad" +L["Wailing Caverns"] = "Cuevas de los Lamentos" +L["was automatically declined."] = "fue rechazado automáticamente." +L["Weather density"] = "Densidad del entorno" +L["Welcome to Leatrix Plus."] = "Bienvenido a Leatrix Plus" +L["Western Plaguelands"] = "Tierras de la Peste del Oeste" +L["Westfall"] = "Páramos de Poniente" +L["Wetlands"] = "Los Humedales" +L["Widget"] = "Artilugio" +L["Wildkin E'ko"] = "E'ko de lechúcico salvaje" +L["will be automatically accepted in 10 seconds unless cancelled."] = "será aceptado automáticamente en 10 segundos a menos que se cancele." +L["Winter"] = "Invierno" +L["Winterfall E'ko"] = "E'ko Nevada" +L["Winterspring"] = "Cuna del Invierno" +L["World of Warcraft"] = "World of Warcraft" +L["X Offset"] = "Compensación X" +L["Y Offset"] = "Compensación Y" +L["YOU"] = "Tú" +L["You cannot do that in combat."] = "No puedes hacerlo mientras estés en combate." +L["You have"] = "Tienes" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "Su IU necesita ser recargada para que algunos de los cambios surtan efecto.|n|nNo tiene que hacer clic en el botón de recarga de inmediato, pero debe hacer clic en él cuando haya terminado de hacer cambios y desea que los cambios surtan efecto." +L["Your UI needs to be reloaded."] = "Tiene que recargar la IU." +L["Zangarmarsh"] = "Zangarmarsh" +L["Zones"] = "Zonas" +L["Zoram'gar Outpost"] = "Avanzada de Zoram'gar" +L["Zul'Farrak"] = "Zul'Farrak" +L["Zul'Gurub"] = "Zul'Gurub" +L["Zulian, Razzashi, and Hakkari Coins"] = "Las monedas Zulian, Razzashi y Hakkari" +L["Zygor addon not found."] = "No se encuentra el addon Zygor." + +end + +-- esES: Spanish (Spain) +if GameLocale == "esES" then +L["+"] = "+" +L["A Donation of Mageweave"] = "Un donativo de tejido mágico" +L["A Donation of Runecloth"] = "Un donativo de paño rúnico" +L["A Donation of Silk"] = "Un donativo de seda" +L["A Donation of Wool"] = "Un donativo de lana" +L["A friend request from"] = "Una solicitud de amistad de" +L["Accept available quests automatically"] = "Aceptar misiones disponibles automáticamente" +L["Accept resurrection"] = "Aceptar resucitación" +L["Accept summon"] = "Aceptar invocación" +L["Additional Runecloth"] = "Un donativo extra de paño rúnico" +L["Addon"] = "Addon" +L["Aerie Peak"] = "Pico Nidal" +L["Ahn'Qiraj"] = "Ahn'Qiraj" +L["Alterac Mountains"] = "Montañas de Alterac" +L["Anchor"] = "Anclar" +L["Angelic"] = "Angélico" +L["Arathi Highlands"] = "Tierras Altas de Arathi" +L["Ashenvale"] = "Vallefresno" +L["Auto loot is now enabled."] = "Despojar automáticamente se ha habilitado." +L["AutoFollow"] = "Seguir automáticamente" +L["AutoFollow disabled."] = "Seguir automáticamente se ha deshabilitado" +L["Automate gossip"] = "Automatizar diálogo" +L["Automate quests"] = "Automatizar misiones" +L["Automation"] = "Automatizar" +L["Azshara"] = "Azshara" +L["Azuremyst Isle"] = "Isla Bruma Azur" +L["Back to Main Menu"] = "Volver a menú principal" +L["Bad ID"] = "ID inválida" +L["Badlands"] = "Tierras Inhóspitas" +L["Barrens"] = "Los Baldíos" +L["Battle"] = "Batalla" +L["Battle of Warsong Gulch"] = "La batalla por Garganta Grito de Guerra" +L["Battlegrounds"] = "Campos de Batalla" +L["Black Morass"] = "La Ciénaga Negra" +L["Black Temple"] = "Templo Oscuro" +L["Blackfathom Deeps"] = "Cavernas de Brazanegra" +L["Blackrock Depths"] = "Profundidades de Roca Negra" +L["Blackwing Lair"] = "Guarida de Alanegra" +L["Blade's Edge Mountains"] = "Montañas Filospada" +L["Blasted Lands"] = "Las Tierras Devastadas" +L["Block duels"] = "Duelos" +L["Block friend requests"] = "Solicitudes de amistad" +L["Block party invites"] = "Invitaciones de grupo" +L["Blocks"] = "Rechazar" +L["Bloodmyst Isle"] = "Isla Bruma de Sangre" +L["Booty Bay"] = "Bahía del Botín" +L["Bottom"] = "Inferior" +L["Brackenwall Village"] = "Poblado Murohelecho" +L["Buffs"] = "Buffs" +L["Burning Crusade"] = "Burning Crusade" +L["Burning Crusade Classic"] = "Burning Crusade Clásico" +L["Burning Steppes"] = "Las Estepas Ardientes" +L["Buyout Only"] = "Sola compra" +L["by Leatrix Plus"] = "por Leatrix Plus" +L["C"] = "C" +L["Camera distance"] = "Distancia de cámara" +L["Camp Mojache"] = "Campamento Mojache" +L["Camp Taurajo"] = "Campamento Taurajo" +L["Cannot announce in this zone."] = "No se puede anunciar en esta zona." +L["Cannot find General chat channel."] = "No se puede encontrar el canal de chat general." +L["Cenarion Hold"] = "Fuerte Cenarion" +L["Chain style"] = "Estilo de cadena" +L["Character"] = "Personaje" +L["Chat"] = "Chat" +L["Chat Frame"] = "Marco de chat" +L["Checkbox labels are Ok."] = "Las etiquetas de las casillas de verificación están bien." +L["Chillwind Camp"] = "Campamento del Orvallo" +L["Chillwind E'ko"] = "E'ko Orvallo" +L["Cinematics"] = "Cinemáticas" +L["Claiming Arathi Basin"] = "Reclamo por la Cuenca de Arathi" +L["Class colored frames"] = "Marcos coloreados" +L["Class icon portraits"] = "Retratos de clase" +L["Classic"] = "Clásico" +L["click here for new selection"] = "haga clic para nueva selección" +L["Click to configure the settings for this option."] = "Haga clic para configurar la configuración para esta opción" +L["Click to reset the settings on this page."] = "Haga clic para restablecer la configuración en esta página" +L["Click to resize the screen to fit between the top and bottom borders."] = "Haga clic para cambiar el tamaño de la pantalla para que se ajuste entre los bordes superior e inferior." +L["Click to return to the main menu."] = "Haga clic para volver al menú principal" +L["Cloak"] = "Espalda" +L["Coilfang Reservoir"] = "Reserva de Colmillo Torcido" +L["Combat log cannot be hidden while undocked."] = "El registro de combate no se puede ocultar mientras está desacoplado." +L["Combat plates"] = "Placas de combate" +L["Completed."] = "Completado." +L["Concerted Efforts"] = "Esfuerzos concertados" +L["Configuration Panel"] = "Panel de Configuración" +L["Connections for"] = "Conexiones de" +L["Conquering Arathi Basin"] = "La conquista de la Cuenca de Arathi" +L["Credits"] = "Créditos" +L["Crossroads"] = "El Cruce" +L["Cursor"] = "Cursor" +L["Cursor Left"] = "Cursor izquierdo" +L["Cursor Right"] = "Cursor derecho" +L["D"] = "C" +L["Darkmoon Faire"] = "Feria de la Luna Negra" +L["Darkshire"] = "Villa Oscura" +L["Darkshore"] = "Costa Oscura" +L["Deadmines"] = "Minas de la Muerte" +L["Deadwind Pass"] = "Paso de la Muerte" +L["Desolace"] = "Desolace" +L["Dire Maul"] = "La Masacre" +L["Disable bag automation"] = "Bolsas" +L["Disable chat fade"] = "Desvanecimiento" +L["Disable loot warnings"] = "Advertencias del botín" +L["Disable screen effects"] = "Efectos de pantalla" +L["Disable screen glow"] = "Brillo de pantalla" +L["Disable sticky chat"] = "Chat pegajoso" +L["Drag the frame overlay to position the frame."] = "Arrastra la superposición del marco para colocar el marco." +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "Arrastra la superposición de los marco para colocar los marcos.|n|nPara cambiar la escala de un marco, haga clic para seleccionarlo y luego ajuste el control deslizante de escala.|n|nEste panel se cerrará automáticamente si entras en combate." +L["Drag to set the buffs frame scale."] = "Arrastra para establecer la escala del marco de los bufos." +L["Drag to set the cursor X offset."] = "Arrastra para establecer el desplazamiento del cursor X." +L["Drag to set the cursor Y offset."] = "Arrastra para establecer el desplazamiento del cursor Y." +L["Drag to set the density of weather effects."] = "Arrastra para establecer la densidad de los efectos entornos." +L["Drag to set the font size of book text."] = "Arrastra para establecer el tamaño de fuente del texto de libro." +L["Drag to set the font size of mail text."] = "Arrastra para establecer el tamaño de fuente del texto de correo." +L["Drag to set the font size of quest text."] = "Arrastra para establecer el tamaño de fuente del texto de misión." +L["Drag to set the scale of the Leatrix Plus panel."] = "Arrastra para establecer la escala del panel Leatrix Plus." +L["Drag to set the scale of the selected frame."] = "Arrastra para establecer la escala del marco seleccionado." +L["Drag to set the size of the bottom border."] = "Arrastra para establecer el tamaño del borde inferior." +L["Drag to set the size of the left border."] = "Arrastra para establecer el tamaño del borde izquierdo." +L["Drag to set the size of the right border."] = "Arrastra para establecer el tamaño del borde derecho." +L["Drag to set the size of the top border."] = "Arrastra para establecer el tamaño del borde superior." +L["Drag to set the tooltip scale."] = "Arrastra para establecer la escala del tooltip." +L["Drag to set the transparency of the borders."] = "Arrastra para establecer la transparencia de los bordes." +L["Drag to set the transparency of the Leatrix Plus panel."] = "Arrastra para establecer la transparencia del panel Leatrix Plus." +L["Drag to size"] = "Arrastra para ajustar el tamaño" +L["Dun Morogh"] = "Dun Morogh" +L["Dungeons"] = "Calabozos" +L["Dup ID"] = "ID Copia" +L["durability"] = "durabilidad" +L["Durability"] = "Durabilidad" +L["Durotar"] = "Durotar" +L["Duskwood"] = "Bosque del Ocaso" +L["Dustwallow Marsh"] = "Marjal Revolcafango" +L["Eastern Kingdoms"] = "Reinos del Este" +L["Eastern Plaguelands"] = "Tierras de la Peste del Este" +L["Easy item destroy"] = "Fácil eliminación de objetos" +L["ELITE"] = "ÉLITE" +L["Elwynn Forest"] = "Bosque de Elwynn" +L["Enable viewport"] = "Vista de ventana" +L["Enhance dressup"] = "Probador" +L["Enhance minimap"] = "Minimapa" +L["Enhance professions"] = "Profesiones" +L["Enhance quest log"] = "Registro de misiones" +L["Enhance tooltip"] = "Tooltip" +L["Enhance trainers"] = "Instructores" +L["Enhancements"] = "Mejoras" +L["Enter"] = "Entrar" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "Entra la ID de hechizo para los iconos de reutilización que desea ver.|n|nSi normalmente aparece un icono de reutilización debajo del marco de la mascota, marca la casilla de verificación mascota.|n|Los iconos de reutilización se guardan en tu clase." +L["enter zone or track name"] = "entra zona o rastrea el nombre" +L["Error messages will be hidden"] = "Mensajes de error se ocultarán" +L["Error messages will be shown"] = "Mensajes de error se mostrarán" +L["Events"] = "Eventos" +L["Everlook"] = "Vista Eterna" +L["Eversong Woods"] = "Bosque Cancion Eterna" +L["Extras"] = "Excesos" +L["False"] = "Falso" +L["Faster auto loot"] = "Despojar rápido" +L["Faster movie skip"] = "Saltar película rápido" +L["Feathermoon"] = "Plumaluna" +L["Features"] = "Caracteristicas" +L["Felwood"] = "Frondavil" +L["Feralas"] = "Feralas" +L["Fight for Warsong Gulch"] = "Lucha por Garganta Grito de Guerra" +L["Find Item"] = "Buscar objeto" +L["Firewing Signets"] = "Sellos Ala de Fuego" +L["Flame Crest"] = "Peñasco Llamarada" +L["For Great Honor"] = "Cuestión de honor" +L["Frames"] = "Marcos" +L["Freewind Post"] = "Poblado Viento Libre" +L["Frostmaul E'ko"] = "E'ko de los Machacahielo" +L["Frostsaber E'ko"] = "E'ko de sable de hielo" +L["Game Options"] = "Opciones de juego" +L["Ghost"] = "Fantasma" +L["Ghostlands"] = "Tierras Fantasmas" +L["Gloomy"] = "Melancólico" +L["Gnomeregan"] = "Gnomeregan" +L["Gold Only"] = "Solo oro" +L["Graphics and Sound"] = "Gráficos y sonido" +L["Groups"] = "Grupos" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "Las monedas Gurubashi, Vilrama y Secacorteza" +L["H"] = "H" +L["Hammerfall"] = "Sentencia" +L["Haunted"] = "Encantado" +L["Hellfire Peninsula"] = "Península del Fuego Infernal" +L["Hellfire Ramparts"] = "Murallas del Fuego Infernal" +L["Helm"] = "Cabeza" +L["Help"] = "Ayuda" +L["Hide chat buttons"] = "Botones de chat" +L["Hide cooldown duration numbers (if enabled)"] = "Ocultar números de reutilización (si habilitado)" +L["Hide error messages"] = "Mensajes de error" +L["Hide gryphons"] = "Grifos" +L["Hide portrait numbers"] = "Números del retrato" +L["Hide stance bar"] = "Barra de actitud" +L["Hide the combat log"] = "Registro de combate" +L["Hide the zone text bar"] = "Ocultar texto de zona" +L["Hide the zoom buttons"] = "Ocultar los botones de acercar/alejar" +L["Hide tooltips for world units during combat"] = "Ocultar tooltips para unidades del mundo si estés en combate" +L["Hide zone text"] = "Texto de zona" +L["High"] = "Alto" +L["Hillsbrad Foothills"] = "Laderas de Trabalomas" +L["Hinterlands"] = "Tierras del Interior" +L["Home"] = "Principal" +L["Hyjal Summit"] = "La Cima Hyjal" +L["Ice Thistle E'ko"] = "E'ko de los Cardo Nevado" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "Si está seleccionado, se mostrará un cuadro de búsqueda de bolsas en el marco de la mochila y el marco del banco." +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "Si está seleccionado, se agregará un botón a la información del personaje que mostrará la durabilidad de su equipo cuando pase el puntero sobre él.|n|nAdemás, se mostrará un porcentaje general en el marco del chat cuando muera." +L["If checked, a master volume slider will be shown in the character frame."] = "Si está seleccionado, se mostrará un control deslizante de volumen maestro en la información del personaje." +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "Si está seleccionado, se agregará funcionalidad adicional a la casa de subastas.|n|nSolo compra: cree subastas de compra sin completar el precio inicial.|n|nSolo oro: establezca los precios del cobre y la plata en 99 para acelerar las nuevas subastas.|n|nBuscar objeto: busca en la casa de subastas el objeto que estás vendiendo.|n|nAdemás, la configuración de duración de la subasta se guardará en toda la cuenta." +L["If checked, alert frames will not be shown."] = "Si está seleccionado, no se mostrarán los marcos de alerta." +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Si está seleccionado, todos los objetos de calidad pobre en sus bolsas se venderán automáticamente cuando visite a un mercader.|n|nPuede mantener presionada la tecla shift cuando hable con un mercader para anular esta configuración." +L["If checked, available quests will be accepted automatically."] = "Si está seleccionado, las misiones disponibles se aceptarán automáticamente." +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "Si está seleccionado, los fondos se teñirán de azul (amigable) o rojo (hostil)." +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "Si está seleccionado, las solicitudes de amistad de BattleTag y Real ID se rechazarán automáticamente.|n|nHabilitar esta opción rechazará automáticamente cualquier solicitud pendiente." +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "Si está seleccionado, los botones del marco de chat estarán ocultos.|n|nAl hacer clic en las pestañas de chat, se mostrarán automáticamente los últimos mensajes.|n|nUsa la rueda del ratón para desplazarse por el historial de chat. Mantenga presionada la tecla shift para saltar de página o Ctrl para saltar a la parte superior o inferior del historial de chat." +L["If checked, chat text will not fade out after a time period."] = "Si está seleccionado, el texto del chat no se desvanecerá después de un período de tiempo." +L["If checked, class coloring will be used in the player frame, target frame and focus frame."] = "Si está marcada, se utilizará el color de la clase en el marco del jugador, en el marco del objetivo y en el marco de enfoque." +L["If checked, class colors will be used in the chat frame."] = "Si está seleccionado, los colores de la clase se usarán en el marco del chat." +L["If checked, completed quests will be turned-in automatically."] = "Si está seleccionado, las misiones completadas se entregarán automáticamente." +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "Si está seleccionado, las confirmaciones ya no aparecerán cuando elija una opción de botín o cuando intente vender o enviar un objeto comercializable." +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "Si está seleccionado, los números de reutilización no se mostrarán sobre el hechizo.|n|nSi no está marcado, los números de reutilización se mostrarán sobre el hechizo si están habilitados en el panel de opciones del juego (menú 'Barras de Acción')." +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "Si está seleccionado, se ocultarán los números de daño y sanación en los marcos de retrato de jugador y mascota." +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "Si está seleccionado, arrastrando la pestaña de chat General mientras el marco de chat está bloqueado expandirá el marco de chat hacia arriba.|n|nSi el marco de chat está desbloqueado, arrastrando la pestaña de chat General se moverá el marco de chat." +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "Si está seleccionado, los sonidos de emoción se silenciarán mientras tu personaje esté descansando o en El Tragapenas.|n|nLos sonidos de emoción se habilitarán en cualquier otro momento." +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "Si está seleccionado, las placas identificativas del enemigo se mostrarán durante el combate y se ocultarán cuando finalice el combate." +L["If checked, guild ranks will be shown for players in your guild."] = "Si está seleccionado, los rangos de la hermandad se mostrarán para los jugadores de tu hermandad." +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "Si está seleccionado, las casillas de alternar cabeza y espalda se mostrarán en la información del personaje.|n|nPuede mantener presionada la tecla shift y hacer clic con el botón derecho en las casillas de verificación para cambiar de visualización." +L["If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman."] = "Si se marca, los sonidos de los eventos festivos se silenciarán.|n|nEsto se aplica a Jinete decapitado." +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "Si está seleccionado, la mayoría de los mensajes de error (como 'No tienes suficiente ira') no se mostrarán. Se excluyen algunos errores importantes.|n|nSi tiene habilitado el botón de minimapa, puede mantener presionada la tecla de control y hacer clic con el botón derecho para alternar los mensajes de error sin afectar esta configuración." +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "Si está seleccionado, el chat de banda y el chat de instancia serán de color azul (para que coincida con el color predeterminado del chat del grupo)." +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "Si está seleccionado, la ID de hechizo se mostrarán en el tooltip del icono de buff ubicado en el marco de buff y debajo del marco de objetivo." +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "Si está seleccionado, el chat pegajoso se deshabilitará.|n|nTenga en cuenta que esto no se aplica a las ventanas de chat temporales." +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "Si está seleccionado, las solicitudes de invocación serán aceptadas automáticamente a menos que estés en combate." +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "Si está seleccionado, la lista de addons (accesible desde el menú del juego) mostrará addons basados en personajes de forma predeterminada." +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "Si está seleccionado, el tiempo que se tarda en despojar automáticamente a las criaturas se reducirá significativamente." +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "Si está seleccionado, el botón de limpieza de la mochila y el botón de limpieza del marco del banco no se mostrarán." +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "Si está seleccionado, el botón para alternar el marco del contenedor de banda se mostrará justo encima del marco de administración de banda (lado izquierdo de la pantalla) en lugar de en el marco de administración de banda en sí.|n|nEsto le permite alternar el marco del contenedor de banda sin necesidad de abrir el marco de administración de banda." +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "Si está seleccionado, el registro de combate estará oculto.|n|nEl registro de combate debe estar acoplado para que esta opción funcione.|n|nSi el registro de combate está desacoplado, puedes acoplarlo arrastrando la pestaña (y recargando tu IU) o restableciendo las ventanas de chat (desde el menú de chat)." +L["If checked, the editbox will be moved to the top of the chat frame."] = "Si está seleccionado, el cuadro de edición se moverá a la parte superior del marco de chat." +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "Si está seleccionado, la pantalla gris de la muerte y el efecto del inframundo se deshabilitarán." +L["If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted."] = "Si está seleccionado, el sonido del botón de la interfaz, el sonido del clic de la pestaña del marco del chat y el sonido de alternancia del menú del juego se silenciarán." +L["If checked, the main bar gryphons will not be shown."] = "Si está seleccionado, no se mostrarán los grifos de la barra principal." +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "Si está seleccionado, la cantidad de casillas para bolsas disponibles se mostrará en el icono del botón de la mochila y en el tooltip." +L["If checked, the player frame background will be shown in class color."] = "Si está seleccionado, el fondo del marco del jugador se mostrará en color de clase." +L["If checked, the professions frame will be larger."] = "Si está seleccionado, el marco de profesiones será más grande." +L["If checked, the ready check sound will be muted."] = "Si está seleccionado, el sonido de comprobación de listo se silenciará." +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "Si está seleccionado, el brillo de la pantalla se deshabilitará.|n|nHabilitar esta opción también deshabilitará el efecto de borracho." +L["If checked, the spell fizzle sounds will be muted."] = "Si está seleccionado, los sonidos del hechizo fizzle serán silenciados." +L["If checked, the stance bar will not be shown."] = "Si está seleccionado, la barra de actitud no mostrará." +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "Si está seleccionado, el marco de conversación no se mostrará.|n|nEl marco de conversación normalmente aparece en la parte inferior de la pantalla cuando ciertos PNJs se comunican con usted." +L["If checked, the target frame background will be shown in class color."] = "Si está seleccionado, el fondo del marco de objetivo se mostrará en color de clase." +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "Si está seleccionado, el tooltip estará codificada por colores y podrá modificar la visualización y la escala del tooltip." +L["If checked, the vendor price will be shown in item tooltips."] = "Si está seleccionado, el precio de venta se mostrará en el tooltip del objeto." +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "Si está seleccionado, los botones de acercar/alejar estarán ocultos. Puede usar la rueda del ratón para acercar independientemente de esta configuración." +L["If checked, train sounds will be muted."] = "Si está seleccionado, los sonidos del tren se silenciarán." +L["If checked, unit targets will be shown."] = "Si está seleccionado, se mostrarán los objetivos de la unidad." +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "Si está seleccionado, puede mantener presionada la tecla de control y hacer clic en una pestaña de chat para ver el chat reciente en una ventana fácil de copiar." +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "Si está seleccionado, puede presionar las teclas de flecha para mover el punto de inserción hacia la izquierda y hacia la derecha en el marco del chat.|n|nSi no está marcado, las teclas de flecha utilizarán la configuración predeterminada del teclado." +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "Si está seleccionado, podrá cancelar cinemáticas sin que se le solicite confirmación." +L["If checked, you will be able to change the font size of book text."] = "Si está seleccionado, podrá cambiar el tamaño de fuente del texto de libro." +L["If checked, you will be able to change the font size of quest text."] = "Si está seleccionado, podrá cambiar el tamaño de fuente del texto de misión." +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "Si está seleccionado, podrá cambiar el tamaño de fuente del texto de correo.|n|nEsto no afecta el correo creado con plantillas (como las facturas de la casa de subastas)." +L["If checked, you will be able to change the position and scale of the buffs frame."] = "Si está seleccionado, podrá cambiar la posición y la escala del marco de los bufos." +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "Si está marcado, podrá cambiar la posición y la escala del marco del artilugio.|n|nEl marco del artilugio se usa comúnmente para mostrar las puntuaciones JcJ y los objetivos de seguimiento." +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "Si está seleccionado, podrá crear una ventana de vista. Una ventana de vista agrega bordes negros ajustables alrededor del mundo del juego.|n|nLos bordes se colocan en la parte superior del mundo del juego pero debajo de la interfaz de usuario para que pueda colocar elementos de la interfaz de usuario sobre ellos." +L["If checked, you will be able to customise the minimap."] = "Si está seleccionado, podrá personalizar el minimapa." +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "Si está seleccionado, podrá arrastrar el marco del chat al borde de la pantalla." +L["If checked, you will be able to mute a selection of game sounds."] = "Si está seleccionado, podrá silenciar una selección de sonidos del juego." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "Si está seleccionado, podrá colocar hasta cinco iconos de reutilización sobre el marco del objetivo." +L["If checked, you will be able to reposition the tooltip."] = "Si está seleccionado, podrá reposicionar el tooltip." +L["If checked, you will be able to set the density of weather effects."] = "Si está seleccionado, podrá establecer la densidad de los efectos entornos." +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "Si está seleccionado, podrá mostrar una cadena de élite rara, élite o rara alrededor del marco del jugador." +L["If checked, you will be able to zoom out to a greater distance."] = "Si está seleccionado, podrá alejarse a una distancia mayor." +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "Si está marcado, ya no necesitará escribir eliminar al destruir un objeto de calidad superior.|n|nAdemás, los enlaces de objetos se mostrarán en todas las ventanas de confirmación de eliminación de objetos." +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "Si está seleccionado, liberarás automáticamente después de morir en un campo de batalla.|n|nNo lo liberarás automáticamente si tienes la capacidad de resucitarte a ti mismo." +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "Si está seleccionado, sus bolsas no se abrirán o cerrarán automáticamente cuando interactúe con un mercader, banco o buzón." +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "Si está seleccionado, su historial de chat aumentará a 4096 líneas. Si no está marcado, se usará el valor predeterminado (128 líneas).|n|nHabilitar esta opción puede evitar que se muestre texto de chat durante el inicio de sesión." +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Si está seleccionado, su equipo se reparará automáticamente cuando visite a un mercader adecuado.|n|nPuede mantener presionada la tecla shift cuando hable con un mercader para anular esta configuración." +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "Si está seleccionado, el texto de la zona no se mostrará (por ejemplo, 'Forjaz')." +L["Increase chat history"] = "Aumentar el historial" +L["Interface"] = "Interfaz" +L["Invaders of Alterac Valley"] = "Invasores del Valle de Alterac" +L["Invalid console variable."] = "Consola variable inválida." +L["Invalid parameter."] = "Parámetro inválido" +L["Invalid quest ID."] = "ID de misión inválida" +L["Invalid sound ID"] = "ID de sonido inválida" +L["Invalid taint level."] = "Nivel de contaminación inválido." +L["Invalid target."] = "Objetivo inválido" +L["Invite from whispers"] = "Invitación de susurros" +L["Ironforge"] = "Forjaz" +L["Kalimdor"] = "Kalimdor" +L["Karazhan"] = "Karazhan" +L["Keyword"] = "Palabra clave" +L["Lakeshire"] = "Villa del Lago" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "Leatrix Plus no sobrescribirá LeaPlusDB en el próximo cierre de sesión." +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX PLUS: ¡VERSIÓN INCORRECTA INSTALADA!" +L["Left"] = "Izquierdo" +L["Lifetime honorable kills"] = "Muertes con honor de vida" +L["Light's Hope Chapel"] = "Capilla de la Esperanza de la Luz" +L["Loch Modan"] = "Loch Modan" +L["Lockout sharing"] = "Bloquear compartiendo" +L["Low"] = "Bajo" +L["Magic"] = "Magia" +L["Magisters' Terrace"] = "Bancal del Magister" +L["Main Titles"] = "Títulos principales" +L["Manage buffs"] = "Gestionar bufos" +L["Manage focus"] = "Gestionar enfoque" +L["Manage frames"] = "Gestionar marcos" +L["Manage widget"] = "Gestionar artilugio" +L["Managed by Leatrix Plus"] = "Gestionado por LeatrixPlus" +L["Map"] = "Mapa" +L["Maraudon"] = "Maraudon" +L["Marks of Kil'jaeden"] = "Marcas de Kil'jaeden" +L["Marks of Sargeras"] = "Marcas de Sargeras" +L["Marshal's Refuge"] = "Refugio de Marshal" +L["Max camera zoom"] = "Distancia máxima de cámara" +L["Mechanics"] = "Mecánicas" +L["Media"] = "Media" +L["Medium"] = "Medio" +L["Memory Usage"] = "Uso de Memoria" +L["Menethil Harbor"] = "Puerto de Menethil" +L["message shown."] = "mensaje mostrado." +L["Messages"] = "Mensajes" +L["messages shown."] = "mensajes mostrados." +L["Missing console variable."] = "Falta variable de consola" +L["Missing mount name."] = "Falta nombre de montura" +L["Missing movie ID."] = "Falta ID de película" +L["Missing quest ID."] = "Falta ID de hechizo" +L["Missing sound file parameter."] = "Falta el parámetro del archivo de sonido." +L["Missing sound ID."] = "Falta ID de sonido." +L["Molten Core"] = "Núcleo de Magma" +L["Moonglade"] = "Claro de la Luna" +L["More Firewing Signets"] = "Más sellos Ala de Fuego" +L["More Marks of Kil'jaeden"] = "Más marcas de Kil'jaeden" +L["More Marks of Sargeras"] = "Más marcas de Sargeras" +L["More Sunfury Signets"] = "Más sellos Furia del Sol" +L["Morgan's Vigil"] = "Vigilia de Morgan" +L["Mount not found."] = "No se busca montura." +L["Move editbox to top"] = "Cuadro de edición" +L["Movie not playable."] = "Película no jugable." +L["Movie number"] = "Número de la película" +L["Movies"] = "Películas" +L["Mulgore"] = "Mulgore" +L["Music"] = "Música" +L["Musical Moments"] = "Momentos musicales" +L["Mute game sounds"] = "Silenciar los sonidos del juego" +L["Mystery"] = "Misterio" +L["Nagrand"] = "Nangrand" +L["Narration"] = "Narración" +L["Naxxramas"] = "Naxxramas" +L["Nethergarde Keep"] = "Castillo de Nethergarde" +L["Netherstorm"] = "Tormenta Abisal" +L["Nijel's Point"] = "Punta de Nijel" +L["No bad sound IDs found."] = "No se encontraron ID de sonido inválidos." +L["No help is available for this page."] = "No hay ayuda disponible para esta página." +L["No items with durability equipped."] = "No hay objetos con durabilidad equipados." +L["No media duplicates found."] = "No se encontraron duplicados de medios." +L["No tooltip showing."] = "No se muestra tooltip." +L["None"] = "Ninguno" +L["Not completed."] = "No completado." +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "¡AVISO!|nDebe reiniciar completamente su cliente de juego antes de poder usar esta versión de Leatrix Plus." +L["Nude"] = "Nudo" +L["Old Hillsbrad Foothills"] = "Antiguas Laderas de Trabalomas" +L["Onyxia's Lair"] = "Guarida de Onyxia" +L["or click the minimap button to open Leatrix Plus."] = "o haga clic el botón minimapa para abrir Leatrix Plus." +L["Orgrimmar"] = "Orgrimmar" +L["Outland"] = "Terrallende" +L["Overall"] = "Todo" +L["Overlay"] = "Superposición" +L["Particle density"] = "Densidad de particula" +L["Party from friends"] = "Grupo de amigos" +L["Pet"] = "Mascota" +L["Player"] = "Jugador" +L["Power"] = "Poder" +L["Press CTRL/C to copy."] = "Pulsa Ctrl+C para copiar." +L["Queue from friends"] = "Cola de amigos" +L["R"] = "B" +L["Ragefire Chasm"] = "Sima Ígnea" +L["Raid"] = "Banda" +L["Raid frame toggle"] = "Marco de banda" +L["Random"] = "Aleatorio" +L["RARE"] = "RARO" +L["RARE ELITE"] = "ÉLITE RARO" +L["Ratchet"] = "Trinquete" +L["Razorfen Downs"] = "Zahúrda Rajacieno" +L["Razorfen Kraul"] = "Horado Rajacieno" +L["Recent chat window"] = "Chat reciente" +L["Redridge Mountains"] = "Montañas Crestagrana" +L["Refuge Pointe"] = "Refugio de la Zaga" +L["Release in PvP"] = "Liberar espíritu en JcJ" +L["Reload"] = "Recargar" +L["Remember Alterac Valley!"] = "¡Recuerda el Valle de Alterac!" +L["Repair automatically"] = "Reparar" +L["Repaired for"] = "Reparado por" +L["Reposition the tooltip"] = "Reposicionar el tooltip" +L["Requires UI reload."] = "Requiere recargar la IU." +L["Reset"] = "Restablecer" +L["Resize book text"] = "Texto de libro" +L["Resize mail text"] = "Texto de correo" +L["Resize quest text"] = "Texto de misión" +L["Resize Screen"] = "Redimensionar pantalla" +L["Rested bubbles"] = "Burbujas descansadas" +L["result"] = "resultado" +L["results"] = "resultados" +L["Revantusk Village"] = "Poblado Sañadiente" +L["Right"] = "Derecho" +L["Right-click to close"] = "Haga clic derecho para cerrar" +L["Right-click to close."] = "Haga clic derecho para cerrar." +L["right-click to go back"] = "haga clic derecho para volver" +L["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj" +L["Rut'theran Village"] = "Aldea Rut'theran" +L["Sacred"] = "Sagrado" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "Las monedas Furiarena, Machacacráneos y Sangrapellejo" +L["Scale"] = "Escala" +L["Scarlet Monastery"] = "Monasterio Escarlata" +L["Scholomance"] = "Scholomance" +L["Search"] = "Buscar" +L["Searing Gorge"] = "La Garganta de Fuego" +L["Select the settings that you want to use."] = "Selecciona la configuración que desea usar." +L["Selection of music tracks"] = "Selección de pistas de música" +L["Self Markers Allowed"] = "Auto marcadores permitidos" +L["Self Markers Blocked"] = "Auto marcadores bloqueados" +L["Sell junk automatically"] = "Vender objetos pobres" +L["SELLING JUNK"] = "Vendiendo objetos pobres" +L["Sentinel Hill"] = "Colina del Centinela" +L["Set weather density"] = "Densidad del entorno" +L["Settings"] = "Configuración" +L["Shaders"] = "Sombreadores" +L["Shadowfang Keep"] = "Castillo de Colmillo Oscuro" +L["Shadowmoon Valley"] = "Valle Sombraluna" +L["Shadowprey Village"] = "Aldea Cazasombras" +L["Shardtooth E'ko"] = "E'ko Dentoesquirla" +L["Show auction controls"] = "Subasta" +L["Show bag search box"] = "Búsqueda de bolsas" +L["Show character addons"] = "Addons del personaje" +L["Show cooldowns"] = "Reutilización" +L["Show cooldowns above the player frame"] = "Mostrar tiempos de reutilización sobre el marco del jugador" +L["Show durability status"] = "Durabilidad" +L["Show free bag slots"] = "Casillas de bolsas vacías" +L["Show guild names"] = "Mostrar nombres de hermandad" +L["Show guild ranks for your guild"] = "Mostrar rangos de hermandad para tu hermandad" +L["Show minimap button"] = "Botón del minimapa" +L["Show player chain"] = "Cadena de jugador" +L["Show player frame in class color"] = "Mostrar marco de jugador en color de clase" +L["Show raid button"] = "Mostrar botón de banda" +L["Show the spell ID in buff icon tooltips"] = "Mostrar ID de hechizo en tooltips del icono de buff" +L["Show unit targets"] = "Mostrar objetivos de unidad" +L["Show vanity controls"] = "Vanidad" +L["Show vendor price"] = "Precio de venta" +L["Show volume slider"] = "Volumen" +L["Show Wowhead links"] = "Enlaces de Wowhead" +L["Silence rested emotes"] = "Emociones de descanso" +L["Silithus"] = "Silithus" +L["Silverpine Forest"] = "Bosque de Argénteos" +L["Single Mark of Sargeras"] = "Marca de Sargeras única" +L["Single Sunfury Signet"] = "Sello Furia del Sol único" +L["Social"] = "Social" +L["Sold junk for"] = "Objetos pobres vendido por" +L["Sound system restarted."] = "Sistema de sonido reiniciado." +L["Southshore"] = "Costasur" +L["Spell ID"] = "ID de hechizo" +L["Splintertree Post"] = "Puesto del Hachazo" +L["Spooky"] = "Escalofriante" +L["Stockade"] = "Las Mazmorras" +L["Stonard"] = "Rocal" +L["Stonetalon Mountains"] = "Sierra Espolón" +L["Stonetalon Peak"] = "Cima del Espolón" +L["Stop"] = "Parar" +L["Stormwind"] = "Ventormenta" +L["Stranglethorn Vale"] = "Vega de Tuercespina" +L["Stratholme"] = "Stratholme" +L["Sun Rock Retreat"] = "Refugio Roca del Sol" +L["Sunfury Signets"] = "Sellos Furia del Sol" +L["Sunken Temple"] = "Templo Sumergido" +L["Sunwell Plateau"] = "Meseta de la Fuente del Sol" +L["Support"] = "Soporte" +L["Swamp"] = "Pantano" +L["Swamp of Sorrows"] = "Pantano de las Penas" +L["System"] = "Sistema" +L["Tabard"] = "Tabardo" +L["Taint level: Basic (1)."] = "Nivel de contaminación: básico (1)." +L["Taint level: Disabled (0)."] = "Nivel de contaminación: deshabilitado (0)." +L["Taint level: Full (2)."] = "Nivel de contaminación: lleno (2)." +L["Talonbranch Glade"] = "Claro Ramaespolón" +L["Talrendis Point"] = "Punta Talrendis" +L["Tanaris"] = "Tanaris" +L["Target"] = "Objetivo" +L["Target Tracking Disabled"] = "Rastreo de objetivo se ha deshabilitado" +L["Target Tracking Enabled"] = "Rastreo de objetivo se ha habilitado" +L["Tarren Mill"] = "Molino Tarren" +L["Teldrassil"] = "Teldrassil" +L["Tempest Keep"] = "El Castillo de la Tempestad" +L["Temple of Ahn'Qiraj"] = "Templo de Ahn'Qiraj" +L["Temple of Atal'Hakkar"] = "Templo de Atal'Hakkar" +L["Ten Years of Warcraft"] = "Diez años de Warcraft" +L["Terokkar Forest"] = "Bosque de Terrokar" +L["Text"] = "Texto" +L["Text size"] = "Tamaño de texto" +L["Text Size"] = "Tamaño de texto" +L["The Sepulcher"] = "El Sepulcro" +L["The summon from"] = "La invocación de" +L["Themes"] = "Temas" +L["This panel will close automatically if you enter combat."] = "Este panel se cerrará automáticamente si entras en combate." +L["Thorium Point"] = "Puesto del Torio" +L["Thousand Needles"] = "Las Mil Agujas" +L["Thunder Bluff"] = "Cima del Trueno" +L["Timer"] = "Temporizador" +L["Tirisfal Glades"] = "Claros de Tirisfal" +L["To begin, choose an options page."] = "Para comenzar, elija una pestaña de opciones." +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "Para ocultar el registro de combate, debes deshabilitar el módulo de chat en ElvUI." +L["To use the Find Item button, you need to deselect the WoW Token category."] = "Para usar el botón Buscar objeto, debe anular la selección de la categoría Token de WoW." +L["Tooltip"] = "Tooltip" +L["Tooltip title color"] = "Color de título del tooltip" +L["Top"] = "Superior" +L["Top Center"] = "Central Superior" +L["Tracing started."] = "El seguimiento comenzó." +L["Tracing stopped."] = "El seguimiento se detuvo." +L["Transparency"] = "Transparencia" +L["True"] = "Cierto" +L["Turn-in completed quests automatically"] = "Entregar misiones completadas automáticamente" +L["Uldaman"] = "Uldaman" +L["Unclamp chat frame"] = "Desbloquear el marco" +L["Undercity"] = "Entrañas" +L["Un'Goro Crater"] = "Cráter de Un'Goro" +L["Universal group color"] = "Color de grupo universal" +L["Use arrow keys in chat"] = "Teclas de flecha" +L["Use class colors in chat"] = "Colores de clase" +L["Use easy resizing"] = "Cambio de tamaño" +L["Value must be a number."] = "Valor debe ser un número." +L["Various"] = "Varios" +L["Vendors"] = "Vendedores" +L["Version"] = "Versión" +L["Very Low"] = "Muy Bajo" +L["Video"] = "Vídeo" +L["Visibility"] = "Visibilidad" +L["Wailing Caverns"] = "Cuevas de los Lamentos" +L["was automatically declined."] = "fue rechazado automáticamente." +L["Weather density"] = "Densidad del entorno" +L["Welcome to Leatrix Plus."] = "Bienvenido a Leatrix Plus" +L["Western Plaguelands"] = "Tierras de la Peste del Oeste" +L["Westfall"] = "Páramos de Poniente" +L["Wetlands"] = "Los Humedales" +L["Widget"] = "Artilugio" +L["Wildkin E'ko"] = "E'ko de lechúcico salvaje" +L["will be automatically accepted in 10 seconds unless cancelled."] = "será aceptado automáticamente en 10 segundos a menos que se cancele." +L["Winter"] = "Invierno" +L["Winterfall E'ko"] = "E'ko Nevada" +L["Winterspring"] = "Cuna del Invierno" +L["World of Warcraft"] = "World of Warcraft" +L["X Offset"] = "Compensación X" +L["Y Offset"] = "Compensación Y" +L["YOU"] = "Tú" +L["You cannot do that in combat."] = "No puedes hacerlo mientras estés en combate." +L["You have"] = "Tienes" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "Su IU necesita ser recargada para que algunos de los cambios surtan efecto.|n|nNo tiene que hacer clic en el botón de recarga de inmediato, pero debe hacer clic en él cuando haya terminado de hacer cambios y desea que los cambios surtan efecto." +L["Your UI needs to be reloaded."] = "Tiene que recargar la IU." +L["Zangarmarsh"] = "Zangarmarsh" +L["Zones"] = "Zonas" +L["Zoram'gar Outpost"] = "Avanzada de Zoram'gar" +L["Zul'Farrak"] = "Zul'Farrak" +L["Zul'Gurub"] = "Zul'Gurub" +L["Zulian, Razzashi, and Hakkari Coins"] = "Las monedas Zulian, Razzashi y Hakkari" +L["Zygor addon not found."] = "No se encuentra el addon Zygor." + +end + +-- frFR: French +if GameLocale == "frFR" then +L["+"] = "+" +L["A Donation of Mageweave"] = "Un don de tisse-mage" +L["A Donation of Runecloth"] = "Un don d'étoffe runique" +L["A Donation of Silk"] = "Un don de soie" +L["A Donation of Wool"] = "Un don de laine" +L["A friend request from"] = "Une demande de contact de" +L["Accept available quests automatically"] = "Accepter automatiquement les quêtes disponibles" +L["Accept resurrection"] = "Accepter ressuscitation" +L["Accept summon"] = "Accepter invocation" +L["Additional Runecloth"] = "Encore de l'étoffe runique" +L["Addon"] = "Add-on" +L["Aerie Peak"] = "Nid-de-l'Aigle" +L["Ahn'Qiraj"] = "Ahn'Qiraj" +L["Alterac Mountains"] = "Montagnes d'Alterac" +L["Anchor"] = "Ancre" +L["Angelic"] = "Angélique" +L["Arathi Highlands"] = "Hautes-terres d'Arathi" +L["Ashenvale"] = "Orneval" +L["Auto loot is now enabled."] = "La fouille automatique est maintenant activée." +L["AutoFollow"] = "Suivi automatique" +L["AutoFollow disabled."] = "Suivi automatique désactivé" +L["Automate gossip"] = "Automatiser le dialogue" +L["Automate quests"] = "Automatiser les quêtes" +L["Automation"] = "Automatisation" +L["Azshara"] = "Azshara" +L["Azuremyst Isle"] = "Île de Brume-Azur" +L["Back to Main Menu"] = "Retour au menu principal" +L["Bad ID"] = "ID incorrect" +L["Badlands"] = "Terres ingrates" +L["Barrens"] = "Les Tarides" +L["Battle"] = "Bataille" +L["Battle of Warsong Gulch"] = "La bataille du goulet des Warsong" +L["Battlegrounds"] = "Champs de bataille" +L["Black Morass"] = "Le Noir marécage" +L["Black Temple"] = "Le Temple noir" +L["Blackfathom Deeps"] = "Profondeurs de Brassenoire" +L["Blackrock Depths"] = "Profondeurs de Blackrock" +L["Blackwing Lair"] = "Repaire de l'Aile noire" +L["Blade's Edge Mountains"] = "Les Tranchantes" +L["Blasted Lands"] = "Terres foudroyées" +L["Block duels"] = "Duels" +L["Block friend requests"] = "Demandes de contact" +L["Block party invites"] = "Invitations de groupe" +L["Blocks"] = "Bloquer" +L["Bloodmyst Isle"] = "Île de Brume-Sang" +L["Booty Bay"] = "Baie-du-Butin" +L["Bottom"] = "Bas" +L["Brackenwall Village"] = "Mur-de-Fougères" +L["Buffs"] = "Buffs" +L["Burning Steppes"] = "Steppes ardentes" +L["Buyout Only"] = "Acheter seulement" +L["by Leatrix Plus"] = "par Leatrix Plus" +L["C"] = "C" +L["Camera distance"] = "Distance de la caméra" +L["Cannot announce in this zone."] = "Impossible d'annoncer dans cette zone." +L["Cannot find General chat channel."] = "Impossible de trouver le canal de discussion général." +L["Cenarion Hold"] = "Fort Cénarien" +L["Chain style"] = "Style de chaîne" +L["Character"] = "Personnage" +L["Chat"] = "Discussion" +L["Chat Frame"] = "Cadre de discussion" +L["Checkbox labels are Ok."] = "Les étiquettes des cases à cocher sont correctes." +L["Chillwind Camp"] = "Camp du Noroît" +L["Chillwind E'ko"] = "L'E'ko de Noroît" +L["Cinematics"] = "Cinématique" +L["Claiming Arathi Basin"] = "La revendication du bassin d'Arathi" +L["Class colored frames"] = "Cadres colorés" +L["Class icon portraits"] = "Portraits de classe" +L["Classic"] = "Classique" +L["click here for new selection"] = "cliquez ici pour une nouvelle sélection" +L["Click to configure the settings for this option."] = "Cliquez pour configurer les paramètres de cette option." +L["Click to reset the settings on this page."] = "Cliquez pour réinitialiser les paramètres de cette page." +L["Click to resize the screen to fit between the top and bottom borders."] = "Cliquez pour redimensionner l'écran pour qu'il s'adapte entre les bordures supérieure et inférieure." +L["Click to return to the main menu."] = "Cliquez pour revenir au menu principal." +L["Cloak"] = "Manteau" +L["Coilfang Reservoir"] = "Réservoir de Glissecroc" +L["Combat log cannot be hidden while undocked."] = "Le journal de combat ne peut pas être masqué lorsqu'il n'est pas ancré." +L["Combat plates"] = "Plaques de combat" +L["Completed."] = "Terminé." +L["Concerted Efforts"] = "Des efforts concertés" +L["Configuration Panel"] = "Panneau de configuration" +L["Connections for"] = "Connexions pour" +L["Conquering Arathi Basin"] = "La conquête du bassin d'Arathi" +L["Credits"] = "Crédits" +L["Crossroads"] = "La Croisée" +L["Cursor"] = "Curseur" +L["Cursor Left"] = "Curseur gauche" +L["Cursor Right"] = "Curseur droit" +L["D"] = "D" +L["Darkmoon Faire"] = "Foire de Sombrelune" +L["Darkshire"] = "Sombre-Comté" +L["Darkshore"] = "Sombrivage" +L["Deadmines"] = "Les Mortemines" +L["Deadwind Pass"] = "Défilé de Deuillevent" +L["Desolace"] = "Désolace" +L["Dire Maul"] = "Hache-tripes" +L["Disable bag automation"] = "Sac" +L["Disable chat fade"] = "Fondu de discussion" +L["Disable loot warnings"] = "Avertissements de butin" +L["Disable screen effects"] = "Effets d'écran" +L["Disable screen glow"] = "L'éclat de l'écran" +L["Disable sticky chat"] = "Discussion collante" +L["Drag the frame overlay to position the frame."] = "Faites glisser la superposition de cadre pour positionner le cadre." +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "Faites glisser les superpositions de cadres pour positionner les cadres.|n|nPour modifier l'échelle d'un cadre, cliquez dessus pour le sélectionner, puis ajustez le curseur d'échelle.|n|nCe panneau se fermera automatiquement si vous entrez en combat." +L["Drag to set the buffs frame scale."] = "Faites glisser pour définir l'échelle du cadre des buffs." +L["Drag to set the cursor X offset."] = "Faites glisser pour définir le décalage X du curseur." +L["Drag to set the cursor Y offset."] = "Faites glisser pour définir le décalage Y du curseur." +L["Drag to set the density of weather effects."] = "Faites glisser pour définir la densité des effets météorologiques." +L["Drag to set the font size of book text."] = "Faites glisser pour définir la taille de police du texte du livre." +L["Drag to set the font size of mail text."] = "Faites glisser pour définir la taille de la police du texte du courrier." +L["Drag to set the font size of quest text."] = "Faites glisser pour définir la taille de la police du texte de la quête." +L["Drag to set the scale of the Leatrix Plus panel."] = "Faites glisser pour définir l'échelle du panneau Leatrix Plus." +L["Drag to set the scale of the selected frame."] = "Faites glisser pour définir l'échelle du cadre sélectionné." +L["Drag to set the size of the bottom border."] = "Faites glisser pour définir la taille de la bordure inférieure." +L["Drag to set the size of the left border."] = "Faites glisser pour définir la taille de la bordure gauche." +L["Drag to set the size of the right border."] = "Faites glisser pour définir la taille de la bordure droite." +L["Drag to set the size of the top border."] = "Faites glisser pour définir la taille de la bordure supérieure." +L["Drag to set the tooltip scale."] = "Faites glisser pour définir l'échelle de l'infobulle." +L["Drag to set the transparency of the borders."] = "Faites glisser pour définir la transparence des bordures." +L["Drag to set the transparency of the Leatrix Plus panel."] = "Faites glisser pour définir la transparence du panneau Leatrix Plus." +L["Dun Morogh"] = "Dun Morogh" +L["Dungeons"] = "Donjons" +L["Dup ID"] = "Dup ID" +L["durability"] = "durabilité" +L["Durability"] = "Durabilité" +L["Durotar"] = "Durotar" +L["Duskwood"] = "Bois de la Pénombre" +L["Dustwallow Marsh"] = "Marécage d'Âprefange" +L["Eastern Kingdoms"] = "Royaumes de l'Est" +L["Eastern Plaguelands"] = "Maleterres de l'est" +L["Easy item destroy"] = "Élimination facile des objets" +L["ELITE"] = "ÉLITE" +L["Elwynn Forest"] = "Forêt d'Elwynn" +L["Enable viewport"] = "Activer la fenêtre" +L["Enhance dressup"] = "Cabine d'essayage" +L["Enhance minimap"] = "Minicarte" +L["Enhance professions"] = "Professions" +L["Enhance quest log"] = "Journal des quêtes" +L["Enhance tooltip"] = "Infobulle" +L["Enhance trainers"] = "Maîtres" +L["Enhancements"] = "Améliorations" +L["Enter"] = "Entrer" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "Entrez les ID des sorts pour les icônes de temps de recharge que vous souhaitez voir.|n|nSi une icône de temps de recharge apparaît normalement sous le cadre de le familier, cochez la case de le familier.|n|nLes icônes de temps de recharge sont enregistrées dans votre classe." +L["enter zone or track name"] = "entrer dans la zone ou suivre le nom" +L["Error messages will be hidden"] = "Les messages d'erreur seront masqués" +L["Error messages will be shown"] = "Des messages d'erreur seront affichés" +L["Events"] = "Événements" +L["Everlook"] = "Long-Guet" +L["Eversong Woods"] = "Bois des Chants éternels" +L["Extras"] = "Suppléments" +L["False"] = "Faux" +L["Faster auto loot"] = "La fouille plus rapide" +L["Faster movie skip"] = "Saut de film plus rapide" +L["Feathermoon"] = "Pennelune" +L["Features"] = "Traits" +L["Felwood"] = "Gangrebois" +L["Feralas"] = "Féralas" +L["Fight for Warsong Gulch"] = "La lutte pour le goulet des Warsong" +L["Find Item"] = "Rechercher un objet" +L["Firewing Signets"] = "Les chevalières Aile-de-feu" +L["Flame Crest"] = "Corniche des Flammes" +L["For Great Honor"] = "Pour un grand honneur" +L["Frames"] = "Cadres" +L["Freewind Post"] = "Poste de Librevent" +L["Frostmaul E'ko"] = "L'E'ko de Cognegivre" +L["Frostsaber E'ko"] = "L'E'ko des sabres-de-givre" +L["Game Options"] = "Options de jeu" +L["Ghost"] = "Fantôme" +L["Ghostlands"] = "Les terres Fantômes" +L["Gloomy"] = "Cafardeux" +L["Gnomeregan"] = "Gnomeregan" +L["Gold Only"] = "Or seulement" +L["Graphics and Sound"] = "Graphisme et son" +L["Groups"] = "Groupes" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "Pièces Gurubashi, Vilebranch et Witherbark" +L["H"] = "H" +L["Hammerfall"] = "Trépas-d'Orgrim" +L["Haunted"] = "Hanté" +L["Hellfire Peninsula"] = "Péninsule des Flammes infernales" +L["Hellfire Ramparts"] = "Remparts des Flammes infernales" +L["Helm"] = "Heaume" +L["Help"] = "Aide" +L["Hide chat buttons"] = "Boutons de discussion" +L["Hide cooldown duration numbers (if enabled)"] = "Masquer les numéros de durée de recharge (si activé)" +L["Hide error messages"] = "Messages d'erreur" +L["Hide gryphons"] = "Griffons" +L["Hide portrait numbers"] = "Numéros de portrait" +L["Hide stance bar"] = "Barre de posture" +L["Hide the combat log"] = "Journal de combat" +L["Hide the zone text bar"] = "Masquer la barre de texte de la zone" +L["Hide the zoom buttons"] = "Masquer les boutons de zoom" +L["Hide tooltips for world units during combat"] = "Masquer les infobulles des unités mondiales pendant le combat" +L["Hide zone text"] = "Texte de la zone" +L["High"] = "Haut" +L["Hillsbrad Foothills"] = "Contreforts d'Hillsbrad" +L["Hinterlands"] = "Les Hinterlands" +L["Home"] = "Principal" +L["Hyjal Summit"] = "Sommet d’Hyjal" +L["Ice Thistle E'ko"] = "L'E'ko des Chardon de Glace" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "Si cette option est cochée, une boîte de recherche de sac sera affichée dans le cadre du sac à dos et le cadre de la banque." +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "Si cette option est cochée, un bouton sera ajouté à la feuille de personnage qui montrera la durabilité de votre objet équipé lorsque vous passez le pointeur dessus.|n|nDe plus, un pourcentage global sera affiché dans le cadre de discussion lorsque vous mourrez." +L["If checked, a master volume slider will be shown in the character frame."] = "Si cette option est cochée, un curseur de volume principal sera affiché dans la feuille de personnage." +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "Si cette option est cochée, des fonctionnalités supplémentaires seront ajoutées à l'hôtel des ventes|n|nAcheter seulement - créer des enchères de rachat sans renseigner le prix de départ.|n|nOr uniquement - fixez les prix du cuivre et de l'argent à 99 pour accélérer les nouvelles enchères.|n|nRechercher un objet - recherchez dans l'hôtel des ventes l'objet que vous vendez.|n|nEn outre, le paramètre de durée de l'enchère sera enregistré dans l'ensemble du compte." +L["If checked, alert frames will not be shown."] = "Si cette option est cochée, les cadres d'alerte ne seront pas affichés." +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Si cette option est cochée, tous les objets de qualité médiocre dans vos sacs seront vendus automatiquement lors de votre visite chez un marchand.|n|nVous pouvez maintenir la touche Maj enfoncée lorsque vous parlez à un marchand pour remplacer ce paramètre." +L["If checked, available quests will be accepted automatically."] = "Si cette option est cochée, les quêtes disponibles seront acceptées automatiquement." +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "Si cette option est cochée, les fonds seront teintés en bleu (amical) ou en rouge (hostile)." +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "Si cette option est cochée, les demandes de contact BattleTag et Nom réel seront automatiquement refusées.|n|nL'activation de cette option refusera automatiquement toutes les demandes en attente." +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "Si cette option est cochée, les boutons du cadre de discussion seront masqués.|n|nCliquer sur les onglets de discussion affichera automatiquement les derniers messages.|n|nUtilisez la molette de la souris pour faire défiler l'historique du discussion. Maintenez Maj pour le saut de page ou Ctrl pour sauter vers le haut ou le bas de l'historique de discussion." +L["If checked, chat text will not fade out after a time period."] = "Si cette option est cochée, le texte de discussion ne disparaîtra pas après un certain temps." +L["If checked, class colors will be used in the chat frame."] = "Si cette option est cochée, les couleurs de classe seront utilisées dans le cadre de discussion." +L["If checked, completed quests will be turned-in automatically."] = "Si cette option est cochée, les quêtes terminées seront retournées automatiquement." +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "Si cette option est cochée, les confirmations n'apparaîtront plus lorsque vous choisissez une option de rouleau de butin ou tentez de vendre ou d'envoyer un objet échangeable." +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "Si cette option est cochée, les numéros de durée de temps de recharge ne seront pas affichés au cours des temps de recharge.|n|nSi il n'est pas coché, les numéros de durée des temps de recharge seront affichés au-dessus des temps de recharge s'ils sont activés dans le panneau d'options de jeu (menu 'Barres d'action')." +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "Si cette option est cochée, les nombres de dégâts et de soins dans les cadres de portrait de joueur et du familier seront cachés." +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "Si cette option est cochée, le fait de faire glisser l'onglet Général de discussion alors que le cadre de discussion est verrouillé étendra le cadre de discussion vers le haut.|n|nSi le cadre de discussion est déverrouillé, le fait de faire glisser l'onglet Général de discussion déplace le cadre de discussion." +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "Si cette option est cochée, les sons d'émote seront réduits au silence pendant que votre personnage se repose ou dans Le Sinistre écluseur.|n|nLes sons d'émote seront activés à tout autre moment." +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "Si cette option est cochée, les barres d'info des ennemis seront affichées pendant le combat et cachées à la fin du combat." +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "Si cette option est cochée, les cases à cocher de l'heaume et de la cape seront affichées dans la feuille de personnage.|n|nVous pouvez maintenir la touche Maj enfoncée et cliquer avec le bouton droit sur les cases à cocher pour changer de disposition." +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "Si cette option est cochée, la plupart des messages d'erreur ne seront pas affichés. Certaines erreurs importantes sont exclues.|n|nSi le bouton de la mini-carte est activé, vous pouvez maintenir la touche de contrôle enfoncée et cliquer dessus avec le bouton droit pour basculer les messages d'erreur sans affecter ce paramètre." +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "Si cette option est cochée, la discussion de raid et la discussion d'instance seront tous les deux colorés en bleu (pour correspondre à la couleur de chat du groupe par défaut)." +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "Si cette option est cochée, les ID des sorts seront affichés dans les infobulles des icônes de buff situées dans le cadre du buff et sous le cadre cible." +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "Si cette option est cochée, le chat collant sera désactivé.|n|nNotez que cela ne s'applique pas aux fenêtres de discussion temporaires." +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "Si cette option est cochée, les demandes d'invocation seront acceptées automatiquement, sauf si vous êtes en combat." +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "Si cette option est cochée, la liste des add-ons (accessible depuis le menu du jeu) affichera les add-ons basés sur les personnages par défaut." +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "Si cette option est cochée, le temps qu'il faut pour fouiller automatiquement les créatures sera considérablement réduit." +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "Si cette option est cochée, le bouton de nettoyage du sac à dos et le bouton de nettoyage du cadre de la banque ne seront pas affichés." +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "Si cette option est cochée, le bouton permettant de basculer le cadre du conteneur de raid sera affiché juste au-dessus du cadre de gestion du raid (côté gauche de l'écran) plutôt que dans le cadre de gestion du raid lui-même.|n|nCela vous permet de basculer le cadre du conteneur de raid sans avoir à ouvrir le cadre de gestion du raid." +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "Si cette option est cochée, le journal de combat sera caché.|n|nLe journal de combat doit être ancré pour que cette option fonctionne.|n|nSi le journal de combat n'est pas ancré, vous pouvez l'ancrer en faisant glisser l'onglet (et en rechargeant votre interface utilisateur) ou en réinitialisant les fenêtres de discussion (à partir du menu de discussion)." +L["If checked, the editbox will be moved to the top of the chat frame."] = "Si cette option est cochée, la boîte d'édition sera déplacée en haut du cadre de discussion." +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "Si cette option est cochée, l'écran gris de la mort et l'effet du monde inférieur seront désactivés." +L["If checked, the main bar gryphons will not be shown."] = "Si cette option est cochée, les griffons de la barre principale ne seront pas affichés." +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "Si cette option est cochée, le nombre d'emplacements de sac vides sera affiché dans l'icône du bouton du sac à dos et dans l'infobulle." +L["If checked, the player frame background will be shown in class color."] = "Si cette option est cochée, l'arrière-plan du cadre du joueur sera affiché en couleur de la classe." +L["If checked, the professions frame will be larger."] = "Si cette option est cochée, le cadre des professions sera plus grand." +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "Si cette option est cochée, la lueur de l'écran sera désactivée.|n|nL'activation de cette option désactivera également l'effet de trouble ivre." +L["If checked, the stance bar will not be shown."] = "Si cette option est cochée, la barre de posture ne sera pas affichée." +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "Si cette option est cochée, le cadre parlant ne sera pas affiché.|n|nLe cadre parlant apparaît normalement dans la partie inférieure de l'écran lorsque certains PNJ communiquent avec vous." +L["If checked, the target frame background will be shown in class color."] = "Si cette option est cochée, l'arrière-plan du cadre cible sera affiché dans la couleur de la classe." +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "Si cette option est cochée, l'infobulle sera codée par couleur et vous pourrez modifier la disposition et l'échelle de l'infobulle." +L["If checked, the vendor price will be shown in item tooltips."] = "Si cette option est cochée, le prix marchand sera affiché dans les infobulles des objets." +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "Si cette option est cochée, les boutons de zoom seront masqués. Vous pouvez utiliser la molette pour zoomer quel que soit ce paramètre." +L["If checked, unit targets will be shown."] = "Si cette option est cochée, les cibles des unités seront affichées." +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "Si cette option est cochée, vous pouvez maintenir la touche de contrôle enfoncée et cliquer sur un onglet de discussion pour afficher la discussion récente dans une fenêtre de copie." +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "Si cette option est cochée, vous pouvez appuyer sur les touches fléchées pour déplacer le point d'insertion vers la gauche et la droite dans le cadre de discussion.|n|nSi elle n'est pas cochée, les touches fléchées utiliseront le paramètre de liaison de touches par défaut." +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "Si cette option est cochée, vous pourrez annuler les cinématiques sans être invité à confirmer." +L["If checked, you will be able to change the font size of book text."] = "Si cette option est cochée, vous pourrez modifier la taille de la police du texte du livre." +L["If checked, you will be able to change the font size of quest text."] = "Si cette option est cochée, vous pourrez modifier la taille de la police du texte de la quête." +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "Si cette option est cochée, vous pourrez modifier la taille de police du texte de courrier standard.|n|nCela n'affecte pas le courrier créé à l'aide de modèles (tels que les factures de l'hôtel des ventes)." +L["If checked, you will be able to change the position and scale of the buffs frame."] = "Si cette option est cochée, vous pourrez modifier la position et l'échelle du cadre des buffs." +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "Si cette option est cochée, vous pourrez changer la position et l'échelle du cadre du widget.|n|nLe cadre du widget est couramment utilisé pour afficher les scores JcJ et suivre les objectifs." +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "Si cette option est cochée, vous pourrez créer une fenêtre. Une fenêtre ajoute des bordures noires réglables dans le monde du jeu.|n|nLes bordures sont placées au-dessus du monde du jeu mais sous l'interface utilisateur afin que vous puissiez placer des éléments d'interface sur eux." +L["If checked, you will be able to customise the minimap."] = "Si cette option est cochée, vous pourrez personnaliser la minicarte." +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "Si cette option est cochée, vous pourrez faire glisser le cadre de discussion vers le bord de l'écran." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "Si cette option est cochée, vous pourrez placer jusqu'à cinq icônes de recharge bénéfiques au-dessus du cadre cible." +L["If checked, you will be able to reposition the tooltip."] = "Si cette option est cochée, vous pourrez repositionner l'infobulle." +L["If checked, you will be able to set the density of weather effects."] = "Si cette option est cochée, vous pourrez définir la densité des effets météorologiques." +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "Si cette option est cochée, vous pourrez montrer une chaîne rare, d'élite ou d'élite rare autour du cadre du joueur." +L["If checked, you will be able to zoom out to a greater distance."] = "Si cette option est cochée, vous pourrez effectuer un zoom arrière sur une plus grande distance." +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "Si est cochée, vous n'aurez plus besoin de taper supprimer lors de l'élimination d'un objet de qualité supérieure.|n|nDe plus, les liens d'objets seront affichés dans toutes les fenêtres de confirmation de élimination d'objets." +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "Si cette option est cochée, vous serez automatiquement libéré après votre mort sur un champ de bataille.|n|nVous ne vous libérerez pas automatiquement si vous avez la capacité de ressusciter automatiquement." +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "Si cette option est cochée, vos sacs ne seront pas ouverts ou fermés automatiquement lorsque vous interagissez avec un marchand, une banque ou une boîte aux lettres." +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "Si cette option est cochée, votre historique de discussion passera à 4096 lignes. Si elle n'est pas cochée, la valeur par défaut sera utilisée (128 lignes).|n|nL'activation de cette option peut empêcher certains textes de discussion de s'afficher pendant la connexion." +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Si cette option est cochée, votre équipement sera réparé automatiquement lorsque vous rendrez visite à un marchand approprié.|n|nVous pouvez maintenir la touche Maj enfoncée lorsque vous parlez à un marchand pour remplacer ce paramètre." +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "Si cette option est cochée, le texte de la zone ne sera pas affiché (par exemple, «Ironforge»)." +L["Increase chat history"] = "Augmenter l'historique" +L["Interface"] = "Interface" +L["Invaders of Alterac Valley"] = "Les envahisseurs de la vallée d'Alterac" +L["Invalid console variable."] = "Variable de console non valide." +L["Invalid parameter."] = "Paramètre invalide." +L["Invalid quest ID."] = "ID de quête non valide." +L["Invalid sound ID"] = "ID de son invalide" +L["Invalid taint level."] = "Niveau de souillure non valide." +L["Invalid target."] = "Cible invalide." +L["Invite from whispers"] = "Inviter des chuchotements" +L["Ironforge"] = "Forgefer" +L["Kalimdor"] = "Kalimdor" +L["Karazhan"] = "Échecs de Karazhan" +L["Keyword"] = "Mot-clé" +L["Lakeshire"] = "Comté-du-Lac" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "Leatrix Plus n'écrasera pas LeaPlusDB à la prochaine déconnexion." +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX PLUS: UNE VERSION INCORRECTE EST INSTALLÉE!" +L["Left"] = "Gauche" +L["Lifetime honorable kills"] = "Victoires honorables à vie" +L["Light's Hope Chapel"] = "Chapelle de l'Espoir de Lumière" +L["Loch Modan"] = "Loch Modan" +L["Lockout sharing"] = "Partage de verrouillage" +L["Low"] = "Faible" +L["Magic"] = "Magie" +L["Magisters' Terrace"] = "Terrasse des Magistères" +L["Main Titles"] = "Titres principaux" +L["Manage buffs"] = "Gérer les buffs" +L["Manage frames"] = "Gérer les cadres" +L["Manage widget"] = "Gérer le widget" +L["Managed by Leatrix Plus"] = "Géré par Leatrix Plus" +L["Map"] = "Carte" +L["Maraudon"] = "Maraudon" +L["Marks of Kil'jaeden"] = "Les marques de Kil'jaeden" +L["Marks of Sargeras"] = "Les marques de Sargeras" +L["Marshal's Refuge"] = "Refuge des Marshal" +L["Max camera zoom"] = "Zoom max de la caméra" +L["Mechanics"] = "Mécanique" +L["Media"] = "Médias" +L["Medium"] = "Moyen" +L["Memory Usage"] = "Utilisation de la mémoire" +L["Menethil Harbor"] = "Port de Menethil" +L["message shown."] = "message affiché." +L["messages shown."] = "messages affichés." +L["Missing console variable."] = "Variable de console manquante." +L["Missing mount name."] = "Nom de monture manquant." +L["Missing movie ID."] = "ID de film manquant." +L["Missing quest ID."] = "ID de quête manquant." +L["Missing sound file parameter."] = "Paramètre de fichier son manquant." +L["Missing sound ID."] = "ID de son manquant." +L["Molten Core"] = "Cœur du Magma" +L["Moonglade"] = "Reflet-de-Lune" +L["More Firewing Signets"] = "De nouvelles chevalières Aile-de-feu" +L["More Marks of Kil'jaeden"] = "De nouvelles marques de Kil'jaeden" +L["More Marks of Sargeras"] = "De nouvelles marques de Sargeras" +L["More Sunfury Signets"] = "De nouvelles chevalières Solfurie" +L["Morgan's Vigil"] = "Veille de Morgan" +L["Mount not found."] = "Monture introuvable." +L["Move editbox to top"] = "Boîte d'édition" +L["Movie not playable."] = "Film non jouable." +L["Movie number"] = "Numéro de film" +L["Movies"] = "Films" +L["Mulgore"] = "Mulgore" +L["Music"] = "Musique" +L["Musical Moments"] = "Moments musicaux" +L["Mystery"] = "Mystère" +L["Nagrand"] = "Nagrand" +L["Narration"] = "Narration" +L["Naxxramas"] = "Naxxramas" +L["Nethergarde Keep"] = "Rempart-du-Néant" +L["Netherstorm"] = "Raz-de-Neant" +L["Nijel's Point"] = "Combe de Nijel" +L["No bad sound IDs found."] = "Aucun mauvais ID sonore trouvé." +L["No help is available for this page."] = "Aucune aide n'est disponible pour cette page." +L["No items with durability equipped."] = "Aucun objet avec durabilité équipé." +L["No media duplicates found."] = "Aucun doublon de média trouvé." +L["No tooltip showing."] = "Aucune infobulle ne s'affiche." +L["None"] = "Aucun" +L["Not completed."] = "Pas terminé." +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "AVIS!|nVous devez redémarrer complètement votre client de jeu avant de pouvoir utiliser cette version de Leatrix Plus." +L["Nude"] = "Nu" +L["Old Hillsbrad Foothills"] = "Contreforts de Hautebrande d’antan" +L["Onyxia's Lair"] = "Repaire d'Onyxia" +L["or click the minimap button to open Leatrix Plus."] = "ou cliquez sur le bouton de la mini-carte pour ouvrir Leatrix Maps." +L["Orgrimmar"] = "Orgrimmar" +L["Outland"] = "Outreterre" +L["Overall"] = "Total" +L["Overlay"] = "Superposition" +L["Particle density"] = "Densité de particules" +L["Party from friends"] = "Groupe d'amis" +L["Pet"] = "Familier" +L["Player"] = "Joueur" +L["Power"] = "Puissance" +L["Press CTRL/C to copy."] = "Appuyez sur Ctrl+C pour copier." +L["Queue from friends"] = "File d'attente d'amis" +L["R"] = "R" +L["Ragefire Chasm"] = "Gouffre de Ragefeu" +L["Raid"] = "Raid" +L["Raid frame toggle"] = "Cadre de raid" +L["Random"] = "Aléatoire" +L["RARE"] = "RARE" +L["RARE ELITE"] = "RARE ÉLITE" +L["Ratchet"] = "Cabestan" +L["Razorfen Downs"] = "Souilles de Tranchebauge" +L["Razorfen Kraul"] = "Kraal de Tranchebauge" +L["Recent chat window"] = "Discussion récente" +L["Redridge Mountains"] = "Les Carmines" +L["Refuge Pointe"] = "Refuge de l'Ornière" +L["Release in PvP"] = "Libérer en JcJ" +L["Reload"] = "Recharger" +L["Remember Alterac Valley!"] = "Souvenez-vous de la vallée d'Alterac !" +L["Repair automatically"] = "Réparer" +L["Repaired for"] = "Réparé pour" +L["Reposition the tooltip"] = "Repositionner l'infobulle" +L["Requires UI reload."] = "Nécessite le rechargement de l'interface utilisateur." +L["Reset"] = "Réinitialiser" +L["Resize book text"] = "Texte du livre" +L["Resize mail text"] = "Texte du courrier" +L["Resize quest text"] = "Texte de la quête" +L["Resize Screen"] = "Redimensionner l'écran" +L["Rested bubbles"] = "Bulles reposées" +L["result"] = "résultat" +L["results"] = "résultats" +L["Revantusk Village"] = "Village des Vengebroches" +L["Right"] = "Droit" +L["Right-click to close"] = "Clic droit pour fermer" +L["Right-click to close."] = "Clic droit pour fermer." +L["right-click to go back"] = "clic droit pour revenir" +L["Ruins of Ahn'Qiraj"] = "Ruines d'Ahn'Qiraj" +L["Rut'theran Village"] = "Rut'theran" +L["Sacred"] = "Sacré" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "Pièces Sandfury, Skullsplitter et Bloodscalp" +L["Scale"] = "Échelle" +L["Scarlet Monastery"] = "Monastère écarlate" +L["Scholomance"] = "Scholomance" +L["Search"] = "Chercher" +L["Searing Gorge"] = "Gorge des Vents brûlants" +L["Select the settings that you want to use."] = "Sélectionnez les paramètres que vous souhaitez utiliser." +L["Selection of music tracks"] = "Sélection de morceaux de musique" +L["Self Markers Allowed"] = "Marqueurs auto autorisés" +L["Self Markers Blocked"] = "Auto marqueurs bloqués" +L["Sell junk automatically"] = "Vendre objets médiocre" +L["SELLING JUNK"] = "Vendre des objets de qualité médiocre" +L["Sentinel Hill"] = "Colline des sentinelles" +L["Set weather density"] = "Densité météorologique" +L["Settings"] = "Paramètres" +L["Shaders"] = "Shaders" +L["Shadowfang Keep"] = "Donjon d'Ombrecroc" +L["Shadowmoon Valley"] = "Vallée d’Ombrelune" +L["Shadowprey Village"] = "Proie-de-l'Ombre" +L["Shardtooth E'ko"] = "L'E'ko des Crocs acérés" +L["Show auction controls"] = "Hôtel des ventes" +L["Show bag search box"] = "Recherche de sacs" +L["Show character addons"] = "Add-ons de personnage" +L["Show cooldowns"] = "Temps de recharge" +L["Show cooldowns above the player frame"] = "Afficher les temps de recharge au-dessus du cadre du joueur" +L["Show durability status"] = "Durabilité" +L["Show free bag slots"] = "Emplacements de sac vides" +L["Show guild names"] = "Afficher les noms de guilde" +L["Show minimap button"] = "Bouton de la mini-carte" +L["Show player chain"] = "Chaîne du joueur" +L["Show player frame in class color"] = "Afficher le cadre du joueur dans la couleur de la classe" +L["Show raid button"] = "Afficher le bouton de raid" +L["Show the spell ID in buff icon tooltips"] = "Afficher l'ID du sort dans les infobulles des icônes de buff" +L["Show unit targets"] = "Afficher les cibles des unités" +L["Show vanity controls"] = "Afficher les commandes de vanité" +L["Show vendor price"] = "Prix marchand" +L["Show volume slider"] = "Volume" +L["Show Wowhead links"] = "Liens Wowhead" +L["Silence rested emotes"] = "Emotes reposés" +L["Silithus"] = "Silithus" +L["Silverpine Forest"] = "Forêt des Pins argentés" +L["Single Mark of Sargeras"] = "Une marque de Sargeras" +L["Single Sunfury Signet"] = "Une chevalière Solfurie" +L["Social"] = "Social" +L["Sold junk for"] = "Vendu des objets de qualité médiocre pour" +L["Sound system restarted."] = "Le système audio a redémarré." +L["Spell ID"] = "ID de sort" +L["Splintertree Post"] = "Poste de Bois-Brisé" +L["Spooky"] = "Effrayant" +L["Stockade"] = "La Prison" +L["Stonard"] = "Pierrêche" +L["Stonetalon Mountains"] = "Les Serres-Rocheuses" +L["Stonetalon Peak"] = "Pic des Serres-Rocheuses" +L["Stop"] = "Arrêt" +L["Stormwind"] = "Hurlevent" +L["Stranglethorn Vale"] = "Vallée de Strangleronce" +L["Stratholme"] = "Stratholme" +L["Sun Rock Retreat"] = "Retraite de Roche-Soleil" +L["Sunfury Signets"] = "Les chevalières Solfurie" +L["Sunken Temple"] = "Temple englouti" +L["Sunwell Plateau"] = "Plateau du Puits de soleil" +L["Support"] = "Soutien" +L["Swamp"] = "Marais" +L["Swamp of Sorrows"] = "Marais des Chagrins" +L["System"] = "Système" +L["Tabard"] = "Tabard" +L["Taint level: Basic (1)."] = "Niveau de souillure: basique (1)." +L["Taint level: Disabled (0)."] = "Niveau de souillure: désactivé (0)." +L["Taint level: Full (2)."] = "Niveau de souillure: Complet (2)." +L["Talonbranch Glade"] = "Clairière de Griffebranche" +L["Talrendis Point"] = "Halte de Talrendis" +L["Tanaris"] = "Tanaris" +L["Target"] = "Cible" +L["Target Tracking Disabled"] = "Pistage de cible désactivé" +L["Target Tracking Enabled"] = "Pistage de cible activé" +L["Tarren Mill"] = "Moulin-de-Tarren" +L["Teldrassil"] = "Teldrassil" +L["Tempest Keep"] = "Donjon de la Tempête" +L["Temple of Ahn'Qiraj"] = "Temple d'Ahn'Qiraj" +L["Temple of Atal'Hakkar"] = "Le temple d'Atal'Hakkar" +L["Ten Years of Warcraft"] = "Dix ans de Warcraft" +L["Terokkar Forest"] = "Forêt de Terokkar" +L["Text"] = "Texte" +L["Text size"] = "Taille du texte" +L["Text Size"] = "Taille du texte" +L["The Sepulcher"] = "Le Sépulcre" +L["The summon from"] = "L'invocation de" +L["Themes"] = "Thèmes" +L["This panel will close automatically if you enter combat."] = "Ce panneau se fermera automatiquement si vous entrez en combat." +L["Thorium Point"] = "Halte du Thorium" +L["Thousand Needles"] = "Mille pointes" +L["Timer"] = "Chronomètre" +L["Tirisfal Glades"] = "Clairières de Tirisfal" +L["To begin, choose an options page."] = "Pour commencer, choisissez une page d'options." +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "Pour masquer le journal de combat, vous devez désactiver le module de discussion dans ElvUI." +L["To use the Find Item button, you need to deselect the WoW Token category."] = "Pour utiliser le bouton Rechercher un objet, vous devez désélectionner la catégorie Token WoW." +L["Tooltip"] = "Infobulle" +L["Tooltip title color"] = "Couleur du titre de l'infobulle" +L["Top"] = "Haut" +L["Top Center"] = "Haut Centre" +L["Tracing started."] = "Le traçage a commencé." +L["Tracing stopped."] = "Le traçage s'est arrêté." +L["Transparency"] = "Transparence" +L["True"] = "Vrai" +L["Turn-in completed quests automatically"] = "Retourner automatiquement les quêtes terminées" +L["Uldaman"] = "Uldaman" +L["Unclamp chat frame"] = "Déverrouiller le cadre" +L["Undercity"] = "Fossoyeuse" +L["Un'Goro Crater"] = "Cratère d'Un'Goro" +L["Universal group color"] = "Couleur de groupe universelle" +L["Use arrow keys in chat"] = "Touches fléchées" +L["Use class colors in chat"] = "Couleurs de classe" +L["Use easy resizing"] = "Redimensionnement" +L["Value must be a number."] = "La valeur doit être un nombre." +L["Various"] = "Divers" +L["Vendors"] = "Marchands" +L["Version"] = "Version" +L["Very Low"] = "Très faible" +L["Video"] = "Vidéo" +L["Visibility"] = "Visibilité" +L["Wailing Caverns"] = "Cavernes des lamentations" +L["was automatically declined."] = "a été automatiquement refusé." +L["Weather density"] = "Densité météorologique" +L["Welcome to Leatrix Plus."] = "Bienvenue dans Leatrix Plus." +L["Western Plaguelands"] = "Maleterres de l'ouest" +L["Westfall"] = "Marche de l'Ouest" +L["Wetlands"] = "Les Paluns" +L["Widget"] = "Widget" +L["Wildkin E'ko"] = "L'E'ko des Indomptables" +L["will be automatically accepted in 10 seconds unless cancelled."] = "sera automatiquement accepté dans 10 secondes sauf annulation." +L["Winter"] = "Hiver" +L["Winterfall E'ko"] = "L'E'ko des Tombe-hiver" +L["Winterspring"] = "Berceau-de-l'Hiver" +L["World of Warcraft"] = "World of Warcraft" +L["X Offset"] = "Décalage X" +L["Y Offset"] = "Décalage Y" +L["YOU"] = "VOUS" +L["You cannot do that in combat."] = "Vous ne pouvez pas faire cela au combat." +L["You have"] = "Vous avez" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "Votre interface utilisateur doit être rechargée pour que certaines des modifications prennent effet.|n|nVous n'avez pas besoin de cliquer immédiatement sur le bouton de rechargement, mais vous devez le cliquer lorsque vous avez terminé d'apporter des modifications et que vous souhaitez que les modifications prennent effet." +L["Your UI needs to be reloaded."] = "Votre interface utilisateur doit être rechargée." +L["Zangarmarsh"] = "Marécage de Zangar" +L["Zones"] = "Zones" +L["Zoram'gar Outpost"] = "Avant-poste de Zoram'gar" +L["Zul'Farrak"] = "Zul'Farrak" +L["Zul'Gurub"] = "Zul'Gurub" +L["Zulian, Razzashi, and Hakkari Coins"] = "Pièces zuliennes, razzashi et hakkari" +L["Zygor addon not found."] = "Add-on Zygor introuvable." + +end + +-- itIT: Italian +if GameLocale == "itIT" then + +end + +-- ptBR: Portuguese (Brazil) +if GameLocale == "ptBR" then +L["+"] = "+" +L["A Donation of Mageweave"] = "Uma doação de magitrama" +L["A Donation of Runecloth"] = "Uma doação de runatrama" +L["A Donation of Silk"] = "Uma doação de seda" +L["A Donation of Wool"] = "Uma doação de lã" +L["A friend request from"] = "Uma solicitação de confirmação de amigo de" +L["Accept available quests automatically"] = "Aceitar missões disponíveis automaticamente" +L["Accept resurrection"] = "Aceitar ressuscitação" +L["Accept summon"] = "Aceitar evocação" +L["Additional Runecloth"] = "Runatrama extra" +L["Addon"] = "Addon" +L["Aerie Peak"] = "Ninho da Águia" +L["Ahn'Qiraj"] = "Ahn'Qiraj" +L["Alterac Mountains"] = "Montanhas de Alterac" +L["Anchor"] = "Âncora" +L["Angelic"] = "Angélico" +L["Arathi Highlands"] = "Planalto Arathi" +L["Ashenvale"] = "Vale Gris" +L["Auto loot is now enabled."] = "Saque automático agora está ativado." +L["AutoFollow"] = "Seguir automático" +L["AutoFollow disabled."] = "Seguir automático desativado." +L["Automate gossip"] = "Automatizar diálogo" +L["Automate quests"] = "Automatizar missões" +L["Automation"] = "Automação" +L["Azshara"] = "Azshara" +L["Azuremyst Isle"] = "Ilha Névoa Lazúli" +L["Back to Main Menu"] = "Voltar ao menu principal" +L["Bad ID"] = "ID inválido" +L["Badlands"] = "Ermos" +L["Barrens"] = "Sertões" +L["Battle"] = "Batalha" +L["Battle of Warsong Gulch"] = "Batalha da Ravina Brado Guerreiro" +L["Battlegrounds"] = "Campo de Batalha" +L["Black Morass"] = "Lamaçal Negro" +L["Black Temple"] = "Templo Negro" +L["Blackfathom Deeps"] = "Profundezas Negras" +L["Blackrock Depths"] = "Abismo Rocha Negra" +L["Blackwing Lair"] = "Covil Asa Negra" +L["Blade's Edge Mountains"] = "Montanhas da Lâmina Afiada" +L["Blasted Lands"] = "Barreira do Inferno" +L["Block duels"] = "Duelos" +L["Block friend requests"] = "Solicitações de confirmação de amigo" +L["Block party invites"] = "Convites de grupo" +L["Blocks"] = "Bloquear" +L["Bloodmyst Isle"] = "Ilha Névoa Rubra" +L["Booty Bay"] = "Angra do Butim" +L["Bottom"] = "Inferior" +L["Brackenwall Village"] = "Aldeia Muralha Verde" +L["Buffs"] = "Buffs" +L["Burning Steppes"] = "Estepes Ardentes" +L["Buyout Only"] = "Somente Compra" +L["by Leatrix Plus"] = "por Leatrix Plus" +L["C"] = "C" +L["Camera distance"] = "Distância da câmera" +L["Camp Mojache"] = "Aldeia Mojache" +L["Camp Taurajo"] = "Aldeia Taurajo" +L["Cannot announce in this zone."] = "Não é possível anunciar nesta zona." +L["Cannot find General chat channel."] = "Não é possível encontrar o canal de chat geral." +L["Cenarion Hold"] = "Forte Cenariano" +L["Chain style"] = "Estilo cadeia" +L["Character"] = "Personagem" +L["Chat"] = "Bate-papo" +L["Chat Frame"] = "Quadro de bate-papo" +L["Checkbox labels are Ok."] = "Os rótulos das caixas de seleção estão OK." +L["Chillwind Camp"] = "Acampamento Ventogelante" +L["Chillwind E'ko"] = "E'ko de ventogelante" +L["Cinematics"] = "Cinemático" +L["Claiming Arathi Basin"] = "Reivindicando a Bacia Arathi" +L["Class colored frames"] = "Quadros coloridos" +L["Class icon portraits"] = "Retratos de classe" +L["Classic"] = "Clássico" +L["click here for new selection"] = "clique aqui para nova seleção" +L["Click to configure the settings for this option."] = "Clique para definir as configurações para esta opção." +L["Click to reset the settings on this page."] = "Clique para redefinir as configurações nesta página." +L["Click to resize the screen to fit between the top and bottom borders."] = "Clique para redimensionar a tela para caber entre as bordas superior e inferior." +L["Click to return to the main menu."] = "Clique para retornar ao menu principal." +L["Cloak"] = "Capa" +L["Coilfang Reservoir"] = "Reservatório Presacurva" +L["Combat log cannot be hidden while undocked."] = "O registro de combate não pode ser oculto enquanto desencaixado." +L["Combat plates"] = "Placas de combate" +L["Completed."] = "Completo." +L["Concerted Efforts"] = "Esforços combinados" +L["Configuration Panel"] = "Painel de Configuração" +L["Connections for"] = "Conexões para" +L["Conquering Arathi Basin"] = "Conquistando a Bacia Arathi" +L["Credits"] = "Créditos" +L["Crossroads"] = "Encruzilhada" +L["Cursor"] = "Cursor" +L["Cursor Left"] = "Cursor esquerdo" +L["Cursor Right"] = "Cursor direito" +L["D"] = "M" +L["Darkmoon Faire"] = "Feira de Negraluna" +L["Darkshire"] = "Vila Sombria" +L["Darkshore"] = "Costa Negra" +L["Deadmines"] = "Minas Mortas" +L["Deadwind Pass"] = "Trilha do Vento Morto" +L["Desolace"] = "Desolação" +L["Dire Maul"] = "Gládio Cruel" +L["Disable bag automation"] = "Automação de bolsa" +L["Disable chat fade"] = "Esmaecimento" +L["Disable loot warnings"] = "Avisos de butim" +L["Disable screen effects"] = "Efeitos de tela" +L["Disable screen glow"] = "Brilho da tela" +L["Disable sticky chat"] = "Bate-papo pegajoso" +L["Drag the frame overlay to position the frame."] = "Arraste a sobreposição do quadro para posicionar o quadro." +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "Arraste as sobreposições de quadros para posicionar os quadros.|n|nPara alterar a escala de um quadro, clique nele para selecioná-lo e ajuste o controle deslizante da escala.|n|nThis panel will close automatically if you enter combat." +L["Drag to set the buffs frame scale."] = "Arrasta para definir a escala do quadro de buffs." +L["Drag to set the cursor X offset."] = "Arraste para definir o deslocamento X do cursor." +L["Drag to set the cursor Y offset."] = "Arraste para definir o deslocamento Y do cursor." +L["Drag to set the density of weather effects."] = "Arraste para definir a densidade dos efeitos climáticos." +L["Drag to set the font size of book text."] = "Arraste para definir o tamanho da fonte do texto do livro." +L["Drag to set the font size of mail text."] = "Arraste para definir o tamanho da fonte do texto do correio." +L["Drag to set the font size of quest text."] = "Arraste para definir o tamanho da fonte do texto da missão." +L["Drag to set the scale of the Leatrix Plus panel."] = "Arraste para definir a escala do painel Leatrix Plus." +L["Drag to set the scale of the selected frame."] = "Arraste para definir a escala do quadro selecionado." +L["Drag to set the size of the bottom border."] = "Arraste para definir o tamanho da borda inferior." +L["Drag to set the size of the left border."] = "Arraste para definir o tamanho da borda esquerda." +L["Drag to set the size of the right border."] = "Arraste para definir o tamanho da borda direita." +L["Drag to set the size of the top border."] = "Arraste para definir o tamanho da borda superior." +L["Drag to set the tooltip scale."] = "Arraste para definir a escala da dica de ferramenta." +L["Drag to set the transparency of the borders."] = "Arraste para definir a transparência das bordas." +L["Drag to set the transparency of the Leatrix Plus panel."] = "Arraste para definir a transparência do painel Leatrix Plus." +L["Dun Morogh"] = "Dun Morogh" +L["Dungeons"] = "Masmorras" +L["Dup ID"] = "ID Dup" +L["durability"] = "durabilidade" +L["Durability"] = "Durabilidade" +L["Durotar"] = "Durotar" +L["Duskwood"] = "Floresta do Crepúsculo" +L["Dustwallow Marsh"] = "Pântano Vadeoso" +L["Eastern Kingdoms"] = "Reinos do Leste" +L["Eastern Plaguelands"] = "Terras Pestilentas Orientais" +L["Easy item destroy"] = "Fácil remoção de itens" +L["ELITE"] = "ELITE" +L["Elwynn Forest"] = "Floresta de Elwynn" +L["Enable viewport"] = "Porta de visualização" +L["Enhance dressup"] = "Provador" +L["Enhance minimap"] = "Minimapa" +L["Enhance professions"] = "Profissões" +L["Enhance quest log"] = "Registro de missões" +L["Enhance tooltip"] = "Dica de ferramenta" +L["Enhance trainers"] = "Instrutores" +L["Enhancements"] = "Melhorias" +L["Enter"] = "Entrar" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "Entra os IDs do feitiço dos ícones de recarga que você deseja ver.|n|nSe um ícone de recarga normalmente aparecer embaixo do quadro do ajudante, marque a caixa de seleção ajudante.|n|nOs ícones de recarga são salvos na sua classe." +L["enter zone or track name"] = "entrar o nome da zona ou faixa" +L["Error messages will be hidden"] = "Mensagens de erro serão ocultadas" +L["Error messages will be shown"] = "Mensagens de erro serão mostradas" +L["Events"] = "Eventos" +L["Everlook"] = "Visteterna" +L["Eversong Woods"] = "Floresta do Canto Eterno" +L["Extras"] = "Extras" +L["False"] = "Falso" +L["Faster auto loot"] = "Saque rápido" +L["Faster movie skip"] = "Pular filme mais rápido" +L["Feathermoon"] = "Plumaluna" +L["Features"] = "Características" +L["Felwood"] = "Selva Maleva" +L["Feralas"] = "Feralas" +L["Fight for Warsong Gulch"] = "Luta pela Ravina Brado Guerreiro" +L["Find Item"] = "Encontrar objeto" +L["Firewing Signets"] = "Sinetes dos Asardente" +L["Flame Crest"] = "Monte Candente" +L["For Great Honor"] = "Por grande honra" +L["Frames"] = "Quadros" +L["Freewind Post"] = "Aldeia Vento Livre" +L["Frostmaul E'ko"] = "E'ko de Friomalho" +L["Frostsaber E'ko"] = "E'ko de sabre-de-gelo" +L["Gadgetzan"] = "Geringontzan" +L["Game Options"] = "Opções de jogo" +L["Ghost"] = "Fantasma" +L["Ghostlands"] = "Terra Fantasma" +L["Gloomy"] = "Sombrio" +L["Gnomeregan"] = "Gnomeregan" +L["Gold Only"] = "Apenas ouro" +L["Graphics and Sound"] = "Gráficos e som" +L["Groups"] = "Grupos" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "As moedas Cascasseca, Ramatorpe e Gurubashi" +L["H"] = "H" +L["Hammerfall"] = "Ruína do Martelo" +L["Haunted"] = "Assombrado" +L["Hellfire Peninsula"] = "Península Fogo do Inferno" +L["Hellfire Ramparts"] = "Muralha Fogo do Inferno" +L["Helm"] = "Elmo" +L["Help"] = "Ajuda" +L["Hide chat buttons"] = "Botões de bate-papo" +L["Hide cooldown duration numbers (if enabled)"] = "Ocultar números de duração da recarga (se ativado)" +L["Hide error messages"] = "Mensagens de erro" +L["Hide gryphons"] = "Grifos" +L["Hide portrait numbers"] = "Números de retrato" +L["Hide stance bar"] = "Barra de postura" +L["Hide the combat log"] = "Registro de combate" +L["Hide the zone text bar"] = "Ocultar a barra de texto da zona" +L["Hide the zoom buttons"] = "Ocultar os botões de zoom" +L["Hide tooltips for world units during combat"] = "Ocultar dicas de ferramentas para unidades mundiais durante o combate" +L["Hide zone text"] = "Texto da zona" +L["High"] = "Alto" +L["Hillsbrad Foothills"] = "Contraforte de Eira dos Montes" +L["Hinterlands"] = "Terras Agrestes" +L["Home"] = "Principal" +L["Hyjal Summit"] = "Pico Hyjal" +L["Ice Thistle E'ko"] = "E'ko de cardo de gelo" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "Se marcado, uma caixa de pesquisa de bolsas será mostrada no quadro da mochila e no quadro do banco." +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "Se marcado, um botão será adicionado à ficha de personagem que mostrará a durabilidade do objeto equipado quando você passar o cursor sobre ele.|n|nAlém disso, uma porcentagem geral será mostrada no quadro de bate-papo quando você morrer." +L["If checked, a master volume slider will be shown in the character frame."] = "Se marcado, um controle deslizante de volume principal será mostrado na folha do personagem." +L["If checked, additional functionality will be added to the auction house.|n|nBuyout only - create buyout auctions without filling in the starting price.|n|nGold only - set the copper and silver prices at 99 to speed up new auctions.|n|nFind item - search the auction house for the item you are selling.|n|nIn addition, the auction duration setting will be saved account-wide."] = "Se marcado, funcionalidades adicionais serão adicionadas à casa de leilões.|n|nSomente compra - crie leilões de compra sem preencher o preço inicial.|n|nSomente ouro - defina os preços do cobre e da prata em 99 para acelerar novos leilões.|n|nLocalizar objeto - pesquise na casa de leilões o objeto que você está vendendo.|n|nAlém disso, a configuração de duração do leilão será salva em toda a conta." +L["If checked, alert frames will not be shown."] = "Se marcado, os quadros de alerta não serão mostrados." +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Se marcado, todos os objetos de pobre qualidade em suas bolsas serão vendidos automaticamente quando você visitar um comerciante.|n|nVocê pode manter pressionada a tecla Shift ao conversar com um comerciante para substituir essa configuração." +L["If checked, available quests will be accepted automatically."] = "Se marcada, as missões disponíveis serão aceitas automaticamente." +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "Se marcado, o fundo será colorido em azul (amigável) ou vermelho (hostil)." +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "Se marcado, as solicitações de confirmação de amigo do BattleTag e do Real ID serão automaticamente recusadas.|n|nA ativação desta opção recusará automaticamente quaisquer solicitações pendentes." +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "Se marcado, os botões do quadro de bate-papo serão ocultados.|n|nClicar nas guias de bate-papo mostrará automaticamente as mensagens mais recentes.|n|nUse a roda do mouse para rolar pelo histórico de bate-papo. Mantenha pressionada a tecla Shift para pular a página ou Ctrl para pular para a parte superior ou inferior do histórico de bate-papo." +L["If checked, chat text will not fade out after a time period."] = "Se marcado, o texto do bate-papo não desaparecerá após um período de tempo." +L["If checked, class colors will be used in the chat frame."] = "Se marcado, as cores da classe serão usadas no quadro de bate-papo." +L["If checked, completed quests will be turned-in automatically."] = "Se marcada, as missões concluídas serão entregues automaticamente." +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "Se marcado, as confirmações não aparecerão mais quando você escolher uma opção de saque ou tentar vender ou enviar um objeto comercializável." +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "Se marcado, os números de duração da recarga não serão mostrados sobre as recargas.|n|nSe desmarcada, os números de duração da recarga serão exibidos sobre as recargas, se estiverem ativados no painel de opções do jogo (menu 'Barras de ação')." +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "Se marcado, os números de dano e cura nos quadros de retrato do jogador e do ajudante serão ocultados." +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "Se marcado, arrastar a guia Geral enquanto o quadro estiver bloqueado expandirá o quadro para cima.|n|nSe o quadro de bate-papo estiver desbloqueado, arrastar a guia Geral do bate-papo moverá o quadro de bate-papo." +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "Se marcado, os sons de emote serão silenciados enquanto seu personagem estiver descansando ou no Glutão Implacável.|n|nOs sons de emoção serão ativados em todos os outros momentos." +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "Se marcado, as placas de nomes do inimigo serão mostradas durante o combate e ocultas quando o combate terminar." +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "Se marcado, as caixas de seleção de elmo e capa serão mostradas na folha do personagem.|n|nVocê pode pressionar Shift e clicar com o botão direito do mouse nas caixas de seleção para mudar a disposição." +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "Se marcada, a maioria das mensagens de erro (como 'Não há raiva suficiente') não será exibida. Alguns erros importantes são excluídos.|n|nSe você tiver o botão minimapa ativado, mantenha pressionada a tecla Control e clique com o botão direito do mouse para alternar entre as mensagens de erro sem afetar essa configuração." +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "Se marcado, o bate-papo raide e o bate-papo da instância terão a cor azul (para corresponder à cor padrão do bate-papo de grupo)." +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "Se marcado, os IDs de feitiço serão mostrados nas dicas de ferramentas dos ícones de buffs localizados no quadro de buff e abaixo do quadro de alvo." +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "Se marcado, o bate-papo pegajoso será desativado.|n|nObserve que isso não se aplica a janelas de bate-papo temporárias." +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "Se marcado, os solicitações de evocação serão aceitos automaticamente, a menos que você esteja em combate." +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "Se marcada, a lista de addons (acessível no menu do jogo) mostrará addons baseados em personagens por padrão." +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "Se marcado, a quantidade de tempo que leva para saquear criaturas automaticamente será significativamente reduzida." +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "Se marcado, o botão de limpeza da mochila e o botão de limpeza do banco não serão mostrados." +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "Se marcado, o botão para alternar o quadro de contêiner de raide será mostrado logo acima do quadro de gerenciamento de raide (lado esquerdo da tela) em vez de no próprio quadro de gerenciamento de raide.|n|nIsso permite que você alterne o quadro de contêiner de raide, sem precisar abrir o quadro de gerenciamento de raide." +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "Se marcado, o registro de combate será oculto.|n|nO registro de combate deve estar ancorado para que esta opção funcione.|n|nSe o registro de combate estiver desencaixado, você poderá encaixá-lo arrastando a guia (e recarregando a interface do usuário) ou redefinindo as janelas de bate-papo (no menu de bate-papo)." +L["If checked, the editbox will be moved to the top of the chat frame."] = "Se marcada, a caixa de edição será movida para a parte superior do quadro de bate-papo." +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "Se marcado, a tela cinza da morte e o efeito submundo serão desativados." +L["If checked, the main bar gryphons will not be shown."] = "Se marcado, os grifos da barra principal não serão mostrados." +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "Se marcado, o número de compartimentos de bolsa vazios será mostrado no ícone do botão da mochila e na dica de ferramenta." +L["If checked, the player frame background will be shown in class color."] = "Se marcado, o fundo do quadro do jogador será mostrado na cor da classe." +L["If checked, the professions frame will be larger."] = "Se marcado, o quadro de profissões será maior." +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "Se marcado, o brilho da tela será desativado.|n|nA ativação dessa opção também desativará o efeito de neblina bêbado." +L["If checked, the stance bar will not be shown."] = "Se marcada, a barra de postura não será mostrada." +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "Se marcado, o quadro de diálogo não será mostrado.|n|nO quadro de diálogo normalmente aparece na parte inferior da tela quando certos PNJs se comunicam com você." +L["If checked, the target frame background will be shown in class color."] = "Se marcado, o fundo do quadro de alvo será mostrado na cor da classe." +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "Se marcado, a dica de ferramenta será codificada por cores e você poderá modificar a disposição e a escala da dica de ferramenta." +L["If checked, the vendor price will be shown in item tooltips."] = "Se marcado, o preço do comerciante será mostrado nas dicas de ferramentas do objeto." +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "Se marcado, os botões de zoom serão ocultados. Você pode usar o botão do mouse para aplicar zoom, independentemente desta configuração." +L["If checked, unit targets will be shown."] = "Se marcado, os alvos da unidade serão mostrados." +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "Se marcado, você pode manter pressionada a tecla Control e clicar em uma guia de bate-papo para exibir o bate-papo recente em uma janela de cópia amigável." +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "Se marcado, você pode pressionar as teclas de flecha para mover o ponto de inserção para a esquerda e para a direita no quadro de bate-papo.|n|nSe desmarcado, as teclas de flecha usarão a configuração padrão de ligação de teclas." +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "Se marcado, você poderá cancelar o cinema sem ser solicitado a confirmar." +L["If checked, you will be able to change the font size of book text."] = "Se marcado, você poderá alterar o tamanho da fonte do texto do livro." +L["If checked, you will be able to change the font size of quest text."] = "Se marcado, você poderá alterar o tamanho da fonte do texto da missão." +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "Se marcado, você poderá alterar o tamanho da fonte do texto de correio padrão.|n|nIsso não afeta as mensagens criadas usando modelos (como faturas da casa de leilões)." +L["If checked, you will be able to change the position and scale of the buffs frame."] = "Se marcado, você poderá alterar a posição e a escala do quadro de buffs." +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "Se marcado, você poderá alterar a posição e a escala do quadro do widget.|n|nO quadro do widget é comumente usado para mostrar pontuações JxJ e objetivos de rastreamento." +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "Se marcado, você poderá criar uma porta de visualização. Uma porta de visualização adiciona bordas pretas ajustáveis ​​ao redor do mundo do jogo.|n|nAs bordas são colocadas no topo do mundo do jogo, mas sob a interface do usuário, para que você possa colocar elementos da interface do usuário sobre elas." +L["If checked, you will be able to customise the minimap."] = "Se marcado, você poderá personalizar o minimapa." +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "Se marcado, você poderá arrastar o quadro de bate-papo para a borda da tela." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "Se marcado, você poderá colocar até cinco ícones de recarga benéficos acima do quadro de alvo." +L["If checked, you will be able to reposition the tooltip."] = "Se marcado, você poderá reposicionar a dica de ferramenta." +L["If checked, you will be able to set the density of weather effects."] = "Se marcado, você poderá definir a densidade dos efeitos climáticos." +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "Se marcado, você poderá mostrar uma cadeia rara, elite ou elite rara em torno do quadro do jogador." +L["If checked, you will be able to zoom out to a greater distance."] = "Se marcado, você poderá diminuir o zoom para uma distância maior." +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "Se marcado, você não precisará mais digitar delete ao destruir um item de qualidade superior.|n|nAlém disso, os links de itens serão mostrados em todas as janelas de confirmação de destruição de itens." +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "Se marcado, você será liberado automaticamente após a morte em um campo de batalha.|n|nVocê não será liberado automaticamente se tiver a capacidade de ressuscitar automaticamente." +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "Se marcada, suas bolsas não serão abertas ou fechadas automaticamente quando você interagir com um comerciante, banco ou caixa de correio." +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "Se marcado, seu histórico de bate-papo aumentará para 4096 linhas. Se desmarcado, o padrão será usado (128 linhas).|n|nA ativação dessa opção pode impedir a exibição de algum texto de bate-papo durante a conexão." +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Se marcado, seu equipamento será reparado automaticamente quando você visitar um comerciante adequado.|n|nVocê pode manter pressionada a tecla Shift ao conversar com um comerciante para substituir essa configuração." +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "Se marcado, o texto da zona não será exibido (por exemplo, 'Altaforja')." +L["Increase chat history"] = "Aumentar histórico" +L["Interface"] = "Interface" +L["Invaders of Alterac Valley"] = "Invasores do Vale Alterac" +L["Invalid console variable."] = "Variável de console inválida." +L["Invalid parameter."] = "Parâmetro inválido." +L["Invalid quest ID."] = "ID de missão inválido." +L["Invalid sound ID"] = "ID de som inválido" +L["Invalid taint level."] = "Nível de mancha inválido." +L["Invalid target."] = "Alvo inválido." +L["Invite from whispers"] = "Convidar de sussurros" +L["Ironforge"] = "Altaforja" +L["Kalimdor"] = "Kalimdor" +L["Karazhan"] = "Karazhan" +L["Kargath"] = "Karrath" +L["Keyword"] = "Palavra-chave" +L["Lakeshire"] = "Vila Plácida" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "O Leatrix Plus não substituirá o LeaPlusDB na próxima desconexão." +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX PLUS: VERSÃO ERRADA INSTALADA!" +L["Left"] = "Esquerdo" +L["Lifetime honorable kills"] = "Jogadores abatidos honrosamente da vida inteira" +L["Light's Hope Chapel"] = "Capela Esperança da Luz" +L["Loch Modan"] = "Loch Modan" +L["Lockout sharing"] = "Bloquear compartilhamento" +L["Low"] = "Baixo" +L["Magic"] = "Magia" +L["Magisters' Terrace"] = "Terraço dos Magísteres" +L["Main Titles"] = "Principais Títulos" +L["Manage buffs"] = "Gerenciar buffs" +L["Manage frames"] = "Gerenciar quadros" +L["Manage widget"] = "Gerenciar widget" +L["Managed by Leatrix Plus"] = "Gerenciado por Leatrix Plus" +L["Map"] = "Mapa" +L["Maraudon"] = "Maraudon" +L["Marks of Kil'jaeden"] = "Marca de Kil'Jaeden" +L["Marks of Sargeras"] = "Marcas de Sargeras" +L["Marshal's Refuge"] = "Refúgio do Marshal" +L["Max camera zoom"] = "Zoom máximo da câmera" +L["Mechanics"] = "Mecânico" +L["Media"] = "Mídia" +L["Medium"] = "Médio" +L["Memory Usage"] = "Uso de memória" +L["Menethil Harbor"] = "Porto de Menethil" +L["message shown."] = "mensagem mostrada." +L["messages shown."] = "mensagens mostradas." +L["Missing console variable."] = "Variável de console ausente." +L["Missing mount name."] = "Nome de montaria ausente." +L["Missing movie ID."] = "ID do filme ausente." +L["Missing quest ID."] = "ID da missão ausente." +L["Missing sound file parameter."] = "Parâmetro de arquivo de som ausente." +L["Missing sound ID."] = "ID de som ausente." +L["Molten Core"] = "Núcleo Derretido" +L["Moonglade"] = "Clareira da Lua" +L["More Firewing Signets"] = "Mais sinetes dos Asardente" +L["More Marks of Kil'jaeden"] = "Mais marcas de Kil'jaeden" +L["More Marks of Sargeras"] = "Mais marcas de Sargeras" +L["More Sunfury Signets"] = "Mais sinetes dos Solfúria" +L["Morgan's Vigil"] = "Vigia de Morgan" +L["Mount not found."] = "Montaria não encontrada." +L["Move editbox to top"] = "Caixa de edição" +L["Movie not playable."] = "Filme não reproduzível." +L["Movie number"] = "Número do filme" +L["Movies"] = "Filmes" +L["Mulgore"] = "Mulgore" +L["Music"] = "Música" +L["Musical Moments"] = "Momentos musicais" +L["Mystery"] = "Mistério" +L["Nagrand"] = "Nagrand" +L["Narration"] = "Narração" +L["Naxxramas"] = "Naxxramas" +L["Nethergarde Keep"] = "Bastilha de Etergarde" +L["Netherstorm"] = "Eternévoa" +L["Nijel's Point"] = "Posto do Nijel" +L["No bad sound IDs found."] = "Nenhum ID de som ruim encontrado." +L["No help is available for this page."] = "Nenhuma ajuda está disponível para esta página." +L["No items with durability equipped."] = "Nenhum objeto com durabilidade equipada." +L["No media duplicates found."] = "Nenhuma duplicata de mídia encontrada." +L["No tooltip showing."] = "Nenhuma dica de ferramenta sendo exibida." +L["None"] = "Nenhum" +L["Not completed."] = "Não completo." +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "AVISO!|nVocê deve reiniciar completamente o cliente do jogo antes de poder usar esta versão do Leatrix Plus." +L["Nude"] = "Nu" +L["Old Hillsbrad Foothills"] = "Antigo Contraforte de Eira dos Montes" +L["Onyxia's Lair"] = "Covil da Onyxia" +L["or click the minimap button to open Leatrix Plus."] = "ou clique no botão minimapa para abrir o Leatrix Maps." +L["Orgrimmar"] = "Orgrimmar" +L["Outland"] = "Terralém" +L["Overall"] = "Total" +L["Overlay"] = "Sobreposição" +L["Particle density"] = "Densidade de partículas" +L["Party from friends"] = "Grupo de amigos" +L["Pet"] = "Ajudante" +L["Player"] = "Jogador" +L["Power"] = "Poder" +L["Press CTRL/C to copy."] = "Pressione Ctrl+C para copiar." +L["Queue from friends"] = "Fila de amigos" +L["R"] = "R" +L["Ragefire Chasm"] = "Cavernas Ígneas" +L["Raid"] = "Raide" +L["Raid frame toggle"] = "Quadro de raide" +L["Random"] = "Aleatório" +L["RARE"] = "RARO" +L["RARE ELITE"] = "ELITE RARO" +L["Ratchet"] = "Vila Catraca" +L["Razorfen Downs"] = "Urzal dos Mortos" +L["Razorfen Kraul"] = "Urzal dos Tuscos" +L["Recent chat window"] = "Bate-papo recente" +L["Redridge Mountains"] = "Montanhas Cristarrubra" +L["Refuge Pointe"] = "Ponta do Refúgio" +L["Release in PvP"] = "Libertar em JxJ" +L["Reload"] = "Recarregar" +L["Remember Alterac Valley!"] = "Lembrem-se do Vale Alterac!" +L["Repair automatically"] = "Reparar" +L["Repaired for"] = "Reparado para" +L["Reposition the tooltip"] = "Reposicionar a dica de ferramenta" +L["Requires UI reload."] = "Requer atualização da interface do usuário." +L["Reset"] = "Redefinir" +L["Resize book text"] = "Texto do livro" +L["Resize mail text"] = "Texto do correio" +L["Resize quest text"] = "Texto da missão" +L["Resize Screen"] = "Redimensionar tela" +L["Rested bubbles"] = "Bolhas descansadas" +L["result"] = "resultado" +L["results"] = "resultados" +L["Revantusk Village"] = "Aldeia Revatusco" +L["Right"] = "Direito" +L["Right-click to close"] = "Clique com o botão direito para fechar" +L["Right-click to close."] = "Clique com o botão direito para fechar" +L["right-click to go back"] = "clique com o botão direito para voltar" +L["Ruins of Ahn'Qiraj"] = "Ruínas de Ahn'Qiraj" +L["Rut'theran Village"] = "Vila de Rut'theran" +L["Sacred"] = "Sagrado" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "As moedas Sanguescalpo, Rachacrânio e Zangareia" +L["Scale"] = "Escala" +L["Scarlet Monastery"] = "Monastério Escarlate" +L["Scholomance"] = "Scolomântia" +L["Search"] = "Procurar" +L["Searing Gorge"] = "Garganta Abrasadora" +L["Select the settings that you want to use."] = "Selecione as configurações que você deseja usar." +L["Selection of music tracks"] = "Seleção de faixas de música" +L["Self Markers Allowed"] = "Marcadores auto permitidos" +L["Self Markers Blocked"] = "Marcadores auto bloqueados" +L["Sell junk automatically"] = "Vender objetos pobres" +L["SELLING JUNK"] = "Vendendo objetos de pobre qualidade" +L["Sentinel Hill"] = "Morro da Sentinela" +L["Set weather density"] = "Densidade do tempo" +L["Settings"] = "Configurações" +L["Shaders"] = "Shaders" +L["Shadowfang Keep"] = "Bastilha da Presa Negra" +L["Shadowmoon Valley"] = "Vale da Lua Negra" +L["Shadowprey Village"] = "Aldeia Pescassombra" +L["Shardtooth E'ko"] = "E'ko de Dentilhaço" +L["Show auction controls"] = "Casa de leilões" +L["Show bag search box"] = "Pesquisa de bolsas" +L["Show character addons"] = "Addons do personagem" +L["Show cooldowns"] = "Recargas" +L["Show cooldowns above the player frame"] = "Mostrar recarga acima do quadro do jogador" +L["Show durability status"] = "Durabilidade" +L["Show free bag slots"] = "Compartimentos de bolsa vazios" +L["Show guild names"] = "Mostrar nomes de guilda" +L["Show minimap button"] = "Botão minimapa" +L["Show player chain"] = "Cadeia de jogador" +L["Show player frame in class color"] = "Mostrar quadro do jogador na cor da classe" +L["Show raid button"] = "Mostrar botão da raide" +L["Show the spell ID in buff icon tooltips"] = "Mostrar o ID do feitiço nas dicas de ferramentas do ícone de buff" +L["Show unit targets"] = "Mostrar alvos de unidade" +L["Show vanity controls"] = "Personalizados" +L["Show vendor price"] = "Preço do comerciante" +L["Show volume slider"] = "Volume" +L["Show Wowhead links"] = "Links do Wowhead" +L["Silence rested emotes"] = "Silenciar emotes descansados" +L["Silithus"] = "Silithus" +L["Silverpine Forest"] = "Floresta de Pinhaprata" +L["Single Mark of Sargeras"] = "Marca única de Sargeras" +L["Single Sunfury Signet"] = "Sinete único dos Solfúria" +L["Social"] = "Social" +L["Sold junk for"] = "Vendeu objetos de pobre qualidade por" +L["Sound system restarted."] = "Sistema de som reiniciado." +L["Southshore"] = "Costa Sul" +L["Spell ID"] = "ID do feitiço" +L["Splintertree Post"] = "Posto Machadada" +L["Spooky"] = "Assustador" +L["Stockade"] = "O Cárcere" +L["Stonard"] = "Pedregal" +L["Stonetalon Mountains"] = "Cordilheira das Torres de Pedra" +L["Stonetalon Peak"] = "Morro das Torres de Pedra" +L["Stop"] = "Pare" +L["Stormwind"] = "Ventobravo" +L["Stranglethorn Vale"] = "Selva do Espinhaço" +L["Stratholme"] = "Stratholme" +L["Sun Rock Retreat"] = "Retiro Rocha do Sol" +L["Sunfury Signets"] = "Sinetes dos Solfúria" +L["Sunken Temple"] = "Templo Submerso" +L["Sunwell Plateau"] = "Platô da Nascente do Sol" +L["Support"] = "Suporte" +L["Swamp"] = "Pântano" +L["Swamp of Sorrows"] = "Pântano das Mágoas" +L["System"] = "Sistema" +L["Tabard"] = "Tabardo" +L["Taint level: Basic (1)."] = "Nível de mancha: Básico (1)." +L["Taint level: Disabled (0)."] = "Nível de mancha: desativado (0)." +L["Taint level: Full (2)."] = "Nível de mancha: Completo (2)." +L["Talonbranch Glade"] = "Clareira da Galhaça" +L["Talrendis Point"] = "Campo Talrendis" +L["Tanaris"] = "Tanaris" +L["Target"] = "Alvo" +L["Target Tracking Disabled"] = "Rastreamento de alvo desativado" +L["Target Tracking Enabled"] = "Rastreamento de alvo ativado" +L["Tarren Mill"] = "Serraria Tarren" +L["Teldrassil"] = "Teldrassil" +L["Tempest Keep"] = "Bastilha da Tormenta" +L["Temple of Ahn'Qiraj"] = "Templo de Ahn'Qiraj" +L["Temple of Atal'Hakkar"] = "Templo de Atal'Hakkar" +L["Ten Years of Warcraft"] = "Dez anos de Warcraft" +L["Terokkar Forest"] = "Mata Terokkar" +L["Text"] = "Texto" +L["Text size"] = "Tamanho do texto" +L["Text Size"] = "Tamanho do texto" +L["The Sepulcher"] = "O Sepulcro" +L["The summon from"] = "A evocação de" +L["Themes"] = "Temas" +L["This panel will close automatically if you enter combat."] = "Este painel será fechado automaticamente se você entrar em combate." +L["Thorium Point"] = "Posto de Tório" +L["Thousand Needles"] = "Mil Agulhas" +L["Thunder Bluff"] = "Penhasco do Trovão" +L["Timer"] = "Cronômetro" +L["Tirisfal Glades"] = "Clareiras de Tirisfal" +L["To begin, choose an options page."] = "Para começar, escolha uma página de opções." +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "Para ocultar o registro de combate, você precisa desativar o módulo de bate-papo no ElvUI." +L["To use the Find Item button, you need to deselect the WoW Token category."] = "Para usar o botão Encontrar objeto, você precisa desmarcar a categoria WoW Token." +L["Tooltip"] = "Dica de ferramenta" +L["Tooltip title color"] = "Cor do título da dica de ferramenta" +L["Top"] = "Topo" +L["Top Center"] = "Topo central" +L["Tracing started."] = "Rastreamento iniciado." +L["Tracing stopped."] = "Rastreamento parou." +L["Transparency"] = "Transparência" +L["True"] = "Verdade" +L["Turn-in completed quests automatically"] = "Entregar missões concluídas automaticamente" +L["Uldaman"] = "Uldaman" +L["Unclamp chat frame"] = "Desatar quadro" +L["Undercity"] = "Cidade Baixa" +L["Un'Goro Crater"] = "Cratera Un'Goro" +L["Universal group color"] = "Cor do grupo universal" +L["Use arrow keys in chat"] = "Teclas de flecha" +L["Use class colors in chat"] = "Cores da classe" +L["Use easy resizing"] = "Redimensionamento" +L["Value must be a number."] = "O valor deve ser um número." +L["Various"] = "Vários" +L["Vendors"] = "Comerciantes" +L["Version"] = "Versão" +L["Very Low"] = "Muito baixo" +L["Video"] = "Vídeo" +L["Visibility"] = "Visibilidade" +L["Wailing Caverns"] = "Caverna Ululante" +L["was automatically declined."] = "foi recusado automaticamente." +L["Weather density"] = "Densidade do tempo" +L["Welcome to Leatrix Plus."] = "Bem-vindo ao Leatrix Plus." +L["Western Plaguelands"] = "Terras Pestilentas Ocidentais" +L["Westfall"] = "Cerro Oeste" +L["Wetlands"] = "Pantanal" +L["Widget"] = "Ferramenta" +L["Wildkin E'ko"] = "E'ko de coruscante" +L["will be automatically accepted in 10 seconds unless cancelled."] = "será aceito automaticamente em 10 segundos, a menos que seja cancelado." +L["Winter"] = "Inverno" +L["Winterfall E'ko"] = "E'ko de invernoso" +L["Winterspring"] = "Hibérnia" +L["World of Warcraft"] = "World of Warcraft" +L["X Offset"] = "Deslocamento X" +L["Y Offset"] = "Deslocamento Y" +L["YOU"] = "VOCÊ" +L["You cannot do that in combat."] = "Você não pode fazer isso em combate." +L["You have"] = "Você tem" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "Sua interface do usuário precisa ser recarregada para que algumas alterações entrem em vigor.|n|nVocê não precisa clicar no botão recarregar imediatamente, mas precisa clicar nele quando concluir as alterações e desejar que as alterações entrem em vigor." +L["Your UI needs to be reloaded."] = "Sua interface do usuário precisa ser recarregada." +L["Zangarmarsh"] = "Pântano Zíngaro" +L["Zones"] = "Zonas" +L["Zoram'gar Outpost"] = "Assentamento Zoram'gar" +L["Zul'Farrak"] = "Zul'Farrak" +L["Zul'Gurub"] = "Zul'Gurub" +L["Zulian, Razzashi, and Hakkari Coins"] = "As moedas Hakkari, Zulian e Razzashi" +L["Zygor addon not found."] = "Addon Zygor não encontrado." + +end + +-- deDE: German +if GameLocale == "deDE" then +L["+"] = "+" +L["A Donation of Mageweave"] = "Spendet Magiestoff" +L["A Donation of Runecloth"] = "Spendet Runenstoff" +L["A Donation of Silk"] = "Spendet Seide" +L["A Donation of Wool"] = "Spendet Wolle" +L["A friend request from"] = "Eine Freundschaftsanfrage von" +L["Accept available quests automatically"] = "Automatisch verfügbare Quests akzeptieren" +L["Accept resurrection"] = "Wiederbelebung annehmen" +L["Accept summon"] = "Beschwörung annehmen" +L["Additional Runecloth"] = "Noch mehr Runenstoff" +L["Addon"] = "Erweiterung" +L["Aerie Peak"] = "Nistgipfel" +L["Ahn'Qiraj"] = "Ahn'Qiraj" +L["Alterac Mountains"] = "Alteracgebirge" +L["Anchor"] = "Anker" +L["Angelic"] = "Engels" +L["Arathi Highlands"] = "Arathihochland" +L["Ashenvale"] = "Ashenvale" +L["Auto loot is now enabled."] = "Automatisches Plündern ist nun aktiv." +L["AutoFollow"] = "Automatisches verfolgen" +L["AutoFollow disabled."] = "Automatisches verfolgen ausgeschaltet." +L["Automate gossip"] = "Automatischer Verkauf von Müll" +L["Automate quests"] = "Automatische Questannahme" +L["Automation"] = "Auto" +L["Azshara"] = "Azshara" +L["Azuremyst Isle"] = "Azurmythosinsel" +L["Back to Main Menu"] = "Zurück zum Hauptmenü" +L["Bad ID"] = "Schlechte ID" +L["Badlands"] = "Ödland" +L["Barrens"] = "Brachland" +L["Battle"] = "Schlacht" +L["Battle of Warsong Gulch"] = "Schlacht der Warsongschlucht" +L["Battlegrounds"] = "Kampfgebiete" +L["Black Morass"] = "Schwarze Morast" +L["Black Temple"] = "Der Schwarze Tempel" +L["Blackfathom Deeps"] = "Blackfathom-Tiefe" +L["Blackrock Depths"] = "Blackrocktiefen" +L["Blackwing Lair"] = "Pechschwingenhort" +L["Blade's Edge Mountains"] = "Schergrat" +L["Blasted Lands"] = "Verwüstete Lande" +L["Block duels"] = "Duelle blockieren" +L["Block friend requests"] = "Freundschaftsanfragen blockieren" +L["Block party invites"] = "Gruppeneinladungen blockieren" +L["Blocks"] = "Blocken" +L["Bloodmyst Isle"] = "Blutmythosinsel" +L["Booty Bay"] = "Beutebucht" +L["Bottom"] = "Unterseite" +L["Brackenwall Village"] = "Brackenwall" +L["Buffs"] = "Buffs" +L["Burning Crusade"] = "Burning Crusade" +L["Burning Crusade Classic"] = "Burning Crusade Classic" +L["Burning Steppes"] = "Brennende Steppe" +L["Buyout Only"] = "nur Sofortkauf" +L["by Leatrix Plus"] = "von Leatrix Plus" +L["C"] = "C" +L["Camera distance"] = "Kamera-Distanz" +L["Cannot announce in this zone."] = "Kann in dieser Zone nicht ankündigen werde." +L["Cannot find General chat channel."] = "Allgemein-Kanal kann nicht gefunden werden." +L["Cenarion Hold"] = "Burg Cenarius" +L["Chain style"] = "Ketten Stil" +L["Character"] = "Charakter" +L["Chat"] = "Chat" +L["Chat Frame"] = "Chat-Fenster" +L["Checkbox labels are Ok."] = "Kontrollkästchen Bezeichnungen sind OK." +L["Chillwind Camp"] = "Zugwindlager" +L["Chillwind E'ko"] = "E'ko der Eiswindschimären" +L["Cinematics"] = "Film" +L["Claiming Arathi Basin"] = "Inbesitznahme des Arathibeckens" +L["Class colored frames"] = "Fenster in Klassenfarben" +L["Class icon portraits"] = "Klassen Icon Portraits" +L["Classic"] = "Classic" +L["click here for new selection"] = "für eine neue Auswahl hier klicken" +L["Click to configure the settings for this option."] = "Klicken um die Einstellungen für diese Option anzupassen." +L["Click to disable Titan Panel screen adjust. Your UI will be reloaded."] = "Klicken Sie hier, um die Bildschirmanpassung von Titan Panel zu deaktivieren. Ihre Benutzeroberfläche wird neu geladen." +L["Click to reset the settings on this page."] = "Hier klicken um die Einstellungen dieser Seite zurückzusetzen." +L["Click to resize the screen to fit between the top and bottom borders."] = "Klicken, um die Größe des Bildschirms so zu ändern, dass er zwischen den oberen und unteren Rändern passt. " +L["Click to return to the main menu."] = "Hier klicken um zurück zum Hauptmenü zu gelangen." +L["Cloak"] = "Umhang" +L["Coilfang Reservoir"] = "Der Echsenkessel" +L["Combat log cannot be hidden while undocked."] = "Kampflog kann nicht versteckt werden währenddem er freigegeben ist." +L["Combat plates"] = "Kampf Namensplaketten" +L["Completed."] = "Abgeschlossen." +L["Concerted Efforts"] = "Gemeinsames Bestreben" +L["Configuration Panel"] = "Einstellungen" +L["Connections for"] = "Verbindungen für" +L["Conquering Arathi Basin"] = "Eroberung des Arathibeckens" +L["Credits"] = "Credits" +L["Crossroads"] = "Das Wegekreuz" +L["Cursor"] = "Cursor" +L["Cursor Left"] = "Cursor Links" +L["Cursor Right"] = "Cursor Rechts" +L["D"] = "D" +L["Darkmoon Faire"] = "Dunkelmond-Jahrmarkt" +L["Darkshire"] = "Dunkelhain" +L["Darkshore"] = "Die Dunkelküste" +L["Deadmines"] = "Todesminen" +L["Deadwind Pass"] = "Gebirgspass der Totenwinde" +L["Desolace"] = "Desolace" +L["Dire Maul"] = "Düsterbruch" +L["Disable bag automation"] = "Automatisches öffnen aller Taschen deaktivieren " +L["Disable chat fade"] = "Ausblenden des Chats deaktivieren" +L["Disable loot warnings"] = "Loot-Warnungen deaktivieren" +L["Disable screen effects"] = "Bildschirmeffekte deaktivieren" +L["Disable screen glow"] = "Aufleuchten des Bildschirms deaktivieren " +L["Disable sticky chat"] = "Stick Chat deaktvieren" +L["Dismount me"] = "Absteigen" +L["Dismount when casting a spell while moving"] = "Steigt automatisch ab, wenn du auf dem Reittier einen Zauber wirkst." +L["Dismount when clicking a flight destination"] = "Steigt automatisch ab, wenn du auf dem Reittier einen Flugmeister ansprichst." +L["Dismount when not enough rage, mana or energy"] = "Steigt automatisch ab, wenn nicht genug Wut, Mana oder Energie vorhanden ist." +L["Dismount when the flight map opens"] = "Steigt automatisch ab, wenn du auf dem Reittier die Flugkarte öffnest." +L["Drag the frame overlay to position the frame."] = "Verschieben um die Position des Fenster Overlay anzupassen." +L["Drag the frame overlay to position the frame.|n|nThis panel will close automatically if you enter combat."] = "Ziehe die Rahmenanzeige, um den Rahmen zu positionieren.|n|nDieses Fenster wird automatisch geschlossen, wenn du im Kampf bist." +L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."] = "Verschieben um die Position des Fenster Overlays anzupassen.|n|nAnklicken und verschieben un die Größe des Fenster ändern.|n|nDieses Menü wird sich automatisch schließen wenn du im Kampf bist." +L["Drag to set the buffs frame scale."] = "Verschieben um die Größe der Stärkungszauber-Leiste anzupassen." +L["Drag to set the cursor X offset."] = "Verschieben um den Cursor X Versatz/Offset anzupassen." +L["Drag to set the cursor Y offset."] = "Verschieben um den Cursor Y Versatz/Offset anzupassen." +L["Drag to set the density of weather effects."] = "Verschieben um die Dichte der Wetter Effekte anzupassen." +L["Drag to set the focus frame scale."] = "Ziehen, um die Skalierung des Fokusrahmens festzulegen." +L["Drag to set the font size of book text."] = "Ziehen, um die Schriftgröße des Buchtexts festzulegen. " +L["Drag to set the font size of mail text."] = "Verschieben um die Schriftgröße des Post Texts anzupassen." +L["Drag to set the font size of quest text."] = "Verschieben um die Schriftgröße des Quest Texts anzupassen." +L["Drag to set the scale of the Leatrix Plus panel."] = "Verschieben um die Größe des Leatrix Plus Fensters anzupassen." +L["Drag to set the scale of the selected frame."] = "Verschieben um die Größe des ausgewählen Fensters anzupassen." +L["Drag to set the size of the bottom border."] = "Verschieben um die Größe vom unterem Rahmen anzupassen." +L["Drag to set the size of the left border."] = "Verschieben um die Größe vom linkem Rahmen anzupassen." +L["Drag to set the size of the right border."] = "Verschieben um die Größe vom rechten Rahmen anzupassen." +L["Drag to set the size of the top border."] = "Verschieben um die Größe vom oberen Rahmen anzupassen." +L["Drag to set the tooltip scale."] = "Verschieben um die Größe des Tooltips anzupassen." +L["Drag to set the transparency of the borders."] = "Verschieben um die Transparenz der Rahmen anzupassen." +L["Drag to set the transparency of the Leatrix Plus panel."] = "Verschieben um die Transparenz des Leatrix Plus Fensters anzupassen." +L["Drag to set the widget scale."] = "Ziehen, um die Widget-Skalierung festzulegen." +L["Drag to size"] = "Auf Größe ziehen" +L["Dun Morogh"] = "Dun Morogh" +L["Dungeons"] = "Dungeons" +L["Dup ID"] = "Dup ID" +L["durability"] = "haltbarkeit" +L["Durability"] = "Haltbarkeit" +L["Durotar"] = "Durotar" +L["Duskwood"] = "Dämmerwald" +L["Dustwallow Marsh"] = "Marschen von Dustwallow" +L["Eastern Kingdoms"] = "Östliche Königreiche" +L["Eastern Plaguelands"] = "Östliche Pestländer" +L["Easy item destroy"] = "Gegenstands-Zerstörung" +L["ELITE"] = "ELITE" +L["Elwynn Forest"] = "Wald von Elwynn" +L["Enable viewport"] = "Ansichtsfenster aktivieren." +L["Enhance dressup"] = "Anprobe erweitern" +L["Enhance minimap"] = "Minimap erweitern" +L["Enhance professions"] = "Berufsfenster erweitern" +L["Enhance quest log"] = "Questfenster erweitern" +L["Enhance tooltip"] = "Tooltip erweitern" +L["Enhance trainers"] = "Lehrerfenster erweitern" +L["Enhancements"] = "Verbesserungen" +L["Enter"] = "Eingeben" +L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class."] = "Zauber IDs eingeben um die Icons für die Abklingzeiten anzuzeigen.|n|nBegleiter Kontrollkästchen anwählen, wenn ein Abklingzeit-Icon normalerweise unter dem Begleiter-Fenster auftaucht.|n|nDiese Icons werden für ihre Klasse." +L["enter zone or track name"] = "Zone oder Verfolgungsname eingeben" +L["Error messages will be hidden"] = "Fehlermeldungen werden versteckt" +L["Error messages will be shown"] = "Fehlermeldungen werden angezeigt" +L["Events"] = "Veranstaltungen" +L["Everlook"] = "Ewige Warte" +L["Eversong Woods"] = "Immersangwald" +L["Extras"] = "Extras" +L["False"] = "Falsch" +L["Faster auto loot"] = "Schnelleres Auto looten" +L["Faster movie skip"] = "Schnelleres überspringen von Filmsequenzen" +L["Feathermoon"] = "Mondfederfeste" +L["Features"] = "Features" +L["Felwood"] = "Teufelswald" +L["Feralas"] = "Feralas" +L["Fight for Warsong Gulch"] = "Kampf um die Warsongschlucht" +L["Find Item"] = "Gegenstand finden" +L["Firewing Signets"] = "Siegel der Feuerschwingen" +L["Flame Crest"] = "Flammenkamm" +L["Focus"] = "Fokus" +L["For Great Honor"] = "Große Ehre" +L["Frames"] = "Fenster" +L["Freewind Post"] = "Freiwindposten" +L["Frostmaul E'ko"] = "E'ko der Frosthagelriesen" +L["Frostsaber E'ko"] = "E'ko der Frostsäbler" +L["Game Options"] = "Spieloptionen" +L["Ghost"] = "Geist" +L["Ghostlands"] = "Geisterlande" +L["Gloomy"] = "Düster" +L["Gnomeregan"] = "Gnomeregan" +L["Gold Only"] = "Ausschließlich Gold" +L["Graphics and Sound"] = "Grafik und Sound" +L["Groups"] = "Gruppen" +L["Gurubashi, Vilebranch, and Witherbark Coins"] = "Münzen der Gurubashi, Vilebranch und Witherbark" +L["H"] = "H" +L["Haunted"] = "Verfolgt" +L["Hellfire Peninsula"] = "Höllenfeuerhalbinsel" +L["Hellfire Ramparts"] = "Höllenfeuerbollwerk" +L["Helm"] = "Helm" +L["Help"] = "Hilfe" +L["Hide chat buttons"] = "Chat-Buttons verstecken" +L["Hide cooldown duration numbers (if enabled)"] = "Nummern der Cooldown Anzeige verbergen (wenn aktiviert)" +L["Hide error messages"] = "Fehlermeldungen verstecken" +L["Hide gryphons"] = "Greifenpaar verstecken" +L["Hide portrait numbers"] = "Portraitnummern verbergen" +L["Hide stance bar"] = "Haltungsleiste verstecken" +L["Hide the combat log"] = "Kampflog verstecken" +L["Hide the zone text bar"] = "Verstecke die Zonen-Text Leiste" +L["Hide the zoom buttons"] = "Zoom Buttons verbergen" +L["Hide tooltips for world units during combat"] = "Im Kampf Tooltips für Welt Einheiten verstecken" +L["Hide zone text"] = "Gebietstext verbergen" +L["High"] = "Hoch" +L["Hillsbrad Foothills"] = "Vorgebirge des Hügellands" +L["Hinterlands"] = "Hinterlande" +L["Home"] = "Home" +L["Hyjal Summit"] = "Hyjalgipfel" +L["Ice Thistle E'ko"] = "E'ko der Eisdistelyetis" +L["If checked, a bag search box will be shown in the backpack frame and the bank frame."] = "Wenn diese Option aktiviert ist, wird im Rucksackrahmen und im Bankrahmen ein Taschen-Suchfeld angezeigt." +L["If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die."] = "Wenn ausgewählt, wird ein Button zum Charakter-Fenster hinzugefügt. Wenn der Mousezeiger über diesem Button ist, wird die Ausrüstungs Haltbarkeit angezeigt.|n|nZusätzlich wird beim Sterben, ein Gesamt-Prozentsatz Wert im Chat ausgegeben." +L["If checked, a master volume slider will be shown in the character frame."] = "Wenn ausgewählt, wird ein Gesamtlautstärke-Regler im Charakter-Fenster angezeigt." +L["If checked, alert frames will not be shown."] = "Wenn ausgewählt, werden keine Alarm Fenster mehr angezeigt." +L["If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Wenn ausgewählt, werden alle grauen Gegenstände in deinen Taschen automatisch verkauft wenn du mit einem Händler sprichst.|n|nHalte die SHIFT-Taste gedrückt wenn du mit einem Händler sprichst um diese Funktion aufzuheben." +L["If checked, available quests will be accepted automatically."] = "Wenn ausgewählt, werden verfügbare Quests automatisch akzeptiert." +L["If checked, backdrops will be tinted blue (friendly) or red (hostile)."] = "Wenn ausgewählt, wird der Hintergrund blau (freundlich) oder rot (feindlich) eingefärbt." +L["If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests."] = "Wenn ausgewählt, werden BattleTag und Real ID Freundschaftsanfragen automatisch abgelehnt.|n|nDurch das Aktivieren der Option, werden alle ausstehenden Anfragen automatisch abgelehnt." +L["If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history."] = "Wenn ausgewählt, werden die Chat-Fenster Buttons versteckt.|n|nBei einem Klick auf die Chat Reiter/Tabs werden automatisch die letzten Nachrichten angezeigt.|n|nBenutz das Mausrad um durch den Chat Verlauf zu scrollen. Halte die SHIFT-Taste um einen Seite weit zu springen, oder die STRG-Taste um zum Anfang oder Ende des Chat Verlaufs zu springen." +L["If checked, chat text will not fade out after a time period."] = "Wenn ausgewählt, wird der Chat Text nach einer Zeit nicht mehr automatisch verblassen." +L["If checked, class coloring will be used in the player frame, target frame and focus frame."] = "Wenn ausgewählt, wird die Klassenfarbe für das Spieler, Ziel und Fokus-Fenster benutzt." +L["If checked, class colors will be used in the chat frame."] = "Wenn diese Option aktiviert ist, werden im Chatfenster Klassenfarben verwendet. " +L["If checked, completed quests will be turned-in automatically."] = "Wenn ausgewählt, werden abgeschlossene Quests automatisch abgegeben." +L["If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item."] = "Wenn ausgewählt, werden Bestätigungen nicht länger angezeigt wenn du auf einen erbeuteten Gegenstand würfelst oder einen handelbaren Gegenstand verkaufst oder per Post verschickst." +L["If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu)."] = "Wenn ausgewählt, werden keine Zahlen für Abklingzeiten angezeigt.|n|nWenn nicht ausgewählt, wird ein numerischer Countdown für Abklingzeiten angezeigt, sofern es auch in den Interface Optionen ('Aktionsleisten' Menü) aktiviert ist." +L["If checked, damage and healing numbers in the player and pet portrait frames will be hidden."] = "Wenn ausgewählt, werden Schadens und Heilungszahlen am Spieler und Begleiter-Fenster versteckt." +L["If checked, dragging the General chat tab while the chat frame is locked will expand the chat frame upwards.|n|nIf the chat frame is unlocked, dragging the General chat tab will move the chat frame."] = "Wenn ausgewählt, wird das Chat-Fenster nach oben erweitert wenn es fixiert ist aber am Reiter/Tab gezogen wird.|n|nFalls das Chat-Fenster freigegeben ist, wird es durch das ziehen bewegt." +L["If checked, emote sounds will be silenced while your character is resting or at the Grim Guzzler.|n|nEmote sounds will be enabled at all other times."] = "Wenn ausgewählt, werden Sprach-Emotes stumm geschalten währendem dein Charakter:|n|n- sich ausruht|n- im Grimmigen Säufer ist|n|nSofern keines davon zutritt, sind Sprach-Emotes aktiviert." +L["If checked, enemy nameplates will be shown during combat and hidden when combat ends."] = "Wenn ausgewählt, werden feindliche Namensplaketten während dem Kampf angezeigt aber außerhalb des Kampfs versteckt." +L["If checked, helm and cloak toggle checkboxes will be shown in the character frame.|n|nYou can hold shift and right-click the checkboxes to switch layouts."] = "Wenn diese Option aktiviert ist, werden im Charakterfenster Kontrollkästchen zum Umschalten von Helm und Umhang angezeigt. |n|nSie können die Umschalttaste gedrückt halten und mit der rechten Maustaste auf die Kontrollkästchen klicken, um die Ansicht zu wechseln. " +L["If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman."] = "Wenn ausgewählt, werden Feiertags Event Sounds stumm geschalten.|n|nDas trifft zu für den kopflosen Reiter." +L["If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the control key and right-click it to toggle error messages without affecting this setting."] = "Wenn ausgewählt, werden die meisten Fehler Nachrichten (wie z.B. 'Nicht genug Wut') nicht angezeigt. Einige wichtige Fehler Nachrichten sind davon ausgenommen.|n|nFalls der Minimap Button eingeschalten ist, kannst du mit einem STRG+Rechts-Klick darauf die Fehler Nachrichten anzeigen/ausblenden ohne diese Einstellung damit zu beinflussen." +L["If checked, raid chat and instance chat will both be colored blue (to match the default party chat color)."] = "Wenn ausgewählt, werden Schlachtzugs und Instanz Chats in blau angezeigt (um mit der Standard Gruppenchat Frabe übereinzustimmen)." +L["If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame."] = "Wenn ausgewählt, werden Zauber IDs in den Tooltips der Stärkunszauber Leiste und unter dem Ziel-Fenster angezeigt." +L["If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows."] = "Wenn ausgewählt, wird das sticky Chat Verhalten deaktviert.|n|nBeachte, dass dies für temporäre Chat-Fenster nicht funktioniert." +L["If checked, summon requests will be accepted automatically unless you are in combat."] = "Wenn ausgewählt, werden Beschwörungs-Anfragen standardmäßig akzeptiert sofern du dich nicht im Kampf befindest." +L["If checked, the addon list (accessible from the game menu) will show character based addons by default."] = "Wenn ausgewählt, wird die Addon-Liste (erreichbar durch das Spielmenü) standardmäßig Addons für den Charakter anzeigen." +L["If checked, the amount of time it takes to auto loot creatures will be significantly reduced."] = "Wenn ausgewählt, wird die benötigte Zeit zum Kreaturen Plündern erheblich verkürzt." +L["If checked, the backpack clean-up button and the bank frame clean-up button will not be shown."] = "Wenn ausgewählt, wird der Taschen & Bank aufräumen Knopf nicht angezeigt." +L["If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame."] = "Wenn ausgewählt, wird der Button zum Schlachtzugsfenster anzeigen/verstecken oberhalb des Schlachtzugs-Managements Fenster (auf der linken Seite des Bildschirms) angezeigt - statt innerhalb des Menüs.|n|nDas erlaubt das anzeigen/verstecken des Schlachtzugsfenster ohne das Menü öffnen zu müssen." +L["If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu)."] = "Wenn ausgewählt, wird der Kampflog versteckt.|n|nDamit diese Option richtig funktioniert muss der Kampflog fixiert sein.|n|nFalls das Chat-Fenster des Kampflogs freigegeben ist, kannst du es wieder fixieren indem du den Tab/Reiter zurück ziehst oder in dem du vom Chat Menü aus die Chat-Fenster zurücksetzt." +L["If checked, the editbox will be moved to the top of the chat frame."] = "Wenn ausgewählt, wird das Chat-Fenster zum Nachrichten Verfassen am oberen Rand des Chat-Fenster geöffnet." +L["If checked, the grey screen of death and the netherworld effect will be disabled."] = "Wenn ausgewählt, wird der graue Geister Bildschirm Effekt und der Jenseits Effekt deaktiviert." +L["If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted."] = "Wenn ausgewählt, werden der Interface Button Sound, der Chat-Fenster Tab/Reiter Klick Ton und der Spielmenü Öffnungs & Schließungs Sound stumm geschalten." +L["If checked, the main bar gryphons will not be shown."] = "Wenn ausgewählt, wird das Greifenpaar von der Haupt-Aktionsleiste nicht angezeigt." +L["If checked, the number of free bag slots will be shown in the backpack button icon and tooltip."] = "Wenn diese Option aktiviert ist, wird die Anzahl der freien Gepäckfächer im Symbol für die Rucksackschaltfläche und im Tooltip angezeigt. " +L["If checked, the player frame background will be shown in class color."] = "Wenn ausgewählt, wird der Hintergrund vom Spieler Fenster in Klassenfarbe angezeigt." +L["If checked, the professions frame will be larger."] = "Wenn diese Option aktiviert ist, wird der Rahmen für Berufe größer. " +L["If checked, the ready check sound will be muted."] = "Wenn ausgewählt, wird der Ton vom Bereitschaftscheck stumm geschalten." +L["If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect."] = "Wenn ausgewählt, wird das Bildschirm leuchten/Schimmer deaktviert.|n|nDurch das Aktivieren der Option wird auch die Betrunkenheits-Trübung deaktiviert." +L["If checked, the spell fizzle sounds will be muted."] = "Wenn ausgewählt, werden die fizzle/missglückt Sounds von Zauber stumm geschalten." +L["If checked, the stance bar will not be shown."] = "Wenn ausgewählt, wird die Haltungsleiste versteckt." +L["If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you."] = "Wenn ausgewählt, wird das Unterhaltung Fenster versteckt.|n|nDas Unterhaltung Fenster wird normalerweise im unteren Teil des Bildschirms angezeigt wenn manche NPCs mit dir kommunizieren." +L["If checked, the target frame background will be shown in class color."] = "Wenn ausgewählt, wird der Hintergrund des Ziel Fensters in Klassenfarbe angezeigt." +L["If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale."] = "Wenn ausgewählt, wird der Tooltip farbkodiert und du kannst das Layout sowieso die Größe ändern." +L["If checked, the vendor price will be shown in item tooltips."] = "Wenn diese Option aktiviert ist, wird der Händlerverkaufspreis in den Tooltips angezeigt. " +L["If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting."] = "Wenn ausgewählt, werden die Zoom Buttons versteckt. Das Mausrad kann weiterhin zum Zoomen verwendet werden." +L["If checked, train sounds will be muted."] = "Wenn ausgewählt, werden Töne von Bahnen stumm geschalten." +L["If checked, unit targets will be shown."] = "Wenn ausgewählt, werden die Ziele der Einheit angezeigt." +L["If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window."] = "Wenn ausgewählt, kannst du per STRG-Klick auf den Chat Reiter/Tab ein Fenster öffnen um kürzliche Nachrichten einfach zu kopieren." +L["If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting."] = "Wenn ausgewählt, können die Pfeiltasten im Chat verwendet werden um den Cursor nach links oder rechts zu bewegen.|n|nWenn nicht ausgewählt, werden die Pfeiltasten die Standard Tastenbelegung verwenden." +L["If checked, you will be able to cancel cinematics without being prompted for confirmation."] = "Wenn ausgewählt, kannst du Cinematics ohne Bestätigung abbrechen." +L["If checked, you will be able to change the font size of book text."] = "Wenn diese Option aktiviert ist, können Sie die Schriftgröße des Buchtexts ändern. " +L["If checked, you will be able to change the font size of quest text."] = "Wenn ausgewählt, kannst du die Quest Text Schriftgröße ändern." +L["If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices)."] = "Wenn ausgewählt, kannst du die Standard Schriftgröße von Brieftexten ändern.|n|nDas funktioniert nicht für Briefe die aus einer Vorlage erstellt wurden (sowie Auktionshaus Briefe)." +L["If checked, you will be able to change the position and scale of the buffs frame."] = "Wenn ausgewählt, kannst du die Position und Größe der Stärkungszauber Leiste ändern." +L["If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives."] = "Wenn ausgewählt, kannst du die Position und Größe des Widget-Rahmen ändern.|n|nDer Widget-Rahmen wird für gewöhnlich benutzt um den PvP Punktestand und Ziele zu verfolgen." +L["If checked, you will be able to create a viewport. A viewport adds adjustable black borders around the game world.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them."] = "Wenn diese Option aktiviert ist, können Sie ein Ansichtsfenster erstellen. Ein Ansichtsfenster fügt anpassbare schwarze Ränder um die Spielwelt hinzu. |n|nDie Ränder werden über der Spielwelt, aber unter der Benutzeroberfläche platziert, sodass Sie Benutzeroberflächenelemente darüber platzieren können. " +L["If checked, you will be able to customise the minimap."] = "Wenn ausgewählt, kannst du die Minimap anpassen." +L["If checked, you will be able to drag the chat frame to the edge of the screen."] = "Wenn ausgewählt, kannst du das Chat-Fenster bis zum Rand des Bildschirms verschieben." +L["If checked, you will be able to mute a selection of game sounds."] = "Wenn ausgewählt, kannst du eine Auswahl an Spielsounds stummschalten." +L["If checked, you will be able to place up to five beneficial cooldown icons above the target frame."] = "Wenn ausgewählt, kannst du bis zu 5 positive Abklingzeiteiten über dem Ziel-Fenster anzeigen." +L["If checked, you will be able to reposition the tooltip."] = "Wenn ausgewählt, kannst du das Tooltip Fenster verschieben." +L["If checked, you will be able to set the density of weather effects."] = "Wenn ausgewählt, kannst du die Intensität der Wetter Effekte bestimmen." +L["If checked, you will be able to show a rare, elite or rare elite chain around the player frame."] = "Wenn ausgewählt, kannst du dein Spieler Portrait mit einem Rare, Elite oder Rare Elite Rahmen dekorieren." +L["If checked, you will be able to zoom out to a greater distance."] = "Wenn ausgewählt, kannst du auf weitere Distanz herauszoomen." +L["If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows."] = "Wenn ausgewählt, musst du nicht mehr löschen schreiben sofern du einen Gegenstand mit Überragendender Qualität zerstören möchtest.|n|nZusätzlich werden Gegenstands Verlinkungen in allen Zerstörungs-Bestätigungs Fenster angezeigt." +L["If checked, you will release automatically after you die in a battleground.|n|nYou will not release automatically if you have the ability to self-resurrect."] = "Wenn ausgewählt, wird der Geist automatisch freigelassen falls du in einem Schlachtfeld stirbst." +L["If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox."] = "Wenn ausgewählt, werden die Taschen nicht automatisch geöffnet oder geschlossen wenn du mit einem Händler, Bank oder einem Briefkasten interagierst." +L["If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login."] = "Wenn ausgewählt, wird der Chat Verlauf auf 4096 Zeilen erweitert. Wenn nicht ausgewählt, wird der Standard von 128 Zeilen benutzt.|n|nDas Aktivieren der Option wird möglicherweise die Anzeige von Chat Text während dem Login verhindern." +L["If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting."] = "Wenn du einen passenden Händler aufsuchst wird deine Rüstung automatisch repariert, falls aktiviert.|n|nWenn, während der Händler angesprochen wird, die Shift Taste gedrückt gehalten wird, kann diese Einstellung überschrieben werden." +L["If checked, zone text will not be shown (eg. 'Ironforge')."] = "Gebietstext (z.B, 'Eisenschmiede') wird nicht angezeigt, falls ausgewählt." +L["Increase chat history"] = "Chat Verlauf erweitern" +L["Interface"] = "Interface" +L["Invaders of Alterac Valley"] = "Die Invasoren des Alteractals" +L["Invalid console variable."] = "Ungültige Konsolen Variable" +L["Invalid parameter."] = "Ungültiger Parameter." +L["Invalid quest ID."] = "Ungültige Quest ID." +L["Invalid sound ID"] = "Ungültige Sound ID" +L["Invalid taint level."] = "Ungültiger taint level" +L["Invalid target."] = "Ungültiges Ziel." +L["Invite from whispers"] = "Einladen via flüstern" +L["Ironforge"] = "Eisenschmiede" +L["Kalimdor"] = "Kalimdor" +L["Karazhan"] = "Karazhan" +L["Keyword"] = "Stichwort" +L["Lakeshire"] = "Seenhain" +L["Leatrix Plus will not overwrite LeaPlusDB at next logout."] = "Beim nächsten Logout wird LeaPlusDB nicht durch Leatrix Plus überschrieben." +L["LEATRIX PLUS: WRONG VERSION INSTALLED!"] = "LEATRIX PLUS: FALSCHE VERSION INSTALLIERT!" +L["Left"] = "Links" +L["Lifetime honorable kills"] = "Gesamte Ehrenhafte Siege" +L["Light's Hope Chapel"] = "Kapelle des hoffnungsvollen Lichts" +L["Loch Modan"] = "Loch Modan" +L["Lockout sharing"] = "Lockout sharing" +L["Low"] = "Niedrige " +L["Magic"] = "Magie" +L["Magisters' Terrace"] = "Terrasse der Magister" +L["Main Titles"] = "Haupttitel" +L["Manage buffs"] = "Buffs verwalten" +L["Manage focus"] = "Fokus einstellen" +L["Manage frames"] = "Fenster verwalten" +L["Manage widget"] = "Widget verwalten" +L["Managed by Leatrix Plus"] = "Verwaltet durch Leatrix Plus" +L["Map"] = "Karte" +L["Maraudon"] = "Maraudon" +L["Marks of Kil'jaeden"] = "Male von Kil'jaeden" +L["Marks of Sargeras"] = "Male des Sargeras" +L["Marshal's Refuge"] = "Marschalls Zuflucht" +L["Max camera zoom"] = "Maximaler Kamera-Zoom" +L["Mechanics"] = "Mechaniken" +L["Media"] = "Medien" +L["Medium"] = "Mittel" +L["Memory Usage"] = "Speicherverbrauch" +L["Menethil Harbor"] = "Hafen von Menethil" +L["message shown."] = "nachricht angezeigt." +L["Messages"] = "Nachrichten" +L["messages shown."] = "angezeigte Nachrichten." +L["Missing console variable."] = "Fehlende Consolen Variable." +L["Missing mount name."] = "Fehlender Mountname." +L["Missing movie ID."] = "Fehlende Film ID." +L["Missing quest ID."] = "Fehlende Quest ID." +L["Missing sound file parameter."] = "Fehlender Sound Datei Parameter." +L["Missing sound ID."] = "Fehlende Sound ID." +L["Molten Core"] = "Geschmolzener Kern" +L["Moonglade"] = "Mondlichtung" +L["More Firewing Signets"] = "Mehr Siegel der Feuerschwingen" +L["More Marks of Kil'jaeden"] = "Mehr Male von Kil'jaeden" +L["More Marks of Sargeras"] = "Mehr Male des Sargeras" +L["More Sunfury Signets"] = "Mehr Siegel des Sonnenzorns" +L["Morgan's Vigil"] = "Morgans Wacht" +L["Mount not found."] = "Reittier nicht gefunden." +L["Move editbox to top"] = "Texteingabe über Chat" +L["Movie not playable."] = "Film nicht abspielbar." +L["Movie number"] = "Filmnummer" +L["Movies"] = "Filme" +L["Mulgore"] = "Mulgore" +L["Music"] = "Musik" +L["Musical Moments"] = "Musikalische Momente" +L["Mute game sounds"] = "Sounds stummschalten" +L["Mystery"] = "Geheimnis" +L["Nagrand"] = "Nagrand" +L["Narration"] = "Erzählung" +L["Naxxramas"] = "Naxxramas" +L["Nethergarde Keep"] = "Burg Nethergarde" +L["Netherstorm"] = "Nethersturm" +L["Nijel's Point"] = "Die Nijelspitze" +L["No bad sound IDs found."] = "Es wurden keine fehlerhaften Sound IDs gefunden." +L["No help is available for this page."] = "Für diese Seite ist keine Hilfe verfügbar." +L["No items with durability equipped."] = "Keine Gegenstände mit Haltbarkeit ausgerüstet." +L["No media duplicates found."] = "Keine Media Duplikate gefunden." +L["No tooltip showing."] = "Kein Tooltip gezeigt" +L["None"] = "Keiner" +L["Not completed."] = "Nicht abgeschlossen" +L["NOTICE!|nYou must fully restart your game client before you can use this version of Leatrix Plus."] = "WICHTIG|nDu musst deinen Spielclient komplett neu starten, bevor du diese Version von Leatrix Plus nutzen kannst." +L["Nude"] = "Nackt" +L["Old Hillsbrad Foothills"] = "Vorgebirge des Alten Hügellands" +L["Onyxia's Lair"] = "Onyxias Hort" +L["or click the minimap button to open Leatrix Plus."] = "oder klicke auf den Button an der Minikarte." +L["Orgrimmar"] = "Orgrimmar" +L["Outland"] = "Scherbenwelt" +L["Overall"] = "Insgesamt" +L["Overlay"] = "Überlagerung" +L["Particle density"] = "Partikeldichte" +L["Party from friends"] = "Gruppen von Freunden" +L["Pet"] = "Haustier" +L["Player"] = "Spieler" +L["Power"] = "Leistung" +L["Press CTRL/C to copy."] = "Zum kopieren STRG+C drücken." +L["Queue from friends"] = "Warteschlange von Freunden" +L["R"] = "S" +L["Ragefire Chasm"] = "Der Flammenschlund" +L["Raid"] = "Schlachtzüge" +L["Raid frame toggle"] = "Schlachtzugsfenster umschalten" +L["Random"] = "Zufällig" +L["RARE"] = "SELTENER" +L["RARE ELITE"] = "SELTENER ELITE" +L["Ratchet"] = "Ratschet" +L["Razorfen Downs"] = "Hügel der Klingenhauer" +L["Razorfen Kraul"] = "Kral der Klingenhauer" +L["Recent chat window"] = "Kürzliches Chat Fenster" +L["Redridge Mountains"] = "Rotkammgebirge" +L["Refuge Pointe"] = "Die Zuflucht" +L["Release in PvP"] = "Geist im PvP freilassen" +L["Reload"] = "Neu laden" +L["Remember Alterac Valley!"] = "Vergesst das Alteractal nicht!" +L["Repair automatically"] = "Automatisch reparieren" +L["Repaired for"] = "Repariert für" +L["Reposition the tooltip"] = "Tooltip neu positionieren" +L["Requires UI reload."] = "Erfordert das neu laden des UI." +L["Reset"] = "Zurücksetzen" +L["Resize book text"] = "Größe des Buchtextes" +L["Resize mail text"] = "Mail-Text Größe" +L["Resize quest text"] = "Quest-Text Größe" +L["Resize Screen"] = "Größe der Fenster" +L["Rested bubbles"] = "Rested bubbles" +L["result"] = "Ergebnis" +L["results"] = "Ergebnisse" +L["Revantusk Village"] = "Dorf der Bruchhauer" +L["Right"] = "Rechts" +L["Right-click to close"] = "Rechtsklick zum schließen" +L["Right-click to close."] = "Rechtsklick zum schließen." +L["right-click to go back"] = "Rechtsklick um zurück zu gelangen" +L["Ruins of Ahn'Qiraj"] = "Die Ruinen von Ahn'Qiraj" +L["Rut'theran Village"] = "Rut'theran" +L["Sacred"] = "Heilig" +L["Sandfury, Skullsplitter, and Bloodscalp Coins"] = "Münzen der Sandfury, Skullsplitter und Bloodscalp" +L["Scale"] = "Rahmen" +L["Scarlet Monastery"] = "Das Scharlachrote Kloster" +L["Scholomance"] = "Scholomance" +L["Search"] = "Suche" +L["Searing Gorge"] = "Sengende Schlucht" +L["Select the settings that you want to use."] = "Auswahl der bevorzugten Einstellung." +L["Selection of music tracks"] = "Auswahl an Musikspur" +L["Self Markers Allowed"] = "Selbst-Markierung erlaubt" +L["Self Markers Blocked"] = "Selbst-Markierung blockiert" +L["Sell junk automatically"] = "Automatisch verkaufen" +L["SELLING JUNK"] = "RAMSCH VERKAUFEN" +L["Sentinel Hill"] = "Späherkuppe" +L["Set weather density"] = "Setze Wetter Dichte" +L["Settings"] = "Einstellungen" +L["Shaders"] = "Shaders" +L["Shadowfang Keep"] = "Burg Shadowfang" +L["Shadowmoon Valley"] = "Schattenmondtal" +L["Shadowprey Village"] = "Schattenflucht" +L["Shardtooth E'ko"] = "E'ko eines Splitterzahns" +L["Show bag search box"] = "Taschen-Suchfeld anzeigen" +L["Show character addons"] = "Zeige Charakter Addons" +L["Show cooldowns"] = "Zeige Abklingzeiten" +L["Show cooldowns above the player frame"] = "Abklingzeiten über dem Spielerrahmen anzeigen" +L["Show durability status"] = "Zeige Haltbarkeit Status" +L["Show free bag slots"] = "Zeige freie Taschenplätze an " +L["Show guild names"] = "Gildennamen anzeigen" +L["Show guild ranks for other guilds"] = "Zeige Gildenränge anderer Gilden" +L["Show guild ranks for your guild"] = "Zeige Gildenränge der eigenen Gilde" +L["Show minimap button"] = "Minimap Button anzeigen" +L["Show player chain"] = "Zeige Ketten um das Spieler Fenster Spieler Portrait Rahmen" +L["Show player frame in class color"] = "Färbe das Spieler Fenster in Klassenfarbe" +L["Show raid button"] = "Schlachtzugs Button" +L["Show the spell ID in buff icon tooltips"] = "Zauber ID im Buff Icon Tooltip anzeigen" +L["Show unit targets"] = "Einheitenziele anzeigen" +L["Show vendor price"] = "Händlerverkaufspreis anzeigen" +L["Show volume slider"] = "Zeige Lautstärkeregler" +L["Show Wowhead links"] = "Zeige Wowhead Links" +L["Silence rested emotes"] = "rested emotes stummschalten" +L["Silithus"] = "Silithus" +L["Silverpine Forest"] = "Silberwald" +L["Single Mark of Sargeras"] = "Einzelne Male des Sargeras" +L["Single Sunfury Signet"] = "Einzelne Siegel des Sonnenzorns" +L["Social"] = "Kontakte" +L["Sold junk for"] = "Ramsch verkauft für" +L["Sound system restarted."] = "Sound System neugestartet." +L["Southshore"] = "Süderstade" +L["Spell ID"] = "Zauber ID" +L["Splintertree Post"] = "Splitterholzposten" +L["Spooky"] = "Gruslig" +L["Stockade"] = "Verlies" +L["Stonard"] = "Steinard" +L["Stonetalon Mountains"] = "Steinkrallengebirge" +L["Stonetalon Peak"] = "Steinkrallengipfel" +L["Stop"] = "Stop" +L["Stormwind"] = "Sturmwind" +L["Stranglethorn Vale"] = "Schlingendorntal" +L["Stratholme"] = "Stratholme" +L["Sun Rock Retreat"] = "Sonnenfels" +L["Sunfury Signets"] = "Siegel des Sonnenzorns" +L["Sunken Temple"] = "Versunkener Tempel" +L["Sunwell Plateau"] = "Sonnenbrunnenplateau" +L["Support"] = "Support" +L["Swamp"] = "Sümpfe" +L["Swamp of Sorrows"] = "Sümpfe des Elends" +L["System"] = "System" +L["Tabard"] = "Wappenrock" +L["Taint level: Basic (1)."] = "Taint level: einfach (1)." +L["Taint level: Disabled (0)."] = "Taint level: deaktiviert (0)." +L["Taint level: Full (2)."] = "Taint level: gesamt (2)." +L["Talonbranch Glade"] = "Nachtlaublichtung" +L["Talrendis Point"] = "Talrendisspitze" +L["Tanaris"] = "Tanaris" +L["Target"] = "Ziel" +L["Target Tracking Disabled"] = "Ziel erfolgung deaktiviert" +L["Target Tracking Enabled"] = "Ziel Verfolgung aktiviert" +L["Tarren Mill"] = "Tarrens Mühle" +L["Teldrassil"] = "Teldrassil" +L["Tempest Keep"] = "Die Festung der Stürme" +L["Temple of Ahn'Qiraj"] = "Ahn'Qiraj" +L["Temple of Atal'Hakkar"] = "Der Tempel von Atal'Hakkar" +L["Ten Years of Warcraft"] = "Zehn Jahre Warcraft" +L["Terokkar Forest"] = "Wälder von Terokkar" +L["Text"] = "Text" +L["Text size"] = "Textgröße" +L["Text Size"] = "Textgröße" +L["The Sepulcher"] = "Das Grabmal" +L["The summon from"] = "Beschwörung von" +L["Themes"] = "Themes" +L["This panel will close automatically if you enter combat."] = "Dieses Fenster schließt sich im Kampf automatisch." +L["Thorium Point"] = "Thoriumspitze" +L["Thousand Needles"] = "Tausend Nadeln" +L["Thunder Bluff"] = "Donnerfels" +L["Timer"] = "Timer" +L["Tirisfal Glades"] = "Tirisfal" +L["To begin, choose an options page."] = "Wähle zum Starten eine Options Seite." +L["To hide the combat log, you need to disable the chat module in ElvUI."] = "Du musst zuerst das Chat Modul in ElvUI deaktivieren um den Kampflog zu verstecken." +L["To use the Find Item button, you need to deselect the WoW Token category."] = "Du musst zuerst die WoW Token Kategorie abwählen um den Gegenstands-Suche Button zu verwenden." +L["Tooltip"] = "Tooltip" +L["Tooltip title color"] = "Tooltip Titel Farbe" +L["Top"] = "oben" +L["Top Center"] = "Oben in der Mitte" +L["Tracing started."] = "Nachverfolgung gestartet." +L["Tracing stopped."] = "Nachverfolgung gestoppt." +L["Transparency"] = "Transparenz" +L["True"] = "Wahr" +L["Turn-in completed quests automatically"] = "Abgeschlossene Quests automatisch abgeben" +L["Uldaman"] = "Uldaman" +L["Unclamp chat frame"] = "Chat Fenster freigeben" +L["Undercity"] = "Unterstadt" +L["Un'Goro Crater"] = "Un'Goro-Krater" +L["Universal group color"] = "Gruppen-Farbe" +L["Use arrow keys in chat"] = "Pfeiltasten benutzen" +L["Use class colors in chat"] = "Verwendet Klassenfarben im Chat" +L["Use easy resizing"] = "Einfache Größenänderung" +L["Value must be a number."] = "Wert muss eine Nummer sein." +L["Various"] = "Verschiedenes" +L["Vendors"] = "Anbieter" +L["Version"] = "Version" +L["Very Low"] = "Sehr Niedrig" +L["Video"] = "Video" +L["Visibility"] = "Sichtbarkeit" +L["Wailing Caverns"] = "Die Höhlen des Wehklagens" +L["Warning"] = "Warnung" +L["was automatically declined."] = "wurde automatisch abgebrochen." +L["Weather density"] = "Wetter Dichte" +L["Welcome to Leatrix Plus."] = "Willkommen zu Leatrix Plus." +L["Western Plaguelands"] = "Westliche Pestländer" +L["Westfall"] = "Westfall" +L["Wetlands"] = "Sumpfland" +L["Widget"] = "Widget" +L["Wildkin E'ko"] = "E'ko der Wildekin" +L["will be automatically accepted in 10 seconds unless cancelled."] = "wird in 10 Sekunden automatisch akzeptiert, sofern nicht abgebrochen" +L["Winter"] = "Winter" +L["Winterfall E'ko"] = "E'ko der Winterfelle" +L["Winterspring"] = "Winterspring" +L["World of Warcraft"] = "World of Warcraft" +L["X Offset"] = "X-Abstand" +L["Y Offset"] = "Y-Abstand" +L["YOU"] = "DU" +L["You cannot do that in combat."] = "Dies kannst du in einem Kampf nicht tun." +L["You have"] = "Du hast" +L["Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect."] = "Damit gewisse Änderungen aktiv werden, muss das UI neu geladen werden.|n|nDu musst nicht gleich auf den Neuladen Button klicken, du kannst zuerst deine Änderungen fertig stellen und dann neuladen um sie zu übernehmen." +L["Your UI needs to be reloaded."] = "Das UI muss neu geladen werden." +L["Zangarmarsh"] = "Zangarmarschen" +L["Zones"] = "Gebiete" +L["Zoram'gar Outpost"] = "Außenposten von Zoram'gar" +L["Zul'Farrak"] = "Zul'Farrak" +L["Zul'Gurub"] = "Zul'Gurub" +L["Zulian, Razzashi, and Hakkari Coins"] = "Münzen der Razzashi, Hakkari und zulianische Münzen" +L["Zygor addon not found."] = "Das Addon Zygor wurde nicht gefunden." + +end diff --git a/Leatrix_Plus_Media.lua b/Leatrix_Plus_Media.lua new file mode 100644 index 0000000..81c8abe --- /dev/null +++ b/Leatrix_Plus_Media.lua @@ -0,0 +1,263 @@ + + ---------------------------------------------------------------------- + -- Leatrix Plus Media + ---------------------------------------------------------------------- + + -- Begin + local void, Leatrix_Plus = ... + local L = Leatrix_Plus.L + + local ZoneList = {} + local prefol = "|cffffffaa{" .. L["right-click to go back"] .. "}" + + -- Create a table for each heading + ZoneList = {L["Zones"], L["Dungeons"], L["Various"], L["Random"], L["Search"], L["Movies"]} + for k, v in ipairs(ZoneList) do + ZoneList[v] = {} + end + + -- Function to create a table for each zone + local function Zn(where, category, zone, tracklist) + tinsert(ZoneList[where], {category = category, zone = zone, tracks = tracklist}) + end + + -- Debug + -- Zn(L["Zones"], L["Eastern Kingdoms"], "Debug3", {"|cffffd800" .. L["Zones"] .. ": Debug2", "spells/absorbgethita.ogg#1", "spells/absorbgethitb.ogg#1",}) + + ---------------------------------------------------------------------- + -- Zones + ---------------------------------------------------------------------- + + -- Zones: Eastern Kingdoms + Zn(L["Zones"], L["Eastern Kingdoms"], "|cffffd800" .. L["Eastern Kingdoms"], {""}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Alterac Mountains"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Alterac Mountains"], prefol, "zonemusic/forest/dayforest01.mp3#56", "zonemusic/forest/dayforest02.mp3#73", "zonemusic/forest/dayforest03.mp3#65", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland02.mp3#59", "zonemusic/cursedland/cursedland03.mp3#64", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "musical moments/battle/battle06.mp3#62",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Arathi Highlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Arathi Highlands"], prefol, "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/mountain/daymountain01.mp3#120", "zonemusic/mountain/daymountain02.mp3#67", "zonemusic/mountain/daymountain03.mp3#80", "zonemusic/mountain/nightmountain01.mp3#64", "zonemusic/mountain/nightmountain02.mp3#63", "zonemusic/mountain/nightmountain03.mp3#69", "zonemusic/mountain/nightmountain04.mp3#64", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "musical moments/haunted/haunted01.mp3#62", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "musical moments/battle/battle05.mp3#45", "musical moments/gloomy/gloomy01.mp3#36", "citymusic/stormwind/stormwind08-zone.mp3#77",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Badlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Badlands"], prefol, "zonemusic/barrendry/daybarrendry01.mp3#64", "zonemusic/barrendry/daybarrendry02.mp3#64", "zonemusic/barrendry/daybarrendry03.mp3#55", "zonemusic/barrendry/nightbarrendry01.mp3#67", "zonemusic/barrendry/nightbarrendry02.mp3#41", "zonemusic/barrendry/nightbarrendry03.mp3#47", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Blasted Lands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Blasted Lands"], prefol, "zonemusic/barrendry/daybarrendry01.mp3#64", "zonemusic/barrendry/daybarrendry02.mp3#64", "zonemusic/barrendry/daybarrendry03.mp3#55", "zonemusic/barrendry/nightbarrendry01.mp3#67", "zonemusic/barrendry/nightbarrendry02.mp3#41", "zonemusic/barrendry/nightbarrendry03.mp3#47", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "musical moments/battle/battle06.mp3#62",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Burning Steppes"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Burning Steppes"], prefol, "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Deadwind Pass"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Deadwind Pass"], prefol, "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "musical moments/haunted/haunted01.mp3#62", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Dun Morogh"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Dun Morogh"], prefol, "zonemusic/mountain/daymountain01.mp3#120", "zonemusic/mountain/daymountain02.mp3#67", "zonemusic/mountain/daymountain03.mp3#80", "zonemusic/mountain/nightmountain01.mp3#64", "zonemusic/mountain/nightmountain02.mp3#63", "zonemusic/mountain/nightmountain03.mp3#69", "zonemusic/mountain/nightmountain04.mp3#64", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/tavernalliance/tavernalliance01.mp3#47", "zonemusic/tavernalliance/tavernalliance02.mp3#51",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Duskwood"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Duskwood"], prefol, "zonemusic/enchantedforest/enchantedforest01.mp3#50", "zonemusic/enchantedforest/enchantedforest02.mp3#67", "zonemusic/enchantedforest/enchantedforest03.mp3#235", "zonemusic/enchantedforest/enchantedforest04.mp3#61", "zonemusic/enchantedforest/enchantedforest05.mp3#71", "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland03.mp3#64", "musical moments/haunted/haunted01.mp3#62", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Eastern Plaguelands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Eastern Plaguelands"], prefol, "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland03.mp3#64", "citymusic/darnassus/darnassus walking 1.mp3#85", "citymusic/darnassus/darnassus walking 2.mp3#69", "citymusic/darnassus/darnassus walking 3.mp3#68", "musical moments/haunted/haunted01.mp3#62", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "citymusic/undercity/undercity01-zone.mp3#67", "citymusic/undercity/undercity02-zone.mp3#86", "citymusic/undercity/undercity03-zone.mp3#76", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Elwynn Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Elwynn Forest"], prefol, "zonemusic/forest/dayforest01.mp3#56", "zonemusic/forest/dayforest02.mp3#73", "zonemusic/forest/dayforest03.mp3#65", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "citymusic/stormwind/stormwind03-moment.mp3#70", "citymusic/stormwind/stormwind07-zone.mp3#87",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Eversong Woods"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Eversong Woods"], prefol, "zonemusic/eversong/es_ruinswalkday01.mp3#48", "zonemusic/eversong/es_ruinswalkday02.mp3#72", "zonemusic/eversong/es_ruinswalkday03.mp3#71", "zonemusic/eversong/es_sunstriderwalkday01.mp3#81", "zonemusic/eversong/es_sunstriderwalkday02.mp3#58", "zonemusic/eversong/es_sunstriderwalkday03.mp3#67", "zonemusic/eversong/es_ruinswalknight01.mp3#51", "zonemusic/eversong/es_ruinswalknight02.mp3#83", "zonemusic/eversong/es_ruinswalknight03.mp3#67", "zonemusic/eversong/es_sunstriderwalknight01.mp3#100", "zonemusic/eversong/es_sunstriderwalknight02.mp3#101", "zonemusic/eversong/es_sunstriderwalknight03.mp3#86", "zonemusic/eversong/es_buildingwalkday01.mp3#65", "zonemusic/eversong/es_buildingwalkday02.mp3#69", "zonemusic/eversong/es_buildingwalknight01.mp3#84", "zonemusic/eversong/es_buildingwalknight02.mp3#84",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Ghostlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Ghostlands"], prefol, "zonemusic/eversong/es_buildingwalkday01.mp3#65", "zonemusic/eversong/es_buildingwalkday02.mp3#69", "zonemusic/eversong/es_buildingwalknight01.mp3#84", "zonemusic/eversong/es_buildingwalknight02.mp3#84", "zonemusic/ghostlands/gl_forest1walkday01.mp3#67", "zonemusic/ghostlands/gl_forest1walkday02.mp3#70", "zonemusic/ghostlands/gl_forest2walkday01.mp3#83", "zonemusic/ghostlands/gl_forest1walknight01.mp3#67", "zonemusic/ghostlands/gl_forest2walknight01.mp3#60", "zonemusic/ghostlands/gl_forest2walknight02.mp3#61", "zonemusic/ghostlands/gl_forest3walkday01.mp3#154", "zonemusic/ghostlands/gl_forest3walknight01.mp3#51", "zonemusic/ghostlands/gl_forest3walknight02.mp3#28", "zonemusic/ghostlands/gl_forest3walknight03.mp3#44", "zonemusic/ghostlands/gl_eversongdarkwalkuni01.mp3#62", "zonemusic/ghostlands/gl_eversongdarkwalkuni02.mp3#62", "zonemusic/ghostlands/gl_eversongdarkwalkuni03.mp3#64", "zonemusic/ghostlands/gl_eversongdarkwalkuni04.mp3#61", "zonemusic/ghostlands/gl_shalandiswalkuni01.mp3#132", "zonemusic/ghostlands/gl_shalandiswalkuni02.mp3#104", "zonemusic/ghostlands/gl_shalandiswalkuni03.mp3#68", "zonemusic/zulaman/za_zulaman_amb10.mp3#114", "zonemusic/zulaman/za_zulaman_amb11.mp3#75", "zonemusic/zulaman/za_zulaman_amb12.mp3#109", "zonemusic/zulaman/za_zulaman_amb13.mp3#70", "zonemusic/zulaman/za_zulaman_amb14.mp3#90", "zonemusic/zulaman/za_zulaman_amb15.mp3#114",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Hillsbrad Foothills"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Hillsbrad Foothills"], prefol, "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/forest/dayforest01.mp3#56", "zonemusic/forest/dayforest02.mp3#73", "zonemusic/forest/dayforest03.mp3#65", "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland03.mp3#64", "zonemusic/forest/nightforest01.mp3#53", "zonemusic/forest/nightforest02.mp3#43", "zonemusic/forest/nightforest03.mp3#59", "zonemusic/forest/nightforest04.mp3#54", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "citymusic/undercity/undercity01-zone.mp3#67", "citymusic/undercity/undercity02-zone.mp3#86", "citymusic/undercity/undercity03-zone.mp3#76", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Hinterlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Hinterlands"], prefol, "citymusic/darnassus/darnassus walking 1.mp3#85", "citymusic/darnassus/darnassus walking 2.mp3#69", "citymusic/darnassus/darnassus walking 3.mp3#68", "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/enchantedforest/enchantedforest01.mp3#50", "zonemusic/enchantedforest/enchantedforest02.mp3#67", "zonemusic/enchantedforest/enchantedforest03.mp3#235", "zonemusic/enchantedforest/enchantedforest04.mp3#61", "zonemusic/enchantedforest/enchantedforest05.mp3#71", "zonemusic/forest/dayforest01.mp3#56", "zonemusic/forest/dayforest02.mp3#73", "zonemusic/forest/dayforest03.mp3#65", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Loch Modan"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Loch Modan"], prefol, "zonemusic/forest/dayforest01.mp3#56", "zonemusic/forest/dayforest02.mp3#73", "zonemusic/forest/dayforest03.mp3#65", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Redridge Mountains"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Redridge Mountains"], prefol, "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/forest/dayforest01.mp3#56", "zonemusic/forest/dayforest02.mp3#73", "zonemusic/forest/dayforest03.mp3#65", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/tavernalliance/tavernalliance01.mp3#47", "zonemusic/tavernalliance/tavernalliance02.mp3#51", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Searing Gorge"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Searing Gorge"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Silverpine Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Silverpine Forest"], prefol, "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "musical moments/haunted/haunted01.mp3#62", "zonemusic/forest/nightforest01.mp3#53", "zonemusic/forest/nightforest02.mp3#43", "zonemusic/forest/nightforest03.mp3#59", "zonemusic/forest/nightforest04.mp3#54", "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland03.mp3#64", "musical moments/battle/battle04.mp3#36", "musical moments/battle/battle06.mp3#62",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Stranglethorn Vale"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Stranglethorn Vale"], prefol, "zonemusic/barrendry/daybarrendry03.mp3#55", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "musical moments/zulgurubvoodoo.mp3#85",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Swamp of Sorrows"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Swamp of Sorrows"], prefol, "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Tirisfal Glades"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Tirisfal Glades"], prefol, "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "musical moments/haunted/haunted01.mp3#62", "zonemusic/tavernhorde/tavernhorde03.mp3#47",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Westfall"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Westfall"], prefol, "zonemusic/barrendry/daybarrendry01.mp3#64", "zonemusic/barrendry/daybarrendry02.mp3#64", "zonemusic/barrendry/daybarrendry03.mp3#55", "zonemusic/barrendry/nightbarrendry01.mp3#67", "zonemusic/barrendry/nightbarrendry02.mp3#41", "zonemusic/barrendry/nightbarrendry03.mp3#47", "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/plains/dayplains01.mp3#54", "zonemusic/plains/dayplains02.mp3#77", "zonemusic/plains/nightplains01.mp3#58", "zonemusic/plains/nightplains02.mp3#69",}) -- Mystery1:10 + Zn(L["Zones"], L["Eastern Kingdoms"], L["Western Plaguelands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Western Plaguelands"], prefol, "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland03.mp3#64", "musical moments/haunted/haunted01.mp3#62", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "musical moments/gloomy/gloomy01.mp3#36", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70",}) + Zn(L["Zones"], L["Eastern Kingdoms"], L["Wetlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Wetlands"], prefol, "zonemusic/forest/nightforest01.mp3#53", "zonemusic/forest/nightforest02.mp3#43", "zonemusic/forest/nightforest03.mp3#59", "zonemusic/forest/nightforest04.mp3#54", "zonemusic/forest/dayforest01.mp3#56", "zonemusic/forest/dayforest02.mp3#73", "zonemusic/forest/dayforest03.mp3#65", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "musical moments/haunted/haunted01.mp3#62", "musical moments/haunted/haunted02.mp3#60", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/tavernalliance/tavernalliance01.mp3#47", "zonemusic/tavernalliance/tavernalliance02.mp3#51", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + + -- Zones: Kalimdor + Zn(L["Zones"], L["Kalimdor"], "|cffffd800", {""}) + Zn(L["Zones"], L["Kalimdor"], "|cffffd800" .. L["Kalimdor"], {""}) + Zn(L["Zones"], L["Kalimdor"], L["Ashenvale"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Ashenvale"], prefol, "zonemusic/barrendry/daybarrendry03.mp3#55", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland02.mp3#59", "zonemusic/cursedland/cursedland03.mp3#64", "citymusic/darnassus/darnassus walking 1.mp3#85", "citymusic/darnassus/darnassus walking 2.mp3#69", "citymusic/darnassus/darnassus walking 3.mp3#68", "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/enchantedforest/enchantedforest01.mp3#50", "zonemusic/enchantedforest/enchantedforest02.mp3#67", "zonemusic/enchantedforest/enchantedforest03.mp3#235", "zonemusic/enchantedforest/enchantedforest04.mp3#61", "zonemusic/enchantedforest/enchantedforest05.mp3#71", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "musical moments/magic/magic01-zone1.mp3#33", "musical moments/magic/magic01-zone2.mp3#39", "zonemusic/tavernhorde/tavernhorde01.mp3#48", "zonemusic/tavernhorde/tavernhorde02.mp3#39", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "musical moments/battle/battle06.mp3#62", "citymusic/darnassus/warrior terrace.mp3#53",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Azshara"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Azshara"], prefol, "citymusic/darnassus/darnassus walking 1.mp3#85", "citymusic/darnassus/darnassus walking 2.mp3#69", "citymusic/darnassus/darnassus walking 3.mp3#68", "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "musical moments/haunted/haunted01.mp3#62", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/mountain/daymountain01.mp3#120", "zonemusic/mountain/daymountain02.mp3#67", "zonemusic/mountain/daymountain03.mp3#80", "zonemusic/mountain/nightmountain01.mp3#64", "zonemusic/mountain/nightmountain02.mp3#63", "zonemusic/mountain/nightmountain03.mp3#69", "zonemusic/mountain/nightmountain04.mp3#64", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "zonemusic/barrendry/daybarrendry03.mp3#55", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "musical moments/battle/battle05.mp3#45",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Azuremyst Isle"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Azuremyst Isle"], prefol, "zonemusic/azuremyst/ai_nagawalkuni01.mp3#103", "zonemusic/azuremyst/ai_nagawalkuni02.mp3#74", "zonemusic/azuremyst/ai_nagawalkuni03.mp3#150", "zonemusic/azuremyst/ai_nagawalkuni04.mp3#73", "zonemusic/azuremyst/ai_nagawalkuni05.mp3#99", "zonemusic/outlandgeneral/ol_alliancebasewalkuni01.mp3#135", "zonemusic/outlandgeneral/ol_alliancebasewalkuni02.mp3#111", "zonemusic/azuremyst/ai_draeneiwalkuni05.mp3#192", "zonemusic/azuremyst/ai_draeneiwalkuni06.mp3#111", "zonemusic/azuremyst/ai_draeneiwalkuni07r.mp3#110", "zonemusic/azuremyst/ai_draeneiwalkuni08r.mp3#99", "zonemusic/azuremyst/av_draeneiwalkuni02r.mp3#129", "zonemusic/azuremyst/av_draeneiwalkuni03.mp3#188", "zonemusic/azuremyst/av_draeneiwalkuni04.mp3#158", "zonemusic/azuremyst/ai_owlkinwalkuni01.mp3#49", "zonemusic/azuremyst/ai_owlkinwalkuni02.mp3#46",}) + Zn(L["Zones"], L["Kalimdor"], L["Bloodmyst Isle"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Bloodmyst Isle"], prefol, "zonemusic/azuremyst/ai_nagawalkuni01.mp3#103", "zonemusic/azuremyst/ai_nagawalkuni02.mp3#74", "zonemusic/azuremyst/ai_nagawalkuni03.mp3#150", "zonemusic/azuremyst/ai_nagawalkuni04.mp3#73", "zonemusic/azuremyst/ai_nagawalkuni05.mp3#99", "zonemusic/bloodmyst/bi_satyrwalkuni01r.mp3#127", "zonemusic/bloodmyst/bi_satyrwalkuni02.mp3#130", "zonemusic/bloodmyst/bi_satyrwalkuni03.mp3#115", "zonemusic/bloodmyst/bi_satyrwalkuni04.mp3#70", "zonemusic/bloodmyst/bi_satyrwalkuni05.mp3#144",}) + Zn(L["Zones"], L["Kalimdor"], L["Barrens"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Barrens"], prefol, "zonemusic/barrendry/daybarrendry01.mp3#64", "zonemusic/barrendry/daybarrendry02.mp3#64", "zonemusic/barrendry/daybarrendry03.mp3#55", "zonemusic/barrendry/nightbarrendry01.mp3#67", "zonemusic/barrendry/nightbarrendry02.mp3#41", "zonemusic/barrendry/nightbarrendry03.mp3#47", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "citymusic/thunderbluff/thunderbluff walking 01.mp3#117", "citymusic/thunderbluff/thunderbluff walking 02.mp3#116", "citymusic/undercity/undercity01-zone.mp3#67", "citymusic/undercity/undercity02-zone.mp3#86", "citymusic/undercity/undercity03-zone.mp3#76", "zonemusic/tavernhorde/undead_dance.mp3#25", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "musical moments/battle/battle04.mp3#36", "musical moments/battle/battle06.mp3#62",}) + Zn(L["Zones"], L["Kalimdor"], L["Darkshore"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Darkshore"], prefol, "zonemusic/forest/nightforest01.mp3#53", "zonemusic/forest/nightforest02.mp3#43", "zonemusic/forest/nightforest03.mp3#59", "zonemusic/forest/nightforest04.mp3#54", "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "musical moments/haunted/haunted01.mp3#62", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) + Zn(L["Zones"], L["Kalimdor"], L["Desolace"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Desolace"], prefol, "zonemusic/barrendry/daybarrendry01.mp3#64", "zonemusic/barrendry/daybarrendry02.mp3#64", "zonemusic/barrendry/daybarrendry03.mp3#55", "zonemusic/barrendry/nightbarrendry01.mp3#67", "zonemusic/barrendry/nightbarrendry02.mp3#41", "zonemusic/barrendry/nightbarrendry03.mp3#47", "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland03.mp3#64", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "citymusic/darnassus/darnassus walking 1.mp3#85", "citymusic/darnassus/darnassus walking 2.mp3#69", "citymusic/darnassus/darnassus walking 3.mp3#68", "musical moments/battle/battle05.mp3#45", "musical moments/battle/battle06.mp3#62", "musical moments/gloomy/gloomy01.mp3#36", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "citymusic/thunderbluff/thunderbluff walking 01.mp3#117", "citymusic/thunderbluff/thunderbluff walking 02.mp3#116", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "zonemusic/tavernhorde/tavernhorde01.mp3#48", "zonemusic/tavernhorde/tavernhorde02.mp3#39",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Durotar"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Durotar"], prefol, "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "zonemusic/tavernhorde/tavernhorde01.mp3#48", "zonemusic/tavernhorde/tavernhorde02.mp3#39", "zonemusic/plains/dayplains01.mp3#54", "zonemusic/plains/dayplains02.mp3#77", "zonemusic/plains/nightplains01.mp3#58", "zonemusic/plains/nightplains02.mp3#69", "citymusic/stormwind/stormwind08-zone.mp3#77",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Dustwallow Marsh"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Dustwallow Marsh"], prefol, "zonemusic/forest/nightforest01.mp3#53", "zonemusic/forest/nightforest02.mp3#43", "zonemusic/forest/nightforest03.mp3#59", "zonemusic/forest/nightforest04.mp3#54", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "citymusic/stormwind/stormwind01-moment.mp3#55", "citymusic/stormwind/stormwind02-moment.mp3#36", "citymusic/stormwind/stormwind03-moment.mp3#70", "citymusic/stormwind/stormwind04-zone.mp3#62", "citymusic/stormwind/stormwind05-zone.mp3#61", "citymusic/stormwind/stormwind06-zone.mp3#54", "citymusic/stormwind/stormwind07-zone.mp3#87", "citymusic/stormwind/stormwind08-zone.mp3#77", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62",}) + Zn(L["Zones"], L["Kalimdor"], L["Felwood"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Felwood"], prefol, "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland02.mp3#59", "zonemusic/cursedland/cursedland03.mp3#64", "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90",}) + Zn(L["Zones"], L["Kalimdor"], L["Feralas"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Feralas"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/enchantedforest/enchantedforest01.mp3#50", "zonemusic/enchantedforest/enchantedforest02.mp3#67", "zonemusic/enchantedforest/enchantedforest03.mp3#235", "zonemusic/enchantedforest/enchantedforest04.mp3#61", "zonemusic/enchantedforest/enchantedforest05.mp3#71", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "citymusic/thunderbluff/thunderbluff walking 01.mp3#117", "citymusic/thunderbluff/thunderbluff walking 02.mp3#116", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Moonglade"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Moonglade"], prefol, "zonemusic/forest/nightforest01.mp3#53", "zonemusic/forest/nightforest02.mp3#43", "zonemusic/forest/nightforest03.mp3#59", "zonemusic/forest/nightforest04.mp3#54", "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/cursedland/cursedland02.mp3#59", "zonemusic/cursedland/cursedland03.mp3#64",}) + Zn(L["Zones"], L["Kalimdor"], L["Mulgore"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Mulgore"], prefol, "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/plains/dayplains01.mp3#54", "zonemusic/plains/dayplains02.mp3#77", "zonemusic/plains/nightplains01.mp3#58", "zonemusic/plains/nightplains02.mp3#69", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) + Zn(L["Zones"], L["Kalimdor"], L["Silithus"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Silithus"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Stonetalon Mountains"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Stonetalon Mountains"], prefol, "zonemusic/barrendry/daybarrendry01.mp3#64", "zonemusic/barrendry/daybarrendry02.mp3#64", "zonemusic/barrendry/daybarrendry03.mp3#55", "zonemusic/barrendry/nightbarrendry01.mp3#67", "zonemusic/barrendry/nightbarrendry02.mp3#41", "zonemusic/barrendry/nightbarrendry03.mp3#47", "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "zonemusic/forest/nightforest01.mp3#53", "zonemusic/forest/nightforest02.mp3#43", "zonemusic/forest/nightforest03.mp3#59", "zonemusic/forest/nightforest04.mp3#54", "zonemusic/enchantedforest/enchantedforest01.mp3#50", "zonemusic/enchantedforest/enchantedforest02.mp3#67", "zonemusic/enchantedforest/enchantedforest03.mp3#235", "zonemusic/enchantedforest/enchantedforest04.mp3#61", "zonemusic/enchantedforest/enchantedforest05.mp3#71", "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/tavernhorde/tavernhorde01.mp3#48", "zonemusic/tavernhorde/tavernhorde02.mp3#39", "citymusic/thunderbluff/thunderbluff walking 01.mp3#117", "citymusic/thunderbluff/thunderbluff walking 02.mp3#116", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) + Zn(L["Zones"], L["Kalimdor"], L["Tanaris"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Tanaris"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64",}) + Zn(L["Zones"], L["Kalimdor"], L["Teldrassil"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Teldrassil"], prefol, "zonemusic/enchantedforest/enchantedforest01.mp3#50", "zonemusic/enchantedforest/enchantedforest02.mp3#67", "zonemusic/enchantedforest/enchantedforest03.mp3#235", "zonemusic/enchantedforest/enchantedforest04.mp3#61", "zonemusic/enchantedforest/enchantedforest05.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "citymusic/darnassus/darnassus walking 1.mp3#85", "citymusic/darnassus/darnassus walking 2.mp3#69", "citymusic/darnassus/darnassus walking 3.mp3#68", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Thousand Needles"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Thousand Needles"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "citymusic/thunderbluff/thunderbluff walking 01.mp3#117", "citymusic/thunderbluff/thunderbluff walking 02.mp3#116", "citymusic/thunderbluff/thunderbluff walking 03.mp3#121", "zonemusic/plains/dayplains01.mp3#54", "zonemusic/plains/dayplains02.mp3#77", "zonemusic/plains/nightplains01.mp3#58", "zonemusic/plains/nightplains02.mp3#69",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Un'Goro Crater"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Un'Goro Crater"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58", "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90",}) -- Mystery1:10 + Zn(L["Zones"], L["Kalimdor"], L["Winterspring"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Winterspring"], prefol, "citymusic/darnassus/darnassus walking 1.mp3#85", "citymusic/darnassus/darnassus walking 2.mp3#69", "citymusic/darnassus/darnassus walking 3.mp3#68", "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "citymusic/gnomeragon/gnomeragon01-zone.mp3#65", "citymusic/gnomeragon/gnomeragon02-zone.mp3#65", "zonemusic/mountain/daymountain01.mp3#120", "zonemusic/mountain/daymountain02.mp3#67", "zonemusic/mountain/daymountain03.mp3#80", "zonemusic/mountain/nightmountain01.mp3#64", "zonemusic/mountain/nightmountain02.mp3#63", "zonemusic/mountain/nightmountain03.mp3#69", "zonemusic/mountain/nightmountain04.mp3#64", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70","zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", "musical moments/gloomy/gloomy01.mp3#36",}) -- Mystery1:10 + + -- Zones: Outland + Zn(L["Zones"], L["Outland"], "|cffffd800", {""}) + Zn(L["Zones"], L["Outland"], "|cffffd800" .. L["Outland"], {""}) + Zn(L["Zones"], L["Outland"], L["Blade's Edge Mountains"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Blade's Edge Mountains"], prefol, "zonemusic/bladesedge/bl_generalwalkuni01.mp3#80", "zonemusic/bladesedge/bl_generalwalkuni02.mp3#75", "zonemusic/bladesedge/bl_generalwalkuni03.mp3#159", "zonemusic/bladesedge/bl_generalwalkuni04.mp3#110", "zonemusic/bladesedge/bl_generalwalkuni05.mp3#110", "zonemusic/bladesedge/bl_dryforestwalkuni01.mp3#89", "zonemusic/bladesedge/bl_dryforestwalkuni02.mp3#128", "zonemusic/bladesedge/bl_dryforestwalkuni03.mp3#132", "zonemusic/outlandgeneral/ol_hordebasewalkuni03.mp3#66", "zonemusic/outlandgeneral/ol_hordebasewalkuni04.mp3#68", "zonemusic/outlandgeneral/ol_shamanintrouni01.mp3#44", "zonemusic/outlandgeneral/ol_shamanintrouni02.mp3#54",}) + Zn(L["Zones"], L["Outland"], L["Hellfire Peninsula"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Hellfire Peninsula"], prefol, "zonemusic/hellfirepeninsula/he_generalwalkuni01.mp3#130", "zonemusic/hellfirepeninsula/he_generalwalkuni02.mp3#67","zonemusic/hellfirepeninsula/he_generalwalkuni03.mp3#59", "zonemusic/hellfirepeninsula/he_generalwalkuni04.mp3#96", "zonemusic/hellfirepeninsula/he_generalwalkuni05.mp3#127", "zonemusic/outlandgeneral/ol_hordebasewalkuni03.mp3#66", "zonemusic/outlandgeneral/ol_hordebasewalkuni04.mp3#68", "zonemusic/outlandgeneral/ol_alliancebasewalkuni01.mp3#135", "zonemusic/outlandgeneral/ol_alliancebasewalkuni02.mp3#111", "zonemusic/outlandgeneral/ol_bloodelfbasewalkuni01.mp3#120", "zonemusic/outlandgeneral/ol_bloodelfbasewalkuni02.mp3#122", "zonemusic/outlandgeneral/ol_draeneibasewalkuni01.mp3#107", "zonemusic/outlandgeneral/ol_draeneibasewalkuni02r.mp3#100",}) + Zn(L["Zones"], L["Outland"], L["Nagrand"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Nagrand"], prefol, "zonemusic/nagrand/na_generalwalkday01.mp3#73", "zonemusic/nagrand/na_generalwalkday02.mp3#100", "zonemusic/nagrand/na_generalwalkday03.mp3#63", "zonemusic/nagrand/na_generalwalknight01.mp3#88", "zonemusic/nagrand/na_generalwalknight02.mp3#80", "zonemusic/nagrand/na_generalwalknight03.mp3#167", "zonemusic/outlandgeneral/ol_hordebasewalkuni03.mp3#66", "zonemusic/outlandgeneral/ol_hordebasewalkuni04.mp3#68", "zonemusic/outlandgeneral/ol_draeneibasewalkuni01.mp3#107", "zonemusic/outlandgeneral/ol_draeneibasewalkuni02r.mp3#100",}) + Zn(L["Zones"], L["Outland"], L["Netherstorm"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Netherstorm"], prefol, "zonemusic/netherstorm/ns_generalwalkuni01.mp3#151", "zonemusic/netherstorm/ns_generalwalkuni02.mp3#176", "zonemusic/netherstorm/ns_generalwalkuni03.mp3#178", "zonemusic/netherstorm/ns_generalwalkuni04.mp3#181", "zonemusic/netherstorm/ns_generalwalkuni05.mp3#184", "zonemusic/netherstorm/ns_generalwalkuni06.mp3#192", "zonemusic/netherstorm/ns_generalwalkuni07.mp3#193", "zonemusic/netherstorm/ns_generalwalkuni08.mp3#169", "zonemusic/netherstorm/ns_generalwalkuni09.mp3#199", "zonemusic/netherstorm/ns_generalwalkuni10.mp3#223", "zonemusic/outlandgeneral/ol_draeneibasewalkuni01.mp3#107", "zonemusic/outlandgeneral/ol_draeneibasewalkuni02r.mp3#100", "zonemusic/nagrand/na_generalwalkday01.mp3#73", "zonemusic/nagrand/na_generalwalkday02.mp3#100", "zonemusic/outlandgeneral/ol_historicintrouni01.mp3#79", "zonemusic/ghostlands/gl_forest3walknight01.mp3#51", "zonemusic/ghostlands/gl_forest3walknight02.mp3#28", "zonemusic/ghostlands/gl_forest3walknight03.mp3#44",}) + Zn(L["Zones"], L["Outland"], L["Shadowmoon Valley"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Shadowmoon Valley"], prefol, "zonemusic/shadowmoonvalley/sv_generalwalkuni01.mp3#68", "zonemusic/shadowmoonvalley/sv_generalwalkuni02.mp3#113", "zonemusic/shadowmoonvalley/sv_generalwalkuni03.mp3#106", "zonemusic/shadowmoonvalley/sv_generalwalkuni04.mp3#93", "zonemusic/shadowmoonvalley/sv_generalwalkuni05.mp3#93", "zonemusic/shadowmoonvalley/sv_generalwalkuni06.mp3#68", "zonemusic/outlandgeneral/ol_hordebasewalkuni03.mp3#66", "zonemusic/outlandgeneral/ol_hordebasewalkuni04.mp3#68", "zonemusic/outlandgeneral/ol_alliancebasewalkuni01.mp3#135", "zonemusic/outlandgeneral/ol_alliancebasewalkuni02.mp3#111", "zonemusic/outlandgeneral/ol_draeneibasewalkuni01.mp3#107", "zonemusic/outlandgeneral/ol_draeneibasewalkuni02r.mp3#100", "zonemusic/blacktemple/bt_arrivalwalkuni02.mp3#82", "zonemusic/blacktemple/bt_arrivalwalkuni03.mp3#74", "zonemusic/blacktemple/bt_illidariwalkuni01.mp3#62", "zonemusic/blacktemple/bt_illidariwalkuni02.mp3#72", "zonemusic/blacktemple/bt_illidariwalkuni03.mp3#78", "zonemusic/blacktemple/bt_illidariwalkuni06.mp3#29", "zonemusic/blacktemple/bt_illidariwalkuni07.mp3#78", "zonemusic/blacktemple/bt_illidariwalkuni08.mp3#65", "zonemusic/blacktemple/bt_sanctuarywalkuni02.mp3#65", "zonemusic/blacktemple/bt_sanctuarywalkuni03.mp3#66",}) + Zn(L["Zones"], L["Outland"], L["Terokkar Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Terokkar Forest"], prefol, "zonemusic/terokkar/tf_forestwalkuni01.mp3#151", "zonemusic/terokkar/tf_forestwalkuni02.mp3#190", "zonemusic/terokkar/tf_forestwalkuni03.mp3#188", "zonemusic/outlandgeneral/ol_hordebasewalkuni03.mp3#66", "zonemusic/outlandgeneral/ol_hordebasewalkuni04.mp3#68", "zonemusic/outlandgeneral/ol_alliancebasewalkuni01.mp3#135", "zonemusic/outlandgeneral/ol_alliancebasewalkuni02.mp3#111", "zonemusic/terokkar/tf_bonewalkuni01.mp3#65", "zonemusic/terokkar/tf_bonewalkuni02.mp3#63", "zonemusic/terokkar/tf_bonewalkuni03.mp3#57", "zonemusic/terokkar/tf_bonewalkuni04.mp3#190", "zonemusic/outlandgeneral/ol_draeneibasewalkuni01.mp3#107", "zonemusic/outlandgeneral/ol_draeneibasewalkuni02r.mp3#100", "zonemusic/ghostlands/gl_forest3walknight01.mp3#51", "zonemusic/ghostlands/gl_forest3walknight02.mp3#28", "zonemusic/ghostlands/gl_forest3walknight03.mp3#44",}) + Zn(L["Zones"], L["Outland"], L["Zangarmarsh"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Zangarmarsh"], prefol, "zonemusic/zangarmarsh/za_generalwalkuni01.mp3#82", "zonemusic/zangarmarsh/za_generalwalkuni02.mp3#120", "zonemusic/zangarmarsh/za_generalwalkuni03.mp3#60", "zonemusic/zangarmarsh/za_generalwalkuni04.mp3#103", "zonemusic/zangarmarsh/za_generalwalkuni05.mp3#72", "zonemusic/zangarmarsh/za_generalwalkuni06.mp3#90", "zonemusic/outlandgeneral/ol_hordebasewalkuni03.mp3#66", "zonemusic/outlandgeneral/ol_hordebasewalkuni04.mp3#68", "zonemusic/outlandgeneral/ol_draeneibasewalkuni01.mp3#107", "zonemusic/outlandgeneral/ol_draeneibasewalkuni02r.mp3#100",}) + + -- Zones: Northrend + Zn(L["Zones"], L["Northrend"], "|cffffd800", {""}) + Zn(L["Zones"], L["Northrend"], "|cffffd800" .. L["Northrend"], {""}) + Zn(L["Zones"], L["Northrend"], L["Borean Tundra"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Borean Tundra"], prefol, "zonemusic/boreantundra/bo_coldarrawalkuni01.mp3#65", "zonemusic/boreantundra/bo_coldarrawalkuni02.mp3#64", "zonemusic/boreantundra/bo_coldarrawalkuni03.mp3#124", "zonemusic/boreantundra/bo_generalwalk_day01.mp3#74", "zonemusic/boreantundra/bo_generalwalk_day02.mp3#101", "zonemusic/boreantundra/bo_generalwalk_day03.mp3#79", "zonemusic/boreantundra/bo_generalwalk_day04.mp3#112", "zonemusic/boreantundra/bo_generalwalk_day05.mp3#73", "zonemusic/boreantundra/bo_generalwalk_day06.mp3#115", "zonemusic/boreantundra/bo_generalwalk_day07.mp3#87", "zonemusic/boreantundra/bo_generalwalk_day08.mp3#72", "zonemusic/boreantundra/bo_generalwalk_night01.mp3#73", "zonemusic/boreantundra/bo_generalwalk_night02.mp3#115", "zonemusic/boreantundra/bo_generalwalk_night03.mp3#89", "zonemusic/boreantundra/bo_generalwalk_night04.mp3#70", "zonemusic/boreantundra/bo_generalwalk_night05.mp3#78", "zonemusic/boreantundra/bo_generalwalk_night06.mp3#100", "zonemusic/boreantundra/bo_generalwalk_night07.mp3#79", "zonemusic/boreantundra/bo_generalwalk_night08.mp3#112", "zonemusic/boreantundra/bo_geyserfield_general01.mp3#58", "zonemusic/boreantundra/bo_geyserfield_general02.mp3#49", "zonemusic/boreantundra/bo_geyserfield_general03.mp3#63", "zonemusic/boreantundra/bo_riplash_day01.mp3#152", "zonemusic/boreantundra/bo_riplash_day02.mp3#187", "zonemusic/boreantundra/bo_riplash_day03.mp3#162", "zonemusic/boreantundra/bo_riplash_night01.mp3#160", "zonemusic/boreantundra/bo_riplash_night02.mp3#79", "zonemusic/boreantundra/bo_riplash_night03.mp3#76", "zonemusic/boreantundra/bo_riplash_night04.mp3#95", "zonemusic/boreantundra/bo_tusk_kaskaladay01.mp3#101", "zonemusic/boreantundra/bo_tusk_kaskaladay02.mp3#80", "zonemusic/boreantundra/bo_tusk_kaskalanight01.mp3#99", "zonemusic/boreantundra/bo_tusk_kaskalanight02.mp3#60", "zonemusic/nexus/nz_nexusactionwalkuni01.mp3#76", "zonemusic/nexus/nz_nexusactionwalkuni02.mp3#68", "zonemusic/nexus/nz_nexusactionwalkuni03.mp3#102", "zonemusic/nexus/nz_nexusactionwalkuni04.mp3#107", "zonemusic/nexus/nz_nexusactionwalkuni05.mp3#91", "zonemusic/nexus/nz_nexuspulsewalkuni01.mp3#61", "zonemusic/nexus/nz_nexuspulsewalkuni02.mp3#71", "zonemusic/nexus/nz_nexusquietwalkuni01.mp3#114", "zonemusic/nexus/nz_nexusquietwalkuni02.mp3#111", "zonemusic/nexus/nz_nexusquietwalkuni03.mp3#56", "zonemusic/nexus/nz_nexusquietwalkuni04.mp3#72",}) + Zn(L["Zones"], L["Northrend"], L["Crystalsong Forest"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Crystalsong Forest"], prefol, "zonemusic/crystalsong/cs_crystalsongwalkuni01.mp3#113", "zonemusic/crystalsong/cs_crystalsongwalkuni02.mp3#99", "zonemusic/crystalsong/cs_crystalsongwalkuni03.mp3#73", "zonemusic/crystalsong/cs_crystalsongwalkuni04.mp3#113", "zonemusic/crystalsong/cs_crystalsongwalkuni05.mp3#107", "zonemusic/dalaran/dc_generalwalkuni01.mp3#68", "zonemusic/dalaran/dc_generalwalkuni02.mp3#43", "zonemusic/dalaran/dc_generalwalkuni03.mp3#70", "zonemusic/dalaran/dc_generalwalkuni04.mp3#89", "zonemusic/dalaran/dc_sewerwalkuni01.mp3#67", "zonemusic/dalaran/dc_sewerwalkuni02.mp3#102", "zonemusic/dalaran/dc_sewerwalkuni03.mp3#72", "zonemusic/dalaran/dc_sewerwalkuni04.mp3#65", "zonemusic/dalaran/dc_spirewalkuni01.mp3#92",}) + Zn(L["Zones"], L["Northrend"], L["Dragonblight"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Dragonblight"], prefol, "zonemusic/dragonblight/db_generalintro_02.mp3#93", "zonemusic/dragonblight/db_generalintro_03.mp3#92", "zonemusic/dragonblight/db_generalintro_04.mp3#93", "zonemusic/dragonblight/db_generalwalk_day01.mp3#75", "zonemusic/dragonblight/db_generalwalk_day02.mp3#57", "zonemusic/dragonblight/db_generalwalk_day03.mp3#120", "zonemusic/dragonblight/db_generalwalk_day04.mp3#76", "zonemusic/dragonblight/db_generalwalk_day05.mp3#93", "zonemusic/dragonblight/db_generalwalk_day06.mp3#94", "zonemusic/dragonblight/db_generalwalk_day07.mp3#93", "zonemusic/dragonblight/db_generalwalk_day08.mp3#93", "zonemusic/dragonblight/db_generalwalk_night01.mp3#74", "zonemusic/dragonblight/db_generalwalk_night02.mp3#57", "zonemusic/dragonblight/db_generalwalk_night03.mp3#119", "zonemusic/dragonblight/db_generalwalk_night04.mp3#76", "zonemusic/dragonblight/db_generalwalk_night05.mp3#93", "zonemusic/dragonblight/db_generalwalk_night06.mp3#93", "zonemusic/dragonblight/db_generalwalk_night07.mp3#94", "zonemusic/dragonblight/db_generalwalk_night08.mp3#94", "zonemusic/dragonblight/db_tusk_induleday01.mp3#130", "zonemusic/dragonblight/db_tusk_induleday02.mp3#60", "zonemusic/dragonblight/db_tusk_induleday03.mp3#39", "zonemusic/dragonblight/db_tusk_indulenight01.mp3#133", "zonemusic/dragonblight/db_tusk_indulenight02.mp3#64", "zonemusic/dragonblight/db_tusk_indulenight03.mp3#39", "zonemusic/azjolnerub/an_generalintro_01.mp3#62", "zonemusic/azjolnerub/an_generalintro_02.mp3#98", "zonemusic/azjolnerub/an_generalintro_04.mp3#63", "zonemusic/azjolnerub/an_generalintro_05.mp3#76", "zonemusic/azjolnerub/an_generalintro_06.mp3#107", "zonemusic/azjolnerub/an_generalwalk_04.mp3#63", "zonemusic/azjolnerub/an_generalwalk_05.mp3#77", "zonemusic/azjolnerub/an_generalwalk_09.mp3#99", "zonemusic/azjolnerub/an_generalwalk_13.mp3#64", "zonemusic/azjolnerub/an_generalwalk_14.mp3#63", "zonemusic/azjolnerub/an_generalwalk_15.mp3#76", "zonemusic/azjolnerub/an_generalwalk_16.mp3#77", "zonemusic/naxxramas/naxxramasabominationboss1.mp3#61", "zonemusic/naxxramas/naxxramasabominationboss2.mp3#67", "zonemusic/naxxramas/naxxramasabominationwing1.mp3#61", "zonemusic/naxxramas/naxxramasabominationwing2.mp3#67", "zonemusic/naxxramas/naxxramasabominationwing3.mp3#61", "zonemusic/naxxramas/naxxramasfrostwyrm1.mp3#58", "zonemusic/naxxramas/naxxramasfrostwyrm2.mp3#82", "zonemusic/naxxramas/naxxramasfrostwyrm3.mp3#62", "zonemusic/naxxramas/naxxramasfrostwyrm4.mp3#60", "zonemusic/naxxramas/naxxramaskelthuzad1.mp3#95", "zonemusic/naxxramas/naxxramaskelthuzad2.mp3#97", "zonemusic/naxxramas/naxxramaskelthuzad3.mp3#76", "zonemusic/naxxramas/naxxramasplagueboss1.mp3#87", "zonemusic/naxxramas/naxxramasplaguewing1.mp3#88", "zonemusic/naxxramas/naxxramasplaguewing2.mp3#72", "zonemusic/naxxramas/naxxramasplaguewing3.mp3#77", "zonemusic/naxxramas/naxxramasspiderboss1.mp3#60", "zonemusic/naxxramas/naxxramasspiderboss2.mp3#64", "zonemusic/naxxramas/naxxramasspiderwing1.mp3#89", "zonemusic/naxxramas/naxxramasspiderwing2.mp3#67", "zonemusic/naxxramas/naxxramasspiderwing3.mp3#47", "zonemusic/naxxramas/naxxramaswalking1.mp3#102", "zonemusic/naxxramas/naxxramaswalking2.mp3#72", "zonemusic/naxxramas/naxxramaswalking3.mp3#87", "zonemusic/naxxramas/naxxramaswalking4.mp3#82", "zonemusic/naxxramas/naxxramaswalking5.mp3#100", "zonemusic/naxxramas/naxxramaswalking6.mp3#99",}) + Zn(L["Zones"], L["Northrend"], L["Grizzly Hills"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Grizzly Hills"], prefol, "zonemusic/grizzlyhills/gh_generalwalk_a_day01.mp3#94", "zonemusic/grizzlyhills/gh_generalwalk_a_day02.mp3#144", "zonemusic/grizzlyhills/gh_generalwalk_a_day03.mp3#89", "zonemusic/grizzlyhills/gh_generalwalk_a_day04.mp3#95", "zonemusic/grizzlyhills/gh_generalwalk_a_night01.mp3#130", "zonemusic/grizzlyhills/gh_generalwalk_a_night02.mp3#142", "zonemusic/grizzlyhills/gh_generalwalk_b_day01.mp3#108", "zonemusic/grizzlyhills/gh_generalwalk_b_day02.mp3#108", "zonemusic/grizzlyhills/gh_generalwalk_b_night01.mp3#101", "zonemusic/grizzlyhills/gh_generalwalk_b_night02.mp3#116", "zonemusic/grizzlyhills/gh_walkday01.mp3#142", "zonemusic/grizzlyhills/gh_walkday02.mp3#138", "zonemusic/grizzlyhills/gh_walkday03.mp3#238", "zonemusic/grizzlyhills/gh_walkday04.mp3#111", "zonemusic/grizzlyhills/gh_walkday05.mp3#97", "zonemusic/grizzlyhills/gh_walkday06.mp3#155", "zonemusic/grizzlyhills/gh_walkday07.mp3#155", "zonemusic/grizzlyhills/gh_walkday08.mp3#88", "zonemusic/grizzlyhills/gh_walkday09.mp3#88", "zonemusic/grizzlyhills/gh_walknight01.mp3#101", "zonemusic/grizzlyhills/gh_walknight02.mp3#111", "zonemusic/grizzlyhills/gh_walknight03.mp3#99", "zonemusic/grizzlyhills/gh_walknight04.mp3#155", "zonemusic/grizzlyhills/gh_walknight05.mp3#149", "zonemusic/grizzlyhills/gh_walknight06.mp3#134",}) + Zn(L["Zones"], L["Northrend"], L["Howling Fjord"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Howling Fjord"], prefol, "zonemusic/howlingfjord/hf_distwalkuni01.mp3#31", "zonemusic/howlingfjord/hf_distwalkuni02.mp3#47", "zonemusic/howlingfjord/hf_distwalkuni03.mp3#53", "zonemusic/howlingfjord/hf_distwalkuni04.mp3#26", "zonemusic/howlingfjord/hf_distwalkuni05.mp3#22", "zonemusic/howlingfjord/hf_distwalkuni06.mp3#41", "zonemusic/howlingfjord/hf_distwalkuni07.mp3#23", "zonemusic/howlingfjord/hf_generalwalk_day01.mp3#110", "zonemusic/howlingfjord/hf_generalwalk_day02.mp3#75", "zonemusic/howlingfjord/hf_generalwalk_day03.mp3#90", "zonemusic/howlingfjord/hf_generalwalk_day04.mp3#64", "zonemusic/howlingfjord/hf_generalwalk_day05.mp3#124", "zonemusic/howlingfjord/hf_generalwalk_day06.mp3#115", "zonemusic/howlingfjord/hf_generalwalk_day07.mp3#149", "zonemusic/howlingfjord/hf_generalwalk_night01.mp3#107", "zonemusic/howlingfjord/hf_generalwalk_night02.mp3#91", "zonemusic/howlingfjord/hf_generalwalk_night03.mp3#85", "zonemusic/howlingfjord/hf_generalwalk_night04.mp3#158", "zonemusic/howlingfjord/hf_tusk_kamaguaday01.mp3#95", "zonemusic/howlingfjord/hf_tusk_kamaguaday02.mp3#55", "zonemusic/howlingfjord/hf_tusk_kamaguanight01.mp3#100", "zonemusic/howlingfjord/hf_tusk_kamaguanight02.mp3#80", "zonemusic/utgarde keep/uk_quietwalkuni01.mp3#109", "zonemusic/utgarde keep/uk_quietwalkuni02.mp3#107",}) + Zn(L["Zones"], L["Northrend"], L["Icecrown"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Icecrown"], prefol, "zonemusic/icecrownglacier/ic_generalwalk_day01.mp3#76", "zonemusic/icecrownglacier/ic_generalwalk_day02.mp3#102", "zonemusic/icecrownglacier/ic_generalwalk_day03.mp3#62", "zonemusic/icecrownglacier/ic_generalwalk_day04.mp3#99", "zonemusic/icecrownglacier/ic_generalwalk_night01.mp3#100", "zonemusic/icecrownglacier/ic_generalwalk_night02.mp3#81", "zonemusic/icecrownglacier/ic_generalwalk_night03.mp3#94", "zonemusic/icecrownglacier/ic_generalwalk_night04.mp3#65", "zonemusic/icecrownglacier/ic_generalwalk_night05.mp3#103", "zonemusic/icecrownraid/ir_icefortress2.mp3#105", "zonemusic/icecrownraid/ir_icefortress3.mp3#80", "zonemusic/icecrownraid/ir_icefortress4.mp3#106", "zonemusic/icecrownraid/ir_reflectedhalls1.mp3#61", "zonemusic/icecrownraid/ir_reflectedhalls2.mp3#75", "zonemusic/icecrownraid/ir_reflectedhalls3.mp3#67", "zonemusic/icecrownraid/ir_reflectedhalls4.mp3#129", "zonemusic/icecrownraid/ir_reflectedhalls5.mp3#60", "zonemusic/argenttournament/at_tourney01nightwalk.mp3#156", "zonemusic/argenttournament/at_tourney02daywalk.mp3#158", "zonemusic/argenttournament/at_tourney03nightwalkuniwalk.mp3#162", "zonemusic/argenttournament/at_tourney05nightwalk.mp3#165", "zonemusic/argenttournament/at_tourney06daywalk.mp3#144", "zonemusic/argenttournament/at_tourney07nightwalk.mp3#185", "zonemusic/argenttournament/at_tourney08nightwalk.mp3#189", "zonemusic/argenttournament/at_tourney09daywalk.mp3#152", "zonemusic/argenttournament/at_tourney10daywalk.mp3#151",}) + Zn(L["Zones"], L["Northrend"], L["Sholazar Basin"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Sholazar Basin"], prefol, "zonemusic/sholazarbasin/sb_crystalswalkuni01.mp3#130", "zonemusic/sholazarbasin/sb_crystalswalkuni02.mp3#143", "zonemusic/sholazarbasin/sb_firewalkuni01.mp3#107", "zonemusic/sholazarbasin/sb_firewalkuni02.mp3#94", "zonemusic/sholazarbasin/sb_firewalkuni03.mp3#58", "zonemusic/sholazarbasin/sb_firewalkuni04.mp3#107", "zonemusic/sholazarbasin/sb_makersterracewalkuni01.mp3#76", "zonemusic/sholazarbasin/sb_makersterracewalkuni02.mp3#95", "zonemusic/sholazarbasin/sb_pathoflifewardenwalkuni01.mp3#136", "zonemusic/sholazarbasin/sb_pathoflifewardenwalkuni02.mp3#161", "zonemusic/sholazarbasin/sb_sholazarwalkday01.mp3#175", "zonemusic/sholazarbasin/sb_sholazarwalkday02.mp3#115", "zonemusic/sholazarbasin/sb_sholazarwalkday03.mp3#106", "zonemusic/sholazarbasin/sb_sholazarwalkday04.mp3#112", "zonemusic/sholazarbasin/sb_sholazarwalkday05.mp3#123", "zonemusic/sholazarbasin/sb_sholazarwalkday06.mp3#142", "zonemusic/sholazarbasin/sb_sholazarwalknight01.mp3#115", "zonemusic/sholazarbasin/sb_sholazarwalknight02.mp3#138", "zonemusic/sholazarbasin/sb_sholazarwalknight03.mp3#132", "zonemusic/sholazarbasin/sb_sholazarwalknight04.mp3#92", "zonemusic/sholazarbasin/sb_sholazarwalknight05.mp3#100",}) + Zn(L["Zones"], L["Northrend"], L["Storm Peaks"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Storm Peaks"], prefol, "zonemusic/stormpeaks/sp_generalwalka_day01.mp3#87", "zonemusic/stormpeaks/sp_generalwalka_night01.mp3#88", "zonemusic/stormpeaks/sp_generalwalkadark_uni01.mp3#120", "zonemusic/stormpeaks/sp_generalwalkb_day02.mp3#82", "zonemusic/stormpeaks/sp_generalwalkb_night02.mp3#82", "zonemusic/stormpeaks/sp_generalwalkb_uni02.mp3#83", "zonemusic/stormpeaks/sp_generalwalkc_day03.mp3#64", "zonemusic/stormpeaks/sp_generalwalkc_night03.mp3#58", "zonemusic/stormpeaks/sp_generalwalkc_uni03.mp3#58", "zonemusic/stormpeaks/sp_generalwalkd_day04.mp3#55", "zonemusic/stormpeaks/sp_generalwalkd_night04.mp3#52", "zonemusic/stormpeaks/sp_generalwalkd_uni04.mp3#55", "zonemusic/stormpeaks/sp_generalwalke_day05.mp3#83", "zonemusic/stormpeaks/sp_generalwalke_night05.mp3#75", "zonemusic/stormpeaks/sp_generalwalke_uni05.mp3#83", "zonemusic/ulduar/ul_lightningbattlewalk.mp3#53", "zonemusic/ulduar/ul_stonegeneralwalk02.mp3#41", "zonemusic/ulduarraidext/ur_ulduarraidextwalk01.mp3#36", "zonemusic/ulduarraidext/ur_ulduarraidextwalk02.mp3#34", "zonemusic/ulduarraidext/ur_ulduarraidextwalk09.mp3#27", "zonemusic/ulduarraidext/ur_ulduarraidextwalk10.mp3#28",}) + Zn(L["Zones"], L["Northrend"], L["Wintergrasp"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Wintergrasp"], prefol, "zonemusic/lakewintergrasp/wg_generalwalk_01.mp3#93", "zonemusic/lakewintergrasp/wg_generalwalk_02.mp3#62", "zonemusic/lakewintergrasp/wg_generalwalk_03.mp3#93", "zonemusic/lakewintergrasp/wg_generalwalk_04.mp3#43", "zonemusic/lakewintergrasp/wg_generalwalk_05.mp3#57",}) + Zn(L["Zones"], L["Northrend"], L["Zul'Drak"], {"|cffffd800" .. L["Zones"] .. ": " .. L["Zul'Drak"], prefol, "zonemusic/zuldrak/zd_generalwalk_day01.mp3#90", "zonemusic/zuldrak/zd_generalwalk_day02.mp3#91", "zonemusic/zuldrak/zd_generalwalk_day03.mp3#102", "zonemusic/zuldrak/zd_generalwalk_day04.mp3#93", "zonemusic/zuldrak/zd_generalwalk_night01.mp3#90", "zonemusic/zuldrak/zd_generalwalk_night02.mp3#90", "zonemusic/zuldrak/zd_generalwalk_night03.mp3#101", "zonemusic/zuldrak/zd_generalwalk_night04.mp3#93", "zonemusic/zuldrak/zd_mamtoth_intro01.mp3#31", "zonemusic/zuldrak/zd_mamtoth_intro02.mp3#28", "zonemusic/zuldrak/zd_quetzlun_intro01.mp3#32", "zonemusic/zuldrak/zd_quetzlun_intro02.mp3#28", "zonemusic/zuldrak/zd_rhunok_intro01.mp3#30", "zonemusic/zuldrak/zd_rhunok_intro02.mp3#28", "zonemusic/zuldrak/zd_sseratus_intro01.mp3#28", "zonemusic/zuldrak/zd_sseratus_intro02.mp3#28",}) + + -- Dungeons: World of Warcraft + Zn(L["Dungeons"], L["World of Warcraft"], "|cffffd800" .. L["World of Warcraft"], {""}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Ahn'Qiraj"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ahn'Qiraj"], prefol, "zonemusic/ahnqiraj/ahnqirajexteriorwalking1.mp3#67", "zonemusic/ahnqiraj/ahnqirajexteriorwalking2.mp3#85", "zonemusic/ahnqiraj/ahnqirajexteriorwalking3.mp3#58", "zonemusic/ahnqiraj/ahnqirajexteriorwalking4.mp3#59",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Blackfathom Deeps"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackfathom Deeps"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Blackrock Depths"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackrock Depths"], prefol, "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Blackwing Lair"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackwing Lair"], prefol, "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Deadmines"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Deadmines"], prefol, "citymusic/orgrimmar/orgrimmar01-zone.mp3#69", "citymusic/orgrimmar/orgrimmar02-zone.mp3#62", "zonemusic/cursedland/cursedland01.mp3#55", "zonemusic/cursedland/cursedland03.mp3#64", "musical moments/battle/battle02.mp3#62", "musical moments/battle/battle06.mp3#62", "citymusic/orgrimmar/orgrimmar02-moment.mp3#62", "musical moments/spooky/spooky01-moment.mp3#26",}) -- Mystery1:10 + Zn(L["Dungeons"], L["World of Warcraft"], L["Dire Maul"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Dire Maul"], prefol, "zonemusic/enchantedforest/enchantedforest01.mp3#50", "zonemusic/enchantedforest/enchantedforest02.mp3#67", "zonemusic/enchantedforest/enchantedforest03.mp3#235", "zonemusic/enchantedforest/enchantedforest04.mp3#61", "zonemusic/enchantedforest/enchantedforest05.mp3#71", "musical moments/spooky/spooky01-moment.mp3#26", "musical moments/gloomy/gloomy01.mp3#36",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Gnomeregan"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Gnomeregan"], prefol, "citymusic/gnomeragon/gnomeragon01-zone.mp3#65", "citymusic/gnomeragon/gnomeragon02-zone.mp3#65",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Maraudon"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Maraudon"], prefol, "zonemusic/barrendry/daybarrendry01.mp3#64", "zonemusic/barrendry/daybarrendry02.mp3#64", "zonemusic/barrendry/daybarrendry03.mp3#55", "zonemusic/barrendry/nightbarrendry01.mp3#67", "zonemusic/barrendry/nightbarrendry02.mp3#41", "zonemusic/barrendry/nightbarrendry03.mp3#47", "zonemusic/soggyplace/soggyplace-zone2.mp3#98", "zonemusic/soggyplace/soggyplace-zone5.mp3#70", "zonemusic/soggyplace/soggyplace-zone1.mp3#97", "zonemusic/soggyplace/soggyplace-zone3.mp3#91", "zonemusic/soggyplace/soggyplace-zone4.mp3#90", "musical moments/battle/battle02.mp3#62",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Molten Core"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Molten Core"], prefol, "musical moments/battle/battle01.mp3#48", "musical moments/battle/battle02.mp3#62", "musical moments/battle/battle03.mp3#27", "musical moments/battle/battle04.mp3#36", "musical moments/battle/battle05.mp3#45", "musical moments/battle/battle06.mp3#62",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Naxxramas"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Naxxramas"], prefol, "zonemusic/naxxramas/naxxramaswalking1.mp3#102", "zonemusic/naxxramas/naxxramaswalking2.mp3#72", "zonemusic/naxxramas/naxxramaswalking3.mp3#87", "zonemusic/naxxramas/naxxramaswalking4.mp3#82", "zonemusic/naxxramas/naxxramaswalking5.mp3#100", "zonemusic/naxxramas/naxxramaswalking6.mp3#99", "zonemusic/naxxramas/naxxramasabominationboss1.mp3#61", "zonemusic/naxxramas/naxxramasabominationboss2.mp3#67", "zonemusic/naxxramas/naxxramasabominationwing1.mp3#61", "zonemusic/naxxramas/naxxramasabominationwing2.mp3#67", "zonemusic/naxxramas/naxxramasabominationwing3.mp3#61", "zonemusic/naxxramas/naxxramasspiderwing1.mp3#89", "zonemusic/naxxramas/naxxramasspiderwing2.mp3#67", "zonemusic/naxxramas/naxxramasspiderwing3.mp3#47", "zonemusic/naxxramas/naxxramasplagueboss1.mp3#87", "zonemusic/naxxramas/naxxramasplaguewing1.mp3#88", "zonemusic/naxxramas/naxxramasplaguewing2.mp3#72", "zonemusic/naxxramas/naxxramasplaguewing3.mp3#77", "zonemusic/naxxramas/naxxramasspiderboss1.mp3#60", "zonemusic/naxxramas/naxxramasspiderboss2.mp3#64", "zonemusic/naxxramas/naxxramaskelthuzad1.mp3#95", "zonemusic/naxxramas/naxxramaskelthuzad2.mp3#97", "zonemusic/naxxramas/naxxramaskelthuzad3.mp3#76", "zonemusic/naxxramas/naxxramasfrostwyrm1.mp3#58", "zonemusic/naxxramas/naxxramasfrostwyrm2.mp3#82", "zonemusic/naxxramas/naxxramasfrostwyrm3.mp3#62", "zonemusic/naxxramas/naxxramasfrostwyrm4.mp3#60",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Onyxia's Lair"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Onyxia's Lair"], prefol, "zonemusic/barrendry/daybarrendry03.mp3#55",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Razorfen Downs"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Razorfen Downs"], prefol, "citymusic/undercity/undercity01-zone.mp3#67", "citymusic/undercity/undercity02-zone.mp3#86", "citymusic/undercity/undercity03-zone.mp3#76", "zonemusic/tavernhorde/undead_dance.mp3#25",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Scarlet Monastery"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Scarlet Monastery"], prefol, "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74", }) + Zn(L["Dungeons"], L["World of Warcraft"], L["Scholomance"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Scholomance"], prefol, "musical moments/haunted/haunted01.mp3#62",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Shadowfang Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Shadowfang Keep"], prefol, "zonemusic/evilforest/dayevilforest01.mp3#71", "zonemusic/evilforest/dayevilforest02.mp3#72", "zonemusic/evilforest/dayevilforest03.mp3#71", "zonemusic/evilforest/nightevilforest01.mp3#57", "zonemusic/evilforest/nightevilforest02.mp3#76", "zonemusic/evilforest/nightevilforest03.mp3#71", "musical moments/battle/battle01.mp3#48", "musical moments/battle/battle02.mp3#62", "musical moments/battle/battle04.mp3#36",}) -- Mystery1:10 + -- Zn(L["Dungeons"], L["World of Warcraft"], L["Stockade"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Stockade"], prefol, "sound/ambience/wmoambience/stormwindjail.ogg#537412",}) -- Cannot play because it is an ogg file + Zn(L["Dungeons"], L["World of Warcraft"], L["Stratholme"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Stratholme"], prefol, "citymusic/undercity/undercity01-zone.mp3#67", "citymusic/undercity/undercity02-zone.mp3#86", "citymusic/undercity/undercity03-zone.mp3#76",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Temple of Atal'Hakkar"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Temple of Atal'Hakkar"], prefol, "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Uldaman"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Uldaman"], prefol, "zonemusic/volcanic/dayvolcanic01.mp3#73", "zonemusic/volcanic/dayvolcanic02.mp3#87", "zonemusic/volcanic/nightvolcanic01.mp3#71", "zonemusic/volcanic/nightvolcanic02.mp3#64", "musical moments/battle/battle02.mp3#62", }) + Zn(L["Dungeons"], L["World of Warcraft"], L["Wailing Caverns"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Wailing Caverns"], prefol, "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "zonemusic/cursedland/cursedland04.mp3#79", "zonemusic/cursedland/cursedland05.mp3#83", "zonemusic/cursedland/cursedland06.mp3#74",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Zul'Farrak"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Zul'Farrak"], prefol, "zonemusic/desert/daydesert01.mp3#66", "zonemusic/desert/daydesert02.mp3#81", "zonemusic/desert/daydesert03.mp3#54", "zonemusic/desert/nightdesert01.mp3#78", "zonemusic/desert/nightdesert02.mp3#62", "zonemusic/desert/nightdesert03.mp3#58",}) + Zn(L["Dungeons"], L["World of Warcraft"], L["Zul'Gurub"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Zul'Gurub"], prefol, "zonemusic/jungle/dayjungle01.mp3#46", "zonemusic/jungle/dayjungle02.mp3#99", "zonemusic/jungle/dayjungle03.mp3#48", "zonemusic/jungle/nightjungle01.mp3#55", "zonemusic/jungle/nightjungle02.mp3#53", "zonemusic/jungle/nightjungle03.mp3#89", "musical moments/zulgurubvoodoo.mp3#85",}) + -- Zn(L["Dungeons"], L["World of Warcraft"], L["Ragefire Chasm"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ragefire Chasm"], prefol, }) + -- Zn(L["Dungeons"], L["World of Warcraft"], L["Razorfen Kraul"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Razorfen Kraul"], prefol, }) + + -- Dungeons: Burning Crusade + Zn(L["Dungeons"], L["Burning Crusade"], "|cffffd800", {""}) + Zn(L["Dungeons"], L["Burning Crusade"], "|cffffd800" .. L["Burning Crusade"], {""}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Black Morass"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Black Morass"], prefol, "zonemusic/cavernsoftime/ct_morasswalkuni01.mp3#108", "zonemusic/cavernsoftime/ct_morasswalkuni02.mp3#80", "zonemusic/cavernsoftime/ct_morasswalkuni03.mp3#115", "zonemusic/cavernsoftime/ct_morasswalkuni04.mp3#123", "zonemusic/cavernsoftime/ct_morasswalkuni05.mp3#74",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Black Temple"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Black Temple"], prefol, "zonemusic/blacktemple/bt_arrivalwalkuni02.mp3#82", "zonemusic/blacktemple/bt_arrivalwalkuni03.mp3#74", "zonemusic/blacktemple/bt_illidariwalkuni01.mp3#62", "zonemusic/blacktemple/bt_illidariwalkuni02.mp3#72", "zonemusic/blacktemple/bt_illidariwalkuni03.mp3#78", "zonemusic/blacktemple/bt_illidariwalkuni06.mp3#29", "zonemusic/blacktemple/bt_illidariwalkuni07.mp3#78", "zonemusic/blacktemple/bt_illidariwalkuni08.mp3#65", "zonemusic/blacktemple/bt_sanctuarywalkuni02.mp3#65", "zonemusic/blacktemple/bt_sanctuarywalkuni03.mp3#66",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Coilfang Reservoir"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Coilfang Reservoir"], prefol, "zonemusic/zangarmarsh/za_coilfangwalkuni01.mp3#133", "zonemusic/zangarmarsh/za_coilfangwalkuni02.mp3#99", "zonemusic/zangarmarsh/za_coilfangwalkuni03.mp3#110",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Hellfire Ramparts"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Hellfire Ramparts"], prefol, "zonemusic/hellfirepeninsula/he_rampartswalkuni01.mp3#62", "zonemusic/hellfirepeninsula/he_rampartswalkuni02.mp3#69",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Hyjal Summit"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Hyjal Summit"], prefol, "zonemusic/cavernsoftime/ct_hyjalextwalkuni01.mp3#70", "zonemusic/cavernsoftime/ct_hyjalextwalkuni02.mp3#48", "zonemusic/cavernsoftime/ct_hyjalextwalkuni03.mp3#45", "zonemusic/cavernsoftime/ct_hyjalextwalkuni04.mp3#85", "zonemusic/cavernsoftime/ct_hyjalextwalkuni05.mp3#47", "zonemusic/cavernsoftime/ct_hyjalextwalkuni06.mp3#46", "zonemusic/cavernsoftime/ct_hyjalextwalkuni11.mp3#50", "zonemusic/cavernsoftime/ct_hyjalextwalkuni12.mp3#68", "zonemusic/cavernsoftime/ct_hyjalextwalkuni10.mp3#66",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Karazhan"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Karazhan"], prefol, "zonemusic/karazhan/ka_generalwalkuni01.mp3#131", "zonemusic/karazhan/ka_generalwalkuni02.mp3#124", "zonemusic/karazhan/ka_generalwalkuni03.mp3#119", "zonemusic/karazhan/ka_generalwalkuni04.mp3#112", "zonemusic/karazhan/ka_generalwalkuni05.mp3#125", "zonemusic/karazhan/ka_generalwalkuni06.mp3#93", "zonemusic/karazhan/ka_generalwalkuni07.mp3#81", "zonemusic/karazhan/ka_foyerwalkuni01.mp3#113", "zonemusic/karazhan/ka_foyerwalkuni02.mp3#112", "zonemusic/karazhan/ka_foyerwalkuni03.mp3#124", "zonemusic/karazhan/ka_foyerwalkuni04.mp3#31", "zonemusic/karazhan/ka_stablewalkuni01.mp3#96", "zonemusic/karazhan/ka_stablewalkuni02.mp3#111", "zonemusic/karazhan/ka_stablewalkuni03.mp3#115", "zonemusic/karazhan/ka_operaharpsiwalkuni01.mp3#83", "zonemusic/karazhan/ka_operaorganwalkuni01.mp3#81", "zonemusic/karazhan/ka_backstagewalkuni01.mp3#99", "zonemusic/karazhan/ka_backstagewalkuni02.mp3#99", "zonemusic/karazhan/ka_librarywalkuni01.mp3#128", "zonemusic/karazhan/ka_librarywalkuni02.mp3#148", "zonemusic/karazhan/ka_librarywalkuni03.mp3#126", "zonemusic/karazhan/ka_librarywalkuni04.mp3#124", "zonemusic/karazhan/ka_towerwalkuni01.mp3#94", "zonemusic/karazhan/ka_towerwalkuni02.mp3#116", "zonemusic/karazhan/ka_towerwalkuni03.mp3#127", "zonemusic/karazhan/ka_malchezarwalkuni01.mp3#125", "zonemusic/karazhan/ka_malchezarwalkuni02.mp3#112", "zonemusic/karazhan/ka_malchezarwalkuni03.mp3#114",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Magisters' Terrace"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Magisters' Terrace"], prefol, "zonemusic/eversong/es_silvermoonwalkday01.mp3#64", "zonemusic/eversong/es_silvermoonwalkday02.mp3#80", "zonemusic/eversong/es_silvermoonwalkday03.mp3#65", "zonemusic/eversong/es_silvermoonwalknight01.mp3#178", "zonemusic/eversong/es_silvermoonwalknight02.mp3#72", "zonemusic/sunwell/sw_magistersterracewalkuni01.mp3#89", "zonemusic/sunwell/sw_magistersterracewalkuni02.mp3#91", "zonemusic/sunwell/sw_magistersterracewalkuni03.mp3#90", "zonemusic/sunwell/sw_magistersterracewalkuni04.mp3#92", "zonemusic/sunwell/sw_magistersterracewalkuni05.mp3#124", "zonemusic/eversong/es_buildingwalknight01.mp3#84", "zonemusic/eversong/es_buildingwalknight02.mp3#84", "zonemusic/ghostlands/gl_forest2walkday01.mp3#83", "zonemusic/ghostlands/gl_forest2walknight01.mp3#60", "zonemusic/ghostlands/gl_forest2walknight02.mp3#61", "zonemusic/sunwell/sw_assemblychamberwalkuni01.mp3#83", "zonemusic/sunwell/sw_assemblychamberwalkuni02.mp3#88", "zonemusic/sunwell/sw_plateausunwellwalkuni04.mp3#92", "zonemusic/sunwell/sw_plateausunwellwalkuni05.mp3#94", "zonemusic/sunwell/sw_magistersasylumwalkuni01.mp3#97", "zonemusic/sunwell/sw_magistersasylumwalkuni02.mp3#95", "zonemusic/sunwell/sw_magistersasylumwalkuni03.mp3#66", "zonemusic/sunwell/sw_plateausunwellwalkuni02.mp3#79", "zonemusic/sunwell/sw_plateausunwellwalkuni03.mp3#90", "zonemusic/sunwell/sw_plateausunwellwalkuni06.mp3#87", "zonemusic/sunwell/sw_shorelaranwalkuni01.mp3#88",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Old Hillsbrad Foothills"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Old Hillsbrad Foothills"], prefol, "zonemusic/cavernsoftime/ct_durnholdekeepextwalk1uni.mp3#82", "zonemusic/cavernsoftime/ct_durnholdekeepintwalk1uni.mp3#70", "zonemusic/cavernsoftime/ct_tarrenmillextwalk3uni.mp3#62", "zonemusic/cavernsoftime/ct_hillsbradextwalk1uni.mp3#62", "zonemusic/cavernsoftime/ct_hillsbradextwalk2uni.mp3#56",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Sunwell Plateau"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Sunwell Plateau"], prefol, "zonemusic/ghostlands/gl_eversongdarkwalkuni01.mp3#62", "zonemusic/ghostlands/gl_eversongdarkwalkuni02.mp3#62", "zonemusic/ghostlands/gl_eversongdarkwalkuni03.mp3#64", "zonemusic/sunwell/sw_magistersterracewalkuni05.mp3#124", "zonemusic/sunwell/sw_plateausunwellwalkuni01.mp3#85", "zonemusic/sunwell/sw_plateausunwellwalkuni02.mp3#79", "zonemusic/sunwell/sw_plateausunwellwalkuni03.mp3#90", "zonemusic/sunwell/sw_plateausunwellwalkuni04.mp3#92", "zonemusic/sunwell/sw_plateausunwellwalkuni05.mp3#94", "zonemusic/sunwell/sw_plateausunwellwalkuni06.mp3#87",}) + Zn(L["Dungeons"], L["Burning Crusade"], L["Tempest Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Tempest Keep"], prefol, "zonemusic/tempestkeep/tk_tempestkeep_amb_11.mp3#46", "zonemusic/tempestkeep/tk_tempestkeep_amb_12.mp3#97", "zonemusic/tempestkeep/tk_tempestkeep_amb_13.mp3#68", "zonemusic/tempestkeep/tk_tempestkeep_amb_14.mp3#88", "zonemusic/tempestkeep/tk_tempestkeep_amb_16.mp3#58", "zonemusic/tempestkeep/tk_tempestkeep_amb_17.mp3#63", "zonemusic/tempestkeep/tk_tempestkeep_amb_18.mp3#86", "zonemusic/tempestkeep/tk_tempestkeep_amb_19.mp3#49", "zonemusic/tempestkeep/tk_tempestkeep_amb_20.mp3#47", "zonemusic/tempestkeep/tk_tempestkeep_amb_23.mp3#68", "zonemusic/tempestkeep/tk_tempestkeep_btl10.mp3#60", "zonemusic/tempestkeep/tk_tempestkeep_btl11.mp3#82", "zonemusic/tempestkeep/tk_tempestkeep_btl13.mp3#37",}) + + -- Dungeons: Wrath of the Lich King (sound kits) + Zn(L["Dungeons"], L["Wrath of the Lich King"], "|cffffd800", {""}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], "|cffffd800" .. L["Wrath of the Lich King"], {""}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Ahn'kahet (Old Kingdom)"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ahn'kahet (Old Kingdom)"], prefol, "Zone-AzjolNerubC#15098", "Zone-AzjolNerubD#15099", "Zone-AzjolNerubE#15100",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Azjol-Nerub"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Azjol-Nerub"], prefol, "Zone-AzjolNerubA#15096", "Zone-AzjolNerubE#15100", "Zone-AzjolNerubB#15097", "Zone-AzjolNerubD#15099",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Culling of Stratholme"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Culling of Stratholme"], prefol, "Zone-StratholmePastOutdoorsDay#14920", "Zone-StratholmePastOutdoorsNigh#14921",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Drak'Tharon Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Drak'Tharon Keep"], prefol, "Zone-DraktharonRaptorPens#15087",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Eye of Eternity"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Eye of Eternity"], prefol, "Zone-NexusGeneralWalkE#15061",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Forge of Souls"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Forge of Souls"], prefol, "Zone-ForgeOfSoulsWalk#17277", --[["MUS_70_Artif_DK_IcecrownWalk#77050",]] "Event-Bronjahm#17280",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Gundrak"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Gundrak"], prefol, "Zone-GundrakGeneralWalk#15089", "Zone-GundrakCaveofMamtoth#15092", "Zone-GundrakDenofSseratus#15090", "Zone-GundrakPoolofTwisted#15093", "Zone-GundrakChamberofAkali#15094", "Zone-GundrakTombofAncients#15091",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Halls of Lightning"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Lightning"], prefol, "Zone-UldarLightningGeneralWalk#14942", "Zone-UldarLightningBattleWalk#14945",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Halls of Reflection"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Reflection"], prefol, "Zone-IcecrownDungeonWalk#17278", "Event-HallsofReflection1#17282", "Event-HallsofReflection2#17283",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Halls of Stone"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Stone"], prefol, "Zone-UlduarStoneGeneralWalk#14937", "Zone-UlduarStoneBattleWalk#14939", "Zone-UlduarRaidGeneralWalk#15838",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Icecrown Citadel"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Icecrown Citadel"], prefol, "Zone-IcecrownRaidFloor2Intro#17291", "Zone-IcecrownRaidFloor2Plague#17294", "Zone-IcecrownRaidFloor2Spire#17296", "Zone-IcecrownRaidFloor2Valithria#17300", "Zone-IcecrownRaidFloor2Frost#17298", "Zone-IcecrownDungeonWalk#17278", "Zone-CrimsonHallWalk#17287", "Zone-ForgeOfSoulsWalk#17277", "Zone-FrostmourneWalk#17286", "Zone-PitofSaron#17310", "Zone-SindragosaWalk#17288",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Naxxramas"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Naxxramas"], prefol, "NaxxramasAbominationWing#8675", "NaxxramasPlagueWing#8678", "NaxxramasSpiderWing#8679", "Zone-NaxxramasAbominationBoss#8888", "Zone-NaxxramasPlagueBoss#8886", "Zone-NaxxramasSpiderBoss#8887", "Zone-NaxxramasKelthuzad#8889", "Zone-NaxxramasFrostWyrm#8890", "Zone - NaxxramsDeathKnight#8687",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Nexus"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Nexus"], prefol, "Zone-NexusGeneralWalkA#15057", "Zone-NexusGeneralWalkB#15058", "Zone-NexusGeneralWalkC#15059", "Zone-NexusGeneralWalkD#15060",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Obsidian Sanctum"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Obsidian Sanctum"], prefol, "Zone-ChamberAspects01Day#15077", "Zone-ChamberAspects01Night#15078",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Oculus"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Oculus"], prefol, "Zone-NexusGeneralWalkE#15061", "Zone-ColdarraNexusEXT#14959",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Onyxia's Lair"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Onyxia's Lair"], prefol, "Moment-Orc Barren#7474",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Pit of Saron"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Pit of Saron"], prefol, "Zone-PitofSaronEntry#17308", "Zone-PitofSaron#17310", "Zone-PitofSaronTyrannus#17314",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Ruby Sanctum"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ruby Sanctum"], prefol, "RubySanctumWalk#17672",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Ulduar"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ulduar"], prefol, "UR_UlduarRaidGeneralWalk#15838", "UR_BaseCampWalk#15854", "UR_CelestialHallWalk#15842", "UR_ConservatoryWalk#15843", "UR_CorridorsOfIngenuityWalk#15841", "UR_DescentWalk#15839", "UR_KingLlaneWalk#15835", "UR_PrisonOfYoggSaronWalk#15840", "UR_RazorscalesAerieWalk#15868", "UR_SparkOfImaginationWalk#15847", "UR_TheColossalForgeWalk#15865", "UR_TheScrapyardWalk#15871", "UR_TramHallWalk#15901", "UR_WyrmrestTempleWalk#15837",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Utgarde Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Utgarde Keep"], prefol, "Zone-UtgardeA#15062", "Zone-UtgardeE#15066", "Music_Temp_95#14871",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Utgarde Pinnacle"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Utgarde Pinnacle"], prefol, "Zone-UtgardeA#15062", "Zone-UtgardeD#15065", "Music_Temp_95#14871", "Music_Temp_98#14874",}) + Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Vault of Archavon"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Vault of Archavon"], prefol, "Zone-UldarLightningGeneralWalk#14942",}) + + ---------------------------------------------------------------------- + -- Various + ---------------------------------------------------------------------- + + -- Various + Zn(L["Various"], L["Various"], "|cffffd800" .. L["Various"], {""}) + Zn(L["Various"], L["Various"], L["Battlegrounds"], {"|cffffd800" .. L["Various"] .. ": " .. L["Battlegrounds"], prefol, + "zonemusic/pvp/pvp1.mp3#47", + "zonemusic/pvp/pvp2.mp3#53", + "zonemusic/pvp/pvp3.mp3#40", + "zonemusic/pvp/pvp4.mp3#63", + "zonemusic/pvp/pvp5.mp3#62", + "zonemusic/cursedland/cursedland01.mp3#55", + "zonemusic/cursedland/cursedland02.mp3#59", + "zonemusic/cursedland/cursedland03.mp3#64", + "zonemusic/cursedland/cursedland04.mp3#79", + "zonemusic/cursedland/cursedland05.mp3#83", + "zonemusic/cursedland/cursedland06.mp3#74", + "musical moments/gloomy/gloomy01.mp3#36", + }) -- Mystery1:10 + Zn(L["Various"], L["Various"], L["Cinematics"], {"|cffffd800" .. L["Various"] .. ": " .. L["Cinematics"], prefol, + -- World of Warcraft + "|cffffd800", "|cffffd800" .. L["World of Warcraft"], + "cinematics/logo.mp3#27", + "cinematics/wow_intro.mp3#170", + -- The Burning Crusade + "|cffffd800", "|cffffd800" .. L["The Burning Crusade"], + "cinematics/wow_intro_bc.mp3#167", + -- Wrath of the Lich King + "|cffffd800", "|cffffd800" .. L["Wrath of the Lich King"], + "cinematics/wow_intro_lk.mp3#198", + "cinematics/wow_wrathgate.mp3#265", + "cinematics/wow_fotlk.mp3#231", + }) + + Zn(L["Various"], L["Various"], L["Credits"], { "|cffffd800" .. L["Various"] .. ": " .. L["Credits"], prefol, + "citymusic/darnassus/darnassus intro.mp3#40", + "citymusic/ironforge/ironforge intro.mp3#86", + "citymusic/ironforge/tinkertownintro_moment.mp3#52", + "citymusic/stormwind/stormwind_intro-moment.mp3#67", + "citymusic/orgrimmar/orgrimmar_intro-moment.mp3#40", + "citymusic/thunderbluff/thunderbluff intro.mp3#46", + "citymusic/undercity/undercityintro-moment.mp3#29", + "gluescreenmusic/bccredits_lament_of_the_highborne.mp3#171", + "zonemusic/azuremyst/ai_exodarintro01.mp3#83", + "zonemusic/eversong/es_silvermoonintro01.mp3#133", + }) + Zn(L["Various"], L["Various"], L["Events"], { "|cffffd800" .. L["Various"] .. ": " .. L["Events"], prefol, + "|cffffd800", "|cffffd800" .. L["Darkmoon Faire"], "worldevents/darkmoonfaire_1.mp3#29", "worldevents/darkmoonfaire_2.mp3#74", "worldevents/darkmoonfaire_3.mp3#59", "worldevents/darkmoonfaire_4.mp3#38", + }) + Zn(L["Various"], L["Various"], L["Main Titles"], { "|cffffd800" .. L["Various"] .. ": " .. L["Main Titles"], prefol, + "gluescreenmusic/wow_main_theme.mp3#161", + "gluescreenmusic/bc_main_theme.mp3#227", + "gluescreenmusic/wotlk_main_title.mp3#53222", + }) + Zn(L["Various"], L["Various"], L["Musical Moments"], { "|cffffd800" .. L["Various"] .. ": " .. L["Musical Moments"], prefol, + "|cffffd800", "|cffffd800" .. L["Angelic"], "musical moments/angelic/angelic01.mp3#48", + "|cffffd800", "|cffffd800" .. L["Battle"], "musical moments/battle/battle01.mp3#48", "musical moments/battle/battle02.mp3#62", "musical moments/battle/battle03.mp3#27", "musical moments/battle/battle04.mp3#36", "musical moments/battle/battle05.mp3#45", "musical moments/battle/battle06.mp3#62", + "|cffffd800", "|cffffd800" .. L["Gloomy"], "musical moments/gloomy/gloomy01.mp3#36", "musical moments/gloomy/gloomy02.mp3#40", + "|cffffd800", "|cffffd800" .. L["Haunted"], "musical moments/haunted/haunted01.mp3#62", "musical moments/haunted/haunted02.mp3#60", + "|cffffd800", "|cffffd800" .. L["Magic"], "musical moments/magic/magic01-moment.mp3#64", -- "musical moments/magic/magic01-zone1.mp3#33", "musical moments/magic/magic01-zone2.mp3#39", + "|cffffd800", "|cffffd800" .. L["Mystery"], "musical moments/mystery/mystery01-zone.mp3#61", "musical moments/mystery/mystery02-zone.mp3#54", "musical moments/mystery/mystery03-zone.mp3#61", "musical moments/mystery/mystery04-zone.mp3#64", "musical moments/mystery/mystery05-zone.mp3#82", "musical moments/mystery/mystery06-zone.mp3#65", "musical moments/mystery/mystery07-zone.mp3#83", "musical moments/mystery/mystery08-zone.mp3#83", "musical moments/mystery/mystery09-zone.mp3#82", "musical moments/mystery/mystery10-zone.mp3#62", + "|cffffd800", "|cffffd800" .. L["Sacred"], "musical moments/sacred/sacred01.mp3#16", "musical moments/sacred/sacred02.mp3#19", + "|cffffd800", "|cffffd800" .. L["Spooky"], "musical moments/spooky/spooky01-moment.mp3#26", + "|cffffd800", "|cffffd800" .. L["Swamp"], "musical moments/swamp/swamp01.mp3#35", + "|cffffd800", "|cffffd800" .. L["Various"], "musical moments/mystery/ahnqirajintro1.mp3#144", "musical moments/zulgurubvoodoo.mp3#85", + }) + Zn(L["Various"], L["Various"], L["Narration"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Narration"], prefol, "cinematicvoices/dwarfnarration.mp3#62", "cinematicvoices/gnomenarration.mp3#78", "cinematicvoices/humannarration.mp3#88", "cinematicvoices/nightelfnarration.mp3#108", "cinematicvoices/orcnarration.mp3#72", "cinematicvoices/taurennarration.mp3#75", "cinematicvoices/trollnarration.mp3#64", "cinematicvoices/undeadnarration.mp3#104", "cinematicvoices/bloodelfnarration.mp3#83", "cinematicvoices/draeneinarration.mp3#74",}) + + ---------------------------------------------------------------------- + -- Movies + ---------------------------------------------------------------------- + + -- Movies + Zn(L["Movies"], L["Movies"], "|cffffd800" .. L["Movies"], {""}) + Zn(L["Movies"], L["Movies"], L["World of Warcraft"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["World of Warcraft"], prefol, L["Ten Years of Warcraft"] .. " |r(1)", L["World of Warcraft"] .. " |r(2)",}) + Zn(L["Movies"], L["Movies"], L["The Burning Crusade"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["The Burning Crusade"], prefol, L["The Burning Crusade"] .. " |r(27)",}) + Zn(L["Movies"], L["Movies"], L["Wrath of the Lich King"], { "|cffffd800" .. L["Movies"] .. ": " .. L["Wrath of the Lich King"], prefol, + L["Wrath of the Lich King"] .. " |r(18)", + L["Battle of Angrathar the Wrathgate"] .. " |r(14)", + L["Fall of the Lich King"] .. " |r(16)", + }) + + ---------------------------------------------------------------------- + -- End + ---------------------------------------------------------------------- + + -- Give zone table a file level scope (its used in search) + Leatrix_Plus["ZoneList"] = ZoneList + diff --git a/Leatrix_Plus_Wrath.toc b/Leatrix_Plus_Wrath.toc new file mode 100644 index 0000000..28253a0 --- /dev/null +++ b/Leatrix_Plus_Wrath.toc @@ -0,0 +1,31 @@ +## Interface: 30300 + +## Title: Leatrix Plus +## Title-zhCN: Leatrix Plus [|cffeda55f功能百宝箱|r] +## Title-zhTW: Leatrix Plus [|cffeda55f功能百寶箱|r] + +## Notes: Quality of life addon. +## Notes-zhCN: 哆啦A梦的百宝袋 +## Notes-zhTW: 哆啦A夢的百寶袋 + +## Version: 3.0.131 +## Author: Leatrix +## SavedVariables: LeaPlusDB + +## OptionalDeps: Leatrix_enUS, ElvUI, Glass + +## X-Curse-Project-ID: 463863 + +libs\LibStub\LibStub.lua +libs\LibCompat-1.0\lib.xml +Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua +Libs\LibDataBroker-1.1\LibDataBroker-1.1.lua +Libs\LibDBIcon-1.0\LibDBIcon-1.0.lua + + +Leatrix_Plus_Library.lua +Leatrix_Plus_Locale.lua +Leatrix_Plus_Media.lua +Leatrix_Plus_Flight_Alliance.lua +Leatrix_Plus_Flight_Horde.lua +Leatrix_Plus.lua diff --git a/assets/minimapicon.tga b/assets/minimapicon.tga new file mode 100644 index 0000000..8071151 Binary files /dev/null and b/assets/minimapicon.tga differ diff --git a/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua new file mode 100644 index 0000000..712bf7e --- /dev/null +++ b/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua @@ -0,0 +1,240 @@ +--[[ $Id: CallbackHandler-1.0.lua 895 2009-12-06 16:28:55Z nevcairiel $ ]] +local MAJOR, MINOR = "CallbackHandler-1.0", 5 +local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) + +if not CallbackHandler then return end -- No upgrade needed + +local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} + +-- Lua APIs +local tconcat = table.concat +local assert, error, loadstring = assert, error, loadstring +local setmetatable, rawset, rawget = setmetatable, rawset, rawget +local next, select, pairs, type, tostring = next, select, pairs, type, tostring + +-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded +-- List them here for Mikk's FindGlobals script +-- GLOBALS: geterrorhandler + +local xpcall = xpcall + +local function errorhandler(err) + return geterrorhandler()(err) +end + +local function CreateDispatcher(argCount) + local code = [[ + local next, xpcall, eh = ... + + local method, ARGS + local function call() method(ARGS) end + + local function dispatch(handlers, ...) + local index + index, method = next(handlers) + if not method then return end + local OLD_ARGS = ARGS + ARGS = ... + repeat + xpcall(call, eh) + index, method = next(handlers, index) + until not method + ARGS = OLD_ARGS + end + + return dispatch + ]] + + local ARGS, OLD_ARGS = {}, {} + for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end + code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", ")) + return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler) +end + +local Dispatchers = setmetatable({}, {__index=function(self, argCount) + local dispatcher = CreateDispatcher(argCount) + rawset(self, argCount, dispatcher) + return dispatcher +end}) + +-------------------------------------------------------------------------- +-- CallbackHandler:New +-- +-- target - target object to embed public APIs in +-- RegisterName - name of the callback registration API, default "RegisterCallback" +-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" +-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. + +function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused) + -- TODO: Remove this after beta has gone out + assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused") + + RegisterName = RegisterName or "RegisterCallback" + UnregisterName = UnregisterName or "UnregisterCallback" + if UnregisterAllName==nil then -- false is used to indicate "don't want this method" + UnregisterAllName = "UnregisterAllCallbacks" + end + + -- we declare all objects and exported APIs inside this closure to quickly gain access + -- to e.g. function names, the "target" parameter, etc + + + -- Create the registry object + local events = setmetatable({}, meta) + local registry = { recurse=0, events=events } + + -- registry:Fire() - fires the given event/message into the registry + function registry:Fire(eventname, ...) + if not rawget(events, eventname) or not next(events[eventname]) then return end + local oldrecurse = registry.recurse + registry.recurse = oldrecurse + 1 + + Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...) + + registry.recurse = oldrecurse + + if registry.insertQueue and oldrecurse==0 then + -- Something in one of our callbacks wanted to register more callbacks; they got queued + for eventname,callbacks in pairs(registry.insertQueue) do + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + for self,func in pairs(callbacks) do + events[eventname][self] = func + -- fire OnUsed callback? + if first and registry.OnUsed then + registry.OnUsed(registry, target, eventname) + first = nil + end + end + end + registry.insertQueue = nil + end + end + + -- Registration of a callback, handles: + -- self["method"], leads to self["method"](self, ...) + -- self with function ref, leads to functionref(...) + -- "addonId" (instead of self) with function ref, leads to functionref(...) + -- all with an optional arg, which, if present, gets passed as first argument (after self if present) + target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]]) + if type(eventname) ~= "string" then + error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2) + end + + method = method or eventname + + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + + if type(method) ~= "string" and type(method) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2) + end + + local regfunc + + if type(method) == "string" then + -- self["method"] calling style + if type(self) ~= "table" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2) + elseif self==target then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2) + elseif type(self[method]) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) self[method](self,arg,...) end + else + regfunc = function(...) self[method](self,...) end + end + else + -- function ref with self=object or self="addonId" + if type(self)~="table" and type(self)~="string" then + error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) method(arg,...) end + else + regfunc = method + end + end + + + if events[eventname][self] or registry.recurse<1 then + -- if registry.recurse<1 then + -- we're overwriting an existing entry, or not currently recursing. just set it. + events[eventname][self] = regfunc + -- fire OnUsed callback? + if registry.OnUsed and first then + registry.OnUsed(registry, target, eventname) + end + else + -- we're currently processing a callback in this registry, so delay the registration of this new entry! + -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency + registry.insertQueue = registry.insertQueue or setmetatable({},meta) + registry.insertQueue[eventname][self] = regfunc + end + end + + -- Unregister a callback + target[UnregisterName] = function(self, eventname) + if not self or self==target then + error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2) + end + if type(eventname) ~= "string" then + error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2) + end + if rawget(events, eventname) and events[eventname][self] then + events[eventname][self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(events[eventname]) then + registry.OnUnused(registry, target, eventname) + end + end + if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then + registry.insertQueue[eventname][self] = nil + end + end + + -- OPTIONAL: Unregister all callbacks for given selfs/addonIds + if UnregisterAllName then + target[UnregisterAllName] = function(...) + if select("#",...)<1 then + error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2) + end + if select("#",...)==1 and ...==target then + error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2) + end + + + for i=1,select("#",...) do + local self = select(i,...) + if registry.insertQueue then + for eventname, callbacks in pairs(registry.insertQueue) do + if callbacks[self] then + callbacks[self] = nil + end + end + end + for eventname, callbacks in pairs(events) do + if callbacks[self] then + callbacks[self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(callbacks) then + registry.OnUnused(registry, target, eventname) + end + end + end + end + end + end + + return registry +end + + +-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it +-- try to upgrade old implicit embeds since the system is selfcontained and +-- relies on closures to work. + diff --git a/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml new file mode 100644 index 0000000..876df83 --- /dev/null +++ b/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml @@ -0,0 +1,4 @@ + +