fix minimap button
This commit is contained in:
@@ -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
@@ -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
Binary file not shown.
+15957
File diff suppressed because one or more lines are too long
@@ -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
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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")
|
||||
Reference in New Issue
Block a user