fix minimap button

This commit is contained in:
Sattva
2023-05-20 18:30:38 +03:00
commit cd8866e2a2
35 changed files with 54330 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
<Bindings>
<!-- Toggle panel -->
<Binding name="LEATRIX_PLUS_GLOBAL_TOGGLE" category = "Leatrix Plus">
SlashCmdList["Leatrix_Plus"]()
</Binding>
<!-- Show web link -->
<Binding name="LEATRIX_PLUS_GLOBAL_WEBLINK" category = "Leatrix Plus">
SlashCmdList["Leatrix_Plus"]("id")
</Binding>
<!-- Announce rare -->
<Binding name="LEATRIX_PLUS_GLOBAL_RARE" category = "Leatrix Plus">
SlashCmdList["Leatrix_Plus"]("ra")
</Binding>
</Bindings>
+765
View File
@@ -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 <id>") 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.
File diff suppressed because one or more lines are too long
BIN
View File
Binary file not shown.
+15957
View File
File diff suppressed because one or more lines are too long
+31
View File
@@ -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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+263
View File
@@ -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
+31
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

@@ -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.
@@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="CallbackHandler-1.0.lua"/>
</Ui>
+523
View File
@@ -0,0 +1,523 @@
BACKDROP_TOOLTIP_8_8_1111 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 8,
edgeSize = 8,
insets = {left = 1, right = 1, top = 1, bottom = 1}
}
BACKDROP_TOOLTIP_8_12_1111 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 8,
edgeSize = 12,
insets = {left = 1, right = 1, top = 1, bottom = 1}
}
BACKDROP_TOOLTIP_16_16_5555 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 16,
edgeSize = 16,
insets = {left = 5, right = 5, top = 5, bottom = 5}
}
BACKDROP_TOOLTIP_12_12_4444 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 12,
edgeSize = 12,
insets = {left = 4, right = 4, top = 4, bottom = 4}
}
BACKDROP_TOOLTIP_0_16 = {
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 16,
tileEdge = true
}
BACKDROP_TOOLTIP_0_12_0055 = {
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 12,
tileEdge = true,
insets = {left = 0, right = 0, top = 5, bottom = 5}
}
BACKDROP_TOOLTIP_0_16_5555 = {
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 16,
tileEdge = true,
insets = {left = 5, right = 5, top = 5, bottom = 5}
}
BACKDROP_ACHIEVEMENTS_0_64 = {
edgeFile = "Interface\\AchievementFrame\\UI-Achievement-WoodBorder",
edgeSize = 64,
tileEdge = true
}
BACKDROP_ARENA_32_32 = {
bgFile = "Interface\\CharacterFrame\\UI-Party-Background",
edgeFile = "Interface\\ArenaEnemyFrame\\UI-Arena-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 32, right = 32, top = 32, bottom = 32}
}
BACKDROP_DIALOG_32_32 = {
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 11, right = 12, top = 12, bottom = 11}
}
BACKDROP_GOLD_DIALOG_32_32 = {
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 11, right = 12, top = 12, bottom = 11}
}
BACKDROP_WATERMARK_DIALOG_0_16 = {
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-TestWatermark-Border",
tileEdge = true,
edgeSize = 16
}
BACKDROP_SLIDER_8_8 = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
tile = true,
tileEdge = true,
tileSize = 8,
edgeSize = 8,
insets = {left = 3, right = 3, top = 6, bottom = 6}
}
BACKDROP_PARTY_32_32 = {
bgFile = "Interface\\CharacterFrame\\UI-Party-Background",
edgeFile = "Interface\\CharacterFrame\\UI-Party-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 32, right = 32, top = 32, bottom = 32}
}
BACKDROP_TOAST_12_12 = {
bgFile = "Interface\\FriendsFrame\\UI-Toast-Background",
edgeFile = "Interface\\FriendsFrame\\UI-Toast-Border",
tile = true,
tileEdge = true,
tileSize = 12,
edgeSize = 12,
insets = {left = 5, right = 5, top = 5, bottom = 5}
}
BACKDROP_CALLOUT_GLOW_0_16 = {
edgeFile = "Interface\\TutorialFrame\\UI-TutorialFrame-CalloutGlow",
edgeSize = 16,
tileEdge = true
}
BACKDROP_CALLOUT_GLOW_0_20 = {
edgeFile = "Interface\\TutorialFrame\\UI-TutorialFrame-CalloutGlow",
edgeSize = 20,
tileEdge = true
}
BACKDROP_GLUE_TOOLTIP_16_16 = {
bgFile = "Interface\\Glues\\Common\\Glue-Tooltip-Background",
edgeFile = "Interface\\Glues\\Common\\Glue-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 16,
edgeSize = 16,
insets = {left = 10, right = 5, top = 4, bottom = 9}
}
BACKDROP_GLUE_TOOLTIP_0_16 = {
edgeFile = "Interface\\Glues\\Common\\Glue-Tooltip-Border",
tileEdge = true,
edgeSize = 16
}
BACKDROP_MIXED_TOOLTIP_16_16 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Glues\\Common\\Glue-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 16,
edgeSize = 16,
insets = {left = 10, right = 5, top = 4, bottom = 9}
}
BACKDROP_TEXT_PANEL_0_16 = {
edgeFile = "Interface\\Glues\\Common\\TextPanel-Border",
tileEdge = true,
edgeSize = 16
}
BackdropTemplateMixin = {}
local coordStart = 0.0625
local coordEnd = 1 - coordStart
local textureUVs = {
-- keys have to match pieceNames in nineSliceSetup table
TopLeftCorner = {
setWidth = true,
setHeight = true,
ULx = 0.5078125,
ULy = coordStart,
LLx = 0.5078125,
LLy = coordEnd,
URx = 0.6171875,
URy = coordStart,
LRx = 0.6171875,
LRy = coordEnd
},
TopRightCorner = {
setWidth = true,
setHeight = true,
ULx = 0.6328125,
ULy = coordStart,
LLx = 0.6328125,
LLy = coordEnd,
URx = 0.7421875,
URy = coordStart,
LRx = 0.7421875,
LRy = coordEnd
},
BottomLeftCorner = {
setWidth = true,
setHeight = true,
ULx = 0.7578125,
ULy = coordStart,
LLx = 0.7578125,
LLy = coordEnd,
URx = 0.8671875,
URy = coordStart,
LRx = 0.8671875,
LRy = coordEnd
},
BottomRightCorner = {
setWidth = true,
setHeight = true,
ULx = 0.8828125,
ULy = coordStart,
LLx = 0.8828125,
LLy = coordEnd,
URx = 0.9921875,
URy = coordStart,
LRx = 0.9921875,
LRy = coordEnd
},
TopEdge = {
setHeight = true,
ULx = 0.2578125,
ULy = "repeatX",
LLx = 0.3671875,
LLy = "repeatX",
URx = 0.2578125,
URy = coordStart,
LRx = 0.3671875,
LRy = coordStart
},
BottomEdge = {
setHeight = true,
ULx = 0.3828125,
ULy = "repeatX",
LLx = 0.4921875,
LLy = "repeatX",
URx = 0.3828125,
URy = coordStart,
LRx = 0.4921875,
LRy = coordStart
},
LeftEdge = {
setWidth = true,
ULx = 0.0078125,
ULy = coordStart,
LLx = 0.0078125,
LLy = "repeatY",
URx = 0.1171875,
URy = coordStart,
LRx = 0.1171875,
LRy = "repeatY"
},
RightEdge = {
setWidth = true,
ULx = 0.1328125,
ULy = coordStart,
LLx = 0.1328125,
LLy = "repeatY",
URx = 0.2421875,
URy = coordStart,
LRx = 0.2421875,
LRy = "repeatY"
},
Center = {ULx = 0, ULy = 0, LLx = 0, LLy = "repeatY", URx = "repeatX", URy = 0, LRx = "repeatX", LRy = "repeatY"}
}
local defaultEdgeSize = 39 -- the old default
function BackdropTemplateMixin:OnBackdropLoaded()
if self.backdropInfo then
-- check for invalid info
if not self.backdropInfo.edgeFile and not self.backdropInfo.bgFile then
self.backdropInfo = nil
return
end
self:ApplyBackdrop()
do
local r, g, b = 1, 1, 1
if self.backdropColor then
r, g, b = self.backdropColor:GetRGB()
end
local a = self.backdropColorAlpha or 1
self:SetBackdropColor(r, g, b, a)
end
do
local r, g, b = 1, 1, 1
if self.backdropBorderColor then
r, g, b = self.backdropBorderColor:GetRGB()
end
local a = self.backdropBorderColorAlpha or 1
self:SetBackdropBorderColor(r, g, b, a)
end
if self.backdropBorderBlendMode then
self:SetBorderBlendMode(self.backdropBorderBlendMode)
end
end
end
function BackdropTemplateMixin:OnBackdropSizeChanged()
if self.backdropInfo then
self:SetupTextureCoordinates()
end
end
function BackdropTemplateMixin:GetEdgeSize()
if self.backdropInfo.edgeSize and self.backdropInfo.edgeSize > 0 then
return self.backdropInfo.edgeSize
else
return defaultEdgeSize
end
end
local function GetBackdropCoordValue(coord, pieceSetup, repeatX, repeatY)
local value = pieceSetup[coord]
if value == "repeatX" then
return repeatX
elseif value == "repeatY" then
return repeatY
else
return value
end
end
local function SetupBackdropTextureCoordinates(region, pieceSetup, repeatX, repeatY)
region:SetTexCoord(
GetBackdropCoordValue("ULx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("ULy", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LLx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LLy", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("URx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("URy", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LRx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LRy", pieceSetup, repeatX, repeatY)
)
end
function BackdropTemplateMixin:SetupTextureCoordinates()
local width = self:GetWidth()
local height = self:GetHeight()
local effectiveScale = self:GetEffectiveScale()
local edgeSize = self:GetEdgeSize()
local edgeRepeatX = max(0, (width / edgeSize) * effectiveScale - 2 - coordStart)
local edgeRepeatY = max(0, (height / edgeSize) * effectiveScale - 2 - coordStart)
for pieceName, pieceSetup in pairs(textureUVs) do
local region = self[pieceName]
if region then
if pieceName == "Center" then
local repeatX = 1
local repeatY = 1
if self.backdropInfo.tile then
local divisor = self.backdropInfo.tileSize
if not divisor or divisor == 0 then
divisor = edgeSize
end
if divisor ~= 0 then
repeatX = (width / divisor) * effectiveScale
repeatY = (height / divisor) * effectiveScale
end
end
SetupBackdropTextureCoordinates(region, pieceSetup, repeatX, repeatY)
else
SetupBackdropTextureCoordinates(region, pieceSetup, edgeRepeatX, edgeRepeatY)
end
end
end
end
function BackdropTemplateMixin:SetupPieceVisuals(piece, setupInfo, pieceLayout)
local textureInfo = textureUVs[setupInfo.pieceName]
local tileVerts = false
local file
if setupInfo.pieceName == "Center" then
file = self.backdropInfo.bgFile
tileVerts = self.backdropInfo.tile
else
if self.backdropInfo.tileEdge ~= false then
tileVerts = true
end
file = self.backdropInfo.edgeFile
end
piece:SetTexture(file, tileVerts, tileVerts)
local cornerWidth = textureInfo.setWidth and self:GetEdgeSize() or 0
local cornerHeight = textureInfo.setHeight and self:GetEdgeSize() or 0
piece:SetSize(cornerWidth, cornerHeight)
end
function BackdropTemplateMixin:SetBorderBlendMode(blendMode)
if not self.backdropInfo then
return
end
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region and pieceName ~= "Center" then
region:SetBlendMode(blendMode)
end
end
end
function BackdropTemplateMixin:HasBackdropInfo(backdropInfo)
return self.backdropInfo == backdropInfo
end
function BackdropTemplateMixin:ClearBackdrop()
if self.backdropInfo then
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region then
region:SetTexture(nil)
end
end
self.backdropInfo = nil
end
end
function BackdropTemplateMixin:ApplyBackdrop()
local x, y, x1, y1 = 0, 0, 0, 0
if self.backdropInfo.bgFile then
local edgeSize = self:GetEdgeSize()
x = -edgeSize
y = edgeSize
x1 = edgeSize
y1 = -edgeSize
local insets = self.backdropInfo.insets
if insets then
x = x + (insets.left or 0)
y = y - (insets.top or 0)
x1 = x1 - (insets.right or 0)
y1 = y1 + (insets.bottom or 0)
end
end
local layout = {
TopLeftCorner = {},
TopRightCorner = {},
BottomLeftCorner = {},
BottomRightCorner = {},
TopEdge = {},
BottomEdge = {},
LeftEdge = {},
RightEdge = {},
Center = {layer = "BACKGROUND", x = x, y = y, x1 = x1, y1 = y1},
setupPieceVisualsFunction = BackdropTemplateMixin.SetupPieceVisuals
}
NineSliceUtil.ApplyLayout(self, layout)
self:SetBackdropColor(1, 1, 1, 1)
self:SetBackdropBorderColor(1, 1, 1, 1)
self:SetupTextureCoordinates()
end
-- backwards compatibility API starts here
function BackdropTemplateMixin:SetBackdrop(backdropInfo)
if backdropInfo then
if self:HasBackdropInfo(backdropInfo) then
return
end
if not backdropInfo.edgeFile and not backdropInfo.bgFile then
self:ClearBackdrop()
return
end
self.backdropInfo = backdropInfo
self:ApplyBackdrop()
else
self:ClearBackdrop()
end
end
function BackdropTemplateMixin:GetBackdrop()
if self.backdropInfo then
-- make a copy because it will be altered to match old API output
local backdropInfo = CopyTable(self.backdropInfo)
-- fill in defaults
if not backdropInfo.bgFile then
backdropInfo.bgFile = ""
end
if not backdropInfo.edgeFile then
backdropInfo.edgeFile = ""
end
if backdropInfo.tile == nil then
backdropInfo.tile = false
end
if backdropInfo.tileSize == nil then
backdropInfo.tileSize = 0
end
if backdropInfo.tileEdge == nil then
backdropInfo.tileEdge = true
end
if not backdropInfo.edgeSize then
backdropInfo.edgeSize = self:GetEdgeSize()
end
if not backdropInfo.insets then
backdropInfo.insets = {}
end
if not backdropInfo.insets.left then
backdropInfo.insets.left = 0
end
if not backdropInfo.insets.right then
backdropInfo.insets.right = 0
end
if not backdropInfo.insets.top then
backdropInfo.insets.top = 0
end
if not backdropInfo.insets.bottom then
backdropInfo.insets.bottom = 0
end
return backdropInfo
end
return nil
end
function BackdropTemplateMixin:GetBackdropColor()
if not self.backdropInfo then
return
end
if self.Center then
return self.Center:GetVertexColor()
end
end
function BackdropTemplateMixin:SetBackdropColor(r, g, b, a)
if not self.backdropInfo then
-- Ideally this would throw an error here but the old API just failed silently
return
end
if self.Center then
self.Center:SetVertexColor(r, g, b, a or 1)
end
end
function BackdropTemplateMixin:GetBackdropBorderColor()
if not self.backdropInfo then
return
end
-- return the vertex color of any valid region
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region and pieceName ~= "Center" then
return region:GetVertexColor()
end
end
end
function BackdropTemplateMixin:SetBackdropBorderColor(r, g, b, a)
if not self.backdropInfo then
-- Ideally this would throw an error here but the old API just failed silently
return
end
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region and pieceName ~= "Center" then
region:SetVertexColor(r, g, b, a or 1)
end
end
end
+23
View File
@@ -0,0 +1,23 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="Backdrop.lua"/>
<Frame name="BackdropTemplate" mixin="BackdropTemplateMixin" virtual="true">
<Scripts>
<OnLoad method="OnBackdropLoaded"/>
<OnSizeChanged method="OnBackdropSizeChanged"/>
</Scripts>
</Frame>
<Frame name="TooltipBackdropTemplate" inherits="BackdropTemplate" virtual="true">
<KeyValues>
<KeyValue key="backdropInfo" value="TOOLTIP_BACKDROP_STYLE_DEFAULT" type="global"/>
<KeyValue key="backdropColor" value="TOOLTIP_DEFAULT_BACKGROUND_COLOR" type="global"/>
<KeyValue key="backdropBorderColor" value="TOOLTIP_DEFAULT_COLOR" type="global"/>
</KeyValues>
</Frame>
<Frame name="TooltipBorderBackdropTemplate" inherits="BackdropTemplate" virtual="true">
<KeyValues>
<KeyValue key="backdropInfo" value="BACKDROP_TOOLTIP_0_16" type="global"/>
<KeyValue key="backdropBorderColor" value="TOOLTIP_DEFAULT_COLOR" type="global"/>
</KeyValues>
</Frame>
</Ui>
+965
View File
@@ -0,0 +1,965 @@
--
-- **LibCompat-1.0** provided few handy functions that can be embed to addons.
-- This library was originally created for Skada as of 1.8.50.
-- @author: Kader B (https://github.com/bkader)
--
local MAJOR, MINOR = "LibCompat-1.0", 16
local LibCompat, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not LibCompat then return end
LibCompat.embeds = LibCompat.embeds or {}
local pairs, ipairs, select, type = pairs, ipairs, select, type
local tinsert, tremove, tconcat, wipe = table.insert, table.remove, table.concat, wipe
local floor, ceil, max = math.floor, math.ceil, math.max
local setmetatable, format = setmetatable, string.format
local CreateFrame = CreateFrame
-------------------------------------------------------------------------------
do
local tostring = tostring
local tmp = {}
local function Print(self, frame, ...)
local n = 0
if self ~= LibCompat then
n = n + 1
tmp[n] = "|cff33ff99" .. tostring(self) .. "|r:"
end
for i = 1, select("#", ...) do
n = n + 1
tmp[n] = tostring(select(i, ...))
end
frame:AddMessage(tconcat(tmp, " ", 1, n))
end
function LibCompat:Print(...)
local frame = ...
if type(frame) == "table" and frame.AddMessage then
return Print(self, frame, select(2, ...))
end
return Print(self, DEFAULT_CHAT_FRAME, ...)
end
function LibCompat:Printf(...)
local frame = ...
if type(frame) == "table" and frame.AddMessage then
return Print(self, frame, format(select(2, ...)))
else
return Print(self, DEFAULT_CHAT_FRAME, format(...))
end
end
end
-------------------------------------------------------------------------------
do
local pcall = pcall
local function DispatchError(err)
print("|cffff9900Error|r:" .. (err or "<no error given>"))
end
function LibCompat.QuickDispatch(func, ...)
if type(func) ~= "function" then
return
end
local ok, err = pcall(func, ...)
if not ok then
DispatchError(err)
return
end
return true
end
end
-------------------------------------------------------------------------------
do
local function SafePack(...)
local tbl = {...}
tbl.n = select("#", ...)
return tbl
end
local function SafeUnpack(tbl)
return unpack(tbl, 1, tbl.n)
end
local function tLength(tbl)
local len = 0
for _ in pairs(tbl) do
len = len + 1
end
return len
end
-- copies a table from another
local function tCopy(to, from, ...)
for k, v in pairs(from) do
local skip = false
if ... then
for i, j in ipairs(...) do
if j == k then
skip = true
break
end
end
end
if not skip then
if type(v) == "table" then
to[k] = {}
tCopy(to[k], v, ...)
else
to[k] = v
end
end
end
end
local function tAppendAll(tbl, elems)
for _, elem in ipairs(elems) do
tinsert(tbl, elem)
end
end
local weaktable = {__mode = "v"}
local function WeakTable(t)
return setmetatable(wipe(t or {}), weaktable)
end
-- Shamelessly copied from Omen - thanks!
local tablePool = setmetatable({}, {__mode = "kv"})
-- get a new table
local function newTable(...)
local t = next(tablePool)
if t then
tablePool[t] = nil
for i = 1, select("#", ...) do
t[i] = select(i, ...)
end
return t
else
return {...}
end
end
-- delete table and return to pool
local function delTable(t, recursive)
if type(t) == "table" then
for k, v in pairs(t) do
if recursive and type(v) == "table" then
delTable(v, recursive)
end
t[k] = nil
end
t[true] = true
t[true] = nil
setmetatable(t, nil)
tablePool[t] = true
end
return nil
end
LibCompat.SafePack = SafePack
LibCompat.SafeUnpack = SafeUnpack
LibCompat.tLength = tLength
LibCompat.tCopy = tCopy
LibCompat.tAppendAll = tAppendAll
LibCompat.WeakTable = WeakTable
LibCompat.newTable = newTable
LibCompat.delTable = delTable
end
-------------------------------------------------------------------------------
do
local function Round(val)
return (val < 0.0) and ceil(val - 0.5) or floor(val + 0.5)
end
local function Square(val)
return val * val
end
local function Clamp(val, minval, maxval)
return (val > maxval) and maxval or (val < minval) and minval or val
end
local function WithinRange(val, minval, maxval)
return val >= minval and val <= maxval
end
local function WithinRangeExclusive(val, minval, maxval)
return val > minval and val < maxval
end
LibCompat.Round = Round
LibCompat.Square = Square
LibCompat.Clamp = Clamp
LibCompat.WithinRange = WithinRange
LibCompat.WithinRangeExclusive = WithinRangeExclusive
end
-------------------------------------------------------------------------------
do
local GetNumRaidMembers, GetNumPartyMembers = GetNumRaidMembers, GetNumPartyMembers
local UnitExists, UnitAffectingCombat, UnitIsDeadOrGhost = UnitExists, UnitAffectingCombat, UnitIsDeadOrGhost
local UnitHealth, UnitHealthMax = UnitHealth, UnitHealthMax
local UnitPower, UnitPowerMax = UnitPower, UnitPowerMax
local function IsInRaid()
return (GetNumRaidMembers() > 0)
end
local function IsInGroup()
return (GetNumRaidMembers() > 0 or GetNumPartyMembers() > 0)
end
local function GetNumGroupMembers()
return IsInRaid() and GetNumRaidMembers() or GetNumPartyMembers()
end
local function GetNumSubgroupMembers()
return GetNumPartyMembers()
end
local function GetGroupTypeAndCount()
if IsInRaid() then
return "raid", 1, GetNumRaidMembers()
elseif IsInGroup() then
return "party", 0, GetNumPartyMembers()
else
return nil, 0, 0
end
end
local UnitIterator, roster, _
do
local rmem, pmem, step, count
local function SelfIterator()
while step do
local unit, owner
if step == 1 then
unit, owner, step = "player", nil, 2
elseif step == 2 then
unit, owner, step = "playerpet", "player", nil
end
if unit and UnitExists(unit) then
return unit, owner
end
end
end
local function PartyIterator()
while step do
local unit, owner
if step <= 2 then
unit, owner = SelfIterator()
step = step or 3
elseif step == 3 then
unit, owner, step = format("party%d", count), nil, 4
elseif step == 4 then
unit, owner = format("partypet%d", count), format("party%d", count)
count = count + 1
step = count <= pmem and 3 or nil
end
if unit and UnitExists(unit) then
return unit, owner
end
end
end
local function RaidIterator()
while step do
local unit, owner
if step == 1 then
unit, owner, step = format("raid%d", count), nil, 2
elseif step == 2 then
unit, owner = format("raidpet%d", count), format("raid%d", count)
count = count + 1
step = count <= rmem and 1 or nil
end
if unit and UnitExists(unit) then
return unit, owner
end
end
end
function UnitIterator()
rmem, step = GetNumRaidMembers(), 1
if rmem == 0 then
pmem = GetNumPartyMembers()
if pmem == 0 then
return SelfIterator, false
end
count = 1
return PartyIterator, false
end
count = 1
return RaidIterator, true
end
end
local function IsGroupDead()
roster, _ = UnitIterator()
for unit in roster do
if not UnitIsDeadOrGhost(unit) then
return false
end
end
return true
end
local function IsGroupInCombat()
roster, _ = UnitIterator()
for unit in roster do
if UnitAffectingCombat(unit) then
return true
end
end
return false
end
local function GroupIterator(func, ...)
roster, _ = UnitIterator()
for unit, owner in roster do
LibCompat.QuickDispatch(func, unit, owner, ...)
end
end
local function GetUnitIdFromGUID(guid, specific)
if specific == nil or specific == "boss" then
for i = 1, 4 do
if UnitExists("boss" .. i) and UnitGUID("boss" .. i) == guid then
return "boss" .. i
end
end
end
if specific == nil or specific == "player" then
if UnitExists("target") and UnitGUID("target") == guid then
return "target"
elseif UnitExists("focus") and UnitGUID("focus") == guid then
return "focus"
elseif UnitExists("targettarget") and UnitGUID("targettarget") == guid then
return "targettarget"
elseif UnitExists("focustarget") and UnitGUID("focustarget") == guid then
return "focustarget"
elseif UnitExists("mouseover") and UnitGUID("mouseover") == guid then
return "mouseover"
end
end
if specific == nil or specific == "group" then
roster, _ = UnitIterator()
for unit in roster do
if UnitGUID(unit) == guid then
return unit
elseif UnitExists(unit .. "target") and UnitGUID(unit .. "target") == guid then
return unit .. "target"
end
end
end
end
local function GetClassFromGUID(guid)
local unit = GetUnitIdFromGUID(guid)
local class
if unit and unit:find("pet") then
class = "PET"
elseif unit and unit:find("boss") then
class = "BOSS"
elseif unit then
class = select(2, UnitClass(unit))
end
return class, unit
end
local function GetCreatureId(guid)
return guid and tonumber(guid:sub(9, 12), 16) or 0
end
local function GetUnitCreatureId(unit)
return GetCreatureId(UnitGUID(unit))
end
local function UnitHealthInfo(unit, guid)
unit = unit or guid and GetUnitIdFromGUID(guid)
local percent, health, maxhealth
if unit and UnitExists(unit) then
health, maxhealth = UnitHealth(unit), UnitHealthMax(unit)
if health and maxhealth then
percent = 100 * health / max(1, maxhealth)
end
end
return percent, health, maxhealth
end
local function UnitPowerInfo(unit, guid, powerType)
unit = unit or guid and GetUnitIdFromGUID(guid)
local percent, power, maxpower
if unit and UnitExists(unit) then
power, maxpower = UnitPower(unit, powerType), UnitPowerMax(unit, powerType)
if power and maxpower then
percent = 100 * power / max(1, maxpower)
end
end
return percent, power, maxpower
end
local function UnitFullName(unit)
local name, realm = UnitName(unit)
local namerealm = realm and realm ~= "" and name .. "-" .. realm or name
return namerealm
end
LibCompat.IsInRaid = IsInRaid
LibCompat.IsInGroup = IsInGroup
LibCompat.GetNumGroupMembers = GetNumGroupMembers
LibCompat.GetNumSubgroupMembers = GetNumSubgroupMembers
LibCompat.GetGroupTypeAndCount = GetGroupTypeAndCount
LibCompat.IsGroupDead = IsGroupDead
LibCompat.IsGroupInCombat = IsGroupInCombat
LibCompat.GroupIterator = GroupIterator
LibCompat.UnitIterator = UnitIterator
LibCompat.GetUnitIdFromGUID = GetUnitIdFromGUID
LibCompat.GetClassFromGUID = GetClassFromGUID
LibCompat.GetCreatureId = GetCreatureId
LibCompat.GetUnitCreatureId = GetUnitCreatureId
LibCompat.UnitHealthInfo = UnitHealthInfo
LibCompat.UnitHealthPercent = UnitHealthInfo -- backward compatibility
LibCompat.UnitPowerInfo = UnitPowerInfo
LibCompat.UnitFullName = UnitFullName
end
-------------------------------------------------------------------------------
do
local IsRaidLeader, GetPartyLeaderIndex = IsRaidLeader, GetPartyLeaderIndex
local GetRealNumRaidMembers, GetRaidRosterInfo = GetRealNumRaidMembers, GetRaidRosterInfo
local function UnitIsGroupLeader(unit)
if LibCompat.IsInRaid() then
if unit == "player" then
return IsRaidLeader()
end
local rank = select(2, GetRaidRosterInfo(unit:match("%d+")))
return (rank and rank == 2)
end
if unit == "player" then
return (GetPartyLeaderIndex() == 0)
end
local index = unit:match("%d+")
return (index and index == GetPartyLeaderIndex())
end
local function UnitIsGroupAssistant(unit)
for i = 1, GetRealNumRaidMembers() do
local name, rank = GetRaidRosterInfo(i)
if name == UnitName(unit) then
return (rank == 1)
end
end
return false
end
LibCompat.UnitIsGroupLeader = UnitIsGroupLeader
LibCompat.UnitIsGroupAssistant = UnitIsGroupAssistant
end
-------------------------------------------------------------------------------
-- Class Colors
do
local classColorsTable
local colors = CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS
local function GetClassColorsTable()
if not classColorsTable then
-- add missing class color strings
colors.DEATHKNIGHT.colorStr = "ffc41f3b"
colors.DRUID.colorStr = "ffff7d0a"
colors.HUNTER.colorStr = "ffabd473"
colors.MAGE.colorStr = "ff3fc7eb"
colors.PALADIN.colorStr = "fff58cba"
colors.PRIEST.colorStr = "ffffffff"
colors.ROGUE.colorStr = "fffff569"
colors.SHAMAN.colorStr = "ff0070de"
colors.WARLOCK.colorStr = "ff8788ee"
colors.WARRIOR.colorStr = "ffc79c6e"
-- cache it once and for all.
classColorsTable = {}
for class, tbl in pairs(colors) do
classColorsTable[class] = tbl
end
end
return classColorsTable
end
local function GetClassColorObj(class)
classColorsTable = classColorsTable or GetClassColorsTable()
return class and classColorsTable[class]
end
local function GetClassColor(class)
local obj = GetClassColorObj(class)
if obj then
return obj.r, obj.g, obj.b, obj.colorStr
end
return 1, 1, 1, "ffffffff"
end
LibCompat.GetClassColorsTable = GetClassColorsTable
LibCompat.GetClassColorObj = GetClassColorObj
LibCompat.GetClassColor = GetClassColor
end
-------------------------------------------------------------------------------
-- C_Timer mimic
do
local TickerPrototype, waitTable = {}, {}
local TickerMetatable = {__index = TickerPrototype, __metatable = true}
local waitFrame = LibCompat_TimerFrame or CreateFrame("Frame", "LibCompat_TimerFrame", UIParent)
waitFrame:SetScript("OnUpdate", function(self, elapsed)
local total = #waitTable
for i = 1, total do
local ticker = waitTable[i]
if ticker then
if ticker._cancelled then
tremove(waitTable, i)
elseif ticker._delay > elapsed then
ticker._delay = ticker._delay - elapsed
i = i + 1
else
ticker._callback(ticker, LibCompat.SafeUnpack(ticker._args))
if ticker._iterations == -1 then
ticker._delay = ticker._duration
i = i + 1
elseif ticker._iterations > 1 then
ticker._iterations = ticker._iterations - 1
ticker._delay = ticker._duration
i = i + 1
elseif ticker._iterations == 1 then
tremove(waitTable, i)
total = total - 1
end
end
end
end
if #waitTable == 0 then
self:Hide()
end
end)
local function AddDelayedCall(ticker, oldTicker)
if oldTicker and type(oldTicker) == "table" then
ticker = oldTicker
end
tinsert(waitTable, ticker)
waitFrame:Show()
end
local function CreateTicker(duration, callback, iterations, ...)
local ticker = setmetatable({}, TickerMetatable)
ticker._iterations = iterations or -1
ticker._duration = duration
ticker._delay = duration
ticker._callback = callback
ticker._args = LibCompat.SafePack(...)
AddDelayedCall(ticker)
return ticker
end
function TickerPrototype:IsCancelled()
return self._cancelled
end
function TickerPrototype:Cancel()
self._cancelled = true
end
local function After(duration, callback, ...)
AddDelayedCall({
_iterations = 1,
_delay = duration,
_callback = callback,
_args = LibCompat.SafePack(...)
})
end
local function NewTimer(duration, callback, ...)
return CreateTicker(duration, callback, 1, ...)
end
local function NewTicker(duration, callback, iterations, ...)
return CreateTicker(duration, callback, iterations, ...)
end
local function CancelTimer(ticker)
if ticker and type(ticker.Cancel) == "function" then
ticker:Cancel()
end
return nil -- return nil to assign input reference
end
LibCompat.After = After
LibCompat.NewTimer = NewTimer
LibCompat.NewTicker = NewTicker
LibCompat.CancelTimer = CancelTimer
end
-------------------------------------------------------------------------------
do
local GetSpellInfo, GetSpellLink = GetSpellInfo, GetSpellLink
local custom = {
[3] = {ACTION_ENVIRONMENTAL_DAMAGE_FALLING, "Interface\\Icons\\ability_rogue_quickrecovery"},
[4] = {ACTION_ENVIRONMENTAL_DAMAGE_DROWNING, "Interface\\Icons\\spell_shadow_demonbreath"},
[5] = {ACTION_ENVIRONMENTAL_DAMAGE_FATIGUE, "Interface\\Icons\\ability_creature_cursed_05"},
[6] = {ACTION_ENVIRONMENTAL_DAMAGE_FIRE, "Interface\\Icons\\spell_fire_fire"},
[7] = {ACTION_ENVIRONMENTAL_DAMAGE_LAVA, "Interface\\Icons\\spell_shaman_lavaflow"},
[8] = {ACTION_ENVIRONMENTAL_DAMAGE_SLIME, "Interface\\Icons\\inv_misc_slime_01"}
}
local function _GetSpellInfo(spellid)
local res1, res2, res3, res4, res5, res6, res7, res8, res9
if spellid then
if custom[spellid] then
res1, res3 = custom[spellid][1], custom[spellid][2]
else
res1, res2, res3, res4, res5, res6, res7, res8, res9 = GetSpellInfo(spellid)
if spellid == 75 then
res3 = "Interface\\Icons\\INV_Weapon_Bow_07"
elseif spellid == 6603 then
res1, res3 = MELEE, "Interface\\Icons\\INV_Sword_04"
end
end
end
return res1, res2, res3, res4, res5, res6, res7, res8, res9
end
local function _GetSpellLink(spellid)
if not custom[spellid] then
return GetSpellLink(spellid)
end
end
LibCompat.GetSpellInfo = _GetSpellInfo
LibCompat.GetSpellLink = _GetSpellLink
end
-------------------------------------------------------------------------------
do
local band, rshift, lshift = bit.band, bit.rshift, bit.lshift
local byte, char = string.byte, string.char
local function HexEncode(str, title)
local hex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}
local t = (title and title ~= "") and {format("[=== %s ===]", title)} or {}
local j = 0
for i = 1, #str do
if j <= 0 then
t[#t + 1], j = "\n", 32
end
j = j - 1
local b = byte(str, i)
t[#t + 1] = hex[band(b, 15) + 1]
t[#t + 1] = hex[band(rshift(b, 4), 15) + 1]
end
if title and title ~= "" then
t[#t + 1] = "\n" .. t[1]
end
return tconcat(t)
end
local function HexDecode(str)
str = str:gsub("%[.-%]", ""):gsub("[^0123456789ABCDEF]", "")
if (#str == 0) or (#str % 2 ~= 0) then
return false, "Invalid Hex string"
end
local t, bl, bh = {}
local i = 1
repeat
bl = byte(str, i)
bl = bl >= 65 and bl - 55 or bl - 48
i = i + 1
bh = byte(str, i)
bh = bh >= 65 and bh - 55 or bh - 48
i = i + 1
t[#t + 1] = char(lshift(bh, 4) + bl)
until i >= #str
return tconcat(t)
end
local function EscapeStr(str)
local res = ""
for i = 1, str:len() do
local n = str:sub(i, i)
res = res .. n
if n == "|" then
res = res .. "\124"
end
end
return (res ~= "") and res or str
end
LibCompat.HexEncode = HexEncode
LibCompat.HexDecode = HexDecode
LibCompat.EscapeStr = EscapeStr
end
-------------------------------------------------------------------------------
do
local LGT = LibStub("LibGroupTalents-1.0")
local UnitClass, MAX_TALENT_TABS = UnitClass, MAX_TALENT_TABS or 3
local GetActiveTalentGroup, GetTalentTabInfo = GetActiveTalentGroup, GetTalentTabInfo
local LGTRoleTable = {melee = "DAMAGER", caster = "DAMAGER", healer = "HEALER", tank = "TANK"}
-- list of class to specs
local specsTable = {
["MAGE"] = {62, 63, 64},
["PRIEST"] = {256, 257, 258},
["ROGUE"] = {259, 260, 261},
["WARLOCK"] = {265, 266, 267},
["WARRIOR"] = {71, 72, 73},
["PALADIN"] = {65, 66, 70},
["DEATHKNIGHT"] = {250, 251, 252},
["DRUID"] = {102, 103, 104, 105},
["HUNTER"] = {253, 254, 255},
["SHAMAN"] = {262, 263, 264}
}
local function GetSpecialization(isInspect, isPet, specGroup)
local currentSpecGroup = GetActiveTalentGroup(isInspect, isPet) or (specGroup or 1)
local points, specname, specid = 0, nil, nil
for i = 1, MAX_TALENT_TABS do
local name, _, pointsSpent = GetTalentTabInfo(i, isInspect, isPet, currentSpecGroup)
if points <= pointsSpent then
points = pointsSpent
specname = name
specid = i
end
end
return specid, specname, points
end
-- checks if the feral druid is a cat or tank spec
local function GetDruidSpec(unit)
-- 57881 : Natural Reaction -- used by druid tanks
local points = LGT:UnitHasTalent(unit, LibCompat.GetSpellInfo(57881), LGT:GetActiveTalentGroup(unit))
return (points and points > 0) and 3 or 2
end
local function GetInspectSpecialization(unit, class)
local spec -- start with nil
if unit and UnitExists(unit) then
class = class or select(2, UnitClass(unit))
if class and specsTable[class] then
local talentGroup = LGT:GetActiveTalentGroup(unit)
local maxPoints, index = 0, 0
for i = 1, MAX_TALENT_TABS do
local _, _, pointsSpent = LGT:GetTalentTabInfo(unit, i, talentGroup)
if pointsSpent ~= nil then
if maxPoints < pointsSpent then
maxPoints = pointsSpent
if class == "DRUID" and i >= 2 then
if i == 3 then
index = 4
elseif i == 2 then
index = GetDruidSpec(unit)
end
else
index = i
end
end
end
end
spec = specsTable[class][index]
end
end
return spec
end
local function GetSpecializationRole(unit)
return LGTRoleTable[LGT:GetUnitRole(unit or "player")] or "NONE"
end
local function GetSpecializationInfo(specIndex, isInspect, isPet, specGroup)
local name, icon, _, background = GetTalentTabInfo(specIndex, isInspect, isPet, specGroup)
local id, role
if isInspect and UnitExists("target") then
id, role = GetInspectSpecialization("target"), GetSpecializationRole("target")
else
id, role = GetInspectSpecialization("player"), GetSpecializationRole("player")
end
return id, name, nil, icon, background, role
end
local function UnitGroupRolesAssigned(unit)
return LGTRoleTable[LGT:GetUnitRole(unit or "player")] or "NONE"
end
local function GetUnitRole(unit)
return LGTRoleTable[LGT:GetUnitRole(unit or "player")] or "NONE"
end
local function GetGUIDRole(guid)
return LGTRoleTable[LGT:GetGUIDRole(guid)] or "NONE"
end
LibCompat.GetSpecialization = GetSpecialization
LibCompat.GetInspectSpecialization = GetInspectSpecialization
LibCompat.GetSpecializationRole = GetSpecializationRole
LibCompat.GetSpecializationInfo = GetSpecializationInfo
LibCompat.UnitGroupRolesAssigned = UnitGroupRolesAssigned
LibCompat.GetUnitRole = UnitGroupRolesAssigned
LibCompat.GetGUIDRole = GetGUIDRole
LibCompat.GetUnitSpec = GetInspectSpecialization
-- functions that simply replaced other api functions
LibCompat.GetNumSpecializations = GetNumTalentTabs
LibCompat.GetNumSpecGroups = GetNumTalentGroups
LibCompat.GetNumUnspentTalents = GetUnspentTalentPoints
LibCompat.GetActiveSpecGroup = GetActiveTalentGroup
LibCompat.SetActiveSpecGroup = SetActiveTalentGroup
end
-------------------------------------------------------------------------------
do
local C_PvP = {}
local IsInInstance, instanceType = IsInInstance, nil
function C_PvP.IsPvPMap()
instanceType = select(2, IsInInstance())
return (instanceType == "pvp" or instanceType == "arena")
end
function C_PvP.IsBattleground()
instanceType = select(2, IsInInstance())
return (instanceType == "pvp")
end
function C_PvP.IsArena()
instanceType = select(2, IsInInstance())
return (instanceType == "arena")
end
LibCompat.IsInPvP = C_PvP.IsPvPMap
LibCompat.C_PvP = C_PvP
end
-------------------------------------------------------------------------------
local mixins = {
"QuickDispatch",
-- table util
"SafePack",
"SafeUnpack",
"tLength",
"tCopy",
"tAppendAll",
"WeakTable",
"newTable",
"delTable",
-- math util
"Round",
"Square",
"Clamp",
"WithinRange",
"WithinRangeExclusive",
-- roster util
"IsInRaid",
"IsInGroup",
"IsInPvP",
"GetNumGroupMembers",
"GetNumSubgroupMembers",
"GetGroupTypeAndCount",
"IsGroupDead",
"IsGroupInCombat",
"GroupIterator",
"UnitIterator",
"UnitFullName",
"C_PvP",
-- unit util
"GetUnitIdFromGUID",
"GetClassFromGUID",
"GetCreatureId",
"GetUnitCreatureId",
"UnitHealthInfo",
"UnitHealthPercent", -- backward compatibility
"UnitPowerInfo",
"UnitIsGroupLeader",
"UnitIsGroupAssistant",
"GetUnitSpec", -- backward compatibility
"GetSpecialization",
"GetInspectSpecialization",
"GetSpecializationRole",
"GetNumSpecializations",
"GetSpecializationInfo",
"UnitGroupRolesAssigned",
"GetNumSpecGroups",
"GetNumUnspentTalents",
"GetActiveSpecGroup",
"SetActiveSpecGroup",
"GetUnitRole",
"GetGUIDRole",
-- timer util
"After",
"NewTimer",
"NewTicker",
"CancelTimer",
-- spell util
"GetSpellInfo",
"GetSpellLink",
-- misc util
"HexEncode",
"HexDecode",
"EscapeStr",
"GetClassColorsTable",
"GetClassColorObj",
"GetClassColor",
"Print",
"Printf"
}
function LibCompat:Embed(target)
for _, v in pairs(mixins) do
target[v] = self[v]
end
target.locale = target.locale or GetLocale()
self.embeds[target] = true
return target
end
for addon in pairs(LibCompat.embeds) do
LibCompat:Embed(addon)
end
+20
View File
@@ -0,0 +1,20 @@
## Title: Lib: Compat-1.0
## Notes: Brings extra useful functions, some from later expansions and others as utilties.
## Author: Kader
## X-Email: bkader@mail.com
## X-Donate: bkader@mail.com
## Interface: 30300
## Version: 16
## X-Category: Library
## X-Website: https://github.com/bkader/LibCompat-1.0
## Dependencies:
## X-Embeds: LibStub, CallbackHandler-1.0, LibTalentQuery-1.0, LibGroupTalents-1.0
## OptionalDeps: LibStub, CallbackHandler-1.0
## DefaultState: Enabled
## LoadOnDemand: 0
lib.xml
@@ -0,0 +1,237 @@
--[[ $Id: CallbackHandler-1.0.lua 18 2014-10-16 02:52:20Z mikk $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 6
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)
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" 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.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,358 @@
--[[
Name: LibTalentQuery-1.0
Revision: $Rev: 84 $
Author: Rich Martel (richmartel@gmail.com)
Documentation: http://wowace.com/wiki/LibTalentQuery-1.0
SVN: svn://svn.wowace.com/wow/libtalentquery-1-0/mainline/trunk
Description: Library to help with querying unit talents
Dependancies: LibStub, CallbackHandler-1.0
License: LGPL v2.1
Example Usage:
local TalentQuery = LibStub:GetLibrary("LibTalentQuery-1.0")
TalentQuery.RegisterCallback(self, "TalentQuery_Ready")
local raidTalents = {}
...
TalentQuery:Query(unit)
...
function MyAddon:TalentQuery_Ready(e, name, realm, unitid)
local isnotplayer = not UnitIsUnit(unitid, "player")
local spec = {}
for tab = 1, GetNumTalentTabs(isnotplayer) do
local treename, _, pointsspent = GetTalentTabInfo(tab, isnotplayer)
tinsert(spec, pointsspent)
end
raidTalents[UnitGUID(unitid)] = spec
end
]]
local MAJOR, MINOR = "LibTalentQuery-1.0", 90000 + tonumber(("$Rev: 84 $"):match("(%d+)"))
local lib = LibStub:NewLibrary(MAJOR, MINOR)
if not lib then return end
local INSPECTDELAY = 1
local INSPECTTIMEOUT = 5
if not lib.events then
lib.events = LibStub("CallbackHandler-1.0"):New(lib)
end
local validateTrees
local enteredWorld = IsLoggedIn()
local frame = lib.frame
if not frame then
frame = CreateFrame("Frame", MAJOR .. "_Frame")
lib.frame = frame
end
frame:UnregisterAllEvents()
frame:RegisterEvent("INSPECT_TALENT_READY")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("PLAYER_LEAVING_WORLD")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function(this, event, ...)
return lib[event](lib, ...)
end)
do
local lastUpdateTime = 0
frame:SetScript("OnUpdate", function(this, elapsed)
lastUpdateTime = lastUpdateTime + elapsed
if lastUpdateTime > INSPECTDELAY then
lib:CheckInspectQueue()
lastUpdateTime = 0
end
end)
frame:Hide()
end
local inspectQueue = lib.inspectQueue or {}
lib.inspectQueue = inspectQueue
local garbageQueue = lib.garbageQueue or {} -- Added a second queue to things. Inspects that initially fail are now
lib.garbageQueue = garbageQueue -- thrown into second queue will will be processed once main queue is empty
if next(inspectQueue) then
frame:Show()
end
local UnitIsPlayer = _G.UnitIsPlayer
local UnitName = _G.UnitName
local UnitExists = _G.UnitExists
local UnitGUID = _G.UnitGUID
local GetNumRaidMembers = _G.GetNumRaidMembers
local GetNumPartyMembers = _G.GetNumPartyMembers
local UnitIsVisible = _G.UnitIsVisible
local UnitIsConnected = _G.UnitIsConnected
local UnitCanAttack = _G.UnitCanAttack
local CanInspect = _G.CanInspect
local function UnitFullName(unit)
local name, realm = UnitName(unit)
local namerealm = realm and realm ~= "" and name .. "-" .. realm or name
return namerealm
end
-- GuidToUnitID
local function GuidToUnitID(guid)
local prefix, min, max = "raid", 1, GetNumRaidMembers()
if max == 0 then
prefix, min, max = "party", 0, GetNumPartyMembers()
end
-- Prioritise getting direct units first because other players targets
-- can change between notify and event which can bugger things up
for i = min, max do
local unit = i == 0 and "player" or prefix .. i
if (UnitGUID(unit) == guid) then
return unit
end
end
-- This properly detects target units
if (UnitGUID("target") == guid) then
return "target"
elseif (UnitGUID("focus") == guid) then
return "focus"
elseif (UnitGUID("mouseover") == guid) then
return "mouseover"
end
for i = min, max + 3 do
local unit
if i == 0 then
unit = "player"
elseif i == max + 1 then
unit = "target"
elseif i == max + 2 then
unit = "focus"
elseif i == max + 3 then
unit = "mouseover"
else
unit = prefix .. i
end
if (UnitGUID(unit .. "target") == guid) then
return unit .. "target"
elseif (i <= max and UnitGUID(unit.."pettarget") == guid) then
return unit .. "pettarget"
end
end
return nil
end
-- Query
function lib:Query(unit)
if (UnitLevel(unit) < 10 or UnitName(unit) == UNKNOWN) then
return
end
self.lastQueuedInspectReceived = nil
if UnitIsUnit(unit, "player") then
self.events:Fire("TalentQuery_Ready", UnitName("player"), nil, "player")
else
if type(unit) ~= "string" then
error(("Bad argument #2 to 'Query'. Expected %q, received %q (%s)"):format("string", type(unit), tostring(unit)), 2)
elseif not UnitExists(unit) or not UnitIsPlayer(unit) then
error(("Bad argument #2 to 'Query'. %q is not a valid player unit"):format(tostring(unit)), 2)
elseif not UnitExists(unit) or not UnitIsPlayer(unit) then
error(("Bad argument #2 to 'Query'. %q does not require a server query before reading talents"):format("player"), 2)
else
local name = UnitFullName(unit)
if (not inspectQueue[name]) then
inspectQueue[name] = UnitGUID(unit)
garbageQueue[name] = nil
end
frame:Show()
end
end
end
-- CheckInspectQueue
-- Originally, it would wait until no pending NotifyInspect() were expected, and then do it's own.
-- It was also only bother looking at ready results if it had triggered the Notify for that occasion.
-- For the changes I've done, no assumption is made about which mod is performing NotifyInspect().
-- We note the name, unit, time of any inspects done whether from this queue or any other source,
-- we remove from our queue any we were expecting, and use a seperate event in case extra talent
-- info is any time wanted (opportunistic refreshes etc) - Zeksie, 20th May 2009
function lib:CheckInspectQueue()
if (_G.InspectFrame and _G.InspectFrame:IsShown()) then
return
end
if (not self.lastInspectTime or self.lastInspectTime < GetTime() - INSPECTTIMEOUT) then
self.lastInspectPending = 0
end
if (self.lastInspectPending > 0 or not enteredWorld) then
return
end
if (self.lastQueuedInspectReceived and self.lastQueuedInspectReceived < GetTime() - 60) then
-- No queued results received for a minute, so purge the queue as invalid and move on with our lives
self.lastQueuedInspectReceived = nil
inspectQueue = {}
lib.inspectQueue = inspectQueue
garbageQueue = {}
lib.garbageQueue = garbageQueue
frame:Hide()
return
end
for name,guid in pairs(inspectQueue) do
local unit = GuidToUnitID(guid)
if (not unit) then
inspectQueue[name] = nil
else
if (UnitIsVisible(unit) and UnitIsConnected(unit) and not UnitCanAttack("player", unit) and not UnitCanAttack(unit, "player") and CanInspect(unit) and UnitClass(unit)) then
NotifyInspect(unit)
break
else
garbageQueue[name] = guid -- Not available, throw into secondary queue and continue
inspectQueue[name] = nil
end
end
end
if (not next(inspectQueue)) then
if (next(garbageQueue)) then
-- Retry initially failed inspects
lib.inspectQueue = garbageQueue
inspectQueue = lib.inspectQueue
lib.garbageQueue = {}
garbageQueue = lib.garbageQueue
else
frame:Hide()
end
end
end
-- NotifyInspect
if not lib.NotifyInspect then -- don't hook twice
hooksecurefunc("NotifyInspect", function(...) return lib:NotifyInspect(...) end)
end
function lib:NotifyInspect(unit)
if (not (UnitExists(unit) and UnitIsVisible(unit) and UnitIsConnected(unit) and CheckInteractDistance(unit, 4))) then
return
end
self.lastInspectUnit = unit
self.lastInspectGUID = UnitGUID(unit)
self.lastInspectTime = GetTime()
self.lastInspectName = UnitFullName(unit)
self.lastInspectPending = self.lastInspectPending + 1
local isnotplayer = not UnitIsUnit("player", unit)
self.lastInspectTree = GetTalentTabInfo(1, isnotplayer) -- Talent tree names are available immediately
end
-- Reset
function lib:Reset()
self.lastInspectPending = 0
self.lastInspectUnit = nil
self.lastInspectTime = nil
self.lastInspectName = nil
self.lastInspectGUID = nil
self.lastInspectTree = nil
end
-- INSPECT_TALENT_READY
function lib:INSPECT_TALENT_READY()
self.lastInspectPending = self.lastInspectPending - 1
-- Results are valid only when we have received as many events as we have posted notifies
if (self.lastInspectName and self.lastInspectPending == 0) then
-- Check unit ID is still pointing to same actual unit
if (UnitGUID(self.lastInspectUnit) == self.lastInspectGUID) then
local guid = inspectQueue[self.lastInspectName]
inspectQueue[self.lastInspectName] = nil
local name, realm = strsplit("-", self.lastInspectName)
self.lastQueuedInspectReceived = GetTime()
-- Notify of expected talent results
local isnotplayer = not UnitIsUnit("player", self.lastInspectName)
local group = GetActiveTalentGroup(isnotplayer)
local tree1, _, spent1 = GetTalentTabInfo(1, isnotplayer, nil, group)
if (tree1 ~= self.lastInspectTree) then
-- Expected talent tree name to be the same as it was when we triggered the NotifyInspect()
garbageQueue[self.lastInspectName] = self.lastInspectGUID
self:Reset()
self:CheckInspectQueue()
return
elseif (validateTrees) then
-- Double checking here. Check the tree name matches what we expect for this class
local _, class = UnitClass(self.lastInspectUnit)
if (tree1 ~= validateTrees[class]) then
garbageQueue[self.lastInspectName] = self.lastInspectGUID
self:Reset()
self:CheckInspectQueue()
return
end
end
local tree2, _, spent2 = GetTalentTabInfo(2, isnotplayer, nil, group)
local tree3, _, spent3 = GetTalentTabInfo(3, isnotplayer, nil, group)
if ((spent1 or 0) + (spent2 or 0) + (spent3 or 0) > 0) then
if (guid) then
-- It was in our queue
self.events:Fire("TalentQuery_Ready", name, realm, self.lastInspectUnit)
else
-- Also notify of non-expected ones, as it's entirely useful to refresh them if they're there
-- It is up to the receiving applicating to determine whether they want to receive the information
self.events:Fire("TalentQuery_Ready_Outsider", name, realm, self.lastInspectUnit)
end
else
-- Tree came back with zero points spent, probably an issue while logging in
garbageQueue[self.lastInspectName] = guid
end
end
self:Reset()
self:CheckInspectQueue()
end
end
function lib:PLAYER_ENTERING_WORLD()
-- We can't inspect other's talents until now
-- We just get 0/0/0 back even though we get an INSPECT_TALENT_READY event
enteredWorld = true
end
function lib:PLAYER_LEAVING_WORLD()
enteredWorld = nil
end
function lib:PLAYER_LOGIN()
validateTrees = {
DRUID = "Balance",
PRIEST = "Discipline",
ROGUE = "Assassination",
HUNTER = "Beast Mastery",
WARLOCK = "Affliction",
WARRIOR = "Arms",
DEATHKNIGHT = "Blood",
PALADIN = "Holy",
SHAMAN = "Elemental",
MAGE = "Arcane",
}
if (GetLocale() ~= "enUS" and GetLocale() ~= "enGB") then
-- LibBabble-TalentTree-3.0 only loaded if present and not enUS
local LBT = LibStub("LibBabble-TalentTree-3.0", true)
if (not LBT) then
LoadAddOn("LibBabble-TalentTree-3.0")
LBT = LibStub("LibBabble-TalentTree-3.0", true)
end
LBT = LBT and LBT:GetLookupTable()
if (LBT) then
for class,tree1 in pairs(validateTrees) do
validateTrees[class] = LBT[tree1]
end
else
validateTrees = nil
end
end
self.PLAYER_LOGIN = nil
end
lib:Reset()
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibTalentQuery-1.0.lua"/>
<Script file="LibGroupTalents-1.0.lua"/>
</Ui>
@@ -0,0 +1,51 @@
-- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/addons/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
+10
View File
@@ -0,0 +1,10 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<EditBox name="BagSearchBoxTemplate" inherits="SearchBoxTemplate" autoFocus="false" virtual="true">
<Scripts>
<OnHide function="BagSearch_OnHide"/>
<OnTextChanged function="BagSearch_OnTextChanged"/>
<OnChar function="BagSearch_OnChar"/>
</Scripts>
</EditBox>
</Ui>
+11
View File
@@ -0,0 +1,11 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<!--@no-lib-strip@-->
<Script file="Libs\LibStub\LibStub.lua"/>
<Script file="Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
<!--@end-no-lib-strip@-->
<Include file="Libs\LibGroupTalents-1.0\lib.xml"/>
<Include file="Backdrop\Backdrop.xml"/>
<Include file="Templates.xml"/>
<Script file="LibCompat-1.0.lua"/>
</Ui>
+263
View File
@@ -0,0 +1,263 @@
--[[
Name: DBIcon-1.0
Revision: $Rev: 13 $
Author(s): Rabbit (rabbit.magtheridon@gmail.com)
Description: Allows addons to register to recieve a lightweight minimap icon as an alternative to more heavy LDB displays.
Dependencies: LibStub
License: GPL v2 or later.
]]
--[[
Copyright (C) 2008-2010 Rabbit
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
]]
-----------------------------------------------------------------------
-- DBIcon-1.0
--
-- Disclaimer: Most of this code was ripped from Barrel but fixed, streamlined
-- and cleaned up a lot so that it no longer sucks.
--
local DBICON10 = "LibDBIcon-1.0"
local DBICON10_MINOR = tonumber(("$Rev: 13 $"):match("(%d+)"))
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.disabled = lib.disabled or nil
lib.objects = lib.objects or {}
lib.callbackRegistered = lib.callbackRegistered or nil
lib.notCreated = lib.notCreated or {}
function lib:IconCallback(event, name, key, value, dataobj)
if lib.objects[name] then
lib.objects[name].icon:SetTexture(dataobj.icon)
end
end
if not lib.callbackRegistered then
ldb.RegisterCallback(lib, "LibDataBroker_AttributeChanged__icon", "IconCallback")
lib.callbackRegistered = true
end
-- Tooltip code ripped from StatBlockCore by Funkydude
local function getAnchors(frame)
local x,y = frame:GetCenter()
if not x or not y then return "TOPLEFT", "BOTTOMLEFT" 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 self.isMoving then return end
local obj = self.dataObject
if obj.OnTooltipShow then
GameTooltip:SetOwner(self, "ANCHOR_NONE")
GameTooltip:SetPoint(getAnchors(self))
obj.OnTooltipShow(GameTooltip)
GameTooltip:Show()
elseif obj.OnEnter then
obj.OnEnter(self)
end
end
local function onLeave(self)
local obj = self.dataObject
GameTooltip:Hide()
if obj.OnLeave then obj.OnLeave(self) end
end
--------------------------------------------------------------------------------
local minimapShapes = {
["ROUND"] = {true, true, true, true},
["SQUARE"] = {false, false, false, false},
["CORNER-TOPLEFT"] = {true, false, false, false},
["CORNER-TOPRIGHT"] = {false, false, true, false},
["CORNER-BOTTOMLEFT"] = {false, true, false, false},
["CORNER-BOTTOMRIGHT"] = {false, false, false, true},
["SIDE-LEFT"] = {true, true, false, false},
["SIDE-RIGHT"] = {false, false, true, true},
["SIDE-TOP"] = {true, false, true, false},
["SIDE-BOTTOM"] = {false, true, false, true},
["TRICORNER-TOPLEFT"] = {true, true, true, false},
["TRICORNER-TOPRIGHT"] = {true, false, true, true},
["TRICORNER-BOTTOMLEFT"] = {true, true, false, true},
["TRICORNER-BOTTOMRIGHT"] = {false, true, true, true},
}
local function updatePosition(button)
local angle = math.rad(button.db.minimapPos or 225)
local x, y, q = math.cos(angle), math.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]
if quadTable[q] then
x, y = x*80, y*80
else
local diagRadius = 103.13708498985 --math.sqrt(2*(80)^2)-10
x = math.max(-80, math.min(x*diagRadius, 80))
y = math.max(-80, math.min(y*diagRadius, 80))
end
button:SetPoint("CENTER", Minimap, "CENTER", x, y)
end
local function onClick(self, b) if self.dataObject.OnClick then self.dataObject.OnClick(self, b) end end
local function onMouseDown(self) self.icon:SetTexCoord(0, 1, 0, 1) end
local function onMouseUp(self) self.icon:SetTexCoord(0.05, 0.95, 0.05, 0.95) end
local function onUpdate(self)
local mx, my = Minimap:GetCenter()
local px, py = GetCursorPosition()
local scale = Minimap:GetEffectiveScale()
px, py = px / scale, py / scale
self.db.minimapPos = math.deg(math.atan2(py - my, px - mx)) % 360
updatePosition(self)
end
local function onDragStart(self)
self:LockHighlight()
self.icon:SetTexCoord(0, 1, 0, 1)
self:SetScript("OnUpdate", onUpdate)
self.isMoving = true
GameTooltip:Hide()
end
local function onDragStop(self)
self:SetScript("OnUpdate", nil)
self.icon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
self:UnlockHighlight()
self.isMoving = nil
end
local function createButton(name, object, db)
local button = CreateFrame("Button", "LibDBIcon10_"..name, Minimap)
button.dataObject = object
button.db = db
button:SetFrameStrata("MEDIUM")
button:SetWidth(31); button:SetHeight(31)
button:SetFrameLevel(8)
button:RegisterForClicks("anyUp")
button:RegisterForDrag("LeftButton")
button:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
local overlay = button:CreateTexture(nil, "OVERLAY")
overlay:SetWidth(53); overlay:SetHeight(53)
overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
overlay:SetPoint("TOPLEFT")
local icon = button:CreateTexture(nil, "BACKGROUND")
icon:SetWidth(20); icon:SetHeight(20)
icon:SetTexture(object.icon)
icon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
icon:SetPoint("TOPLEFT", 7, -5)
button.icon = icon
button:SetScript("OnEnter", onEnter)
button:SetScript("OnLeave", onLeave)
button:SetScript("OnClick", onClick)
button:SetScript("OnDragStart", onDragStart)
button:SetScript("OnDragStop", onDragStop)
button:SetScript("OnMouseDown", onMouseDown)
button:SetScript("OnMouseUp", onMouseUp)
lib.objects[name] = button
if lib.loggedIn then
updatePosition(button)
if not db.hide then button:Show()
else button:Hide() end
end
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
lib.loggedIn = lib.loggedIn or false
-- 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()
for _, object in pairs(lib.objects) do
updatePosition(object)
if not lib.disabled and not object.db.hide then object:Show()
else object:Hide() end
end
lib.loggedIn = true
f:SetScript("OnEvent", nil)
f = nil
end)
f:RegisterEvent("PLAYER_LOGIN")
end
function lib:Register(name, object, db)
if lib.disabled then return end
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("Already registered, nubcake.") end
if not db or not db.hide then
createButton(name, object, db)
else
lib.notCreated[name] = {object, db}
end
end
function lib:Hide(name)
if not lib.objects[name] then return end
lib.objects[name]:Hide()
end
function lib:Show(name)
if lib.disabled then return end
check(name)
lib.objects[name]:Show()
updatePosition(lib.objects[name])
end
function lib:IsRegistered(name)
return (lib.objects[name] or lib.notCreated[name]) and true or false
end
function lib:Refresh(name, db)
if lib.disabled then return end
check(name)
local button = lib.objects[name]
if db then button.db = db end
updatePosition(button)
end
function lib:EnableLibrary()
lib.disabled = nil
for name, object in pairs(lib.objects) do
if not object.db or (object.db and not object.db.hide) then
object:Show()
updatePosition(object)
end
end
end
function lib:DisableLibrary()
lib.disabled = true
for name, object in pairs(lib.objects) do
object:Hide()
end
end
@@ -0,0 +1,90 @@
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
+13
View File
@@ -0,0 +1,13 @@
LibDataBroker is a small WoW addon library designed to provide a "MVC":http://en.wikipedia.org/wiki/Model-view-controller interface for use in various addons.
LDB's primary goal is to "detach" plugins for TitanPanel and FuBar from the display addon.
Plugins can provide data into a simple table, and display addons can receive callbacks to refresh their display of this data.
LDB also provides a place for addons to register "quicklaunch" functions, removing the need for authors to embed many large libraries to create minimap buttons.
Users who do not wish to be "plagued" by these buttons simply do not install an addon to render them.
Due to it's simple generic design, LDB can be used for any design where you wish to have an addon notified of changes to a table.
h2. Links
* "API documentation":http://github.com/tekkub/libdatabroker-1-1/wikis/api
* "Data specifications":http://github.com/tekkub/libdatabroker-1-1/wikis/data-specifications
* "Addons using LDB":http://github.com/tekkub/libdatabroker-1-1/wikis/addons-using-ldb
+51
View File
@@ -0,0 +1,51 @@
-- $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
+13
View File
@@ -0,0 +1,13 @@
## Interface: 40200
## Title: Lib: LibStub
## Notes: Universal Library Stub
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
## X-Website: http://www.wowace.com/addons/libstub/
## X-Category: Library
## X-License: Public Domain
## X-Curse-Packaged-Version: 1.0.2-40200
## X-Curse-Project-Name: LibStub
## X-Curse-Project-ID: libstub
## X-Curse-Repository-ID: wow/libstub/mainline
LibStub.lua
+41
View File
@@ -0,0 +1,41 @@
debugstack = debug.traceback
strmatch = string.match
loadfile("../LibStub.lua")()
local lib, oldMinor = LibStub:NewLibrary("Pants", 1) -- make a new thingy
assert(lib) -- should return the library table
assert(not oldMinor) -- should not return the old minor, since it didn't exist
-- the following is to create data and then be able to check if the same data exists after the fact
function lib:MyMethod()
end
local MyMethod = lib.MyMethod
lib.MyTable = {}
local MyTable = lib.MyTable
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 1) -- try to register a library with the same version, should silently fail
assert(not newLib) -- should not return since out of date
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 0) -- try to register a library with a previous, should silently fail
assert(not newLib) -- should not return since out of date
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 2) -- register a new version
assert(newLib) -- library table
assert(rawequal(newLib, lib)) -- should be the same reference as the previous
assert(newOldMinor == 1) -- should return the minor version of the previous version
assert(rawequal(lib.MyMethod, MyMethod)) -- verify that values were saved
assert(rawequal(lib.MyTable, MyTable)) -- verify that values were saved
local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 3 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib) -- library table
assert(newOldMinor == 2) -- previous version was 2
local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 4 and please ignore 15 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib)
assert(newOldMinor == 3) -- previous version was 3 (even though it gave a string)
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 5) -- register a new library, using a normal number instead of a string
assert(newLib)
assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
+27
View File
@@ -0,0 +1,27 @@
debugstack = debug.traceback
strmatch = string.match
loadfile("../LibStub.lua")()
for major, library in LibStub:IterateLibraries() do
-- check that MyLib doesn't exist yet, by iterating through all the libraries
assert(major ~= "MyLib")
end
assert(not LibStub:GetLibrary("MyLib", true)) -- check that MyLib doesn't exist yet by direct checking
assert(not pcall(LibStub.GetLibrary, LibStub, "MyLib")) -- don't silently fail, thus it should raise an error.
local lib = LibStub:NewLibrary("MyLib", 1) -- create the lib
assert(lib) -- check it exists
assert(rawequal(LibStub:GetLibrary("MyLib"), lib)) -- verify that :GetLibrary("MyLib") properly equals the lib reference
assert(LibStub:NewLibrary("MyLib", 2)) -- create a new version
local count=0
for major, library in LibStub:IterateLibraries() do
-- check that MyLib exists somewhere in the libraries, by iterating through all the libraries
if major == "MyLib" then -- we found it!
count = count +1
assert(rawequal(library, lib)) -- verify that the references are equal
end
end
assert(count == 1) -- verify that we actually found it, and only once
+14
View File
@@ -0,0 +1,14 @@
debugstack = debug.traceback
strmatch = string.match
loadfile("../LibStub.lua")()
local proxy = newproxy() -- non-string
assert(not pcall(LibStub.NewLibrary, LibStub, proxy, 1)) -- should error, proxy is not a string, it's userdata
local success, ret = pcall(LibStub.GetLibrary, proxy, true)
assert(not success or not ret) -- either error because proxy is not a string or because it's not actually registered.
assert(not pcall(LibStub.NewLibrary, LibStub, "Something", "No number in here")) -- should error, minor has no string in it.
assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
+41
View File
@@ -0,0 +1,41 @@
debugstack = debug.traceback
strmatch = string.match
loadfile("../LibStub.lua")()
-- Pretend like loaded libstub is old and doesn't have :IterateLibraries
assert(LibStub.minor)
LibStub.minor = LibStub.minor - 0.0001
LibStub.IterateLibraries = nil
loadfile("../LibStub.lua")()
assert(type(LibStub.IterateLibraries)=="function")
-- Now pretend that we're the same version -- :IterateLibraries should NOT be re-created
LibStub.IterateLibraries = 123
loadfile("../LibStub.lua")()
assert(LibStub.IterateLibraries == 123)
-- Now pretend that a newer version is loaded -- :IterateLibraries should NOT be re-created
LibStub.minor = LibStub.minor + 0.0001
loadfile("../LibStub.lua")()
assert(LibStub.IterateLibraries == 123)
-- Again with a huge number
LibStub.minor = LibStub.minor + 1234567890
loadfile("../LibStub.lua")()
assert(LibStub.IterateLibraries == 123)
print("OK")